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