mcamd.h revision 9dd0f810214fdc8e1af881a9a5c4b6927629ff9e
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _MCAMD_H
#define _MCAMD_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <mcamd_api.h>
#include <mcamd_dimmcfg.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* PCI configuration space functions for the memory controller. Note that
* the function numbers here also serve as the mc_func indices in the mc_t.
* We will not attach to function 3 "Miscellaneous Control" pci1022,1103
* since the agpgart driver already attaches to that function; instead we
* retrieve what function 3 parameters we require via direct PCI Mechanism 1
* accesses.
*/
enum mc_funcnum {
MC_FUNC_HTCONFIG = 0,
#define MC_FUNC_HTCONFIG_BINDNM "pci1022,1100"
MC_FUNC_ADDRMAP = 1,
#define MC_FUNC_ADDRMAP_BINDNM "pci1022,1101"
MC_FUNC_DRAMCTL = 2,
#define MC_FUNC_DRAMCTL_BINDNM "pci1022,1102"
MC_FUNC_MISCCTL = 3
};
/*
* The memory controller driver attaches to several device nodes, but publishes
* a single minor node. We need to ensure that the minor node can be
* consistently mapped back to a single (and the same) device node, so we need
* to pick one to be used. We'll use the misc control device node, as it'll
* be the last to be attached (since we do not attach function 3)
*/
#define MC_FUNC_DEVIMAP MC_FUNC_DRAMCTL
/*
* The following define the offsets at which various MC registers are
* accessed in PCI config space. For defines describing the register
* structure see mc_amd.h.
*/
/*
* Function 0 (HT Config) offsets
*/
#define MC_HT_REG_RTBL_NODE_0 0x40
#define MC_HT_REG_RTBL_INCR 4
#define MC_HT_REG_NODEID 0x60
#define MC_HT_REG_UNITID 0x64
/*
* Function 1 (address mask) offsets for DRAM base, DRAM limit, DRAM hole
* registers.
*/
/*
* Function 2 (dram controller) offsets for chip-select base, chip-select mask,
* DRAM bank address mapping, DRAM configuration registers.
*/
#define MC_DC_REG_BANKADDRMAP 0x80
#define MC_DC_REG_DRAMCFGLO 0x90
#define MC_DC_REG_DRAMCFGHI 0x94
#define MC_DC_REG_DRAMMISC 0xa0
/*
* Function 3 (misc control) offset for NB MCA config, scrubber control
* and online spare control.
*/
typedef struct mc_func {
} mc_func_t;
/*
* Node types for mch_type below. These are used in array indexing.
*/
#define MC_NT_MC 0
#define MC_NT_CS 1
#define MC_NT_DIMM 2
#define MC_NT_NTYPES 3
typedef struct mc_hdr {
union {
} _mch_ptr;
} mc_hdr_t;
struct mc_dimm {
};
/*
* Chip-select properties. If a chip-select is associated with just one
* dimm (whether it be on the A or B dram channel) that number will be
* in csp_dimmnums[0]; if the chip-select is associated with two dimms
* then csp_dimmnums[0] has the dimm from channel A and csp_dimmnums[1] has
* the partner dimm from channel B.
*/
typedef struct mccs_props {
} mccs_props_t;
/*
* Chip-select config register values
*/
typedef struct mccs_cfgrefs {
struct mc_cs {
};
/*
* Memory controller properties.
*/
typedef struct mc_props {
} mc_props_t;
/*
* Memory controller config register values
*/
typedef struct mc_cfgregs {
} mc_cfgregs_t;
struct mc {
const char *mc_revname; /* revision name string */
char *mc_snapshot; /* packed nvlist for libmc */
int mc_csdiscontig; /* chip-selects discontiguous */
};
typedef struct mcamd_hdl {
int mcamd_errno;
int mcamd_debug;
} mcamd_hdl_t;
extern void mcamd_mkhdl(mcamd_hdl_t *);
extern void mcamd_mc_register(struct cpu *);
#ifdef __cplusplus
}
#endif
#endif /* _MCAMD_H */