xref: /onnv-gate/usr/src/uts/intel/sys/mc_amd.h (revision 5327:7341f36188f5)
11414Scindi /*
21414Scindi  * CDDL HEADER START
31414Scindi  *
41414Scindi  * The contents of this file are subject to the terms of the
52869Sgavinm  * Common Development and Distribution License (the "License").
62869Sgavinm  * You may not use this file except in compliance with the License.
71414Scindi  *
81414Scindi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
91414Scindi  * or http://www.opensolaris.org/os/licensing.
101414Scindi  * See the License for the specific language governing permissions
111414Scindi  * and limitations under the License.
121414Scindi  *
131414Scindi  * When distributing Covered Code, include this CDDL HEADER in each
141414Scindi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
151414Scindi  * If applicable, add the following below this CDDL HEADER, with the
161414Scindi  * fields enclosed by brackets "[]" replaced with your own identifying
171414Scindi  * information: Portions Copyright [yyyy] [name of copyright owner]
181414Scindi  *
191414Scindi  * CDDL HEADER END
201414Scindi  *
213766Sgavinm  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
221414Scindi  * Use is subject to license terms.
231414Scindi  */
241414Scindi 
251414Scindi #ifndef _MC_AMD_H
261414Scindi #define	_MC_AMD_H
271414Scindi 
281414Scindi #pragma ident	"%Z%%M%	%I%	%E% SMI"
291414Scindi 
302869Sgavinm #include <sys/mc.h>
315254Sgavinm #include <sys/isa_defs.h>
322869Sgavinm #include <sys/x86_archext.h>
332869Sgavinm 
343323Scindi #ifdef __cplusplus
353323Scindi extern "C" {
363323Scindi #endif
373323Scindi 
382869Sgavinm /*
393766Sgavinm  * Definitions, register offsets, register structure etc pertaining to
403766Sgavinm  * the memory controller on AMD64 systems.  These are used by both the
413766Sgavinm  * AMD cpu module and the mc-amd driver.
423766Sgavinm  */
433766Sgavinm 
443766Sgavinm /*
452869Sgavinm  * The mc-amd driver exports an nvlist to userland, where the primary
462869Sgavinm  * consumer is the "chip" topology enumerator for this platform type which
472869Sgavinm  * builds a full topology subtree from this information.  Others can use
483164Sgavinm  * it, too, but don't depend on it not changing without an ARC contract
493164Sgavinm  * (and the contract should probably concern the topology, not this nvlist).
502869Sgavinm  *
512869Sgavinm  * In the initial mc-amd implementation this nvlist was not versioned;
522869Sgavinm  * we'll think of that as version 0 and it may be recognised by the absence
532869Sgavinm  * of a "mcamd-nvlist-version member.
542869Sgavinm  *
552869Sgavinm  * Version 1 is defined as follows.  A name in square brackets indicates
562869Sgavinm  * that member is optional (only present if the actual value is valid).
572869Sgavinm  *
582869Sgavinm  * Name			Type		Description
592869Sgavinm  * -------------------- --------------- ---------------------------------------
602869Sgavinm  * mcamd-nvlist-version	uint8		Exported nvlist version number
612869Sgavinm  * num			uint64		Chip id of this memory controller
622869Sgavinm  * revision		uint64		cpuid_getchiprev() result
632869Sgavinm  * revname		string		cpuid_getchiprevstr() result
642869Sgavinm  * socket		string		"Socket 755|939|940|AM2|F(1207)|S1g1"
652869Sgavinm  * ecc-type		string		"ChipKill 128/16" or "Normal 64/8"
662869Sgavinm  * base-addr		uint64		Node base address
672869Sgavinm  * lim-addr		uint64		Node limit address
682869Sgavinm  * node-ilen		uint64		0|1|3|7 for 0/2/4/8 way node interleave
692869Sgavinm  * node-ilsel		uint64		Node interleave position of this node
702869Sgavinm  * cs-intlv-factor	uint64		chip-select interleave: 1/2/4/8
712869Sgavinm  * dram-hole-size	uint64		size in bytes from dram hole addr reg
722869Sgavinm  * access-width		uint64		MC mode, 64 or 128 bit
732869Sgavinm  * bank-mapping		uint64		Raw DRAM Bank Address Mapping Register
742869Sgavinm  * bankswizzle		uint64		1 if bank swizzling enabled; else 0
752869Sgavinm  * mismatched-dimm-support uint64	1 if active; else 0
762869Sgavinm  * [spare-csnum]	uint64		Chip-select pair number of any spare
772869Sgavinm  * [bad-csnum]		uint64		Chip-select pair number of swapped cs
782869Sgavinm  * cslist		nvlist array	See below; may have 0 members
792869Sgavinm  * dimmlist		nvlist array	See below; may have 0 members
802869Sgavinm  *
812869Sgavinm  * cslist is an array of nvlist, each as follows:
822869Sgavinm  *
832869Sgavinm  * Name			Type		Description
842869Sgavinm  * -------------------- --------------- ---------------------------------------
852869Sgavinm  * num			uint64		Chip-select base/mask pair number
862869Sgavinm  * base-addr		uint64		Chip-select base address (rel to node)
872869Sgavinm  * mask			uint64		Chip-select mask
882869Sgavinm  * size			uint64		Chip-select size in bytes
892869Sgavinm  * dimm1-num		uint64		First dimm (lodimm if a pair)
902869Sgavinm  * dimm1-csname		string		Socket cs# line name for 1st dimm rank
912869Sgavinm  * [dimm2-num]		uint64		Second dimm if applicable (updimm)
922869Sgavinm  * [dimm2-csname]	string		Socket cs# line name for 2nd dimm rank
932869Sgavinm  *
942869Sgavinm  * dimmlist is an array of nvlist, each as follows:
952869Sgavinm  *
962869Sgavinm  * Name			Type		Description
972869Sgavinm  * -------------------- --------------- ---------------------------------------
982869Sgavinm  * num			uint64		DIMM instance number
992869Sgavinm  * size			uint64		DIMM size in bytes
1002869Sgavinm  * csnums		uint64 array	CS base/mask pair(s) on this DIMM
1012869Sgavinm  * csnames		string array	Socket cs# line name(s) on this DIMM
1022869Sgavinm  *
1032869Sgavinm  *	The n'th csnums entry corresponds to the n'th csnames entry
1042869Sgavinm  */
1052869Sgavinm #define	MC_NVLIST_VERSTR	"mcamd-nvlist-version"
1062869Sgavinm #define	MC_NVLIST_VERS0		0
1072869Sgavinm #define	MC_NVLIST_VERS1		1
1082869Sgavinm #define	MC_NVLIST_VERS		MC_NVLIST_VERS1
1092869Sgavinm 
1101414Scindi /*
1112869Sgavinm  * Constants and feature/revision test macros that are not expected to vary
1122869Sgavinm  * among different AMD family 0xf processor revisions.
1132869Sgavinm  */
1142869Sgavinm 
1152869Sgavinm /*
1161414Scindi  * Configuration constants
1171414Scindi  */
1182869Sgavinm #define	MC_CHIP_MAXNODES	8	/* max number of MCs in system */
1191414Scindi #define	MC_CHIP_NDIMM		8	/* max dimms per MC */
1201414Scindi #define	MC_CHIP_NCS		8	/* number of chip-selects per MC */
1212869Sgavinm #define	MC_CHIP_NDRAMCHAN	2	/* maximum number of dram channels */
1221414Scindi #define	MC_CHIP_DIMMRANKMAX	4	/* largest number of ranks per dimm */
1231414Scindi #define	MC_CHIP_DIMMPERCS	2	/* max number of dimms per cs */
1241414Scindi #define	MC_CHIP_DIMMPAIR(csnum)	(csnum / MC_CHIP_DIMMPERCS)
1251414Scindi 
1263766Sgavinm /*
1273766Sgavinm  * Memory controller registers are read via PCI config space accesses on
1285254Sgavinm  * bus 0, device 0x18 + NodeId, and function as follows:
1293766Sgavinm  *
1303766Sgavinm  * Function 0: HyperTransport Technology Configuration
1313766Sgavinm  * Function 1: Address Map
1323766Sgavinm  * Function 2: DRAM Controller & HyperTransport Technology Trace Mode
1333766Sgavinm  * Function 3: Miscellaneous Control
1343766Sgavinm  */
1355254Sgavinm 
1365254Sgavinm #define	MC_AMD_DEV_OFFSET	0x18	/* node ID + offset == PCI dev num */
1375254Sgavinm 
1383766Sgavinm enum mc_funcnum {
1393766Sgavinm 	MC_FUNC_HTCONFIG = 0,
1403766Sgavinm 	MC_FUNC_ADDRMAP	= 1,
1413766Sgavinm 	MC_FUNC_DRAMCTL = 2,
1423766Sgavinm 	MC_FUNC_MISCCTL = 3
1433766Sgavinm };
1443766Sgavinm 
1453766Sgavinm /*
1463766Sgavinm  * For a given (bus, device, function) a particular offset selects the
1473766Sgavinm  * desired register.  All registers are 32-bits wide.
1483766Sgavinm  *
1493766Sgavinm  * Different family 0xf processor revisions vary slightly in the content
1503766Sgavinm  * of these configuration registers.  The biggest change is with rev F
1513766Sgavinm  * where DDR2 support has been introduced along with some hardware-controlled
1523766Sgavinm  * correctable memory error thresholding.  Fortunately most of the config info
1533766Sgavinm  * required by the mc-amd driver is similar across revisions.
1543766Sgavinm  *
1553766Sgavinm  * We will try to insulate most of the driver code from config register
1563766Sgavinm  * details by reading all memory-controller PCI config registers that we
1573766Sgavinm  * will need at driver attach time for each of functions 0 through 3, and
1583766Sgavinm  * storing them in a "cooked" form as memory controller properties.
1593766Sgavinm  * These are to be accessed directly where we have an mc_t to hand, otherwise
1603766Sgavinm  * through mcamd_get_numprop.  As such we expect most/all use of the
1613766Sgavinm  * structures and macros defined below to be in those attach codepaths.
1623766Sgavinm  */
1633766Sgavinm 
1643766Sgavinm /*
1653766Sgavinm  * Function 0 (HT Config) offsets
1663766Sgavinm  */
1673766Sgavinm #define	MC_HT_REG_RTBL_NODE_0	0x40
1683766Sgavinm #define	MC_HT_REG_RTBL_INCR	4
1693766Sgavinm #define	MC_HT_REG_NODEID	0x60
1703766Sgavinm #define	MC_HT_REG_UNITID	0x64
1712869Sgavinm 
1721414Scindi /*
1733766Sgavinm  * Function 1 (address map) offsets for DRAM base, DRAM limit, DRAM hole
1743766Sgavinm  * registers.
1753766Sgavinm  */
1763766Sgavinm #define	MC_AM_REG_DRAMBASE_0	0x40	/* Offset for DRAM Base 0 */
1773766Sgavinm #define	MC_AM_REG_DRAMLIM_0	0x44	/* Offset for DRAM Limit 0 */
1783766Sgavinm #define	MC_AM_REG_DRAM_INCR	8	/* incr between base/limit pairs */
1793766Sgavinm #define	MC_AM_REG_HOLEADDR	0xf0	/* DRAM Hole Address Register */
1803766Sgavinm 
1813766Sgavinm /*
1823766Sgavinm  * Function 2 (dram controller) offsets for chip-select base, chip-select mask,
1833766Sgavinm  * DRAM bank address mapping, DRAM configuration registers.
1843766Sgavinm  */
1853766Sgavinm #define	MC_DC_REG_CS_INCR	4	/* incr for CS base and mask */
1863766Sgavinm #define	MC_DC_REG_CSBASE_0	0x40	/* 0x40 - 0x5c */
1873766Sgavinm #define	MC_DC_REG_CSMASK_0	0x60	/* 0x60 - 0x7c */
1883766Sgavinm #define	MC_DC_REG_BANKADDRMAP	0x80	/* DRAM Bank Address Mapping */
1893766Sgavinm #define	MC_DC_REG_DRAMCFGLO	0x90	/* DRAM Configuration Low */
1903766Sgavinm #define	MC_DC_REG_DRAMCFGHI	0x94	/* DRAM Configuration High */
1913766Sgavinm #define	MC_DC_REG_DRAMMISC	0xa0	/* DRAM Miscellaneous */
1923766Sgavinm 
1933766Sgavinm /*
194*5327Sgavinm  * Function 3 (misc control) offset for NB MCA config, scrubber control,
195*5327Sgavinm  * online spare control and NB capabilities.
1962869Sgavinm  */
1973766Sgavinm #define	MC_CTL_REG_NBCFG	0x44	/* MCA NB configuration register */
1983766Sgavinm #define	MC_CTL_REG_SCRUBCTL	0x58	/* Scrub control register */
1993766Sgavinm #define	MC_CTL_REG_SCRUBADDR_LO	0x5c	/* DRAM Scrub Address Low */
2003766Sgavinm #define	MC_CTL_REG_SCRUBADDR_HI	0x60	/* DRAM Scrub Address High */
2013766Sgavinm #define	MC_CTL_REG_SPARECTL	0xb0	/* On-line spare control register */
202*5327Sgavinm #define	MC_CTL_REG_NBCAP	0xe8	/* NB Capabilities */
203*5327Sgavinm 
204*5327Sgavinm #define	MC_NBCAP_L3CAPABLE	0x02000000
2053766Sgavinm 
2063766Sgavinm /*
2075254Sgavinm  * MC4_MISC MSR and MC4_MISCj MSRs
2085254Sgavinm  */
2095254Sgavinm #define	MC_MSR_NB_MISC0		0x413
2105254Sgavinm #define	MC_MSR_NB_MISC1		0xc0000408
2115254Sgavinm #define	MC_MSR_NB_MISC2		0xc0000409
2125254Sgavinm #define	MC_MSR_NB_MISC3		0xc000040a
2135254Sgavinm #define	MC_MSR_NB_MISC(j) \
2145254Sgavinm 	((j) == 0 ? MC_MSR_NB_MISC0 : MC_MSR_NB_MISC1 + (j) - 1)
2155254Sgavinm 
2165254Sgavinm /*
2175254Sgavinm  * PCI registers will be represented as unions, with one fixed-width unsigned
2183766Sgavinm  * integer member providing access to the raw register value and one or more
2193766Sgavinm  * structs breaking the register out into bitfields (more than one struct if
2203766Sgavinm  * the register definitions varies across processor revisions).
2213766Sgavinm  *
2223766Sgavinm  * The "raw" union member will always be '_val32'.  Use MCREG_VAL32 to
2233766Sgavinm  * access this member.
2243766Sgavinm  *
2253766Sgavinm  * The bitfield structs are all named _fmt_xxx where xxx identifies the
2263766Sgavinm  * processor revision to which it applies.  At this point the only xxx
2273766Sgavinm  * values in use are:
2283766Sgavinm  *			'cmn' - applies to all revisions
2295254Sgavinm  *			'f_preF' - applies to revisions E and earlier
2305254Sgavinm  *			'f_revFG' - applies to revisions F and G
2315254Sgavinm  *
2323766Sgavinm  * Variants such as 'preD', 'revDE', 'postCG' etc should be introduced
2333766Sgavinm  * as requirements arise.  The MC_REV_* and MC_REV_MATCH etc macros
2343766Sgavinm  * will also need to grow to match.  Use MCREG_FIELD_* to access the
2353766Sgavinm  * individual bitfields of a register, perhaps using MC_REV_* and MC_REV_MATCH
2363766Sgavinm  * to decide which revision suffix to provide.  Where a bitfield appears
2373766Sgavinm  * in different revisions but has the same use it should be named identically
2383766Sgavinm  * (even if the BKDG varies a little) so that the MC_REG_FIELD_* macros
2393766Sgavinm  * can lookup that member based on revision only.
2403766Sgavinm  */
2413766Sgavinm 
2422869Sgavinm #define	MC_REV_UNKNOWN	X86_CHIPREV_UNKNOWN
2435254Sgavinm 
2445254Sgavinm #define	MC_F_REV_B	X86_CHIPREV_AMD_F_REV_B
2455254Sgavinm #define	MC_F_REV_C	(X86_CHIPREV_AMD_F_REV_C0 | X86_CHIPREV_AMD_F_REV_CG)
2465254Sgavinm #define	MC_F_REV_D	X86_CHIPREV_AMD_F_REV_D
2475254Sgavinm #define	MC_F_REV_E	X86_CHIPREV_AMD_F_REV_E
2485254Sgavinm #define	MC_F_REV_F	X86_CHIPREV_AMD_F_REV_F
2495254Sgavinm #define	MC_F_REV_G	X86_CHIPREV_AMD_F_REV_G
2505254Sgavinm 
2515254Sgavinm #define	MC_10_REV_A	X86_CHIPREV_AMD_10_REV_A
2525254Sgavinm #define	MC_10_REV_B	X86_CHIPREV_AMD_10_REV_B
2532869Sgavinm 
2542869Sgavinm /*
2552869Sgavinm  * The most common groupings for memory controller features.
2561414Scindi  */
2575254Sgavinm #define	MC_F_REVS_BC	(MC_F_REV_B | MC_F_REV_C)
2585254Sgavinm #define	MC_F_REVS_DE	(MC_F_REV_D | MC_F_REV_E)
2595254Sgavinm #define	MC_F_REVS_BCDE	(MC_F_REVS_BC | MC_F_REVS_DE)
2605254Sgavinm #define	MC_F_REVS_FG	(MC_F_REV_F | MC_F_REV_G)
2615254Sgavinm 
2625254Sgavinm #define	MC_10_REVS_AB	(MC_10_REV_A | MC_10_REV_B)
2632869Sgavinm 
2642869Sgavinm /*
2652869Sgavinm  * Is 'rev' included in the 'revmask' bitmask?
2662869Sgavinm  */
2672869Sgavinm #define	MC_REV_MATCH(rev, revmask)	X86_CHIPREV_MATCH(rev, revmask)
2682869Sgavinm 
2692869Sgavinm /*
2702869Sgavinm  * Is 'rev' at least revision 'revmin' or greater
2712869Sgavinm  */
2722869Sgavinm #define	MC_REV_ATLEAST(rev, minrev)	X86_CHIPREV_ATLEAST(rev, minrev)
2732869Sgavinm 
2742869Sgavinm #define	_MCREG_FIELD(up, revsuffix, field) ((up)->_fmt_##revsuffix.field)
2752869Sgavinm 
2762869Sgavinm #define	MCREG_VAL32(up) ((up)->_val32)
2772869Sgavinm 
2785254Sgavinm /*
2795254Sgavinm  * Access a field that has the same structure in all families and revisions
2805254Sgavinm  */
2812869Sgavinm #define	MCREG_FIELD_CMN(up, field)	_MCREG_FIELD(up, cmn, field)
2825254Sgavinm 
2835254Sgavinm /*
2845254Sgavinm  * Access a field as defined for family 0xf prior to revision F
2855254Sgavinm  */
2865254Sgavinm #define	MCREG_FIELD_F_preF(up, field)	_MCREG_FIELD(up, f_preF, field)
2875254Sgavinm 
2885254Sgavinm /*
2895254Sgavinm  * Access a field as defined for family 0xf revisions F and G
2905254Sgavinm  */
2915254Sgavinm #define	MCREG_FIELD_F_revFG(up, field)	_MCREG_FIELD(up, f_revFG, field)
2925254Sgavinm 
2935254Sgavinm /*
2945254Sgavinm  * Access a field as defined for family 0x10 revisions A and
2955254Sgavinm  */
2965254Sgavinm #define	MCREG_FIELD_10_revAB(up, field)	_MCREG_FIELD(up, 10_revAB, field)
2975254Sgavinm 
2985254Sgavinm /*
2995254Sgavinm  * We will only define the register bitfields for little-endian order
3005254Sgavinm  */
3015254Sgavinm #ifdef	_BIT_FIELDS_LTOH
3021414Scindi 
3031414Scindi /*
3043323Scindi  * Function 0 - HT Configuration: Routing Table Node Register
3053323Scindi  */
3063323Scindi union mcreg_htroute {
3073323Scindi 	uint32_t	_val32;
3083323Scindi 	struct {
3093323Scindi 		uint32_t	RQRte:4;	/*  3:0 */
3103323Scindi 		uint32_t	reserved1:4;	/*  7:4 */
3113323Scindi 		uint32_t	RPRte:4;	/* 11:8 */
3123323Scindi 		uint32_t	reserved2:4;	/* 15:12 */
3133323Scindi 		uint32_t	BCRte:4;	/* 19:16 */
3143323Scindi 		uint32_t	reserved3:12;	/* 31:20 */
3153323Scindi 	} _fmt_cmn;
3163323Scindi };
3173323Scindi 
3183323Scindi /*
3193323Scindi  * Function 0 - HT Configuration: Node ID Register
3203323Scindi  */
3213323Scindi union mcreg_nodeid {
3223323Scindi 	uint32_t	_val32;
3233323Scindi 	struct {
3243323Scindi 		uint32_t	NodeId:3;	/*  2:0 */
3253323Scindi 		uint32_t	reserved1:1;	/*  3:3 */
3263323Scindi 		uint32_t	NodeCnt:3;	/*  6:4 */
3273323Scindi 		uint32_t	reserved2:1;	/*  7:7 */
3283323Scindi 		uint32_t	SbNode:3;	/* 10:8 */
3293323Scindi 		uint32_t	reserved3:1;	/* 11:11 */
3303323Scindi 		uint32_t	LkNode:3;	/* 14:12 */
3313323Scindi 		uint32_t	reserved4:1;	/* 15:15 */
3323323Scindi 		uint32_t	CpuCnt:4;	/* 19:16 */
3333323Scindi 		uint32_t	reserved:12;	/* 31:20 */
3343323Scindi 	} _fmt_cmn;
3353323Scindi };
3363323Scindi 
3373323Scindi #define	HT_COHERENTNODES(up)	(MCREG_FIELD_CMN(up, NodeCnt) + 1)
3383323Scindi #define	HT_SYSTEMCORECOUNT(up)	(MCREG_FIELD_CMN(up, CpuCnt) + 1)
3393323Scindi 
3403323Scindi /*
3413323Scindi  * Function 0 - HT Configuration: Unit ID Register
3423323Scindi  */
3433323Scindi union mcreg_unitid {
3443323Scindi 	uint32_t	_val32;
3453323Scindi 	struct {
3463323Scindi 		uint32_t	C0Unit:2;	/*  1:0 */
3473323Scindi 		uint32_t	C1Unit:2;	/*  3:2 */
3483323Scindi 		uint32_t	McUnit:2;	/*  5:4 */
3493323Scindi 		uint32_t	HbUnit:2;	/*  7:6 */
3503323Scindi 		uint32_t	SbLink:2;	/*  9:8 */
3513323Scindi 		uint32_t	reserved:22;	/* 31:10 */
3523323Scindi 	} _fmt_cmn;
3533323Scindi };
3543323Scindi 
3553323Scindi /*
3562869Sgavinm  * Function 1 - DRAM Address Map: DRAM Base i Registers
3572869Sgavinm  *
3582869Sgavinm  */
3592869Sgavinm 
3602869Sgavinm union mcreg_drambase {
3612869Sgavinm 	uint32_t	_val32;
3622869Sgavinm 	struct {
3632869Sgavinm 		uint32_t	RE:1;		/*  0:0  - Read Enable */
3642869Sgavinm 		uint32_t	WE:1;		/*  1:1  - Write Enable */
3652869Sgavinm 		uint32_t	reserved1:6;	/*  7:2 */
3662869Sgavinm 		uint32_t	IntlvEn:3;	/* 10:8  - Interleave Enable */
3672869Sgavinm 		uint32_t	reserved2:5;	/* 15:11 */
3682869Sgavinm 		uint32_t	DRAMBasei:16;	/* 31:16 - Base Addr 39:24 */
3692869Sgavinm 	} _fmt_cmn;
3702869Sgavinm };
3712869Sgavinm 
3722869Sgavinm #define	MC_DRAMBASE(up)	((uint64_t)MCREG_FIELD_CMN(up, DRAMBasei) << 24)
3732869Sgavinm 
3742869Sgavinm /*
3752869Sgavinm  * Function 1 - DRAM Address Map: DRAM Limit i Registers
3762869Sgavinm  *
3771414Scindi  */
3782869Sgavinm 
3792869Sgavinm union mcreg_dramlimit {
3802869Sgavinm 	uint32_t	_val32;
3812869Sgavinm 	struct {
3822869Sgavinm 		uint32_t	DstNode:3;	/*  2:0  - Destination Node */
3832869Sgavinm 		uint32_t	reserved1:5;	/*  7:3 */
3842869Sgavinm 		uint32_t	IntlvSel:3;	/* 10:8  - Interleave Select */
3852869Sgavinm 		uint32_t	reserved2:5;	/* 15:11 */
3862869Sgavinm 		uint32_t	DRAMLimiti:16;	/* 31:16 - Limit Addr 39:24 */
3872869Sgavinm 	} _fmt_cmn;
3882869Sgavinm };
3892869Sgavinm 
3902869Sgavinm #define	MC_DRAMLIM(up) \
3912869Sgavinm 	((uint64_t)MCREG_FIELD_CMN(up, DRAMLimiti) << 24 |		\
3922869Sgavinm 	(MCREG_FIELD_CMN(up, DRAMLimiti) ?  ((1 << 24) - 1) : 0))
3932869Sgavinm 
3942869Sgavinm /*
3952869Sgavinm  * Function 1 - DRAM Address Map: DRAM Hole Address Register
3962869Sgavinm  */
3972869Sgavinm 
3982869Sgavinm union mcreg_dramhole {
3992869Sgavinm 	uint32_t	_val32;
4002869Sgavinm 	struct {
4012869Sgavinm 		uint32_t	DramHoleValid:1;	/*  0:0 */
4022869Sgavinm 		uint32_t	reserved1:7;		/*  7:1 */
4032869Sgavinm 		uint32_t	DramHoleOffset:8;	/* 15:8 */
4042869Sgavinm 		uint32_t	reserved2:8;		/* 23:16 */
4052869Sgavinm 		uint32_t	DramHoleBase:8;		/* 31:24 */
4062869Sgavinm 	} _fmt_cmn;
4072869Sgavinm };
4082869Sgavinm 
4092869Sgavinm #define	MC_DRAMHOLE_SIZE(up) (MCREG_FIELD_CMN(up, DramHoleOffset) << 24)
4101414Scindi 
4111414Scindi /*
4122869Sgavinm  * Function 2 - DRAM Controller: DRAM CS Base Address Registers
4131414Scindi  */
4142869Sgavinm 
4152869Sgavinm union mcreg_csbase {
4162869Sgavinm 	uint32_t	_val32;
4172869Sgavinm 	/*
4185254Sgavinm 	 * Register format in family 0xf revisions E and earlier
4192869Sgavinm 	 */
4202869Sgavinm 	struct {
4212869Sgavinm 		uint32_t	CSEnable:1;	/*  0:0  - CS Bank Enable */
4222869Sgavinm 		uint32_t	reserved1:8;	/*  8:1 */
4232869Sgavinm 		uint32_t	BaseAddrLo:7;	/* 15:9  - Base Addr 19:13 */
4242869Sgavinm 		uint32_t	reserved2:5;	/* 20:16 */
4252869Sgavinm 		uint32_t	BaseAddrHi:11;	/* 31:21 - Base Addr 35:25 */
4265254Sgavinm 	} _fmt_f_preF;
4272869Sgavinm 	/*
4285254Sgavinm 	 * Register format in family 0xf revisions F and G
4292869Sgavinm 	 */
4302869Sgavinm 	struct {
4312869Sgavinm 		uint32_t	CSEnable:1;	/*  0:0  - CS Bank Enable */
4322869Sgavinm 		uint32_t	Spare:1;	/*  1:1  - Spare Rank */
4332869Sgavinm 		uint32_t	TestFail:1;	/*  2:2  - Memory Test Failed */
4342869Sgavinm 		uint32_t	reserved1:2;	/*  4:3 */
4352869Sgavinm 		uint32_t	BaseAddrLo:9;	/* 13:5  - Base Addr 21:13 */
4362869Sgavinm 		uint32_t	reserved2:5;	/* 18:14 */
4372869Sgavinm 		uint32_t	BaseAddrHi:10;	/* 28:19 - Base Addr 36:27 */
4382869Sgavinm 		uint32_t	reserved3:3;	/* 31:39 */
4395254Sgavinm 	} _fmt_f_revFG;
4402869Sgavinm };
4412869Sgavinm 
4425254Sgavinm #define	MC_CSBASE(up, rev) (MC_REV_MATCH(rev, MC_F_REVS_FG) ?	\
4435254Sgavinm 	(uint64_t)MCREG_FIELD_F_revFG(up, BaseAddrHi) << 27 |		\
4445254Sgavinm 	(uint64_t)MCREG_FIELD_F_revFG(up, BaseAddrLo) << 13 :		\
4455254Sgavinm 	(uint64_t)MCREG_FIELD_F_preF(up, BaseAddrHi) << 25 |		\
4465254Sgavinm 	(uint64_t)MCREG_FIELD_F_preF(up, BaseAddrLo) << 13)
4471414Scindi 
4482869Sgavinm /*
4492869Sgavinm  * Function 2 - DRAM Controller: DRAM CS Mask Registers
4502869Sgavinm  */
4511414Scindi 
4522869Sgavinm union mcreg_csmask {
4532869Sgavinm 	uint32_t	_val32;
4542869Sgavinm 	/*
4555254Sgavinm 	 * Register format in family 0xf revisions E and earlier
4562869Sgavinm 	 */
4572869Sgavinm 	struct {
4582869Sgavinm 		uint32_t	reserved1:9;	/*  8:0 */
4592869Sgavinm 		uint32_t	AddrMaskLo:7;	/* 15:9  - Addr Mask 19:13 */
4602869Sgavinm 		uint32_t	reserved2:5;	/* 20:16 */
4612869Sgavinm 		uint32_t	AddrMaskHi:9;	/* 29:21 - Addr Mask 33:25 */
4622869Sgavinm 		uint32_t	reserved3:2;	/* 31:30 */
4635254Sgavinm 	} _fmt_f_preF;
4642869Sgavinm 	/*
4655254Sgavinm 	 * Register format in family 0xf revisions F and G
4662869Sgavinm 	 */
4672869Sgavinm 	struct {
4682869Sgavinm 		uint32_t	reserved1:5;	/*  4:0 */
4692869Sgavinm 		uint32_t	AddrMaskLo:9;	/* 13:5  - Addr Mask 21:13 */
4702869Sgavinm 		uint32_t	reserved2:5;	/* 18:14 */
4712869Sgavinm 		uint32_t	AddrMaskHi:10;	/* 28:19 - Addr Mask 36:27 */
4722869Sgavinm 		uint32_t	reserved3:3;	/* 31:29 */
4735254Sgavinm 	} _fmt_f_revFG;
4742869Sgavinm };
4751414Scindi 
4765254Sgavinm #define	MC_CSMASKLO_LOBIT(rev) (MC_REV_MATCH(rev, MC_F_REVS_FG) ? 13 : 13)
4775254Sgavinm #define	MC_CSMASKLO_HIBIT(rev) (MC_REV_MATCH(rev, MC_F_REVS_FG) ? 21 : 19)
4782869Sgavinm 
4795254Sgavinm #define	MC_CSMASKHI_LOBIT(rev) (MC_REV_MATCH(rev, MC_F_REVS_FG) ? 27 : 25)
4805254Sgavinm #define	MC_CSMASKHI_HIBIT(rev) (MC_REV_MATCH(rev, MC_F_REVS_FG) ? 36 : 33)
4812869Sgavinm 
4825254Sgavinm #define	MC_CSMASK_UNMASKABLE(rev) (MC_REV_MATCH(rev, MC_F_REVS_FG) ? 0 : 2)
4832869Sgavinm 
4845254Sgavinm #define	MC_CSMASK(up, rev) (MC_REV_MATCH(rev, MC_F_REVS_FG) ? \
4855254Sgavinm 	(uint64_t)MCREG_FIELD_F_revFG(up, AddrMaskHi) << 27 | \
4865254Sgavinm 	(uint64_t)MCREG_FIELD_F_revFG(up, AddrMaskLo) << 13 | 0x7c01fff : \
4875254Sgavinm 	(uint64_t)MCREG_FIELD_F_preF(up, AddrMaskHi) << 25 | \
4885254Sgavinm 	(uint64_t)MCREG_FIELD_F_preF(up, AddrMaskLo) << 13 | 0x1f01fff)
4891414Scindi 
4901414Scindi /*
4912869Sgavinm  * Function 2 - DRAM Controller: DRAM Bank Address Mapping Registers
4921414Scindi  */
4931414Scindi 
4942869Sgavinm union mcreg_bankaddrmap {
4952869Sgavinm 	uint32_t	_val32;
4962869Sgavinm 	/*
4975254Sgavinm 	 * Register format in family 0xf revisions E and earlier
4982869Sgavinm 	 */
4992869Sgavinm 	struct {
5002869Sgavinm 		uint32_t	cs10:4;			/*  3:0  - CS1/0 */
5012869Sgavinm 		uint32_t	cs32:4;			/*  7:4  - CS3/2 */
5022869Sgavinm 		uint32_t	cs54:4;			/* 11:8  - CS5/4 */
5032869Sgavinm 		uint32_t	cs76:4;			/* 15:12 - CS7/6 */
5042869Sgavinm 		uint32_t	reserved1:14;		/* 29:16 */
5052869Sgavinm 		uint32_t	BankSwizzleMode:1;	/* 30:30 */
5062869Sgavinm 		uint32_t	reserved2:1;		/* 31:31 */
5075254Sgavinm 	} _fmt_f_preF;
5082869Sgavinm 	/*
5095254Sgavinm 	 * Register format in family 0xf revisions F and G
5102869Sgavinm 	 */
5112869Sgavinm 	struct {
5122869Sgavinm 		uint32_t	cs10:4;			/*  3:0  - CS1/0 */
5132869Sgavinm 		uint32_t	cs32:4;			/*  7:4  - CS3/2 */
5142869Sgavinm 		uint32_t	cs54:4;			/* 11:8  - CS5/4 */
5152869Sgavinm 		uint32_t	cs76:4;			/* 15:12 - CS7/6 */
5162869Sgavinm 		uint32_t	reserved1:16;		/* 31:16 */
5175254Sgavinm 	} _fmt_f_revFG;
5182869Sgavinm 	/*
5192869Sgavinm 	 * Accessing all mode encodings as one uint16
5202869Sgavinm 	 */
5212869Sgavinm 	struct {
5222869Sgavinm 		uint32_t	allcsmodes:16;		/* 15:0 */
5232869Sgavinm 		uint32_t	pad:16;			/* 31:16 */
5242869Sgavinm 	} _fmt_bankmodes;
5252869Sgavinm };
5261414Scindi 
5272869Sgavinm #define	MC_DC_BAM_CSBANK_MASK	0x0000000f
5282869Sgavinm #define	MC_DC_BAM_CSBANK_SHIFT	4
5291414Scindi 
5302869Sgavinm #define	MC_CSBANKMODE(up, csnum) ((up)->_fmt_bankmodes.allcsmodes >>	\
5312869Sgavinm     MC_DC_BAM_CSBANK_SHIFT * MC_CHIP_DIMMPAIR(csnum) & MC_DC_BAM_CSBANK_MASK)
5321414Scindi 
5331414Scindi /*
5342869Sgavinm  * Function 2 - DRAM Controller: DRAM Configuration Low and High
5351414Scindi  */
5361414Scindi 
5372869Sgavinm union mcreg_dramcfg_lo {
5382869Sgavinm 	uint32_t _val32;
5392869Sgavinm 	/*
5405254Sgavinm 	 * Register format in family 0xf revisions E and earlier.
5412869Sgavinm 	 * Bit 7 is a BIOS ScratchBit in revs D and earlier,
5422869Sgavinm 	 * PwrDwnTriEn in revision E;  we don't use it so
5432869Sgavinm 	 * we'll call it ambig1.
5442869Sgavinm 	 */
5452869Sgavinm 	struct {
5462869Sgavinm 		uint32_t	DLL_Dis:1;	/* 0 */
5472869Sgavinm 		uint32_t	D_DRV:1;	/* 1 */
5482869Sgavinm 		uint32_t	QFC_EN:1;	/* 2 */
5492869Sgavinm 		uint32_t	DisDqsHys:1;	/* 3 */
5502869Sgavinm 		uint32_t	reserved1:1;	/* 4 */
5512869Sgavinm 		uint32_t	Burst2Opt:1;	/* 5 */
5522869Sgavinm 		uint32_t	Mod64BitMux:1;	/* 6 */
5532869Sgavinm 		uint32_t	ambig1:1;	/* 7 */
5542869Sgavinm 		uint32_t	DramInit:1;	/* 8 */
5552869Sgavinm 		uint32_t	DualDimmEn:1;	/* 9 */
5562869Sgavinm 		uint32_t	DramEnable:1;	/* 10 */
5572869Sgavinm 		uint32_t	MemClrStatus:1;	/* 11 */
5582869Sgavinm 		uint32_t	ESR:1;		/* 12 */
5592869Sgavinm 		uint32_t	SR_S:1;		/* 13 */
5602869Sgavinm 		uint32_t	RdWrQByp:2;	/* 15:14 */
5612869Sgavinm 		uint32_t	Width128:1;	/* 16 */
5622869Sgavinm 		uint32_t	DimmEcEn:1;	/* 17 */
5632869Sgavinm 		uint32_t	UnBufDimm:1;	/* 18 */
5642869Sgavinm 		uint32_t	ByteEn32:1;	/* 19 */
5652869Sgavinm 		uint32_t	x4DIMMs:4;	/* 23:20 */
5662869Sgavinm 		uint32_t	DisInRcvrs:1;	/* 24 */
5672869Sgavinm 		uint32_t	BypMax:3;	/* 27:25 */
5682869Sgavinm 		uint32_t	En2T:1;		/* 28 */
5692869Sgavinm 		uint32_t	UpperCSMap:1;	/* 29 */
5702869Sgavinm 		uint32_t	PwrDownCtl:2;	/* 31:30 */
5715254Sgavinm 	} _fmt_f_preF;
5722869Sgavinm 	/*
5735254Sgavinm 	 * Register format in family 0xf revisions F and G
5742869Sgavinm 	 */
5752869Sgavinm 	struct {
5762869Sgavinm 		uint32_t	InitDram:1;		/* 0 */
5772869Sgavinm 		uint32_t	ExitSelfRef:1;		/* 1 */
5782869Sgavinm 		uint32_t	reserved1:2;		/* 3:2 */
5792869Sgavinm 		uint32_t	DramTerm:2;		/* 5:4 */
5802869Sgavinm 		uint32_t	reserved2:1;		/* 6 */
5812869Sgavinm 		uint32_t	DramDrvWeak:1;		/* 7 */
5822869Sgavinm 		uint32_t	ParEn:1;		/* 8 */
5832869Sgavinm 		uint32_t	SelRefRateEn:1;		/* 9 */
5842869Sgavinm 		uint32_t	BurstLength32:1;	/* 10 */
5852869Sgavinm 		uint32_t	Width128:1;		/* 11 */
5862869Sgavinm 		uint32_t	x4DIMMs:4;		/* 15:12 */
5872869Sgavinm 		uint32_t	UnBuffDimm:1;		/* 16 */
5882869Sgavinm 		uint32_t	reserved3:2;		/* 18:17 */
5892869Sgavinm 		uint32_t	DimmEccEn:1;		/* 19 */
5902869Sgavinm 		uint32_t	reserved4:12;		/* 31:20 */
5915254Sgavinm 	} _fmt_f_revFG;
5922869Sgavinm };
5931414Scindi 
5941414Scindi /*
5952869Sgavinm  * Function 2 - DRAM Controller: DRAM Controller Miscellaneous Data
5962869Sgavinm  */
5972869Sgavinm 
5982869Sgavinm union mcreg_drammisc {
5992869Sgavinm 	uint32_t _val32;
6002869Sgavinm 	/*
6015254Sgavinm 	 * Register format in family 0xf revisions F and G
6022869Sgavinm 	 */
6032869Sgavinm 	struct {
6042869Sgavinm 		uint32_t	reserved2:1;		/* 0 */
6052869Sgavinm 		uint32_t	DisableJitter:1;	/* 1 */
6062869Sgavinm 		uint32_t	RdWrQByp:2;		/* 3:2 */
6072869Sgavinm 		uint32_t	Mod64Mux:1;		/* 4 */
6082869Sgavinm 		uint32_t	DCC_EN:1;		/* 5 */
6092869Sgavinm 		uint32_t	ILD_lmt:3;		/* 8:6 */
6102869Sgavinm 		uint32_t	DramEnabled:1;		/* 9 */
6112869Sgavinm 		uint32_t	PwrSavingsEn:1;		/* 10 */
6122869Sgavinm 		uint32_t	reserved1:13;		/* 23:11 */
6132869Sgavinm 		uint32_t	MemClkDis:8;		/* 31:24 */
6145254Sgavinm 	} _fmt_f_revFG;
6152869Sgavinm };
6162869Sgavinm 
6172869Sgavinm union mcreg_dramcfg_hi {
6182869Sgavinm 	uint32_t _val32;
6192869Sgavinm 	/*
6205254Sgavinm 	 * Register format in family 0xf revisions E and earlier.
6212869Sgavinm 	 */
6222869Sgavinm 	struct {
6232869Sgavinm 		uint32_t	AsyncLat:4;		/* 3:0 */
6242869Sgavinm 		uint32_t	reserved1:4;		/* 7:4 */
6252869Sgavinm 		uint32_t	RdPreamble:4;		/* 11:8 */
6262869Sgavinm 		uint32_t	reserved2:1;		/* 12 */
6272869Sgavinm 		uint32_t	MemDQDrvStren:2;	/* 14:13 */
6282869Sgavinm 		uint32_t	DisableJitter:1;	/* 15 */
6292869Sgavinm 		uint32_t	ILD_lmt:3;		/* 18:16 */
6302869Sgavinm 		uint32_t	DCC_EN:1;		/* 19 */
6312869Sgavinm 		uint32_t	MemClk:3;		/* 22:20 */
6322869Sgavinm 		uint32_t	reserved3:2;		/* 24:23 */
6332869Sgavinm 		uint32_t	MCR:1;			/* 25 */
6342869Sgavinm 		uint32_t	MC0_EN:1;		/* 26 */
6352869Sgavinm 		uint32_t	MC1_EN:1;		/* 27 */
6362869Sgavinm 		uint32_t	MC2_EN:1;		/* 28 */
6372869Sgavinm 		uint32_t	MC3_EN:1;		/* 29 */
6382869Sgavinm 		uint32_t	reserved4:1;		/* 30 */
6392869Sgavinm 		uint32_t	OddDivisorCorrect:1;	/* 31 */
6405254Sgavinm 	} _fmt_f_preF;
6412869Sgavinm 	/*
6425254Sgavinm 	 * Register format in family 0xf revisions F and G
6432869Sgavinm 	 */
6442869Sgavinm 	struct {
6452869Sgavinm 		uint32_t	MemClkFreq:3;		/* 2:0 */
6462869Sgavinm 		uint32_t	MemClkFreqVal:1;	/* 3 */
6472869Sgavinm 		uint32_t	MaxAsyncLat:4;		/* 7:4 */
6482869Sgavinm 		uint32_t	reserved1:4;		/* 11:8 */
6492869Sgavinm 		uint32_t	RDqsEn:1;		/* 12 */
6502869Sgavinm 		uint32_t	reserved2:1;		/* 13 */
6512869Sgavinm 		uint32_t	DisDramInterface:1;	/* 14 */
6522869Sgavinm 		uint32_t	PowerDownEn:1;		/* 15 */
6532869Sgavinm 		uint32_t	PowerDownMode:1;	/* 16 */
6542869Sgavinm 		uint32_t	FourRankSODimm:1;	/* 17 */
6552869Sgavinm 		uint32_t	FourRankRDimm:1;	/* 18 */
6562869Sgavinm 		uint32_t	reserved3:1;		/* 19 */
6572869Sgavinm 		uint32_t	SlowAccessMode:1;	/* 20 */
6582869Sgavinm 		uint32_t	reserved4:1;		/* 21 */
6592869Sgavinm 		uint32_t	BankSwizzleMode:1;	/* 22 */
6602869Sgavinm 		uint32_t	undocumented1:1;	/* 23 */
6612869Sgavinm 		uint32_t	DcqBypassMax:4;		/* 27:24 */
6622869Sgavinm 		uint32_t	FourActWindow:4;	/* 31:28 */
6635254Sgavinm 	} _fmt_f_revFG;
6642869Sgavinm };
6652869Sgavinm 
6662869Sgavinm /*
6672869Sgavinm  * Function 3 - Miscellaneous Control: Scrub Control Register
6682869Sgavinm  */
6692869Sgavinm 
6702869Sgavinm union mcreg_scrubctl {
6712869Sgavinm 	uint32_t _val32;
6722869Sgavinm 	struct {
6732869Sgavinm 		uint32_t	DramScrub:5;		/* 4:0 */
6742869Sgavinm 		uint32_t	reserved3:3;		/* 7:5 */
6752869Sgavinm 		uint32_t	L2Scrub:5;		/* 12:8 */
6762869Sgavinm 		uint32_t	reserved2:3;		/* 15:13 */
6772869Sgavinm 		uint32_t	DcacheScrub:5;		/* 20:16 */
6782869Sgavinm 		uint32_t	reserved1:11;		/* 31:21 */
6792869Sgavinm 	} _fmt_cmn;
6802869Sgavinm };
6812869Sgavinm 
6825254Sgavinm union mcreg_dramscrublo {
6835254Sgavinm 	uint32_t _val32;
6845254Sgavinm 	struct {
6855254Sgavinm 		uint32_t	ScrubReDirEn:1;		/* 0 */
6865254Sgavinm 		uint32_t	reserved:5;		/* 5:1 */
6875254Sgavinm 		uint32_t	ScrubAddrLo:26;		/* 31:6 */
6885254Sgavinm 	} _fmt_cmn;
6895254Sgavinm };
6905254Sgavinm 
6915254Sgavinm union mcreg_dramscrubhi {
6925254Sgavinm 	uint32_t _val32;
6935254Sgavinm 	struct {
6945254Sgavinm 		uint32_t	ScrubAddrHi:8;		/* 7:0 */
6955254Sgavinm 		uint32_t	reserved:24;		/* 31:8 */
6965254Sgavinm 	} _fmt_cmn;
6975254Sgavinm };
6985254Sgavinm 
6992869Sgavinm /*
7002869Sgavinm  * Function 3 - Miscellaneous Control: On-Line Spare Control Register
7011414Scindi  */
7022869Sgavinm 
7032869Sgavinm union mcreg_nbcfg {
7042869Sgavinm 	uint32_t _val32;
7052869Sgavinm 	/*
7065254Sgavinm 	 * Register format in family 0xf revisions E and earlier.
7072869Sgavinm 	 */
7082869Sgavinm 	struct {
7092869Sgavinm 		uint32_t	CpuEccErrEn:1;			/* 0 */
7102869Sgavinm 		uint32_t	CpuRdDatErrEn:1;		/* 1 */
7112869Sgavinm 		uint32_t	SyncOnUcEccEn:1;		/* 2 */
7122869Sgavinm 		uint32_t	SyncPktGenDis:1;		/* 3 */
7132869Sgavinm 		uint32_t	SyncPktPropDis:1;		/* 4 */
7142869Sgavinm 		uint32_t	IoMstAbortDis:1;		/* 5 */
7152869Sgavinm 		uint32_t	CpuErrDis:1;			/* 6 */
7162869Sgavinm 		uint32_t	IoErrDis:1;			/* 7 */
7172869Sgavinm 		uint32_t	WdogTmrDis:1;			/* 8 */
7182869Sgavinm 		uint32_t	WdogTmrCntSel:3;		/* 11:9 */
7192869Sgavinm 		uint32_t	WdogTmrBaseSel:2;		/* 13:12 */
7202869Sgavinm 		uint32_t	LdtLinkSel:2;			/* 15:14 */
7212869Sgavinm 		uint32_t	GenCrcErrByte0:1;		/* 16 */
7222869Sgavinm 		uint32_t	GenCrcErrByte1:1;		/* 17 */
7232869Sgavinm 		uint32_t	reserved1:2;			/* 19:18 */
7242869Sgavinm 		uint32_t	SyncOnWdogEn:1;			/* 20 */
7252869Sgavinm 		uint32_t	SyncOnAnyErrEn:1;		/* 21 */
7262869Sgavinm 		uint32_t	EccEn:1;			/* 22 */
7272869Sgavinm 		uint32_t	ChipKillEccEn:1;		/* 23 */
7282869Sgavinm 		uint32_t	IoRdDatErrEn:1;			/* 24 */
7292869Sgavinm 		uint32_t	DisPciCfgCpuErrRsp:1;		/* 25 */
7302869Sgavinm 		uint32_t	reserved2:1;			/* 26 */
7312869Sgavinm 		uint32_t	NbMcaToMstCpuEn:1;		/* 27 */
7322869Sgavinm 		uint32_t	reserved3:4;			/* 31:28 */
7335254Sgavinm 	} _fmt_f_preF;
7342869Sgavinm 	/*
7355254Sgavinm 	 * Register format in family 0xf revisions F and G
7362869Sgavinm 	 */
7372869Sgavinm 	struct {
7382869Sgavinm 		uint32_t	CpuEccErrEn:1;			/* 0 */
7392869Sgavinm 		uint32_t	CpuRdDatErrEn:1;		/* 1 */
7402869Sgavinm 		uint32_t	SyncOnUcEccEn:1;		/* 2 */
7412869Sgavinm 		uint32_t	SyncPktGenDis:1;		/* 3 */
7422869Sgavinm 		uint32_t	SyncPktPropDis:1;		/* 4 */
7432869Sgavinm 		uint32_t	IoMstAbortDis:1;		/* 5 */
7442869Sgavinm 		uint32_t	CpuErrDis:1;			/* 6 */
7452869Sgavinm 		uint32_t	IoErrDis:1;			/* 7 */
7462869Sgavinm 		uint32_t	WdogTmrDis:1;			/* 8 */
7472869Sgavinm 		uint32_t	WdogTmrCntSel:3;		/* 11:9 */
7482869Sgavinm 		uint32_t	WdogTmrBaseSel:2;		/* 13:12 */
7492869Sgavinm 		uint32_t	LdtLinkSel:2;			/* 15:14 */
7502869Sgavinm 		uint32_t	GenCrcErrByte0:1;		/* 16 */
7512869Sgavinm 		uint32_t	GenCrcErrByte1:1;		/* 17 */
7522869Sgavinm 		uint32_t	reserved1:2;			/* 19:18 */
7532869Sgavinm 		uint32_t	SyncOnWdogEn:1;			/* 20 */
7542869Sgavinm 		uint32_t	SyncOnAnyErrEn:1;		/* 21 */
7552869Sgavinm 		uint32_t	EccEn:1;			/* 22 */
7562869Sgavinm 		uint32_t	ChipKillEccEn:1;		/* 23 */
7572869Sgavinm 		uint32_t	IoRdDatErrEn:1;			/* 24 */
7582869Sgavinm 		uint32_t	DisPciCfgCpuErrRsp:1;		/* 25 */
7592869Sgavinm 		uint32_t	reserved2:1;			/* 26 */
7602869Sgavinm 		uint32_t	NbMcaToMstCpuEn:1;		/* 27 */
7612869Sgavinm 		uint32_t	DisTgtAbtCpuErrRsp:1;		/* 28 */
7622869Sgavinm 		uint32_t	DisMstAbtCpuErrRsp:1;		/* 29 */
7632869Sgavinm 		uint32_t	SyncOnDramAdrParErrEn:1;	/* 30 */
7642869Sgavinm 		uint32_t	reserved3:1;			/* 31 */
7652869Sgavinm 
7665254Sgavinm 	} _fmt_f_revFG;
7672869Sgavinm };
7682869Sgavinm 
7692869Sgavinm /*
7702869Sgavinm  * Function 3 - Miscellaneous Control: On-Line Spare Control Register
7712869Sgavinm  */
7722869Sgavinm 
7732869Sgavinm union mcreg_sparectl {
7742869Sgavinm 	uint32_t _val32;
7752869Sgavinm 	/*
7765254Sgavinm 	 * Register format in family 0xf revisions F and G
7772869Sgavinm 	 */
7782869Sgavinm 	struct {
7792869Sgavinm 		uint32_t	SwapEn:1;		/* 0 */
7802869Sgavinm 		uint32_t	SwapDone:1;		/* 1 */
7812869Sgavinm 		uint32_t	reserved1:2;		/* 3:2 */
7822869Sgavinm 		uint32_t	BadDramCs:3;		/* 6:4 */
7832869Sgavinm 		uint32_t	reserved2:5;		/* 11:7 */
7842869Sgavinm 		uint32_t	SwapDoneInt:2;		/* 13:12 */
7852869Sgavinm 		uint32_t	EccErrInt:2;		/* 15:14 */
7862869Sgavinm 		uint32_t	EccErrCntDramCs:3;	/* 18:16 */
7872869Sgavinm 		uint32_t	reserved3:1;		/* 19 */
7882869Sgavinm 		uint32_t	EccErrCntDramChan:1;	/* 20 */
7892869Sgavinm 		uint32_t	reserved4:2;		/* 22:21 */
7902869Sgavinm 		uint32_t	EccErrCntWrEn:1;	/* 23 */
7912869Sgavinm 		uint32_t	EccErrCnt:4;		/* 27:24 */
7922869Sgavinm 		uint32_t	reserved5:4;		/* 31:28 */
7935254Sgavinm 	} _fmt_f_revFG;
7945254Sgavinm 	/*
7955254Sgavinm 	 * Regiser format in family 0x10 revisions A and B
7965254Sgavinm 	 */
7975254Sgavinm 	struct {
7985254Sgavinm 		uint32_t	SwapEn0:1;		/* 0 */
7995254Sgavinm 		uint32_t	SwapDone0:1;		/* 1 */
8005254Sgavinm 		uint32_t	SwapEn1:1;		/* 2 */
8015254Sgavinm 		uint32_t	SwapDone1:1;		/* 3 */
8025254Sgavinm 		uint32_t	BadDramCs0:3;		/* 6:4 */
8035254Sgavinm 		uint32_t	reserved1:1;		/* 7 */
8045254Sgavinm 		uint32_t	BadDramCs1:3;		/* 10:8 */
8055254Sgavinm 		uint32_t	reserved2:1;		/* 11 */
8065254Sgavinm 		uint32_t	SwapDoneInt:2;		/* 13:12 */
8075254Sgavinm 		uint32_t	EccErrInt:2;		/* 15:14 */
8085254Sgavinm 		uint32_t	EccErrCntDramCs:4;	/* 19:16 */
8095254Sgavinm 		uint32_t	EccErrCntDramChan:2;	/* 21:20 */
8105254Sgavinm 		uint32_t	reserved4:1;		/* 22 */
8115254Sgavinm 		uint32_t	EccErrCntWrEn:1;	/* 23 */
8125254Sgavinm 		uint32_t	EccErrCnt:4;		/* 27:24 */
8135254Sgavinm 		uint32_t	LvtOffset:4;		/* 31:28 */
8145254Sgavinm 	} _fmt_10_revAB;
8152869Sgavinm };
8161414Scindi 
8175254Sgavinm /*
8185254Sgavinm  * Since the NB is on-chip some registers are also accessible as MSRs.
8195254Sgavinm  * We will represent such registers as bitfields as in the 32-bit PCI
8205254Sgavinm  * registers above, with the restriction that we must compile for 32-bit
8215254Sgavinm  * kernels and so 64-bit bitfields cannot be used.
8225254Sgavinm  */
8235254Sgavinm 
8245254Sgavinm #define	_MCMSR_FIELD(up, revsuffix, field) ((up)->_fmt_##revsuffix.field)
8255254Sgavinm 
8265254Sgavinm #define	MCMSR_VAL(up) ((up)->_val64)
8275254Sgavinm 
8285254Sgavinm #define	MCMSR_FIELD_CMN(up, field)	_MCMSR_FIELD(up, cmn, field)
8295254Sgavinm #define	MCMSR_FIELD_F_preF(up, field)	_MCMSR_FIELD(up, f_preF, field)
8305254Sgavinm #define	MCMSR_FIELD_F_revFG(up, field)	_MCMSR_FIELD(up, f_revFG, field)
8315254Sgavinm #define	MCMSR_FIELD_10_revAB(up, field)	_MCMSR_FIELD(up, 10_revAB, field)
8325254Sgavinm 
8335254Sgavinm /*
8345254Sgavinm  * The NB MISC registers.  On family 0xf rev F this was introduced with
8355254Sgavinm  * a 12-bit ECC error count of all ECC errors observed on this memory-
8365254Sgavinm  * controller (regardless of channel or chip-select) and the ability to
8375254Sgavinm  * raise an interrupt or SMI on overflow.  In family 0x10 it has a similar
8385254Sgavinm  * purpose, but the register is is split into 4 misc registers
8395254Sgavinm  * MC4_MISC{0,1,2,3} accessible via both MSRs and PCI config space;
8405254Sgavinm  * they perform thresholding for dram, l3, HT errors.
8415254Sgavinm  */
8425254Sgavinm 
8435254Sgavinm union mcmsr_nbmisc {
8445254Sgavinm 	uint64_t _val64;
8455254Sgavinm 	/*
8465254Sgavinm 	 * MSR format in family 0xf revision F and later
8475254Sgavinm 	 */
8485254Sgavinm 	struct {
8495254Sgavinm 		/*
8505254Sgavinm 		 * Lower 32 bits
8515254Sgavinm 		 */
8525254Sgavinm 		struct {
8535254Sgavinm 			uint32_t _reserved;			/* 31:0 */
8545254Sgavinm 		} _mcimisc_lo;
8555254Sgavinm 		/*
8565254Sgavinm 		 * Upper 32 bits
8575254Sgavinm 		 */
8585254Sgavinm 		struct {
8595254Sgavinm 			uint32_t _ErrCount:12;			/* 43:32 */
8605254Sgavinm 			uint32_t _reserved1:4;			/* 47:44 */
8615254Sgavinm 			uint32_t _Ovrflw:1;			/* 48 */
8625254Sgavinm 			uint32_t _IntType:2;			/* 50:49 */
8635254Sgavinm 			uint32_t _CntEn:1;			/* 51 */
8645254Sgavinm 			uint32_t _LvtOff:4;			/* 55:52 */
8655254Sgavinm 			uint32_t _reserved2:5;			/* 60:56 */
8665254Sgavinm 			uint32_t _Locked:1;			/* 61 */
8675254Sgavinm 			uint32_t _CntP:1;			/* 62 */
8685254Sgavinm 			uint32_t _Valid:1;			/* 63 */
8695254Sgavinm 		} _mcimisc_hi;
8705254Sgavinm 	} _fmt_f_revFG;
8715254Sgavinm 	/*
8725254Sgavinm 	 * MSR format in family 0x10 revisions A and B
8735254Sgavinm 	 */
8745254Sgavinm 	struct {
8755254Sgavinm 		/*
8765254Sgavinm 		 * Lower 32 bits
8775254Sgavinm 		 */
8785254Sgavinm 		struct {
8795254Sgavinm 			uint32_t _reserved:24;			/* 23:0 */
8805254Sgavinm 			uint32_t _BlkPtr:8;			/* 31:24 */
8815254Sgavinm 		} _mcimisc_lo;
8825254Sgavinm 		/*
8835254Sgavinm 		 * Upper 32 bits
8845254Sgavinm 		 */
8855254Sgavinm 		struct {
8865254Sgavinm 			uint32_t _ErrCnt:12;			/* 43:32 */
8875254Sgavinm 			uint32_t _reserved1:4;			/* 47:44 */
8885254Sgavinm 			uint32_t _Ovrflw:1;			/* 48 */
8895254Sgavinm 			uint32_t _IntType:2;			/* 50:49 */
8905254Sgavinm 			uint32_t _CntEn:1;			/* 51 */
8915254Sgavinm 			uint32_t _LvtOff:4;			/* 55:52 */
8925254Sgavinm 			uint32_t _reserved2:5;			/* 60:56 */
8935254Sgavinm 			uint32_t _Locked:1;			/* 61 */
8945254Sgavinm 			uint32_t _CntP:1;			/* 62 */
8955254Sgavinm 			uint32_t _Valid:1;			/* 63 */
8965254Sgavinm 
8975254Sgavinm 		} _mcimisc_hi;
8985254Sgavinm 	} _fmt_10_revAB;
8995254Sgavinm };
9005254Sgavinm 
9015254Sgavinm #define	mcmisc_BlkPtr	_mcimisc_lo._BlkPtr
9025254Sgavinm #define	mcmisc_ErrCount	_mcimisc_hi._ErrCount
9035254Sgavinm #define	mcmisc_Ovrflw	_mcimisc_hi._Ovrflw
9045254Sgavinm #define	mcmisc_IntType	_mcimisc_hi._IntType
9055254Sgavinm #define	mcmisc_CntEn	_mcimisc_hi._CntEn
9065254Sgavinm #define	mcmisc_LvtOff	_mcimisc_hi._LvtOff
9075254Sgavinm #define	mcmisc_Locked	_mcimisc_hi._Locked
9085254Sgavinm #define	mcmisc_CntP	_mcimisc_hi._CntP
9095254Sgavinm #define	mcmisc_Valid	_mcimisc_hi._Valid
9105254Sgavinm 
9115254Sgavinm #endif /* _BIT_FIELDS_LTOH */
9125254Sgavinm 
9131414Scindi #ifdef __cplusplus
9141414Scindi }
9151414Scindi #endif
9161414Scindi 
9171414Scindi #endif /* _MC_AMD_H */
918