xref: /titanic_51/usr/src/uts/intel/io/mc-amd/mcamd_dimmcfg.c (revision e4b86885570d77af552e9cf94f142f4d744fb8c8)
1*e4b86885SCheng Sean Ye /*
2*e4b86885SCheng Sean Ye  * CDDL HEADER START
3*e4b86885SCheng Sean Ye  *
4*e4b86885SCheng Sean Ye  * The contents of this file are subject to the terms of the
5*e4b86885SCheng Sean Ye  * Common Development and Distribution License (the "License").
6*e4b86885SCheng Sean Ye  * You may not use this file except in compliance with the License.
7*e4b86885SCheng Sean Ye  *
8*e4b86885SCheng Sean Ye  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*e4b86885SCheng Sean Ye  * or http://www.opensolaris.org/os/licensing.
10*e4b86885SCheng Sean Ye  * See the License for the specific language governing permissions
11*e4b86885SCheng Sean Ye  * and limitations under the License.
12*e4b86885SCheng Sean Ye  *
13*e4b86885SCheng Sean Ye  * When distributing Covered Code, include this CDDL HEADER in each
14*e4b86885SCheng Sean Ye  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*e4b86885SCheng Sean Ye  * If applicable, add the following below this CDDL HEADER, with the
16*e4b86885SCheng Sean Ye  * fields enclosed by brackets "[]" replaced with your own identifying
17*e4b86885SCheng Sean Ye  * information: Portions Copyright [yyyy] [name of copyright owner]
18*e4b86885SCheng Sean Ye  *
19*e4b86885SCheng Sean Ye  * CDDL HEADER END
20*e4b86885SCheng Sean Ye  */
21*e4b86885SCheng Sean Ye 
22*e4b86885SCheng Sean Ye /*
23*e4b86885SCheng Sean Ye  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24*e4b86885SCheng Sean Ye  * Use is subject to license terms.
25*e4b86885SCheng Sean Ye  */
26*e4b86885SCheng Sean Ye 
27*e4b86885SCheng Sean Ye #include <sys/types.h>
28*e4b86885SCheng Sean Ye #include <sys/cmn_err.h>
29*e4b86885SCheng Sean Ye #include <mcamd_dimmcfg_impl.h>
30*e4b86885SCheng Sean Ye 
31*e4b86885SCheng Sean Ye /*
32*e4b86885SCheng Sean Ye  * We have built a list of the active csbase/csmask pairs, and now we want
33*e4b86885SCheng Sean Ye  * to associate those active chip-selects with actual dimms.  To achieve this
34*e4b86885SCheng Sean Ye  * we must map the csbase/csmask pair to an associated logical DIMM and
35*e4b86885SCheng Sean Ye  * chip-select line.
36*e4b86885SCheng Sean Ye  *
37*e4b86885SCheng Sean Ye  * A logical DIMM comprises up to 2 physical dimms as follows:
38*e4b86885SCheng Sean Ye  *
39*e4b86885SCheng Sean Ye  *	- in 64-bit mode without mismatched dimm support logical DIMMs are
40*e4b86885SCheng Sean Ye  *	  made up of just one physical dimm situated in a "lodimm" slot
41*e4b86885SCheng Sean Ye  *	  on channel A;  the corresponding slot on channel B (if there is
42*e4b86885SCheng Sean Ye  *	  a channel B) must be empty or will be disabled if populated.
43*e4b86885SCheng Sean Ye  *
44*e4b86885SCheng Sean Ye  *	- in 64-bit mode with mismatched dimm support a logical DIMM may
45*e4b86885SCheng Sean Ye  *	  be made up of 1 or 2 physical dimms - one on channel A and another
46*e4b86885SCheng Sean Ye  *	  in the corresponding slot on channel B.  They are accessed
47*e4b86885SCheng Sean Ye  *	  independently.
48*e4b86885SCheng Sean Ye  *
49*e4b86885SCheng Sean Ye  *	- in 128 bit mode a logical DIMM is made up of two physical dimms -
50*e4b86885SCheng Sean Ye  *	  a pair of one slot on channel A and its partner on channel B.
51*e4b86885SCheng Sean Ye  *	  The lodimm on channel A provides data [63:0] while the updimm
52*e4b86885SCheng Sean Ye  *	  on channel B provides data [127:64].  The two dimms must be
53*e4b86885SCheng Sean Ye  *	  identical in size and organisation (number of ranks etc).
54*e4b86885SCheng Sean Ye  *
55*e4b86885SCheng Sean Ye  * The following tables are derived from the corresponding
56*e4b86885SCheng Sean Ye  * "DRAM CS Base and DRAM CS Mask Registers" with and without mismatched
57*e4b86885SCheng Sean Ye  * dimm support tables of the BKDG (tables 5 and 6 of BKDG 3.31 for rev E
58*e4b86885SCheng Sean Ye  * and earlier; tables 8 and 9 of BKDG 3.01 for rev F and G).  They could
59*e4b86885SCheng Sean Ye  * be implemented programatically, but are more readily reviewed for correctness
60*e4b86885SCheng Sean Ye  * presented as tables.
61*e4b86885SCheng Sean Ye  *
62*e4b86885SCheng Sean Ye  * When we observe a given chip-select base/mask pair to be enabled in a
63*e4b86885SCheng Sean Ye  * system configuration we lookup in the following tables to match on
64*e4b86885SCheng Sean Ye  * all of base register pair number, processor revision, socket type
65*e4b86885SCheng Sean Ye  * and dram configuration (e.g., quadrank registered or not); the remainder
66*e4b86885SCheng Sean Ye  * of the matched line provides the corresponding logical dimm (ldimm)
67*e4b86885SCheng Sean Ye  * number that the chip-select is to be associated with and details of
68*e4b86885SCheng Sean Ye  * which chip-select line is used to operate that chip-select (specified
69*e4b86885SCheng Sean Ye  * as a (channel, slot-number, rank-number) triple.  With this
70*e4b86885SCheng Sean Ye  * information we determine the topology instance number of each physical
71*e4b86885SCheng Sean Ye  * DIMM.  There are three distinct cases to consider:
72*e4b86885SCheng Sean Ye  *
73*e4b86885SCheng Sean Ye  * 128-bit MC mode:
74*e4b86885SCheng Sean Ye  *
75*e4b86885SCheng Sean Ye  *	The lodimm (channel A) and updimm (channel B) dimm in a pair
76*e4b86885SCheng Sean Ye  *	have instance numbers 2 * ldimm and 2 * ldimm + 1, i.e.
77*e4b86885SCheng Sean Ye  *	0/1, 2/3, 4/5, 5/6 for ldimm = 0, 1, 2, 3 (ldimms 2 and 3
78*e4b86885SCheng Sean Ye  *	are only supported for socket 940 and socket F(1207).
79*e4b86885SCheng Sean Ye  *
80*e4b86885SCheng Sean Ye  * 64-bit MC mode, no mismatched dimm support:
81*e4b86885SCheng Sean Ye  *
82*e4b86885SCheng Sean Ye  *	All dimms reside on channel A.  If there is a channel B
83*e4b86885SCheng Sean Ye  *	(anything other than socket 754) then any DIMMs on it will
84*e4b86885SCheng Sean Ye  *	not be configured into the system.  We number as for
85*e4b86885SCheng Sean Ye  *	128-bit mode but omiting the channel B DIMMs, i.e.
86*e4b86885SCheng Sean Ye  *	0, 2, 4, 6 for ldimm = 0, 1, 2, 3.
87*e4b86885SCheng Sean Ye  *
88*e4b86885SCheng Sean Ye  * 64-bit MC mode, mismatched dimm support enabled:
89*e4b86885SCheng Sean Ye  *
90*e4b86885SCheng Sean Ye  *	Each rank of every DIMM is treated as a separate logical
91*e4b86885SCheng Sean Ye  *	dimm, so while the package (939 or AM2) only supports two
92*e4b86885SCheng Sean Ye  *	DIMMS per channel and normally logical dimms 2 and 3
93*e4b86885SCheng Sean Ye  *	would not be supported they do spring into existence in this
94*e4b86885SCheng Sean Ye  *	special mode.
95*e4b86885SCheng Sean Ye  *
96*e4b86885SCheng Sean Ye  * Because of the mismatched DIMM support case we cannot derive
97*e4b86885SCheng Sean Ye  * instance number from logical dimm number alone.  For that case we use the
98*e4b86885SCheng Sean Ye  * slot number on the channel - that tracks the ldimm except in the
99*e4b86885SCheng Sean Ye  * mismatched case.  This provides consistent instance numbering
100*e4b86885SCheng Sean Ye  * even for a system cycled through each of the above configurations -
101*e4b86885SCheng Sean Ye  * the instance dimm remains the same for a given channel and slot
102*e4b86885SCheng Sean Ye  * number.
103*e4b86885SCheng Sean Ye  *
104*e4b86885SCheng Sean Ye  * When quadrank DIMMs - quadrank registered or quadrank SODIMM - are in
105*e4b86885SCheng Sean Ye  * use we must always base the instance number off of the ldimm regardless
106*e4b86885SCheng Sean Ye  * of mismatched DIMM support.
107*e4b86885SCheng Sean Ye  */
108*e4b86885SCheng Sean Ye 
109*e4b86885SCheng Sean Ye #define	MCAMD_TOPONUM(ldimm, cslp, quadrank, mod64mux) \
110*e4b86885SCheng Sean Ye 	(((quadrank) || !(mod64mux)) ? \
111*e4b86885SCheng Sean Ye 	2 * (ldimm) + ((cslp)->csl_chan == CH_B) : \
112*e4b86885SCheng Sean Ye 	2 * (cslp)->csl_slot + ((cslp)->csl_chan == CH_B))
113*e4b86885SCheng Sean Ye 
114*e4b86885SCheng Sean Ye /* BEGIN CSTYLED */
115*e4b86885SCheng Sean Ye 
116*e4b86885SCheng Sean Ye /*
117*e4b86885SCheng Sean Ye  * Revision E and earlier mapping with mismatched dimm support disabled.
118*e4b86885SCheng Sean Ye  */
119*e4b86885SCheng Sean Ye static const struct mcdcfg_csmapline csmap_nomod64mux_preF[] = {
120*e4b86885SCheng Sean Ye     /*
121*e4b86885SCheng Sean Ye      * Pkgs   base dramconfig	     ldimm   cs A              cs B
122*e4b86885SCheng Sean Ye      *
123*e4b86885SCheng Sean Ye      * Base reg 0 (mask 0)
124*e4b86885SCheng Sean Ye      */
125*e4b86885SCheng Sean Ye     { SKT_ALL,	0, DCFG_ALL,		0, { { CH_A, 0, 0 }, { CH_B, 0, 0 } } },
126*e4b86885SCheng Sean Ye     /*
127*e4b86885SCheng Sean Ye      * Base reg 1 (mask 1)
128*e4b86885SCheng Sean Ye      */
129*e4b86885SCheng Sean Ye     { SKT_ALL,	1, DCFG_ALL,		0, { { CH_A, 0, 1 }, { CH_B, 0, 1 } } },
130*e4b86885SCheng Sean Ye     /*
131*e4b86885SCheng Sean Ye      * Base reg 2 (mask 2)
132*e4b86885SCheng Sean Ye      */
133*e4b86885SCheng Sean Ye     { SKT_ALL,	2, DCFG_ALL,		1, { { CH_A, 1, 0 }, { CH_B, 1, 0 } } },
134*e4b86885SCheng Sean Ye     /*
135*e4b86885SCheng Sean Ye      * Base reg 3 (mask 3)
136*e4b86885SCheng Sean Ye      */
137*e4b86885SCheng Sean Ye     { SKT_ALL,	3, DCFG_ALL,		1, { { CH_A, 1, 1 }, { CH_B, 1, 1 } } },
138*e4b86885SCheng Sean Ye     /*
139*e4b86885SCheng Sean Ye      * Base reg 4 (mask 4)
140*e4b86885SCheng Sean Ye      */
141*e4b86885SCheng Sean Ye     { SKT_754,	4, DCFG_N,		2, { { CH_A, 2, 0 } } },
142*e4b86885SCheng Sean Ye     { SKT_940,	4, DCFG_N,		2, { { CH_A, 2, 0 }, { CH_B, 2, 0 } } },
143*e4b86885SCheng Sean Ye     { SKT_940,	4, DCFG_R4,		0, { { CH_A, 2, 0 }, { CH_B, 2, 0 } } },
144*e4b86885SCheng Sean Ye     /*
145*e4b86885SCheng Sean Ye      * Base reg 5 (mask 5)
146*e4b86885SCheng Sean Ye      */
147*e4b86885SCheng Sean Ye     { SKT_754,	5, DCFG_N,		2, { { CH_A, 2, 1 } } },
148*e4b86885SCheng Sean Ye     { SKT_940,	5, DCFG_N,		2, { { CH_A, 2, 1 }, { CH_B, 2, 1 } } },
149*e4b86885SCheng Sean Ye     { SKT_940,	5, DCFG_R4,		0, { { CH_A, 2, 1 }, { CH_B, 2, 1 } } },
150*e4b86885SCheng Sean Ye     /*
151*e4b86885SCheng Sean Ye      * Base reg 6 (mask 6)
152*e4b86885SCheng Sean Ye      */
153*e4b86885SCheng Sean Ye     { SKT_754,	6, DCFG_N,		3, { { CH_A, 3, 0 } } },
154*e4b86885SCheng Sean Ye     { SKT_940,	6, DCFG_N,		3, { { CH_A, 3, 0 }, { CH_B, 3, 0 } } },
155*e4b86885SCheng Sean Ye     { SKT_940,	6, DCFG_R4,		1, { { CH_A, 3, 0 }, { CH_B, 3, 0 } } },
156*e4b86885SCheng Sean Ye     /*
157*e4b86885SCheng Sean Ye      * Base reg 7 (mask 7)
158*e4b86885SCheng Sean Ye      */
159*e4b86885SCheng Sean Ye     { SKT_754,	7, DCFG_N,		3, { { CH_A, 3, 1 } } },
160*e4b86885SCheng Sean Ye     { SKT_940,	7, DCFG_N,		3, { { CH_A, 3, 1 }, { CH_B, 3, 1 } } },
161*e4b86885SCheng Sean Ye     { SKT_940,	7, DCFG_R4,		1, { { CH_A, 3, 1 }, { CH_B, 3, 1 } } }
162*e4b86885SCheng Sean Ye };
163*e4b86885SCheng Sean Ye 
164*e4b86885SCheng Sean Ye /*
165*e4b86885SCheng Sean Ye  * Revision E and earlier mapping with mismatched dimm support.
166*e4b86885SCheng Sean Ye  * Mismatched dimm support applies only to the socket 939 package.
167*e4b86885SCheng Sean Ye  * Socket 939 does not support registered dimms, so quadrank RDIMMs are
168*e4b86885SCheng Sean Ye  * not an issue here.
169*e4b86885SCheng Sean Ye  */
170*e4b86885SCheng Sean Ye static const struct mcdcfg_csmapline csmap_mod64mux_preF[] = {
171*e4b86885SCheng Sean Ye     /*
172*e4b86885SCheng Sean Ye      * Pkgs   base dramconfig	     ldimm   cs A              cs B
173*e4b86885SCheng Sean Ye      *
174*e4b86885SCheng Sean Ye      * Base reg 0 (mask 0)
175*e4b86885SCheng Sean Ye      */
176*e4b86885SCheng Sean Ye     { SKT_939,	0, DCFG_N,		0, { { CH_A, 0, 0 } } },
177*e4b86885SCheng Sean Ye     /*
178*e4b86885SCheng Sean Ye      * Base reg 1 (mask 1)
179*e4b86885SCheng Sean Ye      */
180*e4b86885SCheng Sean Ye     { SKT_939,	1, DCFG_N,		0, { { CH_A, 0, 1 } } },
181*e4b86885SCheng Sean Ye     /*
182*e4b86885SCheng Sean Ye      * Base reg 2 (mask 2)
183*e4b86885SCheng Sean Ye      */
184*e4b86885SCheng Sean Ye     { SKT_939,	2, DCFG_N,		1, { { CH_A, 1, 0 } } },
185*e4b86885SCheng Sean Ye     /*
186*e4b86885SCheng Sean Ye      * Base reg 3 (mask 3)
187*e4b86885SCheng Sean Ye      */
188*e4b86885SCheng Sean Ye     { SKT_939,	3, DCFG_N,		1, { { CH_A, 1, 1 } } },
189*e4b86885SCheng Sean Ye     /*
190*e4b86885SCheng Sean Ye      * Base reg 4 (mask 4)
191*e4b86885SCheng Sean Ye      */
192*e4b86885SCheng Sean Ye     { SKT_939,	4, DCFG_N,		2, { { CH_B, 0, 0 } } },
193*e4b86885SCheng Sean Ye     /*
194*e4b86885SCheng Sean Ye      * Base reg 5 (mask 5)
195*e4b86885SCheng Sean Ye      */
196*e4b86885SCheng Sean Ye     { SKT_939,	5, DCFG_N,		2, { { CH_B, 0, 1 } } },
197*e4b86885SCheng Sean Ye     /*
198*e4b86885SCheng Sean Ye      * Base reg 6 (mask 6)
199*e4b86885SCheng Sean Ye      */
200*e4b86885SCheng Sean Ye     { SKT_939,	6, DCFG_N,		3, { { CH_B, 1, 0 } } },
201*e4b86885SCheng Sean Ye     /*
202*e4b86885SCheng Sean Ye      * Base reg 7 (mask 7)
203*e4b86885SCheng Sean Ye      */
204*e4b86885SCheng Sean Ye     { SKT_939,	7, DCFG_N,		3, { { CH_B, 1, 1 } } }
205*e4b86885SCheng Sean Ye };
206*e4b86885SCheng Sean Ye 
207*e4b86885SCheng Sean Ye /*
208*e4b86885SCheng Sean Ye  * Rev F and G csbase/csmask to logical DIMM and cs line mappings.
209*e4b86885SCheng Sean Ye  *
210*e4b86885SCheng Sean Ye  * We can reduce the tables by a few lines by taking into account which
211*e4b86885SCheng Sean Ye  * DIMM types are supported by the different package types:
212*e4b86885SCheng Sean Ye  *
213*e4b86885SCheng Sean Ye  *		Number of dimms of given type supported per dram channel
214*e4b86885SCheng Sean Ye  * Package	Reg'd DIMM	4-rank reg'd	Unbuffered	SO-DIMMs
215*e4b86885SCheng Sean Ye  * F(1207)	4		2		0		0
216*e4b86885SCheng Sean Ye  * AM2		0		0		2		1
217*e4b86885SCheng Sean Ye  * S1g1		0		0		0		1
218*e4b86885SCheng Sean Ye  */
219*e4b86885SCheng Sean Ye 
220*e4b86885SCheng Sean Ye /*
221*e4b86885SCheng Sean Ye  * NPT (rev F & G) mapping with mismatched dimm support disabled.
222*e4b86885SCheng Sean Ye  */
223*e4b86885SCheng Sean Ye static const struct mcdcfg_csmapline csmap_nomod64mux_fg[] = {
224*e4b86885SCheng Sean Ye     /*
225*e4b86885SCheng Sean Ye      * Pkgs   base dramconfig	     ldimm   cs A              cs B
226*e4b86885SCheng Sean Ye      *
227*e4b86885SCheng Sean Ye      * Base reg 0 (mask 0)
228*e4b86885SCheng Sean Ye      */
229*e4b86885SCheng Sean Ye     { SKT_NPT,	0, DCFG_ALLNPT,		0, { { CH_A, 0, 0 }, { CH_B, 0, 0 } } },
230*e4b86885SCheng Sean Ye     /*
231*e4b86885SCheng Sean Ye      * Base reg 1 (mask 0)
232*e4b86885SCheng Sean Ye      */
233*e4b86885SCheng Sean Ye     { SKT_NPT,	1, DCFG_ALLNPT,		0, { { CH_A, 0, 1 }, { CH_B, 0, 1 } } },
234*e4b86885SCheng Sean Ye     /*
235*e4b86885SCheng Sean Ye      * Base reg 2 (mask 1)
236*e4b86885SCheng Sean Ye      */
237*e4b86885SCheng Sean Ye     { AM2F1207,	2, DCFG_N | DCFG_R4,	1, { { CH_A, 1, 0 }, { CH_B, 1, 0 } } },
238*e4b86885SCheng Sean Ye     { AM2,	2, DCFG_S4,		0, { { CH_A, 1, 0 }, { CH_B, 1, 0 } } },
239*e4b86885SCheng Sean Ye     { S1g1,	2, DCFG_N,		1, { { CH_A, 0, 2 }, { CH_B, 0, 2 } } },
240*e4b86885SCheng Sean Ye     { S1g1,	2, DCFG_S4,		0, { { CH_A, 0, 2 }, { CH_B, 0, 2 } } },
241*e4b86885SCheng Sean Ye     /*
242*e4b86885SCheng Sean Ye      * Base reg 3 (mask 1)
243*e4b86885SCheng Sean Ye      */
244*e4b86885SCheng Sean Ye     { AM2F1207,	3, DCFG_N | DCFG_R4,	1, { { CH_A, 1, 1 }, { CH_B, 1, 1 } } },
245*e4b86885SCheng Sean Ye     { AM2,	3, DCFG_S4,		0, { { CH_A, 1, 1 }, { CH_B, 1, 1 } } },
246*e4b86885SCheng Sean Ye     { S1g1,	3, DCFG_N,		1, { { CH_A, 0, 3 }, { CH_B, 0, 3 } } },
247*e4b86885SCheng Sean Ye     { S1g1,	3, DCFG_S4,		0, { { CH_A, 0, 3 }, { CH_B, 0, 3 } } },
248*e4b86885SCheng Sean Ye     /*
249*e4b86885SCheng Sean Ye      * Base reg 4 (mask 2)
250*e4b86885SCheng Sean Ye      */
251*e4b86885SCheng Sean Ye     { F1207,	4, DCFG_N,		2, { { CH_A, 2, 0 }, { CH_B, 2, 0 } } },
252*e4b86885SCheng Sean Ye     { F1207,	4, DCFG_R4,		0, { { CH_A, 2, 0 }, { CH_B, 2, 0 } } },
253*e4b86885SCheng Sean Ye     /*
254*e4b86885SCheng Sean Ye      * Base reg 5 (mask 2)
255*e4b86885SCheng Sean Ye      */
256*e4b86885SCheng Sean Ye     { F1207,	5, DCFG_N,		2, { { CH_A, 2, 1 }, { CH_B, 2, 1 } } },
257*e4b86885SCheng Sean Ye     { F1207,	5, DCFG_R4,		0, { { CH_A, 2, 1 }, { CH_B, 2, 1 } } },
258*e4b86885SCheng Sean Ye     /*
259*e4b86885SCheng Sean Ye      * Base reg 6 (mask 3)
260*e4b86885SCheng Sean Ye      */
261*e4b86885SCheng Sean Ye     { F1207,	6, DCFG_N,		3, { { CH_A, 3, 0 }, { CH_B, 3, 0 } } },
262*e4b86885SCheng Sean Ye     { F1207,	6, DCFG_R4,		1, { { CH_A, 3, 0 }, { CH_B, 3, 0 } } },
263*e4b86885SCheng Sean Ye     /*
264*e4b86885SCheng Sean Ye      * Base reg 7 (mask 3)
265*e4b86885SCheng Sean Ye      */
266*e4b86885SCheng Sean Ye     { F1207,	7, DCFG_N,		3, { { CH_A, 3, 1 }, { CH_B, 3, 1 } } },
267*e4b86885SCheng Sean Ye     { F1207,	7, DCFG_R4,		1, { { CH_A, 3, 1 }, { CH_B, 3, 1 } } }
268*e4b86885SCheng Sean Ye };
269*e4b86885SCheng Sean Ye 
270*e4b86885SCheng Sean Ye /*
271*e4b86885SCheng Sean Ye  * NPT (rev F & G) mapping with mismatched dimm support.
272*e4b86885SCheng Sean Ye  * Mismatched dimm support applies only to the AM2 and S1g1 packages.
273*e4b86885SCheng Sean Ye  * AM2 and S1g1 do not support registered dimms.
274*e4b86885SCheng Sean Ye  */
275*e4b86885SCheng Sean Ye static const struct mcdcfg_csmapline csmap_mod64mux_fg[] = {
276*e4b86885SCheng Sean Ye     /*
277*e4b86885SCheng Sean Ye      * Pkgs   base dramconfig	     ldimm   cs A              cs B
278*e4b86885SCheng Sean Ye      *
279*e4b86885SCheng Sean Ye      * Base reg 0 (mask 0)
280*e4b86885SCheng Sean Ye      */
281*e4b86885SCheng Sean Ye     { AM2S1g1,	0, DCFG_N | DCFG_S4,	0, { { CH_A, 0, 0 } } },
282*e4b86885SCheng Sean Ye     /*
283*e4b86885SCheng Sean Ye      * Base reg 1 (mask 0)
284*e4b86885SCheng Sean Ye      */
285*e4b86885SCheng Sean Ye     { AM2S1g1,	1, DCFG_N | DCFG_S4,	0, { { CH_A, 0, 1 } } },
286*e4b86885SCheng Sean Ye     /*
287*e4b86885SCheng Sean Ye      * Base reg 2 (mask 1)
288*e4b86885SCheng Sean Ye      */
289*e4b86885SCheng Sean Ye     { AM2,	2, DCFG_N,		1, { { CH_A, 1, 0 } } },
290*e4b86885SCheng Sean Ye     { AM2,	2, DCFG_S4,		0, { { CH_A, 1, 0 } } },
291*e4b86885SCheng Sean Ye     { S1g1,	2, DCFG_N,		1, { { CH_A, 0, 2 } } },
292*e4b86885SCheng Sean Ye     { S1g1,	2, DCFG_S4,		0, { { CH_A, 0, 2 } } },
293*e4b86885SCheng Sean Ye     /*
294*e4b86885SCheng Sean Ye      * Base reg 3 (mask 1)
295*e4b86885SCheng Sean Ye      */
296*e4b86885SCheng Sean Ye     { AM2,	3, DCFG_N,		1, { { CH_A, 1, 1 } } },
297*e4b86885SCheng Sean Ye     { AM2,	3, DCFG_S4,		0, { { CH_A, 1, 1 } } },
298*e4b86885SCheng Sean Ye     { S1g1,	3, DCFG_N,		1, { { CH_A, 0, 3 } } },
299*e4b86885SCheng Sean Ye     { S1g1,	3, DCFG_S4,		0, { { CH_A, 0, 3 } } },
300*e4b86885SCheng Sean Ye     /*
301*e4b86885SCheng Sean Ye      * Base reg 4 (mask 2)
302*e4b86885SCheng Sean Ye      */
303*e4b86885SCheng Sean Ye     { AM2S1g1,	4, DCFG_N,		2, { { CH_B, 0, 0 } } },
304*e4b86885SCheng Sean Ye     { AM2S1g1,	4, DCFG_S4,		1, { { CH_B, 0, 0 } } },
305*e4b86885SCheng Sean Ye     /*
306*e4b86885SCheng Sean Ye      * Base reg 5 (mask 2)
307*e4b86885SCheng Sean Ye      */
308*e4b86885SCheng Sean Ye     { AM2S1g1,	5, DCFG_N,		2, { { CH_B, 0, 1 } } },
309*e4b86885SCheng Sean Ye     { AM2S1g1,	5, DCFG_S4,		1, { { CH_B, 0, 1 } } },
310*e4b86885SCheng Sean Ye     /*
311*e4b86885SCheng Sean Ye      * Base reg 6 (mask 3)
312*e4b86885SCheng Sean Ye      */
313*e4b86885SCheng Sean Ye     { AM2,	6, DCFG_N,		3, { { CH_B, 1, 0 } } },
314*e4b86885SCheng Sean Ye     { AM2,	6, DCFG_S4,		1, { { CH_B, 1, 0 } } },
315*e4b86885SCheng Sean Ye     { S1g1,	6, DCFG_N,		3, { { CH_B, 0, 2 } } },
316*e4b86885SCheng Sean Ye     { S1g1,	6, DCFG_S4,		1, { { CH_B, 0, 2 } } },
317*e4b86885SCheng Sean Ye     /*
318*e4b86885SCheng Sean Ye      * Base reg 7 (mask 3)
319*e4b86885SCheng Sean Ye      */
320*e4b86885SCheng Sean Ye     { AM2,	7, DCFG_N,		3, { { CH_B, 1, 1 } } },
321*e4b86885SCheng Sean Ye     { AM2,	7, DCFG_S4,		1, { { CH_B, 1, 1 } } },
322*e4b86885SCheng Sean Ye     { S1g1,	7, DCFG_N,		3, { { CH_B, 0, 3 } } },
323*e4b86885SCheng Sean Ye     { S1g1,	7, DCFG_S4,		1, { { CH_B, 0, 3 } } }
324*e4b86885SCheng Sean Ye };
325*e4b86885SCheng Sean Ye 
326*e4b86885SCheng Sean Ye /* END CSTYLED */
327*e4b86885SCheng Sean Ye 
328*e4b86885SCheng Sean Ye #define	DCFG_NTBL	4
329*e4b86885SCheng Sean Ye 
330*e4b86885SCheng Sean Ye static const struct {
331*e4b86885SCheng Sean Ye 	uint32_t revmask;		/* applicable chip revs */
332*e4b86885SCheng Sean Ye 	int mod64mux;			/* mismatched support or not */
333*e4b86885SCheng Sean Ye 	const struct mcdcfg_csmapline *map;
334*e4b86885SCheng Sean Ye 	int nmapents;
335*e4b86885SCheng Sean Ye } csmap_tbls[DCFG_NTBL] = {
336*e4b86885SCheng Sean Ye 	{ MC_F_REVS_BCDE, 0, &csmap_nomod64mux_preF[0],
337*e4b86885SCheng Sean Ye 	    sizeof (csmap_nomod64mux_preF) / sizeof (struct mcdcfg_csmapline) },
338*e4b86885SCheng Sean Ye 	{ MC_F_REVS_BCDE, 1, &csmap_mod64mux_preF[0],
339*e4b86885SCheng Sean Ye 	    sizeof (csmap_mod64mux_preF) / sizeof (struct mcdcfg_csmapline) },
340*e4b86885SCheng Sean Ye 	{ MC_F_REVS_FG, 0, &csmap_nomod64mux_fg[0],
341*e4b86885SCheng Sean Ye 	    sizeof (csmap_nomod64mux_fg) / sizeof (struct mcdcfg_csmapline) },
342*e4b86885SCheng Sean Ye 	{ MC_F_REVS_FG, 1, &csmap_mod64mux_fg[0],
343*e4b86885SCheng Sean Ye 	    sizeof (csmap_mod64mux_fg) / sizeof (struct mcdcfg_csmapline) }
344*e4b86885SCheng Sean Ye };
345*e4b86885SCheng Sean Ye 
346*e4b86885SCheng Sean Ye int
347*e4b86885SCheng Sean Ye mcdcfg_lookup(uint32_t rev, int mod64mux, int accwidth, int basenum,
348*e4b86885SCheng Sean Ye     uint32_t pkg, int r4, int s4, mcdcfg_rslt_t *rsltp)
349*e4b86885SCheng Sean Ye {
350*e4b86885SCheng Sean Ye 	const struct mcdcfg_csmapline *csm = NULL;
351*e4b86885SCheng Sean Ye 	int ismux = (mod64mux != 0);
352*e4b86885SCheng Sean Ye 	int nmapents;
353*e4b86885SCheng Sean Ye 	int ndimm = (accwidth == 128) ? 2 : 1;
354*e4b86885SCheng Sean Ye 	int dcfg;
355*e4b86885SCheng Sean Ye 	int i;
356*e4b86885SCheng Sean Ye 
357*e4b86885SCheng Sean Ye 	/*
358*e4b86885SCheng Sean Ye 	 * Validate aspects that the table lookup won't.
359*e4b86885SCheng Sean Ye 	 */
360*e4b86885SCheng Sean Ye 	if ((accwidth != 64 && accwidth != 128) || (r4 != 0 && s4 != 0))
361*e4b86885SCheng Sean Ye 		return (-1);
362*e4b86885SCheng Sean Ye 
363*e4b86885SCheng Sean Ye 	for (i = 0; i < DCFG_NTBL; i++) {
364*e4b86885SCheng Sean Ye 		if (MC_REV_MATCH(rev, csmap_tbls[i].revmask) &&
365*e4b86885SCheng Sean Ye 		    ismux == csmap_tbls[i].mod64mux) {
366*e4b86885SCheng Sean Ye 			csm = csmap_tbls[i].map;
367*e4b86885SCheng Sean Ye 			nmapents = csmap_tbls[i].nmapents;
368*e4b86885SCheng Sean Ye 			break;
369*e4b86885SCheng Sean Ye 		}
370*e4b86885SCheng Sean Ye 	}
371*e4b86885SCheng Sean Ye 	if (csm == NULL)
372*e4b86885SCheng Sean Ye 		return (-1);
373*e4b86885SCheng Sean Ye 
374*e4b86885SCheng Sean Ye 	if (r4)
375*e4b86885SCheng Sean Ye 		dcfg = DCFG_R4;
376*e4b86885SCheng Sean Ye 	else if (s4)
377*e4b86885SCheng Sean Ye 		dcfg = DCFG_S4;
378*e4b86885SCheng Sean Ye 	else
379*e4b86885SCheng Sean Ye 		dcfg = DCFG_N;
380*e4b86885SCheng Sean Ye 
381*e4b86885SCheng Sean Ye 	for (i = 0; i < nmapents; i++, csm++) {
382*e4b86885SCheng Sean Ye 		if (X86_SOCKET_MATCH(pkg, csm->csm_pkg) &&
383*e4b86885SCheng Sean Ye 		    basenum == csm->csm_basereg &&
384*e4b86885SCheng Sean Ye 		    (dcfg & csm->csm_dimmcfg) != 0)
385*e4b86885SCheng Sean Ye 			break;
386*e4b86885SCheng Sean Ye 	}
387*e4b86885SCheng Sean Ye 	if (i == nmapents)
388*e4b86885SCheng Sean Ye 		return (-1);
389*e4b86885SCheng Sean Ye 
390*e4b86885SCheng Sean Ye 	/*
391*e4b86885SCheng Sean Ye 	 * We return the dimm instance number here for the topology, based
392*e4b86885SCheng Sean Ye 	 * on the AMD Motherboard Design Guide.
393*e4b86885SCheng Sean Ye 	 */
394*e4b86885SCheng Sean Ye 	rsltp->ldimm = csm->csm_ldimm;
395*e4b86885SCheng Sean Ye 	rsltp->ndimm = ndimm;
396*e4b86885SCheng Sean Ye 	for (i = 0; i < ndimm; i++) {
397*e4b86885SCheng Sean Ye 		const struct mcdcfg_csl *cslp = &csm->csm_cs[i];
398*e4b86885SCheng Sean Ye 
399*e4b86885SCheng Sean Ye 		rsltp->dimm[i].toponum =
400*e4b86885SCheng Sean Ye 		    MCAMD_TOPONUM(rsltp->ldimm, cslp, r4 || s4, ismux);
401*e4b86885SCheng Sean Ye 		rsltp->dimm[i].cslp = cslp;
402*e4b86885SCheng Sean Ye 	}
403*e4b86885SCheng Sean Ye 
404*e4b86885SCheng Sean Ye 	return (0);
405*e4b86885SCheng Sean Ye }
406*e4b86885SCheng Sean Ye 
407*e4b86885SCheng Sean Ye /*
408*e4b86885SCheng Sean Ye  * Given a chip-select line and package type return the chip-select line
409*e4b86885SCheng Sean Ye  * pin label for that package type.
410*e4b86885SCheng Sean Ye  */
411*e4b86885SCheng Sean Ye void
412*e4b86885SCheng Sean Ye mcdcfg_csname(uint32_t pkg, const mcdcfg_csl_t *cslp, char *buf, int buflen)
413*e4b86885SCheng Sean Ye {
414*e4b86885SCheng Sean Ye 	int csnum;
415*e4b86885SCheng Sean Ye 
416*e4b86885SCheng Sean Ye 	switch (pkg) {
417*e4b86885SCheng Sean Ye 	case X86_SOCKET_754:
418*e4b86885SCheng Sean Ye 		/*
419*e4b86885SCheng Sean Ye 		 * Format is: MEMCS_L[{0..7}].  There is only channel A.
420*e4b86885SCheng Sean Ye 		 */
421*e4b86885SCheng Sean Ye 		csnum = 2 * cslp->csl_slot + cslp->csl_rank;
422*e4b86885SCheng Sean Ye 		(void) snprintf(buf, buflen, "MEMCS_L%d", csnum);
423*e4b86885SCheng Sean Ye 		break;
424*e4b86885SCheng Sean Ye 
425*e4b86885SCheng Sean Ye 	case X86_SOCKET_940:
426*e4b86885SCheng Sean Ye 		/*
427*e4b86885SCheng Sean Ye 		 * Format is: MEMCS_L[{0..7}].  That does not identify
428*e4b86885SCheng Sean Ye 		 * a single dimm (since a single chip-select is shared
429*e4b86885SCheng Sean Ye 		 * by both members of a dimm pair in socket 940) so
430*e4b86885SCheng Sean Ye 		 * we tack on some channel identification.
431*e4b86885SCheng Sean Ye 		 */
432*e4b86885SCheng Sean Ye 		csnum = 2 * cslp->csl_slot + cslp->csl_rank;
433*e4b86885SCheng Sean Ye 		(void) snprintf(buf, buflen, "MEMCS_L%d (channel %s)", csnum,
434*e4b86885SCheng Sean Ye 		    cslp->csl_chan == CH_A ? "A" : "B");
435*e4b86885SCheng Sean Ye 
436*e4b86885SCheng Sean Ye 		break;
437*e4b86885SCheng Sean Ye 
438*e4b86885SCheng Sean Ye 	case X86_SOCKET_939:
439*e4b86885SCheng Sean Ye 		/*
440*e4b86885SCheng Sean Ye 		 * Format is: MEMCS_{1,2}{L,H}_L[{1,0}]
441*e4b86885SCheng Sean Ye 		 *		{1,2} - dimm pair
442*e4b86885SCheng Sean Ye 		 *		{L,H} - lodimm or updimm
443*e4b86885SCheng Sean Ye 		 *		{1,0} - rank
444*e4b86885SCheng Sean Ye 		 */
445*e4b86885SCheng Sean Ye 		(void) snprintf(buf, buflen, "MEMCS_%d%s_L[%d]",
446*e4b86885SCheng Sean Ye 		    cslp->csl_slot + 1,
447*e4b86885SCheng Sean Ye 		    cslp->csl_chan == CH_A ? "A" : "B",
448*e4b86885SCheng Sean Ye 		    cslp->csl_rank);
449*e4b86885SCheng Sean Ye 		break;
450*e4b86885SCheng Sean Ye 
451*e4b86885SCheng Sean Ye 	case X86_SOCKET_F1207:
452*e4b86885SCheng Sean Ye 	case X86_SOCKET_AM2:
453*e4b86885SCheng Sean Ye 	case X86_SOCKET_S1g1:
454*e4b86885SCheng Sean Ye 		/*
455*e4b86885SCheng Sean Ye 		 * Format is: M{B,A}{0,1,2,3}_CS_L[{0,1,2,3}]
456*e4b86885SCheng Sean Ye 		 *		{B,A} - channel
457*e4b86885SCheng Sean Ye 		 *		{0,1,2,3} - slot on channel
458*e4b86885SCheng Sean Ye 		 *		{0,1,2,3} - rank
459*e4b86885SCheng Sean Ye 		 */
460*e4b86885SCheng Sean Ye 		(void) snprintf(buf, buflen, "M%s%d_CS_L[%d]",
461*e4b86885SCheng Sean Ye 		    cslp->csl_chan == CH_A ? "A" : "B",
462*e4b86885SCheng Sean Ye 		    cslp->csl_slot,
463*e4b86885SCheng Sean Ye 		    cslp->csl_rank);
464*e4b86885SCheng Sean Ye 		break;
465*e4b86885SCheng Sean Ye 
466*e4b86885SCheng Sean Ye 	default:
467*e4b86885SCheng Sean Ye 		(void) snprintf(buf, buflen, "Unknown");
468*e4b86885SCheng Sean Ye 		break;
469*e4b86885SCheng Sean Ye 	}
470*e4b86885SCheng Sean Ye }
471