xref: /onnv-gate/usr/src/uts/intel/io/intel_nhm/intel_nhm.h (revision 11516:dea3f81dcab2)
18472SSean.Ye@Sun.COM /*
28472SSean.Ye@Sun.COM  * CDDL HEADER START
38472SSean.Ye@Sun.COM  *
48472SSean.Ye@Sun.COM  * The contents of this file are subject to the terms of the
58472SSean.Ye@Sun.COM  * Common Development and Distribution License (the "License").
68472SSean.Ye@Sun.COM  * You may not use this file except in compliance with the License.
78472SSean.Ye@Sun.COM  *
88472SSean.Ye@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
98472SSean.Ye@Sun.COM  * or http://www.opensolaris.org/os/licensing.
108472SSean.Ye@Sun.COM  * See the License for the specific language governing permissions
118472SSean.Ye@Sun.COM  * and limitations under the License.
128472SSean.Ye@Sun.COM  *
138472SSean.Ye@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
148472SSean.Ye@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
158472SSean.Ye@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
168472SSean.Ye@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
178472SSean.Ye@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
188472SSean.Ye@Sun.COM  *
198472SSean.Ye@Sun.COM  * CDDL HEADER END
208472SSean.Ye@Sun.COM  */
218472SSean.Ye@Sun.COM 
228472SSean.Ye@Sun.COM /*
23*11516SAdrian.Frost@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
248472SSean.Ye@Sun.COM  * Use is subject to license terms.
258472SSean.Ye@Sun.COM  */
268472SSean.Ye@Sun.COM 
278472SSean.Ye@Sun.COM #ifndef _INTEL_NHM_H
288472SSean.Ye@Sun.COM #define	_INTEL_NHM_H
298472SSean.Ye@Sun.COM 
308472SSean.Ye@Sun.COM #ifdef __cplusplus
318472SSean.Ye@Sun.COM extern "C" {
328472SSean.Ye@Sun.COM #endif
338472SSean.Ye@Sun.COM 
348977SAdrian.Frost@Sun.COM #define	NHM_EP_CPU	0x2c408086
358977SAdrian.Frost@Sun.COM #define	NHM_WS_CPU	0x2c418086
368977SAdrian.Frost@Sun.COM #define	NHM_CPU_RAS	0x2c1a8086
3710556SAdrian.Frost@Sun.COM #define	NHM_JF_CPU	0x2c588086
3810556SAdrian.Frost@Sun.COM #define	NHM_JF_CPU_RAS	0x2cda8086
3910556SAdrian.Frost@Sun.COM #define	NHM_WM_CPU	0x2c708086
4010556SAdrian.Frost@Sun.COM #define	NHM_WM_CPU_RAS	0x2d9a8086
418977SAdrian.Frost@Sun.COM 
428977SAdrian.Frost@Sun.COM #define	NHM_INTERCONNECT	"Intel QuickPath"
438472SSean.Ye@Sun.COM 
448472SSean.Ye@Sun.COM #define	MAX_CPU_NODES	2
458472SSean.Ye@Sun.COM #define	CPU_PCI_DEVS	6
468472SSean.Ye@Sun.COM #define	CPU_PCI_FUNCS	6
478472SSean.Ye@Sun.COM 
488472SSean.Ye@Sun.COM #define	MAX_BUS_NUMBER	max_bus_number
498472SSean.Ye@Sun.COM 
508472SSean.Ye@Sun.COM #define	SOCKET_BUS(cpu) (MAX_BUS_NUMBER - (cpu))
518472SSean.Ye@Sun.COM #define	CPU_ID_RD(cpu)  nhm_pci_getl(SOCKET_BUS(cpu), 0, 0, 0, 0)
528472SSean.Ye@Sun.COM #define	MC_CONTROL_RD(cpu) \
538472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, 0x48, 0)
548472SSean.Ye@Sun.COM #define	MC_STATUS_RD(cpu) \
558472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, 0x4c, 0)
568472SSean.Ye@Sun.COM #define	MC_SMI_SPARE_DIMM_ERROR_STATUS_RD(cpu) \
578472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, 0x50, 0)
588977SAdrian.Frost@Sun.COM #define	MC_CPU_RAS_RD(cpu) \
598977SAdrian.Frost@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0, 0)
608472SSean.Ye@Sun.COM #define	MC_SCRUB_CONTROL_RD(cpu) \
618472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x4c, 0)
628472SSean.Ye@Sun.COM #define	MC_SCRUB_CONTROL_WR(cpu, reg) nhm_pci_putl(SOCKET_BUS(cpu), 3, 2, \
638472SSean.Ye@Sun.COM     0x4c, reg);
648472SSean.Ye@Sun.COM #define	MC_SSR_CONTROL_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x48, 0)
658472SSean.Ye@Sun.COM #define	MC_SSR_CONTROL_WR(cpu, reg) nhm_pci_putl(SOCKET_BUS(cpu), 3, 2, 0x48, \
668472SSean.Ye@Sun.COM     reg);
678472SSean.Ye@Sun.COM #define	MC_SSR_SCRUB_CONTROL_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, \
688472SSean.Ye@Sun.COM     0x4c, 0)
698472SSean.Ye@Sun.COM #define	MC_RAS_ENABLES_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x50, 0)
708472SSean.Ye@Sun.COM #define	MC_RAS_STATUS_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x54, 0)
718472SSean.Ye@Sun.COM #define	MC_SSR_STATUS_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x60, 0)
728472SSean.Ye@Sun.COM #define	MC_CHANNEL_MAPPER_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, \
738472SSean.Ye@Sun.COM     0x60, 0)
748472SSean.Ye@Sun.COM #define	MC_COR_ECC_CNT_RD(cpu, select) \
758472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x80 + ((select) * 4), 0)
768472SSean.Ye@Sun.COM #define	MC_CHANNEL_RANK_PRESENT_RD(cpu, channel) \
778472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 0, 0x7c, 0)
788472SSean.Ye@Sun.COM #define	MC_DOD_RD(cpu, channel, select) \
798472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 1, 0x48 + ((select) * 4), 0)
808472SSean.Ye@Sun.COM #define	MC_SAG_RD(cpu, channel, select) \
818472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 1, 0x80 + ((select) * 4), 0)
828472SSean.Ye@Sun.COM #define	MC_RIR_LIMIT_RD(cpu, channel, select) \
838472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 2, 0x40 + ((select) * 4), 0)
848472SSean.Ye@Sun.COM #define	MC_RIR_WAY_RD(cpu, channel, select) \
858472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 2, 0x80 + ((select) * 4), 0)
868472SSean.Ye@Sun.COM #define	MC_CHANNEL_DIMM_INIT_PARAMS_RD(cpu, channel) \
878472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 0, 0x58, 0)
888472SSean.Ye@Sun.COM #define	SAD_DRAM_RULE_RD(cpu, rule) \
898472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 0, 1, 0x80 + (4 * (rule)), 0)
908472SSean.Ye@Sun.COM #define	SAD_INTERLEAVE_LIST_RD(cpu, rule) \
918472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 0, 1, 0xc0 + (4 * (rule)), 0)
928472SSean.Ye@Sun.COM #define	TAD_DRAM_RULE_RD(cpu, rule) \
938472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 3, 1, 0x80 + (4 * (rule)), 0)
948472SSean.Ye@Sun.COM #define	TAD_INTERLEAVE_LIST_RD(cpu, rule) \
958472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 3, 1, 0xc0 + (4 * (rule)), 0)
968472SSean.Ye@Sun.COM #define	MC_DIMM_CLK_RATIO_STATUS(cpu) \
978472SSean.Ye@Sun.COM     nhm_pci_getl(SOCKET_BUS(cpu), 3, 4, 0x50, 0)
988472SSean.Ye@Sun.COM 
998472SSean.Ye@Sun.COM /*
1008472SSean.Ye@Sun.COM  * MC_CONTROL
1018472SSean.Ye@Sun.COM  */
1028472SSean.Ye@Sun.COM #define	MC_CONTROL_CHANNEL_ACTIVE(reg, channel) \
1038472SSean.Ye@Sun.COM 	((reg) & (1 << (8 + (channel))) != 0)
1048472SSean.Ye@Sun.COM #define	MC_CONTROL_ECCEN(reg) (((reg) >> 1) & 1)
1058472SSean.Ye@Sun.COM #define	MC_CONTROL_CLOSED_PAGE(reg) ((reg) & 1)
10610650SVuong.Nguyen@Sun.COM #define	MC_CONTROL_DIVBY3(reg) ((reg >> 6) &1)
10710650SVuong.Nguyen@Sun.COM 
10810650SVuong.Nguyen@Sun.COM #define	NUM_CACHELINE_BITS	6	/* Cachelines are 64B */
10910650SVuong.Nguyen@Sun.COM 
1108472SSean.Ye@Sun.COM /*
1118472SSean.Ye@Sun.COM  * MC_STATUS
1128472SSean.Ye@Sun.COM  */
1138472SSean.Ye@Sun.COM #define	CHANNEL_DISABLED(reg, channel) ((reg) & (1 << (channel)))
1148977SAdrian.Frost@Sun.COM #define	WS_ECC_ENABLED	0x10
1158472SSean.Ye@Sun.COM /*
1168472SSean.Ye@Sun.COM  * MC_CHANNEL_DIMM_INIT_PARAMS
1178472SSean.Ye@Sun.COM  */
1188472SSean.Ye@Sun.COM #define	THREE_DIMMS_PRESENT		(1 << 24) /* not quad rank */
1198472SSean.Ye@Sun.COM #define	SINGLE_QUAD_RANK_PRESENT	(1 << 23)
1208472SSean.Ye@Sun.COM #define	QUAD_RANK_PRESENT		(1 << 22) /* 1 or 2 quad rank dimms */
1218472SSean.Ye@Sun.COM #define	REGISTERED_DIMM			(1 << 15)
1228472SSean.Ye@Sun.COM 
1238472SSean.Ye@Sun.COM /*
1248472SSean.Ye@Sun.COM  * MC_DOD_CH
1258472SSean.Ye@Sun.COM  */
1268472SSean.Ye@Sun.COM #define	RANKOFFSET(reg)	(((reg) >> 10) & 7)
1278472SSean.Ye@Sun.COM #define	DIMMPRESENT(reg) (((reg) & (1 << 9)) != 0)
1288472SSean.Ye@Sun.COM #define	NUMBANK(reg) (((reg) & (3 << 7)) == 0 ? 4 : (((reg) >> 7) & 3) * 8)
1298472SSean.Ye@Sun.COM #define	NUMRANK(reg) (((reg) & (3 << 5)) == 0 ? 1 : (((reg) >> 5) & 3) * 2)
1308472SSean.Ye@Sun.COM #define	NUMROW(reg) ((((reg) >> 2) & 7) + 12)
1318472SSean.Ye@Sun.COM #define	NUMCOL(reg) (((reg) & 3) + 10)
1328472SSean.Ye@Sun.COM #define	DIMMWIDTH	8
1338472SSean.Ye@Sun.COM #define	DIMMSIZE(reg) ((1ULL << (NUMCOL(reg) + NUMROW(reg))) * NUMRANK(reg) \
1348472SSean.Ye@Sun.COM 	* NUMBANK(reg) * DIMMWIDTH)
1358472SSean.Ye@Sun.COM 
1368472SSean.Ye@Sun.COM /*
1378472SSean.Ye@Sun.COM  * MC_SAG_CH
1388472SSean.Ye@Sun.COM  */
1398472SSean.Ye@Sun.COM #define	DIVBY3(reg)	(((reg) >> 27) & 1)	/* 3 or 6 way interleave */
1408472SSean.Ye@Sun.COM #define	REMOVE_6(reg)	(((reg) >> 24) & 1)
1418472SSean.Ye@Sun.COM #define	REMOVE_7(reg)	(((reg) >> 25) & 1)
1428472SSean.Ye@Sun.COM #define	REMOVE_8(reg)	(((reg) >> 26) & 1)
1438472SSean.Ye@Sun.COM #define	CH_ADDRESS_OFFSET(reg) \
14410650SVuong.Nguyen@Sun.COM 	(int64_t)((uint64_t)(reg) & 0x00ffffff)
14510650SVuong.Nguyen@Sun.COM #define	CH_ADDRESS_SOFFSET(reg) \
14610650SVuong.Nguyen@Sun.COM 	((int64_t)(((uint64_t)(reg) & 0x00ffffff) << 40) >>40)
14710650SVuong.Nguyen@Sun.COM /* SAG offset covers SA[39:16] so granularity is 2^16 = 64KB */
14810650SVuong.Nguyen@Sun.COM #define	SAG_OFFSET_GRANULARITY	16
14910650SVuong.Nguyen@Sun.COM /* 24-bit mask for TTMAD_CR_SAG_CH*.OFFSET */
15010650SVuong.Nguyen@Sun.COM #define	SAG_OFFSET_SIZE_MASK	0xffffffULL
15110650SVuong.Nguyen@Sun.COM /* 16-bit mask for lower bits not covered by CREG value (SA[15:0]) */
15210650SVuong.Nguyen@Sun.COM #define	SAG_OFFSET_ADDR_MASK	0xffffULL
15310650SVuong.Nguyen@Sun.COM #define	CACHELINE_ADDR_MASK	0x3fULL	/* 6-bit mask */
15410650SVuong.Nguyen@Sun.COM 
1558472SSean.Ye@Sun.COM /*
1568472SSean.Ye@Sun.COM  * MC_RIR_LIMIT_CH
1578472SSean.Ye@Sun.COM  */
1588472SSean.Ye@Sun.COM #define	RIR_LIMIT(reg)	((((uint64_t)(reg) & 0x000003ff) + 1) << 28)
1598472SSean.Ye@Sun.COM /*
1608472SSean.Ye@Sun.COM  * MC_RIR_WAY_CH
1618472SSean.Ye@Sun.COM  */
16210650SVuong.Nguyen@Sun.COM #define	RIR_OFFSET(reg)	(int64_t)((uint64_t)(reg >> 4)& 0x3ff)
16310650SVuong.Nguyen@Sun.COM #define	RIR_SOFFSET(reg)	((int64_t)(((uint64_t)(reg) & 0x3ff0) << 50) \
16410650SVuong.Nguyen@Sun.COM 				    >> 54)
16510650SVuong.Nguyen@Sun.COM #define	RIR_DIMM_RANK(reg)	((reg) & 0xf)
16610650SVuong.Nguyen@Sun.COM #define	RIR_RANK(reg)	((reg) & 0x3)
16710650SVuong.Nguyen@Sun.COM #define	RIR_DIMM(reg)	((reg)>>2 & 0x03)
16810650SVuong.Nguyen@Sun.COM #define	RIR_OFFSET_SIZE_MASK	0x3ff
1698472SSean.Ye@Sun.COM 
1708472SSean.Ye@Sun.COM #define	MAX_RIR_WAY 4
1718472SSean.Ye@Sun.COM 
17210650SVuong.Nguyen@Sun.COM #define	RIR_LIMIT_GRANULARITY	28
17310650SVuong.Nguyen@Sun.COM #define	RIR_OFFSET_ADDR_MASK	0xfffffffULL	/* 28-bit mask */
17410650SVuong.Nguyen@Sun.COM #define	RIR_INTLV_PGOPEN_BIT	12	/* Rank interleaving */
17510650SVuong.Nguyen@Sun.COM #define	RIR_INTLV_PGOPEN_MASK	0xfffULL	/* 12-bit mask */
17610650SVuong.Nguyen@Sun.COM #define	RIR_INTLV_PGCLS_BIT	6	/* Rank interleaving */
17710650SVuong.Nguyen@Sun.COM #define	RIR_INTLV_PGCLS_MASK	0x3fULL	/* 6-bit mask */
17810650SVuong.Nguyen@Sun.COM #define	RIR_INTLV_SIZE_MASK	0x3ULL
1798472SSean.Ye@Sun.COM /*
1808472SSean.Ye@Sun.COM  * MC_RAS_ENABLES
1818472SSean.Ye@Sun.COM  */
1828472SSean.Ye@Sun.COM #define	RAS_LOCKSTEP_ENABLE(reg) (((reg) & 2) != 0)
1838472SSean.Ye@Sun.COM #define	RAS_MIRROR_MEM_ENABLE(reg) (((reg) & 1) != 0)
1848472SSean.Ye@Sun.COM /*
1858472SSean.Ye@Sun.COM  * MC_RAS_STATUS
1868472SSean.Ye@Sun.COM  */
1878472SSean.Ye@Sun.COM #define	REDUNDANCY_LOSS(reg) (((reg) & 1) != 0)
1888472SSean.Ye@Sun.COM /*
1898472SSean.Ye@Sun.COM  * MC_SSRSTATUS
1908472SSean.Ye@Sun.COM  */
1918472SSean.Ye@Sun.COM #define	SPAREING_IN_PROGRESS(reg) (((reg) & 2) != 0)
1928472SSean.Ye@Sun.COM #define	SPAREING_COMPLETE(reg) (((reg) & 1) != 0)
1938472SSean.Ye@Sun.COM 
1948472SSean.Ye@Sun.COM /*
1958472SSean.Ye@Sun.COM  * MC_SSR_CONTROL
1968472SSean.Ye@Sun.COM  */
1978472SSean.Ye@Sun.COM #define	SSR_MODE(reg) ((reg) & 3)
1988472SSean.Ye@Sun.COM #define	SSR_IDLE	0
1998472SSean.Ye@Sun.COM #define	SSR_SCRUB	1
2008472SSean.Ye@Sun.COM #define	SSR_SPARE	2
2018472SSean.Ye@Sun.COM #define	DEMAND_SCRUB_ENABLE	(1 << 6)
2028472SSean.Ye@Sun.COM /*
2038472SSean.Ye@Sun.COM  * MC_SCRUB_CONTROL
2048472SSean.Ye@Sun.COM  */
2058472SSean.Ye@Sun.COM #define	STARTSCRUB	(1 << 24)
2068472SSean.Ye@Sun.COM /*
2078472SSean.Ye@Sun.COM  * MC_DIMM_CLK_RATIO_STATUS
2088472SSean.Ye@Sun.COM  */
2098472SSean.Ye@Sun.COM #define	MAX_DIMM_CLK_RATIO(reg) (((reg) >> 24) & 0x1f)
2108472SSean.Ye@Sun.COM /*
2118472SSean.Ye@Sun.COM  * MC_SMI_SPARE_DIMM_ERROR_STATUS_RD
2128472SSean.Ye@Sun.COM  */
2138472SSean.Ye@Sun.COM #define	REDUNDANCY_LOSS_FAILING_DIMM(status) (((status) >> 12) & 3)
2148472SSean.Ye@Sun.COM #define	DIMM_ERROR_OVERFLOW_STATUS(status) ((status) & 0xfff)
2158472SSean.Ye@Sun.COM 
2168472SSean.Ye@Sun.COM #define	MAX_MEMORY_CONTROLLERS	MAX_CPU_NODES
2178472SSean.Ye@Sun.COM #define	CHANNELS_PER_MEMORY_CONTROLLER	3
2188472SSean.Ye@Sun.COM #define	MAX_DIMMS_PER_CHANNEL	3
2198472SSean.Ye@Sun.COM 
2208472SSean.Ye@Sun.COM /*
2218472SSean.Ye@Sun.COM  * SAD_DRAM_RULE
2228472SSean.Ye@Sun.COM  */
2238472SSean.Ye@Sun.COM #define	SAD_DRAM_LIMIT(sad) ((((uint64_t)(sad) & 0x000fffc0ULL) + 0x40) << 20)
2248472SSean.Ye@Sun.COM #define	SAD_DRAM_MODE(sad) (((sad) >> 1) & 3)
2258472SSean.Ye@Sun.COM #define	SAD_DRAM_RULE_ENABLE(sad) ((sad) & 1)
2268472SSean.Ye@Sun.COM 
22710650SVuong.Nguyen@Sun.COM /*
22810650SVuong.Nguyen@Sun.COM  * from SAD_DRAM_RULE*.MODE
22910650SVuong.Nguyen@Sun.COM  */
23010650SVuong.Nguyen@Sun.COM #define	DIRECT	0
23110650SVuong.Nguyen@Sun.COM #define	XOR	1
23210650SVuong.Nguyen@Sun.COM #define	MOD3	2
23310650SVuong.Nguyen@Sun.COM #define	SAD_INTERLEAVE(list, num)	(((list) >> ((num) * 4)) & 0x3)
23410650SVuong.Nguyen@Sun.COM #define	INTERLEAVE_NWAY	8
23510650SVuong.Nguyen@Sun.COM #define	MAX_SAD_DRAM_RULE	8
23610650SVuong.Nguyen@Sun.COM 
23710650SVuong.Nguyen@Sun.COM #define	SAD_LIMIT_GRANULARITY	26
23810650SVuong.Nguyen@Sun.COM #define	SAD_LIMIT_ADDR_MASK	0x3ffffffULL
23910650SVuong.Nguyen@Sun.COM #define	SAD_INTLV_DIRECT_BIT	6
24010650SVuong.Nguyen@Sun.COM #define	SAD_INTLV_XOR_BIT	16
24110650SVuong.Nguyen@Sun.COM #define	SAD_INTLV_SIZE_MASK	0x7ULL
24210650SVuong.Nguyen@Sun.COM #define	SAD_INTLV_ADDR_MASK	0x3fULL
2438472SSean.Ye@Sun.COM 
2448472SSean.Ye@Sun.COM /*
2458472SSean.Ye@Sun.COM  * TAD_DRAM_RULE
2468472SSean.Ye@Sun.COM  */
2478472SSean.Ye@Sun.COM #define	TAD_DRAM_LIMIT(tad) ((((uint64_t)(tad) & 0x000fffc0ULL) + 0x40) << 20)
2488472SSean.Ye@Sun.COM #define	TAD_DRAM_MODE(tad) (((tad) >> 1) & 3)
2498472SSean.Ye@Sun.COM #define	TAD_DRAM_RULE_ENABLE(tad) ((tad) & 1)
2508472SSean.Ye@Sun.COM 
2518472SSean.Ye@Sun.COM #define	TAD_INTERLEAVE(list, channel) (((list) >> ((channel) * 4)) & 3)
2528472SSean.Ye@Sun.COM 
2538472SSean.Ye@Sun.COM #define	MAX_TAD_DRAM_RULE 8
2548472SSean.Ye@Sun.COM 
255*11516SAdrian.Frost@Sun.COM #define	VRANK_SZ 0x10000000
2568472SSean.Ye@Sun.COM 
25710650SVuong.Nguyen@Sun.COM typedef struct sad {
25810650SVuong.Nguyen@Sun.COM 	uint64_t limit;
25910650SVuong.Nguyen@Sun.COM 	uint32_t node_list;
26010650SVuong.Nguyen@Sun.COM 	uint32_t node_tgt[INTERLEAVE_NWAY];
26110650SVuong.Nguyen@Sun.COM 	char mode;
26210650SVuong.Nguyen@Sun.COM 	char enable;
26310650SVuong.Nguyen@Sun.COM 	char interleave;
26410650SVuong.Nguyen@Sun.COM } sad_t;
26510650SVuong.Nguyen@Sun.COM 
26610650SVuong.Nguyen@Sun.COM typedef struct tad {
26710650SVuong.Nguyen@Sun.COM 	uint64_t limit;
26810650SVuong.Nguyen@Sun.COM 	uint32_t pkg_list;
26910650SVuong.Nguyen@Sun.COM 	uint32_t pkg_tgt[INTERLEAVE_NWAY];
27010650SVuong.Nguyen@Sun.COM 	char mode;
27110650SVuong.Nguyen@Sun.COM 	char enable;
27210650SVuong.Nguyen@Sun.COM 	char interleave;
27310650SVuong.Nguyen@Sun.COM } tad_t;
27410650SVuong.Nguyen@Sun.COM 
27510650SVuong.Nguyen@Sun.COM typedef struct sag_ch {
27610650SVuong.Nguyen@Sun.COM 	uint32_t offset;
27710650SVuong.Nguyen@Sun.COM 	int32_t soffset;
27810650SVuong.Nguyen@Sun.COM 	char divby3;
27910650SVuong.Nguyen@Sun.COM 	char remove6;
28010650SVuong.Nguyen@Sun.COM 	char remove7;
28110650SVuong.Nguyen@Sun.COM 	char remove8;
28210650SVuong.Nguyen@Sun.COM } sag_ch_t;
28310650SVuong.Nguyen@Sun.COM 
28410650SVuong.Nguyen@Sun.COM typedef struct rir_way {
28510650SVuong.Nguyen@Sun.COM 	uint16_t offset;
28610650SVuong.Nguyen@Sun.COM 	int16_t soffset;
28710650SVuong.Nguyen@Sun.COM 	uint8_t	rank;
28810650SVuong.Nguyen@Sun.COM 	uint8_t dimm;
28910650SVuong.Nguyen@Sun.COM 	uint8_t dimm_rank;
29010650SVuong.Nguyen@Sun.COM 	uint64_t rlimit;
29110650SVuong.Nguyen@Sun.COM } way_t;
29210650SVuong.Nguyen@Sun.COM 
29310650SVuong.Nguyen@Sun.COM typedef struct rir {
29410650SVuong.Nguyen@Sun.COM 	uint64_t limit;
29510650SVuong.Nguyen@Sun.COM 	way_t way[MAX_RIR_WAY];
29610650SVuong.Nguyen@Sun.COM 	char interleave;
29710650SVuong.Nguyen@Sun.COM } rir_t;
29810650SVuong.Nguyen@Sun.COM 
29910650SVuong.Nguyen@Sun.COM typedef struct dod_type {
30010650SVuong.Nguyen@Sun.COM 	int NUMCol;
30110650SVuong.Nguyen@Sun.COM 	int NUMRow;
30210650SVuong.Nguyen@Sun.COM 	int NUMRank;
30310650SVuong.Nguyen@Sun.COM 	int NUMBank;
30410650SVuong.Nguyen@Sun.COM 	int DIMMPresent;
30510650SVuong.Nguyen@Sun.COM 	int RankOffset;
30610650SVuong.Nguyen@Sun.COM } dod_t;
30710650SVuong.Nguyen@Sun.COM 
3088472SSean.Ye@Sun.COM /*
3098472SSean.Ye@Sun.COM  * MC_CHANNEL_MAPPER
3108472SSean.Ye@Sun.COM  */
3118472SSean.Ye@Sun.COM #define	CHANNEL_MAP(reg, channel, write) (((reg) >> ((channel) * 6 + \
3128472SSean.Ye@Sun.COM 	((write) ? 0 : 3))) & 7)
3138472SSean.Ye@Sun.COM 
3148472SSean.Ye@Sun.COM extern int max_bus_number;
3158472SSean.Ye@Sun.COM 
3168472SSean.Ye@Sun.COM #ifdef __cplusplus
3178472SSean.Ye@Sun.COM }
3188472SSean.Ye@Sun.COM #endif
3198472SSean.Ye@Sun.COM 
3208472SSean.Ye@Sun.COM #endif /* _INTEL_NHM_H */
321