17aec1d6eScindi /*
27aec1d6eScindi * CDDL HEADER START
37aec1d6eScindi *
47aec1d6eScindi * The contents of this file are subject to the terms of the
55f25dc2aSgavinm * Common Development and Distribution License (the "License").
65f25dc2aSgavinm * You may not use this file except in compliance with the License.
77aec1d6eScindi *
87aec1d6eScindi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97aec1d6eScindi * or http://www.opensolaris.org/os/licensing.
107aec1d6eScindi * See the License for the specific language governing permissions
117aec1d6eScindi * and limitations under the License.
127aec1d6eScindi *
137aec1d6eScindi * When distributing Covered Code, include this CDDL HEADER in each
147aec1d6eScindi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157aec1d6eScindi * If applicable, add the following below this CDDL HEADER, with the
167aec1d6eScindi * fields enclosed by brackets "[]" replaced with your own identifying
177aec1d6eScindi * information: Portions Copyright [yyyy] [name of copyright owner]
187aec1d6eScindi *
197aec1d6eScindi * CDDL HEADER END
205f25dc2aSgavinm */
215f25dc2aSgavinm
225f25dc2aSgavinm /*
237aec1d6eScindi *
24*20c794b3Sgavinm * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
257aec1d6eScindi * Use is subject to license terms.
267aec1d6eScindi */
277aec1d6eScindi
287aec1d6eScindi #pragma ident "%Z%%M% %I% %E% SMI"
297aec1d6eScindi
307aec1d6eScindi #include <mcamd_api.h>
317aec1d6eScindi #include <mcamd_err.h>
327aec1d6eScindi #include <mcamd_rowcol_impl.h>
337aec1d6eScindi
347aec1d6eScindi /*
358a40a695Sgavinm * =========== Chip-Select Bank Address Mode Encodings =======================
367aec1d6eScindi */
377aec1d6eScindi
388a40a695Sgavinm /* Individual table declarations */
398a40a695Sgavinm static const struct rct_bnkaddrmode bnkaddr_tbls_pre_d[];
408a40a695Sgavinm static const struct rct_bnkaddrmode bnkaddr_tbls_d_e[];
418a40a695Sgavinm static const struct rct_bnkaddrmode bnkaddr_tbls_f[];
428a40a695Sgavinm
438a40a695Sgavinm /* Managing bank address mode tables */
448a40a695Sgavinm static const struct _bnkaddrmode_tbldesc {
458a40a695Sgavinm uint_t revmask;
467aec1d6eScindi int nmodes;
478a40a695Sgavinm const struct rct_bnkaddrmode *modetbl;
488a40a695Sgavinm } bnkaddr_tbls[] = {
49*20c794b3Sgavinm { MC_F_REVS_BC, 7, bnkaddr_tbls_pre_d },
50*20c794b3Sgavinm { MC_F_REVS_DE, 11, bnkaddr_tbls_d_e },
51*20c794b3Sgavinm { MC_F_REVS_FG, 12, bnkaddr_tbls_f },
527aec1d6eScindi };
537aec1d6eScindi
547aec1d6eScindi /*
558a40a695Sgavinm * =========== DRAM Address Mappings for bank/row/column =====================
567aec1d6eScindi */
577aec1d6eScindi
588a40a695Sgavinm
598a40a695Sgavinm /* Individual table declarations */
608a40a695Sgavinm struct _rcbmap_tbl {
618a40a695Sgavinm uint_t mt_revmask; /* revision to which this applies */
628a40a695Sgavinm int mt_width; /* MC mode (64 or 128) */
638a40a695Sgavinm const struct rct_rcbmap mt_csmap[MC_RC_CSMODES];
648a40a695Sgavinm };
658a40a695Sgavinm
668a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_pre_d_64;
678a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_pre_d_128;
688a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_d_e_64;
698a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_d_e_128;
708a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_f_64;
718a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_f_128;
728a40a695Sgavinm
738a40a695Sgavinm /* Managing row/column/bank tables */
748a40a695Sgavinm static const struct _rcbmap_tbldesc {
757aec1d6eScindi int nmodes;
768a40a695Sgavinm const struct _rcbmap_tbl *rcbmap;
778a40a695Sgavinm } rcbmap_tbls[] = {
787aec1d6eScindi { 7, &dram_addrmap_pre_d_64 },
797aec1d6eScindi { 7, &dram_addrmap_pre_d_128 },
807aec1d6eScindi { 11, &dram_addrmap_d_e_64 },
817aec1d6eScindi { 11, &dram_addrmap_d_e_128 },
828a40a695Sgavinm { 12, &dram_addrmap_f_64 },
838a40a695Sgavinm { 12, &dram_addrmap_f_128 },
847aec1d6eScindi };
857aec1d6eScindi
867aec1d6eScindi /*
878a40a695Sgavinm * =========== Bank swizzling information ====================================
887aec1d6eScindi */
897aec1d6eScindi
908a40a695Sgavinm /* Individual table declarations */
918a40a695Sgavinm struct _bnkswzl_tbl {
928a40a695Sgavinm uint_t swzt_revmask; /* revision to which this applies */
938a40a695Sgavinm int swzt_width; /* MC mode (64 or 128) */
948a40a695Sgavinm const struct rct_bnkswzlinfo swzt_bits;
958a40a695Sgavinm };
967aec1d6eScindi
978a40a695Sgavinm static const struct _bnkswzl_tbl bnswzl_info_e_64;
988a40a695Sgavinm static const struct _bnkswzl_tbl bnswzl_info_e_128;
998a40a695Sgavinm static const struct _bnkswzl_tbl bnswzl_info_f_64;
1008a40a695Sgavinm static const struct _bnkswzl_tbl bnswzl_info_f_128;
1017aec1d6eScindi
1028a40a695Sgavinm /* Managing bank swizzle tables */
1038a40a695Sgavinm static const struct _bnkswzl_tbl *bnkswzl_tbls[] = {
1048a40a695Sgavinm &bnswzl_info_e_64,
1058a40a695Sgavinm &bnswzl_info_e_128,
1068a40a695Sgavinm &bnswzl_info_f_64,
1078a40a695Sgavinm &bnswzl_info_f_128,
1088a40a695Sgavinm };
1097aec1d6eScindi
1107aec1d6eScindi /*
1118a40a695Sgavinm * ======================================================================
1128a40a695Sgavinm * | Tables reflecting those in the BKDG |
1138a40a695Sgavinm * ======================================================================
1147aec1d6eScindi */
1157aec1d6eScindi
1167aec1d6eScindi /*
1178a40a695Sgavinm * DRAM Address Mapping in Interleaving Mode
1187aec1d6eScindi *
1197aec1d6eScindi * Chip-select interleave is performed by addressing across the columns
1207aec1d6eScindi * of the first row of internal bank-select 0 on a chip-select, then the
1217aec1d6eScindi * next row on internal bank-select 1, then 2 then 3; instead of then
1227aec1d6eScindi * moving on to the next row of this chip-select we then rotate across
1237aec1d6eScindi * other chip-selects in the interleave. The row/column/bank mappings
1247aec1d6eScindi * described elsewhere in this file show that a DRAM InputAddr breaks down
1258a40a695Sgavinm * as follows, using an example for CS Mode 0000 revision CG and earlier 64-bit
1268a40a695Sgavinm * mode; the cs size is 32MB, requiring 25 bits to address all of it.
1277aec1d6eScindi *
1287aec1d6eScindi * chip-selection bits | offset within chip-select bits |
1297aec1d6eScindi * | row bits | bank bits | column bits | - |
1307aec1d6eScindi * 24 13 12 11 10 3 2 0
1317aec1d6eScindi *
1327aec1d6eScindi * The high-order chip-selection bits select the chip-select and the
1337aec1d6eScindi * offset bits offset within the chosen chip-select.
1347aec1d6eScindi *
1357aec1d6eScindi * To establish say a 2-way interleave in which we consume all of one
1367aec1d6eScindi * row number and all internal bank numbers on one cs before moving on
1377aec1d6eScindi * to the next to do the same we will target the first row bit - bit 13;
1387aec1d6eScindi * a 4-way interleave would use bits 14 and 13, and an 8-way interleave
1397aec1d6eScindi * bits 15, 14 and 13. We swap the chosen bits with the least significant
1407aec1d6eScindi * high order chip-selection bits.
1417aec1d6eScindi *
1428a40a695Sgavinm * The BKDG interleave tables really just describe the above. Working
1437aec1d6eScindi * out the high-order bits to swap is easy since that is derived directly
1447aec1d6eScindi * from the chip-select size. The low-order bits depend on the device
1457aec1d6eScindi * parameters since we need to target the least significant row address bits -
1468a40a695Sgavinm * but we have that information from the rcbmap_tbls since the first row bit
1477aec1d6eScindi * simply follows the last bank address bit.
1487aec1d6eScindi */
1497aec1d6eScindi
1507aec1d6eScindi /*
1518a40a695Sgavinm * General notes for CS Bank Address Mode Encoding tables.
1528a40a695Sgavinm *
1538a40a695Sgavinm * These are indexed by chip-select mode. Where the numbers of rows and
1548a40a695Sgavinm * columns is ambiguous (as it is for a number of rev CG and earlier cases)
1558a40a695Sgavinm * the bam_config should be initialized to 1 and the numbers of rows
1568a40a695Sgavinm * and columns should be the maximums.
1578a40a695Sgavinm */
1588a40a695Sgavinm
1598a40a695Sgavinm /*
1608a40a695Sgavinm * Chip Select Bank Address Mode Encoding for rev CG and earlier.
1618a40a695Sgavinm */
1628a40a695Sgavinm static const struct rct_bnkaddrmode bnkaddr_tbls_pre_d[] = {
1638a40a695Sgavinm { /* 000 */
1648a40a695Sgavinm 32, 12, 8
1658a40a695Sgavinm },
1668a40a695Sgavinm { /* 001 */
1678a40a695Sgavinm 64, 12, 9
1688a40a695Sgavinm },
1698a40a695Sgavinm { /* 010 */
1708a40a695Sgavinm 128, 13, 10, 1 /* AMBIG */
1718a40a695Sgavinm },
1728a40a695Sgavinm { /* 011 */
1738a40a695Sgavinm 256, 13, 11, 1 /* AMBIG */
1748a40a695Sgavinm },
1758a40a695Sgavinm { /* 100 */
1768a40a695Sgavinm 512, 14, 11, 1 /* AMBIG */
1778a40a695Sgavinm },
1788a40a695Sgavinm { /* 101 */
1798a40a695Sgavinm 1024, 14, 12, 1 /* AMBIG */
1808a40a695Sgavinm },
1818a40a695Sgavinm { /* 110 */
1828a40a695Sgavinm 2048, 14, 12
1838a40a695Sgavinm }
1848a40a695Sgavinm };
1858a40a695Sgavinm
1868a40a695Sgavinm /*
1878a40a695Sgavinm * Chip Select Bank Address Mode Encoding for revs D and E.
1888a40a695Sgavinm */
1898a40a695Sgavinm static const struct rct_bnkaddrmode bnkaddr_tbls_d_e[] = {
1908a40a695Sgavinm { /* 0000 */
1918a40a695Sgavinm 32, 12, 8
1928a40a695Sgavinm },
1938a40a695Sgavinm { /* 0001 */
1948a40a695Sgavinm 64, 12, 9
1958a40a695Sgavinm },
1968a40a695Sgavinm { /* 0010 */
1978a40a695Sgavinm 128, 13, 9
1988a40a695Sgavinm },
1998a40a695Sgavinm { /* 0011 */
2008a40a695Sgavinm 128, 12, 10
2018a40a695Sgavinm },
2028a40a695Sgavinm { /* 0100 */
2038a40a695Sgavinm 256, 13, 10
2048a40a695Sgavinm },
2058a40a695Sgavinm { /* 0101 */
2068a40a695Sgavinm 512, 14, 10
2078a40a695Sgavinm },
2088a40a695Sgavinm { /* 0110 */
2098a40a695Sgavinm 256, 12, 11
2108a40a695Sgavinm },
2118a40a695Sgavinm { /* 0111 */
2128a40a695Sgavinm 512, 13, 11
2138a40a695Sgavinm },
2148a40a695Sgavinm { /* 1000 */
2158a40a695Sgavinm 1024, 14, 11
2168a40a695Sgavinm },
2178a40a695Sgavinm { /* 1001 */
2188a40a695Sgavinm 1024, 13, 12
2198a40a695Sgavinm },
2208a40a695Sgavinm { /* 1010 */
2218a40a695Sgavinm 2048, 14, 12
2228a40a695Sgavinm }
2238a40a695Sgavinm };
2248a40a695Sgavinm
2258a40a695Sgavinm /*
2268a40a695Sgavinm * Chip Select Bank Address Mode Encoding for rev F
2278a40a695Sgavinm */
2288a40a695Sgavinm static const struct rct_bnkaddrmode bnkaddr_tbls_f[] = {
2298a40a695Sgavinm { /* 0000 */
2308a40a695Sgavinm 128, 13, 9
2318a40a695Sgavinm },
2328a40a695Sgavinm { /* 0001 */
2338a40a695Sgavinm 256, 13, 10
2348a40a695Sgavinm },
2358a40a695Sgavinm { /* 0010 */
2368a40a695Sgavinm 512, 14, 10
2378a40a695Sgavinm },
2388a40a695Sgavinm { /* 0011 */
2398a40a695Sgavinm 512, 13, 11
2408a40a695Sgavinm },
2418a40a695Sgavinm { /* 0100 */
2428a40a695Sgavinm 512, 13, 10
2438a40a695Sgavinm },
2448a40a695Sgavinm { /* 0101 */
2458a40a695Sgavinm 1024, 14, 10
2468a40a695Sgavinm },
2478a40a695Sgavinm { /* 0110 */
2488a40a695Sgavinm 1024, 14, 11
2498a40a695Sgavinm },
2508a40a695Sgavinm { /* 0111 */
2518a40a695Sgavinm 2048, 15, 10
2528a40a695Sgavinm },
2538a40a695Sgavinm { /* 1000 */
2548a40a695Sgavinm 2048, 14, 11
2558a40a695Sgavinm },
2568a40a695Sgavinm { /* 1001 */
2578a40a695Sgavinm 4096, 15, 11
2588a40a695Sgavinm },
2598a40a695Sgavinm { /* 1010 */
2608a40a695Sgavinm 4096, 16, 10
2618a40a695Sgavinm },
2628a40a695Sgavinm { /* 1011 */
2638a40a695Sgavinm 8192, 16, 11
2648a40a695Sgavinm }
2658a40a695Sgavinm
2668a40a695Sgavinm };
2678a40a695Sgavinm
2688a40a695Sgavinm /*
2698a40a695Sgavinm * General notes on Row/Column/Bank table initialisation.
2708a40a695Sgavinm *
2718a40a695Sgavinm * These are the tables 7, 8, 9, 10, 11 and 12 of BKDG 3.29 section 3.5.6.1.
2728a40a695Sgavinm * They apply in non-interleave (node or cs) mode and describe how for
2738a40a695Sgavinm * a given revision, access width, bank-swizzle mode, and current chip-select
2748a40a695Sgavinm * mode the row, column and internal sdram bank are derived from the
2758a40a695Sgavinm * normalizied InputAddr presented to the DRAM controller.
2768a40a695Sgavinm *
2778a40a695Sgavinm * The mt_csmap array is indexed by chip-select mode. Within it the
2788a40a695Sgavinm * bankargs, rowbits and colbits arrays are indexed by bit number, so
2798a40a695Sgavinm * match the BKDG tables if the latter are read right-to-left.
2808a40a695Sgavinm *
2818a40a695Sgavinm * The bankargs list up to three bit numbers per bank bit. For revisions
2828a40a695Sgavinm * CG and earlier there is no bank swizzling, so just a single number
2838a40a695Sgavinm * should be listed. Revisions D and E have the same row/column/bank mapping,
2848a40a695Sgavinm * but rev E has the additional feature of being able to xor two row bits
2858a40a695Sgavinm * into each bank bit. The consumer will know whether they are using bank
2868a40a695Sgavinm * swizzling - if so then they should xor the bankargs bits together.
2878a40a695Sgavinm * The first argument must be the bit number not already used in forming
2888a40a695Sgavinm * part of the row address - eg in table 12 for csmode 0000b bank address
2898a40a695Sgavinm * bit 0 is bit 12 xor bit 18 xor bit 21, and 18 and 21 are also mentioned in
2908a40a695Sgavinm * the row address (bits 10 and 1) so we must list bit 12 first. We will
2918a40a695Sgavinm * use this information in chip-select interleave decoding in which we need
2928a40a695Sgavinm * to know which is the first bit after column and bank address bits.
2938a40a695Sgavinm *
2948a40a695Sgavinm * Column address A10 is always used for the Precharge All signal. Where
2958a40a695Sgavinm * "PC" appears in the BKDG tables we will include MC_PC_ALL in the
2968a40a695Sgavinm * corresponding bit position.
2978a40a695Sgavinm *
2988a40a695Sgavinm * For some rev CG and earlier chipselect modes the number of rows and columns
2998a40a695Sgavinm * is ambiguous. This is reflected in these tables by some bit being
3008a40a695Sgavinm * duplicated between row and column address. In practice we will follow
3018a40a695Sgavinm * the convention of always assigning the floating bit to the row address.
3028a40a695Sgavinm */
3038a40a695Sgavinm
3048a40a695Sgavinm /*
3058a40a695Sgavinm * Row/Column/Bank address mappings for rev CG in 64-bit mode, no interleave.
3068a40a695Sgavinm * See BKDG 3.29 3.5.6 Table 7.
3078a40a695Sgavinm */
3088a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_pre_d_64 = {
309*20c794b3Sgavinm MC_F_REVS_BC,
3108a40a695Sgavinm 64,
3118a40a695Sgavinm {
3128a40a695Sgavinm { /* 000 */
3138a40a695Sgavinm 2, { 11, 12 },
3148a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18 },
3158a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10 }
3168a40a695Sgavinm },
3178a40a695Sgavinm { /* 001 */
3188a40a695Sgavinm 2, { 13, 12 },
3198a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 14, 15, 16, 17, 18 },
3208a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11 }
3218a40a695Sgavinm },
3228a40a695Sgavinm { /* 010 */
3238a40a695Sgavinm 2, { 13, 12 },
3248a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 14, 15, 16, 17, 18, 26 },
3258a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 26 }
3268a40a695Sgavinm },
3278a40a695Sgavinm { /* 011 */
3288a40a695Sgavinm 2, { 13, 14 },
3298a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 27 },
3308a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 27 }
3318a40a695Sgavinm },
3328a40a695Sgavinm { /* 100 */
3338a40a695Sgavinm 2, { 13, 14 },
3348a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 27, 28 },
3358a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 28 }
3368a40a695Sgavinm },
3378a40a695Sgavinm { /* 101 */
3388a40a695Sgavinm 2, { 15, 14 },
3398a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 29, 16, 17, 18, 27, 28 },
3408a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13, 28 }
3418a40a695Sgavinm },
3428a40a695Sgavinm { /* 110 */
3438a40a695Sgavinm 2, { 15, 14 },
3448a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 29, 16, 17, 18, 27, 28 },
3458a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13, 30 }
3468a40a695Sgavinm },
3478a40a695Sgavinm /*
3488a40a695Sgavinm * remainder unused
3498a40a695Sgavinm */
3508a40a695Sgavinm }
3518a40a695Sgavinm
3528a40a695Sgavinm };
3538a40a695Sgavinm
3548a40a695Sgavinm /*
3558a40a695Sgavinm * Row/Column/Bank address mappings for rev CG in 128-bit mode, no interleave.
3568a40a695Sgavinm * See BKDG 3.29 3.5.6 Table 8.
3578a40a695Sgavinm */
3588a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_pre_d_128 = {
359*20c794b3Sgavinm MC_F_REVS_BC,
3608a40a695Sgavinm 128,
3618a40a695Sgavinm {
3628a40a695Sgavinm { /* 000 */
3638a40a695Sgavinm 2, { 12, 13 },
3648a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 14, 15, 16, 17, 18, 19 },
3658a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11 }
3668a40a695Sgavinm },
3678a40a695Sgavinm { /* 001 */
3688a40a695Sgavinm 2, { 14, 13 },
3698a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19 },
3708a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12 }
3718a40a695Sgavinm },
3728a40a695Sgavinm { /* 010 */
3738a40a695Sgavinm 2, { 14, 13 },
3748a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, 27 },
3758a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 27 }
3768a40a695Sgavinm },
3778a40a695Sgavinm { /* 011 */
3788a40a695Sgavinm 2, { 14, 15 },
3798a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 16, 17, 18, 19, 28 },
3808a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 28 }
3818a40a695Sgavinm },
3828a40a695Sgavinm { /* 100 */
3838a40a695Sgavinm 2, { 14, 15 },
3848a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 16, 17, 18, 19, 28, 29 },
3858a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 29 }
3868a40a695Sgavinm },
3878a40a695Sgavinm { /* 101 */
3888a40a695Sgavinm 2, { 16, 15 },
3898a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 30, 17, 18, 19, 28, 29 },
3908a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14, 29 }
3918a40a695Sgavinm },
3928a40a695Sgavinm { /* 110 */
3938a40a695Sgavinm 2, { 16, 15 },
3948a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 30, 17, 18, 19, 28, 29 },
3958a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14, 31 }
3968a40a695Sgavinm },
3978a40a695Sgavinm /*
3988a40a695Sgavinm * remainder unused
3998a40a695Sgavinm */
4008a40a695Sgavinm }
4018a40a695Sgavinm };
4028a40a695Sgavinm
4038a40a695Sgavinm /*
4048a40a695Sgavinm * Row/Column/Bank address mappings for rev D/E in 64-bit mode, no interleave.
4058a40a695Sgavinm * See BKDG 3.29 3.5.6 Table 9.
4068a40a695Sgavinm */
4078a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_d_e_64 = {
408*20c794b3Sgavinm MC_F_REVS_DE,
4098a40a695Sgavinm 64,
4108a40a695Sgavinm {
4118a40a695Sgavinm { /* 0000 */
4128a40a695Sgavinm 2, { 11, 12 },
4138a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18 },
4148a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10 }
4158a40a695Sgavinm },
4168a40a695Sgavinm { /* 0001 */
4178a40a695Sgavinm 2, { 12, 13 },
4188a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 14, 15, 16, 17, 18, 26 },
4198a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11 }
4208a40a695Sgavinm },
4218a40a695Sgavinm { /* 0010 */
4228a40a695Sgavinm 2, { 12, 13 },
4238a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 14, 15, 16, 17, 18, 26 },
4248a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11 }
4258a40a695Sgavinm },
4268a40a695Sgavinm { /* 0011 */
4278a40a695Sgavinm 2, { 13, 14 },
4288a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 27, 28 },
4298a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }
4308a40a695Sgavinm },
4318a40a695Sgavinm { /* 0100 */
4328a40a695Sgavinm 2, { 13, 14 },
4338a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 27, 28 },
4348a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }
4358a40a695Sgavinm },
4368a40a695Sgavinm { /* 0101 */
4378a40a695Sgavinm 2, { 13, 14 },
4388a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 27, 28 },
4398a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }
4408a40a695Sgavinm },
4418a40a695Sgavinm { /* 0110 */
4428a40a695Sgavinm 2, { 14, 15 },
4438a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 16, 17, 18, 28, 29 },
4448a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13 }
4458a40a695Sgavinm },
4468a40a695Sgavinm { /* 0111 */
4478a40a695Sgavinm 2, { 14, 15 },
4488a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 16, 17, 18, 28, 29 },
4498a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13 }
4508a40a695Sgavinm },
4518a40a695Sgavinm { /* 1000 */
4528a40a695Sgavinm 2, { 14, 15 },
4538a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 16, 17, 18, 28, 29 },
4548a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13 }
4558a40a695Sgavinm },
4568a40a695Sgavinm { /* 1001 */
4578a40a695Sgavinm 2, { 15, 16 },
4588a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 17, 18, 29, 30 },
4598a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13, 14 }
4608a40a695Sgavinm },
4618a40a695Sgavinm { /* 1010 */
4628a40a695Sgavinm 2, { 15, 16 },
4638a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 17, 18, 29, 30 },
4648a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13, 14 }
4658a40a695Sgavinm },
4668a40a695Sgavinm /*
4678a40a695Sgavinm * remainder unused
4688a40a695Sgavinm */
4698a40a695Sgavinm }
4708a40a695Sgavinm };
4718a40a695Sgavinm
4728a40a695Sgavinm /*
4738a40a695Sgavinm * Row/Column/Bank address mappings for rev D/E in 128-bit mode, no interleave.
4748a40a695Sgavinm * See BKDG 3.29 3.5.6 Table 9.
4758a40a695Sgavinm */
4768a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_d_e_128 = {
477*20c794b3Sgavinm MC_F_REVS_DE,
4788a40a695Sgavinm 128,
4798a40a695Sgavinm {
4808a40a695Sgavinm { /* 0000 */
4818a40a695Sgavinm 2, { 12, 13 },
4828a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 14, 15, 16, 17, 18, 19 },
4838a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11 }
4848a40a695Sgavinm },
4858a40a695Sgavinm { /* 0001 */
4868a40a695Sgavinm 2, { 13, 14 },
4878a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, 27 },
4888a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12 }
4898a40a695Sgavinm },
4908a40a695Sgavinm { /* 0010 */
4918a40a695Sgavinm 2, { 13, 14 },
4928a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, 27 },
4938a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12 }
4948a40a695Sgavinm },
4958a40a695Sgavinm { /* 0011 */
4968a40a695Sgavinm 2, { 14, 15 },
4978a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 16, 17, 18, 19, 28, 29 },
4988a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }
4998a40a695Sgavinm },
5008a40a695Sgavinm { /* 0100 */
5018a40a695Sgavinm 2, { 14, 15 },
5028a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 16, 17, 18, 19, 28, 29 },
5038a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }
5048a40a695Sgavinm },
5058a40a695Sgavinm { /* 0101 */
5068a40a695Sgavinm 2, { 14, 15 },
5078a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 16, 17, 18, 19, 28, 29 },
5088a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }
5098a40a695Sgavinm },
5108a40a695Sgavinm { /* 0110 */
5118a40a695Sgavinm 2, { 15, 16 },
5128a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 28, 17, 18, 19, 29, 30 },
5138a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14 }
5148a40a695Sgavinm },
5158a40a695Sgavinm { /* 0111 */
5168a40a695Sgavinm 2, { 15, 16 },
5178a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 28, 17, 18, 19, 29, 30 },
5188a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14 }
5198a40a695Sgavinm },
5208a40a695Sgavinm { /* 1000 */
5218a40a695Sgavinm 2, { 15, 16 },
5228a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 28, 17, 18, 19, 29, 30 },
5238a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14 }
5248a40a695Sgavinm },
5258a40a695Sgavinm { /* 1001 */
5268a40a695Sgavinm 2, { 16, 17 },
5278a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 18, 19, 30, 31 },
5288a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14, 15 }
5298a40a695Sgavinm },
5308a40a695Sgavinm { /* 1010 */
5318a40a695Sgavinm 2, { 16, 17 },
5328a40a695Sgavinm { 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 18, 19, 30, 31 },
5338a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14, 15 }
5348a40a695Sgavinm },
5358a40a695Sgavinm /*
5368a40a695Sgavinm * remainder unused
5378a40a695Sgavinm */
5388a40a695Sgavinm }
5398a40a695Sgavinm };
5408a40a695Sgavinm
5418a40a695Sgavinm /*
5428a40a695Sgavinm * Row/Column/Bank address mappings for revs F/G in 64-bit mode, no interleave.
5438a40a695Sgavinm */
5448a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_f_64 = {
545*20c794b3Sgavinm MC_F_REVS_FG,
5468a40a695Sgavinm 64,
5478a40a695Sgavinm {
5488a40a695Sgavinm { /* 0000 */
5498a40a695Sgavinm 2, { 12, 13 },
5508a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 14, 15, 16, 17 },
5518a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11 },
5528a40a695Sgavinm },
5538a40a695Sgavinm { /* 0001 */
5548a40a695Sgavinm 2, { 13, 14 },
5558a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 15, 16, 17 },
5568a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 },
5578a40a695Sgavinm },
5588a40a695Sgavinm { /* 0010 */
5598a40a695Sgavinm 2, { 13, 14 },
5608a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 15, 16, 17 },
5618a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 },
5628a40a695Sgavinm },
5638a40a695Sgavinm { /* 0011 */
5648a40a695Sgavinm 2, { 14, 15 },
5658a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 16, 17 },
5668a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13 },
5678a40a695Sgavinm },
5688a40a695Sgavinm { /* 0100 */
5698a40a695Sgavinm 3, { 13, 14, 15 },
5708a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 16, 17 },
5718a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13 },
5728a40a695Sgavinm },
5738a40a695Sgavinm { /* 0101 */
5748a40a695Sgavinm 3, { 13, 14, 15 },
5758a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 16, 17 },
5768a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }
5778a40a695Sgavinm },
5788a40a695Sgavinm { /* 0110 */
5798a40a695Sgavinm 2, { 14, 15 },
5808a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 16, 17 },
5818a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13 },
5828a40a695Sgavinm },
5838a40a695Sgavinm { /* 0111 */
5848a40a695Sgavinm 3, { 13, 14, 15 },
5858a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 16, 17 },
5868a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }
5878a40a695Sgavinm },
5888a40a695Sgavinm { /* 1000 */
5898a40a695Sgavinm 3, { 14, 15, 16 },
5908a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 17 },
5918a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13 },
5928a40a695Sgavinm },
5938a40a695Sgavinm { /* 1001 */
5948a40a695Sgavinm 3, { 14, 15, 16 },
5958a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 17 },
5968a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13 },
5978a40a695Sgavinm },
5988a40a695Sgavinm { /* 1010 */
5998a40a695Sgavinm 3, { 13, 14, 15 },
6008a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
6018a40a695Sgavinm 16, 17 },
6028a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }
6038a40a695Sgavinm },
6048a40a695Sgavinm { /* 1011 */
6058a40a695Sgavinm 3, { 14, 15, 16 },
6068a40a695Sgavinm { 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
6078a40a695Sgavinm 17 },
6088a40a695Sgavinm { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, MC_PC_ALL, 13 },
6098a40a695Sgavinm },
6108a40a695Sgavinm /*
6118a40a695Sgavinm * remainder unused
6128a40a695Sgavinm */
6138a40a695Sgavinm }
6148a40a695Sgavinm };
6158a40a695Sgavinm
6168a40a695Sgavinm /*
6178a40a695Sgavinm * Row/Column/Bank address mappings for revs F/G in 128-bit mode, no interleave.
6188a40a695Sgavinm */
6198a40a695Sgavinm static const struct _rcbmap_tbl dram_addrmap_f_128 = {
620*20c794b3Sgavinm MC_F_REVS_FG,
6218a40a695Sgavinm 128,
6228a40a695Sgavinm {
6238a40a695Sgavinm { /* 0000 */
6248a40a695Sgavinm 2, { 13, 14 },
6258a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 15, 16, 17, 18 },
6268a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12 },
6278a40a695Sgavinm },
6288a40a695Sgavinm { /* 0001 */
6298a40a695Sgavinm 2, { 14, 15 },
6308a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 16, 17, 18 },
6318a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 },
6328a40a695Sgavinm },
6338a40a695Sgavinm { /* 0010 */
6348a40a695Sgavinm 2, { 14, 15 },
6358a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 16, 17, 18 },
6368a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 },
6378a40a695Sgavinm },
6388a40a695Sgavinm { /* 0011 */
6398a40a695Sgavinm 2, { 15, 16 },
6408a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 17, 18 },
6418a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14 },
6428a40a695Sgavinm },
6438a40a695Sgavinm { /* 0100 */
6448a40a695Sgavinm 3, { 14, 15, 16 },
6458a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 17, 18 },
6468a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 },
6478a40a695Sgavinm },
6488a40a695Sgavinm { /* 0101 */
6498a40a695Sgavinm 3, { 14, 15, 16 },
6508a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 17, 18 },
6518a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 },
6528a40a695Sgavinm },
6538a40a695Sgavinm { /* 0110 */
6548a40a695Sgavinm 2, { 15, 16 },
6558a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 17, 18 },
6568a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14 },
6578a40a695Sgavinm },
6588a40a695Sgavinm { /* 0111 */
6598a40a695Sgavinm 3, { 14, 15, 16 },
6608a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
6618a40a695Sgavinm 17, 18 },
6628a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 },
6638a40a695Sgavinm },
6648a40a695Sgavinm { /* 1000 */
6658a40a695Sgavinm 3, { 15, 16, 17 },
6668a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
6678a40a695Sgavinm 18 },
6688a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14 },
6698a40a695Sgavinm },
6708a40a695Sgavinm { /* 1001 */
6718a40a695Sgavinm 3, { 15, 16, 17 },
6728a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
6738a40a695Sgavinm 18 },
6748a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14 },
6758a40a695Sgavinm },
6768a40a695Sgavinm { /* 1010 */
6778a40a695Sgavinm 3, { 14, 15, 16 },
6788a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
6798a40a695Sgavinm 17, 18 },
6808a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 },
6818a40a695Sgavinm },
6828a40a695Sgavinm { /* 1011 */
6838a40a695Sgavinm 3, { 15, 16, 17 },
6848a40a695Sgavinm { 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
6858a40a695Sgavinm 18 },
6868a40a695Sgavinm { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, MC_PC_ALL, 14 },
6878a40a695Sgavinm },
6888a40a695Sgavinm /*
6898a40a695Sgavinm * remainder unused
6908a40a695Sgavinm */
6918a40a695Sgavinm }
6928a40a695Sgavinm };
6938a40a695Sgavinm
6948a40a695Sgavinm /*
6958a40a695Sgavinm * Bank swizzling is an option in revisions E and later. Each internal-bank-
6968a40a695Sgavinm * select address bit is xor'd with two row address bits. Which row
6978a40a695Sgavinm * address bits to use is not dependent on bank address mode but on
6988a40a695Sgavinm * revision and dram controller width alone.
6998a40a695Sgavinm *
7008a40a695Sgavinm * While rev E only supports 2 bank address bits, rev F supports 3 but not
7018a40a695Sgavinm * all chip-select bank address modes use all 3. These tables will list
7028a40a695Sgavinm * the row bits to use in swizzling for the maximum number of supported
7038a40a695Sgavinm * bank address bits - the consumer musr determine how many should be
7048a40a695Sgavinm * applied (listed in the above row/col/bank tables).
7058a40a695Sgavinm */
7068a40a695Sgavinm
7078a40a695Sgavinm static const struct _bnkswzl_tbl bnswzl_info_e_64 = {
708*20c794b3Sgavinm MC_F_REV_E,
7098a40a695Sgavinm 64,
7108a40a695Sgavinm {
7118a40a695Sgavinm {
7128a40a695Sgavinm { 17, 20 }, /* rows bits to swizzle with BA0 */
7138a40a695Sgavinm { 18, 21 }, /* rows bits to swizzle with BA1 */
7148a40a695Sgavinm /* only 2 bankaddr bits on rev E */
7158a40a695Sgavinm }
7168a40a695Sgavinm }
7178a40a695Sgavinm };
7188a40a695Sgavinm
7198a40a695Sgavinm static const struct _bnkswzl_tbl bnswzl_info_e_128 = {
720*20c794b3Sgavinm MC_F_REV_E,
7218a40a695Sgavinm 128,
7228a40a695Sgavinm {
7238a40a695Sgavinm {
7248a40a695Sgavinm { 18, 21 }, /* rows bits to swizzle with BA0 */
7258a40a695Sgavinm { 19, 22 }, /* rows bits to swizzle with BA1 */
7268a40a695Sgavinm /* only 2 bankaddr bits on rev E */
7278a40a695Sgavinm }
7288a40a695Sgavinm }
7298a40a695Sgavinm };
7308a40a695Sgavinm
7318a40a695Sgavinm static const struct _bnkswzl_tbl bnswzl_info_f_64 = {
732*20c794b3Sgavinm MC_F_REVS_FG,
7338a40a695Sgavinm 64,
7348a40a695Sgavinm {
7358a40a695Sgavinm {
7368a40a695Sgavinm { 17, 22 }, /* rows bits to swizzle with BA0 */
7378a40a695Sgavinm { 18, 23 }, /* rows bits to swizzle with BA1 */
7388a40a695Sgavinm { 19, 24 }, /* rows bits to swizzle with BA2 */
7398a40a695Sgavinm }
7408a40a695Sgavinm }
7418a40a695Sgavinm };
7428a40a695Sgavinm
7438a40a695Sgavinm static const struct _bnkswzl_tbl bnswzl_info_f_128 = {
744*20c794b3Sgavinm MC_F_REVS_FG,
7458a40a695Sgavinm 128,
7468a40a695Sgavinm {
7478a40a695Sgavinm {
7488a40a695Sgavinm { 18, 23 }, /* rows bits to swizzle with BA0 */
7498a40a695Sgavinm { 19, 24 }, /* rows bits to swizzle with BA1 */
7508a40a695Sgavinm { 20, 25 }, /* rows bits to swizzle with BA2 */
7518a40a695Sgavinm }
7528a40a695Sgavinm }
7538a40a695Sgavinm };
7548a40a695Sgavinm
7558a40a695Sgavinm /*
7567aec1d6eScindi * Yet another highbit function. This really needs to go to common source.
7577aec1d6eScindi * Returns range 0 to 64 inclusive;
7587aec1d6eScindi */
7597aec1d6eScindi static int
topbit(uint64_t i)7607aec1d6eScindi topbit(uint64_t i)
7617aec1d6eScindi {
7627aec1d6eScindi int h = 1;
7637aec1d6eScindi
7647aec1d6eScindi if (i == 0)
7657aec1d6eScindi return (0);
7667aec1d6eScindi
7677aec1d6eScindi if (i & 0xffffffff00000000ULL) {
7687aec1d6eScindi h += 32;
7697aec1d6eScindi i >>= 32;
7707aec1d6eScindi }
7717aec1d6eScindi
7727aec1d6eScindi if (i & 0xffff0000) {
7737aec1d6eScindi h += 16;
7747aec1d6eScindi i >>= 16;
7757aec1d6eScindi }
7767aec1d6eScindi
7777aec1d6eScindi if (i & 0xff00) {
7787aec1d6eScindi h += 8;
7797aec1d6eScindi i >>= 8;
7807aec1d6eScindi }
7817aec1d6eScindi
7827aec1d6eScindi if (i & 0xf0) {
7837aec1d6eScindi h += 4;
7847aec1d6eScindi i >>= 4;
7857aec1d6eScindi }
7867aec1d6eScindi
7877aec1d6eScindi if (i & 0xc) {
7887aec1d6eScindi h += 2;
7897aec1d6eScindi i >>= 2;
7907aec1d6eScindi }
7917aec1d6eScindi
7927aec1d6eScindi if (i & 0x2)
7937aec1d6eScindi h += 1;
7947aec1d6eScindi
7957aec1d6eScindi return (h);
7967aec1d6eScindi }
7977aec1d6eScindi
7988a40a695Sgavinm /*
7998a40a695Sgavinm * Lookup the Chip-Select Bank Address Mode Encoding table for a given
8008a40a695Sgavinm * chip revision and chip-select mode.
8018a40a695Sgavinm */
8028a40a695Sgavinm const struct rct_bnkaddrmode *
rct_bnkaddrmode(uint_t mcrev,uint_t csmode)8038a40a695Sgavinm rct_bnkaddrmode(uint_t mcrev, uint_t csmode)
8048a40a695Sgavinm {
8058a40a695Sgavinm int i;
8068a40a695Sgavinm const struct _bnkaddrmode_tbldesc *bdp = bnkaddr_tbls;
8078a40a695Sgavinm
8088a40a695Sgavinm for (i = 0; i < sizeof (bnkaddr_tbls) /
8098a40a695Sgavinm sizeof (struct _bnkaddrmode_tbldesc);
8108a40a695Sgavinm i++, bdp++) {
8118a40a695Sgavinm if (MC_REV_MATCH(mcrev, bdp->revmask) && csmode < bdp->nmodes)
8128a40a695Sgavinm return (&bdp->modetbl[csmode]);
8138a40a695Sgavinm
8148a40a695Sgavinm }
8158a40a695Sgavinm
8168a40a695Sgavinm return (NULL);
8178a40a695Sgavinm }
8188a40a695Sgavinm
8198a40a695Sgavinm /*
8208a40a695Sgavinm * Lookup the DRAM Address Mapping table for a given chip revision, access
8218a40a695Sgavinm * width, bank-swizzle and chip-select mode.
8228a40a695Sgavinm */
8238a40a695Sgavinm const struct rct_rcbmap *
rct_rcbmap(uint_t mcrev,int width,uint_t csmode)8248a40a695Sgavinm rct_rcbmap(uint_t mcrev, int width, uint_t csmode)
8258a40a695Sgavinm {
8268a40a695Sgavinm const struct _rcbmap_tbl *rcbm;
8278a40a695Sgavinm int i;
8288a40a695Sgavinm
8298a40a695Sgavinm for (i = 0; i < sizeof (rcbmap_tbls) /
8308a40a695Sgavinm sizeof (struct _rcbmap_tbldesc); i++) {
8318a40a695Sgavinm rcbm = rcbmap_tbls[i].rcbmap;
8328a40a695Sgavinm if (MC_REV_MATCH(mcrev, rcbm->mt_revmask) &&
8338a40a695Sgavinm rcbm->mt_width == width && csmode < rcbmap_tbls[i].nmodes)
8348a40a695Sgavinm return (&rcbm->mt_csmap[csmode]);
8358a40a695Sgavinm }
8368a40a695Sgavinm
8378a40a695Sgavinm return (NULL);
8388a40a695Sgavinm }
8398a40a695Sgavinm
8408a40a695Sgavinm /*
8418a40a695Sgavinm * Lookup the bank swizzling information for a given chip revision and
8428a40a695Sgavinm * access width.
8438a40a695Sgavinm */
8448a40a695Sgavinm const struct rct_bnkswzlinfo *
rct_bnkswzlinfo(uint_t mcrev,int width)8458a40a695Sgavinm rct_bnkswzlinfo(uint_t mcrev, int width)
8468a40a695Sgavinm {
8478a40a695Sgavinm int i;
8488a40a695Sgavinm const struct _bnkswzl_tbl *swztp;
8498a40a695Sgavinm
8508a40a695Sgavinm for (i = 0; i < sizeof (bnkswzl_tbls) /
8518a40a695Sgavinm sizeof (struct rcb_bnkswzl_tbl *); i++) {
8528a40a695Sgavinm swztp = bnkswzl_tbls[i];
8538a40a695Sgavinm if (MC_REV_MATCH(mcrev, swztp->swzt_revmask) &&
8548a40a695Sgavinm swztp->swzt_width == width)
8558a40a695Sgavinm return (&swztp->swzt_bits);
8568a40a695Sgavinm }
8578a40a695Sgavinm
8588a40a695Sgavinm return (NULL);
8598a40a695Sgavinm }
8608a40a695Sgavinm
8617aec1d6eScindi void
rct_csintlv_bits(uint_t mcrev,int width,uint_t csmode,int factor,struct rct_csintlv * csid)8627aec1d6eScindi rct_csintlv_bits(uint_t mcrev, int width, uint_t csmode, int factor,
8638a40a695Sgavinm struct rct_csintlv *csid)
8647aec1d6eScindi {
8657aec1d6eScindi int i, lstbnkbit;
8667aec1d6eScindi size_t csz;
8678a40a695Sgavinm const struct rct_bnkaddrmode *bam;
8688a40a695Sgavinm const struct rct_rcbmap *rcm;
8697aec1d6eScindi
8707aec1d6eScindi /*
8715f25dc2aSgavinm * 8-way cs interleave for some large cs sizes in 128-bit mode is
8728a40a695Sgavinm * not implemented prior to rev F.
8737aec1d6eScindi */
8745f25dc2aSgavinm if (factor == 8 && width == 128 &&
875*20c794b3Sgavinm ((MC_REV_MATCH(mcrev, MC_F_REVS_BC) && csmode == 0x6) ||
876*20c794b3Sgavinm (MC_REV_MATCH(mcrev, MC_F_REVS_DE) &&
8778a40a695Sgavinm (csmode == 0x9 || csmode == 0xa)))) {
8787aec1d6eScindi csid->csi_factor = 0;
8797aec1d6eScindi return;
8807aec1d6eScindi }
8817aec1d6eScindi
8828a40a695Sgavinm if ((bam = rct_bnkaddrmode(mcrev, csmode)) == NULL ||
8837aec1d6eScindi (rcm = rct_rcbmap(mcrev, width, csmode)) == NULL) {
8847aec1d6eScindi csid->csi_factor = 0;
8857aec1d6eScindi return;
8867aec1d6eScindi }
8877aec1d6eScindi
8887aec1d6eScindi csz = MC_CS_SIZE(bam, width);
8897aec1d6eScindi
8907aec1d6eScindi switch (factor) {
8917aec1d6eScindi case 2:
8927aec1d6eScindi csid->csi_nbits = 1;
8937aec1d6eScindi break;
8947aec1d6eScindi case 4:
8957aec1d6eScindi csid->csi_nbits = 2;
8967aec1d6eScindi break;
8977aec1d6eScindi case 8:
8987aec1d6eScindi csid->csi_nbits = 3;
8997aec1d6eScindi break;
9007aec1d6eScindi default:
9017aec1d6eScindi csid->csi_factor = 0;
9027aec1d6eScindi return;
9037aec1d6eScindi }
9047aec1d6eScindi
9057aec1d6eScindi csid->csi_hibit = topbit(csz) - 1;
9067aec1d6eScindi
9078a40a695Sgavinm /*
9088a40a695Sgavinm * The first row bit is immediately after the last bank bit.
9098a40a695Sgavinm */
9107aec1d6eScindi lstbnkbit = 0;
9118a40a695Sgavinm for (i = 0; i < rcm->rcb_nbankbits; i++)
9128a40a695Sgavinm if (rcm->rcb_bankbit[i] > lstbnkbit)
9138a40a695Sgavinm lstbnkbit = rcm->rcb_bankbit[i];
9147aec1d6eScindi
9157aec1d6eScindi csid->csi_lobit = lstbnkbit + 1;
9167aec1d6eScindi
9177aec1d6eScindi csid->csi_factor = factor;
9187aec1d6eScindi }
919