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
mcdcfg_lookup(uint32_t rev,int mod64mux,int accwidth,int basenum,uint32_t pkg,int r4,int s4,mcdcfg_rslt_t * rsltp)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
mcdcfg_csname(uint32_t pkg,const mcdcfg_csl_t * cslp,char * buf,int buflen)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