1e3d60c9bSAdrian Frost /*
2e3d60c9bSAdrian Frost  * CDDL HEADER START
3e3d60c9bSAdrian Frost  *
4e3d60c9bSAdrian Frost  * The contents of this file are subject to the terms of the
5e3d60c9bSAdrian Frost  * Common Development and Distribution License (the "License").
6e3d60c9bSAdrian Frost  * You may not use this file except in compliance with the License.
7e3d60c9bSAdrian Frost  *
8e3d60c9bSAdrian Frost  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e3d60c9bSAdrian Frost  * or http://www.opensolaris.org/os/licensing.
10e3d60c9bSAdrian Frost  * See the License for the specific language governing permissions
11e3d60c9bSAdrian Frost  * and limitations under the License.
12e3d60c9bSAdrian Frost  *
13e3d60c9bSAdrian Frost  * When distributing Covered Code, include this CDDL HEADER in each
14e3d60c9bSAdrian Frost  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15e3d60c9bSAdrian Frost  * If applicable, add the following below this CDDL HEADER, with the
16e3d60c9bSAdrian Frost  * fields enclosed by brackets "[]" replaced with your own identifying
17e3d60c9bSAdrian Frost  * information: Portions Copyright [yyyy] [name of copyright owner]
18e3d60c9bSAdrian Frost  *
19e3d60c9bSAdrian Frost  * CDDL HEADER END
20e3d60c9bSAdrian Frost  */
21e3d60c9bSAdrian Frost 
22e3d60c9bSAdrian Frost /*
23*e8ee2240SAdrian Frost  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
24e3d60c9bSAdrian Frost  * Use is subject to license terms.
25e3d60c9bSAdrian Frost  */
26e3d60c9bSAdrian Frost 
27e3d60c9bSAdrian Frost #ifndef _INTEL_NHM_H
28e3d60c9bSAdrian Frost #define	_INTEL_NHM_H
29e3d60c9bSAdrian Frost 
30e3d60c9bSAdrian Frost #ifdef __cplusplus
31e3d60c9bSAdrian Frost extern "C" {
32e3d60c9bSAdrian Frost #endif
33e3d60c9bSAdrian Frost 
34ee9ef9e5SAdrian Frost #define	NHM_EP_CPU	0x2c408086
35ee9ef9e5SAdrian Frost #define	NHM_WS_CPU	0x2c418086
36ee9ef9e5SAdrian Frost #define	NHM_CPU_RAS	0x2c1a8086
3735366b93SAdrian Frost #define	NHM_JF_CPU	0x2c588086
3835366b93SAdrian Frost #define	NHM_JF_CPU_RAS	0x2cda8086
3935366b93SAdrian Frost #define	NHM_WM_CPU	0x2c708086
4035366b93SAdrian Frost #define	NHM_WM_CPU_RAS	0x2d9a8086
41ee9ef9e5SAdrian Frost 
42ee9ef9e5SAdrian Frost #define	NHM_INTERCONNECT	"Intel QuickPath"
43e3d60c9bSAdrian Frost 
44e3d60c9bSAdrian Frost #define	MAX_CPU_NODES	2
45e3d60c9bSAdrian Frost #define	CPU_PCI_DEVS	6
46e3d60c9bSAdrian Frost #define	CPU_PCI_FUNCS	6
47e3d60c9bSAdrian Frost 
48e3d60c9bSAdrian Frost #define	MAX_BUS_NUMBER	max_bus_number
49e3d60c9bSAdrian Frost 
50e3d60c9bSAdrian Frost #define	SOCKET_BUS(cpu) (MAX_BUS_NUMBER - (cpu))
51e3d60c9bSAdrian Frost #define	CPU_ID_RD(cpu)  nhm_pci_getl(SOCKET_BUS(cpu), 0, 0, 0, 0)
52e3d60c9bSAdrian Frost #define	MC_CONTROL_RD(cpu) \
53e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, 0x48, 0)
54e3d60c9bSAdrian Frost #define	MC_STATUS_RD(cpu) \
55e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, 0x4c, 0)
56e3d60c9bSAdrian Frost #define	MC_SMI_SPARE_DIMM_ERROR_STATUS_RD(cpu) \
57e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, 0x50, 0)
58ee9ef9e5SAdrian Frost #define	MC_CPU_RAS_RD(cpu) \
59ee9ef9e5SAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0, 0)
60e3d60c9bSAdrian Frost #define	MC_SCRUB_CONTROL_RD(cpu) \
61e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x4c, 0)
62e3d60c9bSAdrian Frost #define	MC_SCRUB_CONTROL_WR(cpu, reg) nhm_pci_putl(SOCKET_BUS(cpu), 3, 2, \
63e3d60c9bSAdrian Frost     0x4c, reg);
64e3d60c9bSAdrian Frost #define	MC_SSR_CONTROL_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x48, 0)
65e3d60c9bSAdrian Frost #define	MC_SSR_CONTROL_WR(cpu, reg) nhm_pci_putl(SOCKET_BUS(cpu), 3, 2, 0x48, \
66e3d60c9bSAdrian Frost     reg);
67e3d60c9bSAdrian Frost #define	MC_SSR_SCRUB_CONTROL_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, \
68e3d60c9bSAdrian Frost     0x4c, 0)
69e3d60c9bSAdrian Frost #define	MC_RAS_ENABLES_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x50, 0)
70e3d60c9bSAdrian Frost #define	MC_RAS_STATUS_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x54, 0)
71e3d60c9bSAdrian Frost #define	MC_SSR_STATUS_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x60, 0)
72e3d60c9bSAdrian Frost #define	MC_CHANNEL_MAPPER_RD(cpu)	nhm_pci_getl(SOCKET_BUS(cpu), 3, 0, \
73e3d60c9bSAdrian Frost     0x60, 0)
74e3d60c9bSAdrian Frost #define	MC_COR_ECC_CNT_RD(cpu, select) \
75e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 3, 2, 0x80 + ((select) * 4), 0)
76e3d60c9bSAdrian Frost #define	MC_CHANNEL_RANK_PRESENT_RD(cpu, channel) \
77e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 0, 0x7c, 0)
78e3d60c9bSAdrian Frost #define	MC_DOD_RD(cpu, channel, select) \
79e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 1, 0x48 + ((select) * 4), 0)
80e3d60c9bSAdrian Frost #define	MC_SAG_RD(cpu, channel, select) \
81e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 1, 0x80 + ((select) * 4), 0)
82e3d60c9bSAdrian Frost #define	MC_RIR_LIMIT_RD(cpu, channel, select) \
83e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 2, 0x40 + ((select) * 4), 0)
84e3d60c9bSAdrian Frost #define	MC_RIR_WAY_RD(cpu, channel, select) \
85e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 2, 0x80 + ((select) * 4), 0)
86e3d60c9bSAdrian Frost #define	MC_CHANNEL_DIMM_INIT_PARAMS_RD(cpu, channel) \
87e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), (channel) + 4, 0, 0x58, 0)
88e3d60c9bSAdrian Frost #define	SAD_DRAM_RULE_RD(cpu, rule) \
89e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 0, 1, 0x80 + (4 * (rule)), 0)
90e3d60c9bSAdrian Frost #define	SAD_INTERLEAVE_LIST_RD(cpu, rule) \
91e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 0, 1, 0xc0 + (4 * (rule)), 0)
92e3d60c9bSAdrian Frost #define	TAD_DRAM_RULE_RD(cpu, rule) \
93e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 3, 1, 0x80 + (4 * (rule)), 0)
94e3d60c9bSAdrian Frost #define	TAD_INTERLEAVE_LIST_RD(cpu, rule) \
95e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 3, 1, 0xc0 + (4 * (rule)), 0)
96e3d60c9bSAdrian Frost #define	MC_DIMM_CLK_RATIO_STATUS(cpu) \
97e3d60c9bSAdrian Frost     nhm_pci_getl(SOCKET_BUS(cpu), 3, 4, 0x50, 0)
98e3d60c9bSAdrian Frost 
99e3d60c9bSAdrian Frost /*
100e3d60c9bSAdrian Frost  * MC_CONTROL
101e3d60c9bSAdrian Frost  */
102e3d60c9bSAdrian Frost #define	MC_CONTROL_CHANNEL_ACTIVE(reg, channel) \
103e3d60c9bSAdrian Frost 	((reg) & (1 << (8 + (channel))) != 0)
104e3d60c9bSAdrian Frost #define	MC_CONTROL_ECCEN(reg) (((reg) >> 1) & 1)
105e3d60c9bSAdrian Frost #define	MC_CONTROL_CLOSED_PAGE(reg) ((reg) & 1)
106f899e573SVuong Nguyen #define	MC_CONTROL_DIVBY3(reg) ((reg >> 6) &1)
107f899e573SVuong Nguyen 
108f899e573SVuong Nguyen #define	NUM_CACHELINE_BITS	6	/* Cachelines are 64B */
109f899e573SVuong Nguyen 
110e3d60c9bSAdrian Frost /*
111e3d60c9bSAdrian Frost  * MC_STATUS
112e3d60c9bSAdrian Frost  */
113e3d60c9bSAdrian Frost #define	CHANNEL_DISABLED(reg, channel) ((reg) & (1 << (channel)))
114ee9ef9e5SAdrian Frost #define	WS_ECC_ENABLED	0x10
115e3d60c9bSAdrian Frost /*
116e3d60c9bSAdrian Frost  * MC_CHANNEL_DIMM_INIT_PARAMS
117e3d60c9bSAdrian Frost  */
118e3d60c9bSAdrian Frost #define	THREE_DIMMS_PRESENT		(1 << 24) /* not quad rank */
119e3d60c9bSAdrian Frost #define	SINGLE_QUAD_RANK_PRESENT	(1 << 23)
120e3d60c9bSAdrian Frost #define	QUAD_RANK_PRESENT		(1 << 22) /* 1 or 2 quad rank dimms */
121e3d60c9bSAdrian Frost #define	REGISTERED_DIMM			(1 << 15)
122e3d60c9bSAdrian Frost 
123e3d60c9bSAdrian Frost /*
124e3d60c9bSAdrian Frost  * MC_DOD_CH
125e3d60c9bSAdrian Frost  */
126e3d60c9bSAdrian Frost #define	RANKOFFSET(reg)	(((reg) >> 10) & 7)
127e3d60c9bSAdrian Frost #define	DIMMPRESENT(reg) (((reg) & (1 << 9)) != 0)
128e3d60c9bSAdrian Frost #define	NUMBANK(reg) (((reg) & (3 << 7)) == 0 ? 4 : (((reg) >> 7) & 3) * 8)
129e3d60c9bSAdrian Frost #define	NUMRANK(reg) (((reg) & (3 << 5)) == 0 ? 1 : (((reg) >> 5) & 3) * 2)
130e3d60c9bSAdrian Frost #define	NUMROW(reg) ((((reg) >> 2) & 7) + 12)
131e3d60c9bSAdrian Frost #define	NUMCOL(reg) (((reg) & 3) + 10)
132e3d60c9bSAdrian Frost #define	DIMMWIDTH	8
133e3d60c9bSAdrian Frost #define	DIMMSIZE(reg) ((1ULL << (NUMCOL(reg) + NUMROW(reg))) * NUMRANK(reg) \
134e3d60c9bSAdrian Frost 	* NUMBANK(reg) * DIMMWIDTH)
135e3d60c9bSAdrian Frost 
136e3d60c9bSAdrian Frost /*
137e3d60c9bSAdrian Frost  * MC_SAG_CH
138e3d60c9bSAdrian Frost  */
139e3d60c9bSAdrian Frost #define	DIVBY3(reg)	(((reg) >> 27) & 1)	/* 3 or 6 way interleave */
140e3d60c9bSAdrian Frost #define	REMOVE_6(reg)	(((reg) >> 24) & 1)
141e3d60c9bSAdrian Frost #define	REMOVE_7(reg)	(((reg) >> 25) & 1)
142e3d60c9bSAdrian Frost #define	REMOVE_8(reg)	(((reg) >> 26) & 1)
143e3d60c9bSAdrian Frost #define	CH_ADDRESS_OFFSET(reg) \
144f899e573SVuong Nguyen 	(int64_t)((uint64_t)(reg) & 0x00ffffff)
145f899e573SVuong Nguyen #define	CH_ADDRESS_SOFFSET(reg) \
146f899e573SVuong Nguyen 	((int64_t)(((uint64_t)(reg) & 0x00ffffff) << 40) >>40)
147f899e573SVuong Nguyen /* SAG offset covers SA[39:16] so granularity is 2^16 = 64KB */
148f899e573SVuong Nguyen #define	SAG_OFFSET_GRANULARITY	16
149f899e573SVuong Nguyen /* 24-bit mask for TTMAD_CR_SAG_CH*.OFFSET */
150f899e573SVuong Nguyen #define	SAG_OFFSET_SIZE_MASK	0xffffffULL
151f899e573SVuong Nguyen /* 16-bit mask for lower bits not covered by CREG value (SA[15:0]) */
152f899e573SVuong Nguyen #define	SAG_OFFSET_ADDR_MASK	0xffffULL
153f899e573SVuong Nguyen #define	CACHELINE_ADDR_MASK	0x3fULL	/* 6-bit mask */
154f899e573SVuong Nguyen 
155e3d60c9bSAdrian Frost /*
156e3d60c9bSAdrian Frost  * MC_RIR_LIMIT_CH
157e3d60c9bSAdrian Frost  */
158e3d60c9bSAdrian Frost #define	RIR_LIMIT(reg)	((((uint64_t)(reg) & 0x000003ff) + 1) << 28)
159e3d60c9bSAdrian Frost /*
160e3d60c9bSAdrian Frost  * MC_RIR_WAY_CH
161e3d60c9bSAdrian Frost  */
162f899e573SVuong Nguyen #define	RIR_OFFSET(reg)	(int64_t)((uint64_t)(reg >> 4)& 0x3ff)
163f899e573SVuong Nguyen #define	RIR_SOFFSET(reg)	((int64_t)(((uint64_t)(reg) & 0x3ff0) << 50) \
164f899e573SVuong Nguyen 				    >> 54)
165f899e573SVuong Nguyen #define	RIR_DIMM_RANK(reg)	((reg) & 0xf)
166f899e573SVuong Nguyen #define	RIR_RANK(reg)	((reg) & 0x3)
167f899e573SVuong Nguyen #define	RIR_DIMM(reg)	((reg)>>2 & 0x03)
168f899e573SVuong Nguyen #define	RIR_OFFSET_SIZE_MASK	0x3ff
169e3d60c9bSAdrian Frost 
170e3d60c9bSAdrian Frost #define	MAX_RIR_WAY 4
171e3d60c9bSAdrian Frost 
172f899e573SVuong Nguyen #define	RIR_LIMIT_GRANULARITY	28
173f899e573SVuong Nguyen #define	RIR_OFFSET_ADDR_MASK	0xfffffffULL	/* 28-bit mask */
174f899e573SVuong Nguyen #define	RIR_INTLV_PGOPEN_BIT	12	/* Rank interleaving */
175f899e573SVuong Nguyen #define	RIR_INTLV_PGOPEN_MASK	0xfffULL	/* 12-bit mask */
176f899e573SVuong Nguyen #define	RIR_INTLV_PGCLS_BIT	6	/* Rank interleaving */
177f899e573SVuong Nguyen #define	RIR_INTLV_PGCLS_MASK	0x3fULL	/* 6-bit mask */
178f899e573SVuong Nguyen #define	RIR_INTLV_SIZE_MASK	0x3ULL
179e3d60c9bSAdrian Frost /*
180e3d60c9bSAdrian Frost  * MC_RAS_ENABLES
181e3d60c9bSAdrian Frost  */
182e3d60c9bSAdrian Frost #define	RAS_LOCKSTEP_ENABLE(reg) (((reg) & 2) != 0)
183e3d60c9bSAdrian Frost #define	RAS_MIRROR_MEM_ENABLE(reg) (((reg) & 1) != 0)
184e3d60c9bSAdrian Frost /*
185e3d60c9bSAdrian Frost  * MC_RAS_STATUS
186e3d60c9bSAdrian Frost  */
187e3d60c9bSAdrian Frost #define	REDUNDANCY_LOSS(reg) (((reg) & 1) != 0)
188e3d60c9bSAdrian Frost /*
189e3d60c9bSAdrian Frost  * MC_SSRSTATUS
190e3d60c9bSAdrian Frost  */
191e3d60c9bSAdrian Frost #define	SPAREING_IN_PROGRESS(reg) (((reg) & 2) != 0)
192e3d60c9bSAdrian Frost #define	SPAREING_COMPLETE(reg) (((reg) & 1) != 0)
193e3d60c9bSAdrian Frost 
194e3d60c9bSAdrian Frost /*
195e3d60c9bSAdrian Frost  * MC_SSR_CONTROL
196e3d60c9bSAdrian Frost  */
197e3d60c9bSAdrian Frost #define	SSR_MODE(reg) ((reg) & 3)
198e3d60c9bSAdrian Frost #define	SSR_IDLE	0
199e3d60c9bSAdrian Frost #define	SSR_SCRUB	1
200e3d60c9bSAdrian Frost #define	SSR_SPARE	2
201e3d60c9bSAdrian Frost #define	DEMAND_SCRUB_ENABLE	(1 << 6)
202e3d60c9bSAdrian Frost /*
203e3d60c9bSAdrian Frost  * MC_SCRUB_CONTROL
204e3d60c9bSAdrian Frost  */
205e3d60c9bSAdrian Frost #define	STARTSCRUB	(1 << 24)
206e3d60c9bSAdrian Frost /*
207e3d60c9bSAdrian Frost  * MC_DIMM_CLK_RATIO_STATUS
208e3d60c9bSAdrian Frost  */
209e3d60c9bSAdrian Frost #define	MAX_DIMM_CLK_RATIO(reg) (((reg) >> 24) & 0x1f)
210e3d60c9bSAdrian Frost /*
211e3d60c9bSAdrian Frost  * MC_SMI_SPARE_DIMM_ERROR_STATUS_RD
212e3d60c9bSAdrian Frost  */
213e3d60c9bSAdrian Frost #define	REDUNDANCY_LOSS_FAILING_DIMM(status) (((status) >> 12) & 3)
214e3d60c9bSAdrian Frost #define	DIMM_ERROR_OVERFLOW_STATUS(status) ((status) & 0xfff)
215e3d60c9bSAdrian Frost 
216e3d60c9bSAdrian Frost #define	MAX_MEMORY_CONTROLLERS	MAX_CPU_NODES
217e3d60c9bSAdrian Frost #define	CHANNELS_PER_MEMORY_CONTROLLER	3
218e3d60c9bSAdrian Frost #define	MAX_DIMMS_PER_CHANNEL	3
219e3d60c9bSAdrian Frost 
220e3d60c9bSAdrian Frost /*
221e3d60c9bSAdrian Frost  * SAD_DRAM_RULE
222e3d60c9bSAdrian Frost  */
223e3d60c9bSAdrian Frost #define	SAD_DRAM_LIMIT(sad) ((((uint64_t)(sad) & 0x000fffc0ULL) + 0x40) << 20)
224e3d60c9bSAdrian Frost #define	SAD_DRAM_MODE(sad) (((sad) >> 1) & 3)
225e3d60c9bSAdrian Frost #define	SAD_DRAM_RULE_ENABLE(sad) ((sad) & 1)
226e3d60c9bSAdrian Frost 
227f899e573SVuong Nguyen /*
228f899e573SVuong Nguyen  * from SAD_DRAM_RULE*.MODE
229f899e573SVuong Nguyen  */
230f899e573SVuong Nguyen #define	DIRECT	0
231f899e573SVuong Nguyen #define	XOR	1
232f899e573SVuong Nguyen #define	MOD3	2
233f899e573SVuong Nguyen #define	SAD_INTERLEAVE(list, num)	(((list) >> ((num) * 4)) & 0x3)
234f899e573SVuong Nguyen #define	INTERLEAVE_NWAY	8
235f899e573SVuong Nguyen #define	MAX_SAD_DRAM_RULE	8
236f899e573SVuong Nguyen 
237f899e573SVuong Nguyen #define	SAD_LIMIT_GRANULARITY	26
238f899e573SVuong Nguyen #define	SAD_LIMIT_ADDR_MASK	0x3ffffffULL
239f899e573SVuong Nguyen #define	SAD_INTLV_DIRECT_BIT	6
240f899e573SVuong Nguyen #define	SAD_INTLV_XOR_BIT	16
241f899e573SVuong Nguyen #define	SAD_INTLV_SIZE_MASK	0x7ULL
242f899e573SVuong Nguyen #define	SAD_INTLV_ADDR_MASK	0x3fULL
243e3d60c9bSAdrian Frost 
244e3d60c9bSAdrian Frost /*
245e3d60c9bSAdrian Frost  * TAD_DRAM_RULE
246e3d60c9bSAdrian Frost  */
247e3d60c9bSAdrian Frost #define	TAD_DRAM_LIMIT(tad) ((((uint64_t)(tad) & 0x000fffc0ULL) + 0x40) << 20)
248e3d60c9bSAdrian Frost #define	TAD_DRAM_MODE(tad) (((tad) >> 1) & 3)
249e3d60c9bSAdrian Frost #define	TAD_DRAM_RULE_ENABLE(tad) ((tad) & 1)
250e3d60c9bSAdrian Frost 
251e3d60c9bSAdrian Frost #define	TAD_INTERLEAVE(list, channel) (((list) >> ((channel) * 4)) & 3)
252e3d60c9bSAdrian Frost 
253e3d60c9bSAdrian Frost #define	MAX_TAD_DRAM_RULE 8
254e3d60c9bSAdrian Frost 
255*e8ee2240SAdrian Frost #define	VRANK_SZ 0x10000000
256e3d60c9bSAdrian Frost 
257f899e573SVuong Nguyen typedef struct sad {
258f899e573SVuong Nguyen 	uint64_t limit;
259f899e573SVuong Nguyen 	uint32_t node_list;
260f899e573SVuong Nguyen 	uint32_t node_tgt[INTERLEAVE_NWAY];
261f899e573SVuong Nguyen 	char mode;
262f899e573SVuong Nguyen 	char enable;
263f899e573SVuong Nguyen 	char interleave;
264f899e573SVuong Nguyen } sad_t;
265f899e573SVuong Nguyen 
266f899e573SVuong Nguyen typedef struct tad {
267f899e573SVuong Nguyen 	uint64_t limit;
268f899e573SVuong Nguyen 	uint32_t pkg_list;
269f899e573SVuong Nguyen 	uint32_t pkg_tgt[INTERLEAVE_NWAY];
270f899e573SVuong Nguyen 	char mode;
271f899e573SVuong Nguyen 	char enable;
272f899e573SVuong Nguyen 	char interleave;
273f899e573SVuong Nguyen } tad_t;
274f899e573SVuong Nguyen 
275f899e573SVuong Nguyen typedef struct sag_ch {
276f899e573SVuong Nguyen 	uint32_t offset;
277f899e573SVuong Nguyen 	int32_t soffset;
278f899e573SVuong Nguyen 	char divby3;
279f899e573SVuong Nguyen 	char remove6;
280f899e573SVuong Nguyen 	char remove7;
281f899e573SVuong Nguyen 	char remove8;
282f899e573SVuong Nguyen } sag_ch_t;
283f899e573SVuong Nguyen 
284f899e573SVuong Nguyen typedef struct rir_way {
285f899e573SVuong Nguyen 	uint16_t offset;
286f899e573SVuong Nguyen 	int16_t soffset;
287f899e573SVuong Nguyen 	uint8_t	rank;
288f899e573SVuong Nguyen 	uint8_t dimm;
289f899e573SVuong Nguyen 	uint8_t dimm_rank;
290f899e573SVuong Nguyen 	uint64_t rlimit;
291f899e573SVuong Nguyen } way_t;
292f899e573SVuong Nguyen 
293f899e573SVuong Nguyen typedef struct rir {
294f899e573SVuong Nguyen 	uint64_t limit;
295f899e573SVuong Nguyen 	way_t way[MAX_RIR_WAY];
296f899e573SVuong Nguyen 	char interleave;
297f899e573SVuong Nguyen } rir_t;
298f899e573SVuong Nguyen 
299f899e573SVuong Nguyen typedef struct dod_type {
300f899e573SVuong Nguyen 	int NUMCol;
301f899e573SVuong Nguyen 	int NUMRow;
302f899e573SVuong Nguyen 	int NUMRank;
303f899e573SVuong Nguyen 	int NUMBank;
304f899e573SVuong Nguyen 	int DIMMPresent;
305f899e573SVuong Nguyen 	int RankOffset;
306f899e573SVuong Nguyen } dod_t;
307f899e573SVuong Nguyen 
308e3d60c9bSAdrian Frost /*
309e3d60c9bSAdrian Frost  * MC_CHANNEL_MAPPER
310e3d60c9bSAdrian Frost  */
311e3d60c9bSAdrian Frost #define	CHANNEL_MAP(reg, channel, write) (((reg) >> ((channel) * 6 + \
312e3d60c9bSAdrian Frost 	((write) ? 0 : 3))) & 7)
313e3d60c9bSAdrian Frost 
314e3d60c9bSAdrian Frost extern int max_bus_number;
315e3d60c9bSAdrian Frost 
316e3d60c9bSAdrian Frost #ifdef __cplusplus
317e3d60c9bSAdrian Frost }
318e3d60c9bSAdrian Frost #endif
319e3d60c9bSAdrian Frost 
320e3d60c9bSAdrian Frost #endif /* _INTEL_NHM_H */
321