xref: /illumos-gate/usr/src/uts/intel/sys/mc_amd.h (revision 7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fe)
1*7aec1d6eScindi /*
2*7aec1d6eScindi  * CDDL HEADER START
3*7aec1d6eScindi  *
4*7aec1d6eScindi  * The contents of this file are subject to the terms of the
5*7aec1d6eScindi  * Common Development and Distribution License, Version 1.0 only
6*7aec1d6eScindi  * (the "License").  You may not use this file except in compliance
7*7aec1d6eScindi  * with the License.
8*7aec1d6eScindi  *
9*7aec1d6eScindi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7aec1d6eScindi  * or http://www.opensolaris.org/os/licensing.
11*7aec1d6eScindi  * See the License for the specific language governing permissions
12*7aec1d6eScindi  * and limitations under the License.
13*7aec1d6eScindi  *
14*7aec1d6eScindi  * When distributing Covered Code, include this CDDL HEADER in each
15*7aec1d6eScindi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7aec1d6eScindi  * If applicable, add the following below this CDDL HEADER, with the
17*7aec1d6eScindi  * fields enclosed by brackets "[]" replaced with your own identifying
18*7aec1d6eScindi  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7aec1d6eScindi  *
20*7aec1d6eScindi  * CDDL HEADER END
21*7aec1d6eScindi  *
22*7aec1d6eScindi  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23*7aec1d6eScindi  * Use is subject to license terms.
24*7aec1d6eScindi  */
25*7aec1d6eScindi 
26*7aec1d6eScindi #ifndef _MC_AMD_H
27*7aec1d6eScindi #define	_MC_AMD_H
28*7aec1d6eScindi 
29*7aec1d6eScindi #pragma ident	"%Z%%M%	%I%	%E% SMI"
30*7aec1d6eScindi 
31*7aec1d6eScindi /*
32*7aec1d6eScindi  * Definitions describing various memory controller constant properties and
33*7aec1d6eScindi  * the structure of configuration registers.
34*7aec1d6eScindi  */
35*7aec1d6eScindi 
36*7aec1d6eScindi #ifdef __cplusplus
37*7aec1d6eScindi extern "C" {
38*7aec1d6eScindi #endif
39*7aec1d6eScindi 
40*7aec1d6eScindi /*
41*7aec1d6eScindi  * Configuration constants
42*7aec1d6eScindi  */
43*7aec1d6eScindi #define	MC_CHIP_NDIMM		8	/* max dimms per MC */
44*7aec1d6eScindi #define	MC_CHIP_NCS		8	/* number of chip-selects per MC */
45*7aec1d6eScindi #define	MC_CHIP_DIMMRANKMAX	4	/* largest number of ranks per dimm */
46*7aec1d6eScindi #define	MC_CHIP_DIMMPERCS	2	/* max number of dimms per cs */
47*7aec1d6eScindi #define	MC_CHIP_DIMMPAIR(csnum)	(csnum / MC_CHIP_DIMMPERCS)
48*7aec1d6eScindi 
49*7aec1d6eScindi /*
50*7aec1d6eScindi  * Encoding of chip version variations that we need to distinguish
51*7aec1d6eScindi  */
52*7aec1d6eScindi #define	MC_REV_UNKNOWN	-1u	/* unknown AMD revision */
53*7aec1d6eScindi #define	MC_REV_PRE_D	0	/* B/C/CG */
54*7aec1d6eScindi #define	MC_REV_D_E	1	/* D or E */
55*7aec1d6eScindi #define	MC_REV_F	2	/* F */
56*7aec1d6eScindi 
57*7aec1d6eScindi /*
58*7aec1d6eScindi  * BKDG 3.29 section 3.4.4.1 - DRAM base i registers
59*7aec1d6eScindi  */
60*7aec1d6eScindi #define	MC_AM_DB_DRAMBASE_MASK	0xffff0000
61*7aec1d6eScindi #define	MC_AM_DB_DRAMBASE_LSHFT	8
62*7aec1d6eScindi #define	MC_AM_DB_DRAMBASE(regval) \
63*7aec1d6eScindi 	(((uint64_t)(regval) & MC_AM_DB_DRAMBASE_MASK) << \
64*7aec1d6eScindi 	MC_AM_DB_DRAMBASE_LSHFT)
65*7aec1d6eScindi #define	MC_AM_DB_INTLVEN_MASK	0x00000700
66*7aec1d6eScindi #define	MC_AM_DB_INTLVEN_SHIFT	8
67*7aec1d6eScindi #define	MC_AM_DB_WE		0x00000002
68*7aec1d6eScindi #define	MC_AM_DB_RE		0x00000001
69*7aec1d6eScindi 
70*7aec1d6eScindi /*
71*7aec1d6eScindi  * BKDG 3.29 section 3.4.4.2 - DRAM limit i registers
72*7aec1d6eScindi  */
73*7aec1d6eScindi #define	MC_AM_DL_DRAMLIM_MASK	0xffff0000
74*7aec1d6eScindi #define	MC_AM_DL_DRAMLIM_SHIFT	16
75*7aec1d6eScindi #define	MC_AM_DL_DRAMLIM_LSHFT	8
76*7aec1d6eScindi #define	MC_AM_DL_DRAMLIM(regval) \
77*7aec1d6eScindi 	((((uint64_t)(regval) & MC_AM_DL_DRAMLIM_MASK) << \
78*7aec1d6eScindi 	MC_AM_DL_DRAMLIM_LSHFT) | ((regval) ? \
79*7aec1d6eScindi 	((1 << (MC_AM_DL_DRAMLIM_SHIFT + MC_AM_DL_DRAMLIM_LSHFT)) - 1) : 0))
80*7aec1d6eScindi #define	MC_AM_DL_INTLVSEL_MASK	0x00000700
81*7aec1d6eScindi #define	MC_AM_DL_INTLVSEL_SHIFT	8
82*7aec1d6eScindi #define	MC_AM_DL_DSTNODE_MASK	0x00000007
83*7aec1d6eScindi 
84*7aec1d6eScindi /*
85*7aec1d6eScindi  * BKDG 3.29 section 3.5.4 - DRAM CS Base Address Registers.
86*7aec1d6eScindi  *
87*7aec1d6eScindi  * MC_DC_CSB_CSBASE combines the BaseAddrHi and BaseAddrLo into a single
88*7aec1d6eScindi  * uint64_t, shifting them into the dram address bits they describe.
89*7aec1d6eScindi  */
90*7aec1d6eScindi #define	MC_DC_CSB_BASEHI_MASK	0xffe00000
91*7aec1d6eScindi #define	MC_DC_CSB_BASEHI_LSHFT	4
92*7aec1d6eScindi 
93*7aec1d6eScindi #define	MC_DC_CSB_BASELO_MASK	0x0000fe00
94*7aec1d6eScindi #define	MC_DC_CSB_BASELO_LSHFT	4
95*7aec1d6eScindi 
96*7aec1d6eScindi #define	MC_DC_CSB_CSBASE(regval) \
97*7aec1d6eScindi 	((((uint64_t)(regval) & MC_DC_CSB_BASEHI_MASK) << \
98*7aec1d6eScindi 	MC_DC_CSB_BASEHI_LSHFT) | (((uint64_t)(regval) & \
99*7aec1d6eScindi 	MC_DC_CSB_BASELO_MASK) << MC_DC_CSB_BASELO_LSHFT))
100*7aec1d6eScindi 
101*7aec1d6eScindi #define	MC_DC_CSB_CSBE		0x00000001
102*7aec1d6eScindi 
103*7aec1d6eScindi /*
104*7aec1d6eScindi  * BKDG 3.29 section 3.5.5 - DRAM CS Mask Registers.
105*7aec1d6eScindi  *
106*7aec1d6eScindi  * MC_DC_CSM_CSMASK combines the AddrMaskHi and AddrMaskLo into a single
107*7aec1d6eScindi  * uint64_t, shifting them into the dram address bit positions they mask.
108*7aec1d6eScindi  * It also fills the gaps between high and low mask and below the low mask.
109*7aec1d6eScindi  * MC_DC_CSM_UNMASKED_BITS indicates the number of high dram address bits
110*7aec1d6eScindi  * above MC_DC_CSM_MASKHI_HIBIT that cannot be masked.
111*7aec1d6eScindi  */
112*7aec1d6eScindi #define	MC_DC_CSM_MASKHI_MASK	0x3fe00000
113*7aec1d6eScindi #define	MC_DC_CSM_MASKHI_LSHFT	4
114*7aec1d6eScindi #define	MC_DC_CSM_MASKHI_LOBIT	25
115*7aec1d6eScindi #define	MC_DC_CSM_MASKHI_HIBIT	33
116*7aec1d6eScindi 
117*7aec1d6eScindi #define	MC_DC_CSM_MASKLO_MASK	0x0000fe00
118*7aec1d6eScindi #define	MC_DC_CSM_MASKLO_LOBIT	13
119*7aec1d6eScindi #define	MC_DC_CSM_MASKLO_HIBIT	19
120*7aec1d6eScindi #define	MC_DC_CSM_MASKLO_LSHFT	4
121*7aec1d6eScindi 
122*7aec1d6eScindi #define	MC_DC_CSM_MASKFILL	0x1f01fff	/* [24:20] and [12:0] */
123*7aec1d6eScindi 
124*7aec1d6eScindi #define	MC_DC_CSM_UNMASKED_BITS	2
125*7aec1d6eScindi 
126*7aec1d6eScindi #define	MC_DC_CSM_CSMASK(regval) \
127*7aec1d6eScindi 	((((uint64_t)(regval) & MC_DC_CSM_MASKHI_MASK) << \
128*7aec1d6eScindi 	MC_DC_CSM_MASKHI_LSHFT) | (((uint64_t)(regval) & \
129*7aec1d6eScindi 	MC_DC_CSM_MASKLO_MASK) << MC_DC_CSM_MASKLO_LSHFT) | \
130*7aec1d6eScindi 	MC_DC_CSM_MASKFILL)
131*7aec1d6eScindi 
132*7aec1d6eScindi /*
133*7aec1d6eScindi  * BKDG 3.29 section 3.5.6 - DRAM Bank Address Mapping Register
134*7aec1d6eScindi  */
135*7aec1d6eScindi #define	MC_DC_BAM_CSBANK_MASK	0x0000000f
136*7aec1d6eScindi #define	MC_DC_BAM_CSBANK_SHIFT	4
137*7aec1d6eScindi #define	MC_DC_BAM_CSBANK_SWIZZLE 0x40000000
138*7aec1d6eScindi 
139*7aec1d6eScindi /*
140*7aec1d6eScindi  * BKDG 3.29 section 3.4.8 - DRAM Hole register, revs E and later
141*7aec1d6eScindi  */
142*7aec1d6eScindi #define	MC_DC_HOLE_VALID		0x00000001
143*7aec1d6eScindi #define	MC_DC_HOLE_OFFSET_MASK		0x0000ff00
144*7aec1d6eScindi #define	MC_DC_HOLE_OFFSET_LSHIFT	16
145*7aec1d6eScindi 
146*7aec1d6eScindi /*
147*7aec1d6eScindi  * BKDG 3.29 section 3.5.11  - DRAM configuration high and low registers.
148*7aec1d6eScindi  * The following defines may be applied to a uint64_t made by
149*7aec1d6eScindi  * concatenating those two 32-bit registers.
150*7aec1d6eScindi  */
151*7aec1d6eScindi #define	MC_DC_DCFG_DLL_DIS		0x0000000000000001
152*7aec1d6eScindi #define	MC_DC_DCFG_D_DRV		0x0000000000000002
153*7aec1d6eScindi #define	MC_DC_DCFG_QFC_EN		0x0000000000000004
154*7aec1d6eScindi #define	MC_DC_DCFG_DISDQSYS		0x0000000000000008
155*7aec1d6eScindi #define	MC_DC_DCFG_BURST2OPT		0x0000000000000020
156*7aec1d6eScindi #define	MC_DC_DCFG_MOD64BITMUX		0x0000000000000040
157*7aec1d6eScindi #define	MC_DC_DCFG_PWRDWNTRIEN		0x0000000000000080 /* >= rev E */
158*7aec1d6eScindi #define	MC_DC_DCFG_SCRATCHBIT		0x0000000000000080 /* <= rev D */
159*7aec1d6eScindi #define	MC_DC_DCFG_DRAMINIT		0x0000000000000100
160*7aec1d6eScindi #define	MC_DC_DCFG_DUALDIMMEN		0x0000000000000200
161*7aec1d6eScindi #define	MC_DC_DCFG_DRAMENABLE		0x0000000000000400
162*7aec1d6eScindi #define	MC_DC_DCFG_MEMCLRSTATUS		0x0000000000000800
163*7aec1d6eScindi #define	MC_DC_DCFG_ESR			0x0000000000001000
164*7aec1d6eScindi #define	MC_DC_DCFG_SR_S			0x0000000000002000
165*7aec1d6eScindi #define	MC_DC_DCFG_RDWRQBYP_MASK	0x000000000000c000
166*7aec1d6eScindi #define	MC_DC_DCFG_128			0x0000000000010000
167*7aec1d6eScindi #define	MC_DC_DCFG_DIMMECEN		0x0000000000020000
168*7aec1d6eScindi #define	MC_DC_DCFG_UNBUFFDIMM		0x0000000000040000
169*7aec1d6eScindi #define	MC_DC_DCFG_32BYTEEN		0x0000000000080000
170*7aec1d6eScindi #define	MC_DC_DCFG_X4DIMMS_MASK		0x0000000000f00000
171*7aec1d6eScindi #define	MC_DC_DCFG_X4DIMMS_SHIFT	20
172*7aec1d6eScindi #define	MC_DC_DCFG_DISINRCVRS		0x0000000001000000
173*7aec1d6eScindi #define	MC_DC_DCFG_BYPMAX_MASK		0x000000000e000000
174*7aec1d6eScindi #define	MC_DC_DCFG_EN2T			0x0000000010000000
175*7aec1d6eScindi #define	MC_DC_DCFG_UPPERCSMAP		0x0000000020000000
176*7aec1d6eScindi #define	MC_DC_DCFG_PWRDOWNCTL_MASK	0x00000000c0000000
177*7aec1d6eScindi #define	MC_DC_DCFG_ASYNCLAT_MASK	0x0000000f00000000
178*7aec1d6eScindi #define	MC_DC_DCFG_RDPREAMBLE_MASK	0x00000f0000000000
179*7aec1d6eScindi #define	MC_DC_DCFG_MEMDQDRVSTREN_MASK	0x0000600000000000
180*7aec1d6eScindi #define	MC_DC_DCFG_DISABLEJITTER	0x0000800000000000
181*7aec1d6eScindi #define	MC_DC_DCFG_ILD_LMT_MASK		0x0007000000000000
182*7aec1d6eScindi #define	MC_DC_DCFG_ECC_EN		0x0008000000000000
183*7aec1d6eScindi #define	MC_DC_DCFG_MEMCLK_MASK		0x0070000000000000
184*7aec1d6eScindi #define	MC_DC_DCFG_MCR			0x0200000000000000
185*7aec1d6eScindi #define	MC_DC_DCFG_MC0_EN		0x0400000000000000
186*7aec1d6eScindi #define	MC_DC_DCFG_MC1_EN		0x0800000000000000
187*7aec1d6eScindi #define	MC_DC_DCFG_MC2_EN		0x1000000000000000
188*7aec1d6eScindi #define	MC_DC_DCFG_MC3_EN		0x2000000000000000
189*7aec1d6eScindi #define	MC_DC_DCFG_ODDDIVISORCORRECT	0x8000000000000000
190*7aec1d6eScindi 
191*7aec1d6eScindi #ifdef __cplusplus
192*7aec1d6eScindi }
193*7aec1d6eScindi #endif
194*7aec1d6eScindi 
195*7aec1d6eScindi #endif /* _MC_AMD_H */
196