xref: /onnv-gate/usr/src/uts/intel/sys/mca_amd.h (revision 2869)
11414Scindi /*
21414Scindi  * CDDL HEADER START
31414Scindi  *
41414Scindi  * The contents of this file are subject to the terms of the
51717Swesolows  * Common Development and Distribution License (the "License").
61717Swesolows  * You may not use this file except in compliance with the License.
71414Scindi  *
81414Scindi  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
91414Scindi  * or http://www.opensolaris.org/os/licensing.
101414Scindi  * See the License for the specific language governing permissions
111414Scindi  * and limitations under the License.
121414Scindi  *
131414Scindi  * When distributing Covered Code, include this CDDL HEADER in each
141414Scindi  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
151414Scindi  * If applicable, add the following below this CDDL HEADER, with the
161414Scindi  * fields enclosed by brackets "[]" replaced with your own identifying
171414Scindi  * information: Portions Copyright [yyyy] [name of copyright owner]
181414Scindi  *
191414Scindi  * CDDL HEADER END
201414Scindi  */
211414Scindi 
221414Scindi /*
231414Scindi  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
241414Scindi  * Use is subject to license terms.
251414Scindi  */
261414Scindi 
271414Scindi #ifndef _SYS_MCA_AMD_H
281414Scindi #define	_SYS_MCA_AMD_H
291414Scindi 
301414Scindi #pragma ident	"%Z%%M%	%I%	%E% SMI"
311414Scindi 
321414Scindi /*
331414Scindi  * Constants the Memory Check Architecture as implemented on AMD CPUs.
341414Scindi  */
351414Scindi 
361414Scindi #ifdef __cplusplus
371414Scindi extern "C" {
381414Scindi #endif
391414Scindi 
401414Scindi #define	AMD_MSR_MCG_CAP			0x179
411414Scindi #define	AMD_MSR_MCG_STATUS		0x17a
421414Scindi #define	AMD_MSR_MCG_CTL			0x17b
431414Scindi 
441414Scindi #define	AMD_MCA_BANK_DC			0	/* Data Cache */
451414Scindi #define	AMD_MCA_BANK_IC			1	/* Instruction Cache */
461414Scindi #define	AMD_MCA_BANK_BU			2	/* Bus Unit */
471414Scindi #define	AMD_MCA_BANK_LS			3	/* Load/Store Unit */
481414Scindi #define	AMD_MCA_BANK_NB			4	/* Northbridge */
491414Scindi #define	AMD_MCA_BANK_COUNT		5
501414Scindi 
511414Scindi #define	AMD_MSR_DC_CTL			0x400
521414Scindi #define	AMD_MSR_DC_MASK			0xc0010044
531414Scindi #define	AMD_MSR_DC_STATUS		0x401
541414Scindi #define	AMD_MSR_DC_ADDR			0x402
55*2869Sgavinm #define	AMD_MSR_DC_MISC			0x403
561414Scindi 
571414Scindi #define	AMD_MSR_IC_CTL			0x404
581414Scindi #define	AMD_MSR_IC_MASK			0xc0010045
591414Scindi #define	AMD_MSR_IC_STATUS		0x405
601414Scindi #define	AMD_MSR_IC_ADDR			0x406
61*2869Sgavinm #define	AMD_MSR_IC_MISC			0x407
621414Scindi 
631414Scindi #define	AMD_MSR_BU_CTL			0x408
641414Scindi #define	AMD_MSR_BU_MASK			0xc0010046
651414Scindi #define	AMD_MSR_BU_STATUS		0x409
661414Scindi #define	AMD_MSR_BU_ADDR			0x40a
67*2869Sgavinm #define	AMD_MSR_BU_MISC			0x40b
681414Scindi 
691414Scindi #define	AMD_MSR_LS_CTL			0x40c
701414Scindi #define	AMD_MSR_LS_MASK			0xc0010047
711414Scindi #define	AMD_MSR_LS_STATUS		0x40d
721414Scindi #define	AMD_MSR_LS_ADDR			0x40e
73*2869Sgavinm #define	AMD_MSR_LS_MISC			0x40f
741414Scindi 
751414Scindi #define	AMD_MSR_NB_CTL			0x410
761414Scindi #define	AMD_MSR_NB_MASK			0xc0010048
771414Scindi #define	AMD_MSR_NB_STATUS		0x411
781414Scindi #define	AMD_MSR_NB_ADDR			0x412
79*2869Sgavinm #define	AMD_MSR_NB_MISC			0x413
801414Scindi 
811414Scindi #define	AMD_MCG_EN_DC			0x01
821414Scindi #define	AMD_MCG_EN_IC			0x02
831414Scindi #define	AMD_MCG_EN_BU			0x04
841414Scindi #define	AMD_MCG_EN_LS			0x08
851414Scindi #define	AMD_MCG_EN_NB			0x10
861414Scindi #define	AMD_MCG_EN_ALL \
871414Scindi 	(AMD_MCG_EN_DC | AMD_MCG_EN_IC | AMD_MCG_EN_BU | AMD_MCG_EN_LS | \
881414Scindi 	AMD_MCG_EN_NB)
891414Scindi 
901414Scindi /*
911414Scindi  * Data Cache (DC) bank error-detection enabling bits and CTL register
921414Scindi  * initializer value.
931414Scindi  */
941414Scindi 
951414Scindi #define	AMD_DC_EN_ECCI			0x00000001ULL
961414Scindi #define	AMD_DC_EN_ECCM			0x00000002ULL
971414Scindi #define	AMD_DC_EN_DECC			0x00000004ULL
981414Scindi #define	AMD_DC_EN_DMTP			0x00000008ULL
991414Scindi #define	AMD_DC_EN_DSTP			0x00000010ULL
1001414Scindi #define	AMD_DC_EN_L1TP			0x00000020ULL
1011414Scindi #define	AMD_DC_EN_L2TP			0x00000040ULL
1021414Scindi 
103*2869Sgavinm #define	AMD_DC_CTL_INIT_CMN \
1041414Scindi 	(AMD_DC_EN_ECCI | AMD_DC_EN_ECCM | AMD_DC_EN_DECC | AMD_DC_EN_DMTP | \
1051414Scindi 	AMD_DC_EN_DSTP | AMD_DC_EN_L1TP | AMD_DC_EN_L2TP)
1061414Scindi 
1071414Scindi /*
1081414Scindi  * Instruction Cache (IC) bank error-detection enabling bits and CTL register
1091414Scindi  * initializer value.
1101414Scindi  *
1111414Scindi  * The Northbridge will handle Read Data errors.  Our initializer will enable
1121414Scindi  * all but the RDDE detector.
1131414Scindi  */
1141414Scindi 
1151414Scindi #define	AMD_IC_EN_ECCI			0x00000001ULL
1161414Scindi #define	AMD_IC_EN_ECCM			0x00000002ULL
1171414Scindi #define	AMD_IC_EN_IDP			0x00000004ULL
1181414Scindi #define	AMD_IC_EN_IMTP			0x00000008ULL
1191414Scindi #define	AMD_IC_EN_ISTP			0x00000010ULL
1201414Scindi #define	AMD_IC_EN_L1TP			0x00000020ULL
1211414Scindi #define	AMD_IC_EN_L2TP			0x00000040ULL
1221414Scindi #define	AMD_IC_EN_RDDE			0x00000200ULL
1231414Scindi 
124*2869Sgavinm #define	AMD_IC_CTL_INIT_CMN \
1251414Scindi 	(AMD_IC_EN_ECCI | AMD_IC_EN_ECCM | AMD_IC_EN_IDP | AMD_IC_EN_IMTP | \
1261414Scindi 	AMD_IC_EN_ISTP | AMD_IC_EN_L1TP | AMD_IC_EN_L2TP)
1271414Scindi 
1281414Scindi /*
1291414Scindi  * Bus Unit (BU) bank error-detection enabling bits and CTL register
1301414Scindi  * initializer value.
1311414Scindi  *
1321414Scindi  * The Northbridge will handle Read Data errors.  Our initializer will enable
1331414Scindi  * all but the S_RDE_* detectors.
1341414Scindi  */
1351414Scindi 
1361414Scindi #define	AMD_BU_EN_S_RDE_HP		0x00000001ULL
1371414Scindi #define	AMD_BU_EN_S_RDE_TLB		0x00000002ULL
1381414Scindi #define	AMD_BU_EN_S_RDE_ALL		0x00000004ULL
1391414Scindi #define	AMD_BU_EN_S_ECC1_TLB		0x00000008ULL
1401414Scindi #define	AMD_BU_EN_S_ECC1_HP		0x00000010ULL
1411414Scindi #define	AMD_BU_EN_S_ECCM_TLB		0x00000020ULL
1421414Scindi #define	AMD_BU_EN_S_ECCM_HP		0x00000040ULL
1431414Scindi #define	AMD_BU_EN_L2T_PAR_ICDC		0x00000080ULL
1441414Scindi #define	AMD_BU_EN_L2T_PAR_TLB		0x00000100ULL
1451414Scindi #define	AMD_BU_EN_L2T_PAR_SNP		0x00000200ULL
1461414Scindi #define	AMD_BU_EN_L2T_PAR_CPB		0x00000400ULL
1471414Scindi #define	AMD_BU_EN_L2T_PAR_SCR		0x00000800ULL
1481414Scindi #define	AMD_BU_EN_L2D_ECC1_TLB		0x00001000ULL
1491414Scindi #define	AMD_BU_EN_L2D_ECC1_SNP		0x00002000ULL
1501414Scindi #define	AMD_BU_EN_L2D_ECC1_CPB		0x00004000ULL
1511414Scindi #define	AMD_BU_EN_L2D_ECCM_TLB		0x00008000ULL
1521414Scindi #define	AMD_BU_EN_L2D_ECCM_SNP		0x00010000ULL
1531414Scindi #define	AMD_BU_EN_L2D_ECCM_CPB		0x00020000ULL
1541414Scindi #define	AMD_BU_EN_L2T_ECC1_SCR		0x00040000ULL
1551414Scindi #define	AMD_BU_EN_L2T_ECCM_SCR		0x00080000ULL
1561414Scindi 
157*2869Sgavinm #define	AMD_BU_CTL_INIT_CMN \
1581414Scindi 	(AMD_BU_EN_S_ECC1_TLB | AMD_BU_EN_S_ECC1_HP | \
1591414Scindi 	AMD_BU_EN_S_ECCM_TLB | AMD_BU_EN_S_ECCM_HP | \
1601414Scindi 	AMD_BU_EN_L2T_PAR_ICDC | AMD_BU_EN_L2T_PAR_TLB | \
1611414Scindi 	AMD_BU_EN_L2T_PAR_SNP |	AMD_BU_EN_L2T_PAR_CPB | \
1621414Scindi 	AMD_BU_EN_L2T_PAR_SCR |	AMD_BU_EN_L2D_ECC1_TLB | \
1631414Scindi 	AMD_BU_EN_L2D_ECC1_SNP | AMD_BU_EN_L2D_ECC1_CPB | \
1641414Scindi 	AMD_BU_EN_L2D_ECCM_TLB | AMD_BU_EN_L2D_ECCM_SNP | \
1651414Scindi 	AMD_BU_EN_L2D_ECCM_CPB | AMD_BU_EN_L2T_ECC1_SCR | \
1661414Scindi 	AMD_BU_EN_L2T_ECCM_SCR)
1671414Scindi 
1681414Scindi /*
1691414Scindi  * Load/Store (LS) bank error-detection enabling bits and CTL register
1701414Scindi  * initializer value.
1711414Scindi  *
1721414Scindi  * The Northbridge will handle Read Data errors.  That's the only type of
1731414Scindi  * error the LS unit can detect at present, so we won't be enabling any
1741414Scindi  * LS detectors.
1751414Scindi  */
1761414Scindi 
1771414Scindi #define	AMD_LS_EN_S_RDE_S		0x00000001ULL
1781414Scindi #define	AMD_LS_EN_S_RDE_L		0x00000002ULL
1791414Scindi 
180*2869Sgavinm #define	AMD_LS_CTL_INIT_CMN			0ULL
181*2869Sgavinm 
182*2869Sgavinm /*
183*2869Sgavinm  * NorthBridge (NB) MCi_MISC - DRAM Errors Threshold Register.
184*2869Sgavinm  */
185*2869Sgavinm #define	AMD_NB_MISC_VALID		(0x1ULL << 63)
186*2869Sgavinm #define	AMD_NB_MISC_CTRP		(0x1ULL << 62)
187*2869Sgavinm #define	AMD_NB_MISC_LOCKED		(0x1ULL << 61)
188*2869Sgavinm #define	AMD_NB_MISC_CNTEN		(0x1ULL << 51)
189*2869Sgavinm #define	AMD_NB_MISC_INTTYPE		(0x1ULL << 49)
190*2869Sgavinm #define	AMD_NB_MISC_INTTYPE_MASK	(0x3ULL << 49)
191*2869Sgavinm #define	AMD_NB_MISC_OVRFLW		(0x1ULL << 48)
192*2869Sgavinm #define	AMD_NB_MISC_ERRCOUNT_MASK	(0xfffULL << 32)
1931414Scindi 
1941414Scindi /*
1951414Scindi  * The Northbridge (NB) is configured using both the standard MCA CTL register
1961414Scindi  * and a NB-specific configuration register (NB CFG).  The AMD_NB_EN_* macros
1971414Scindi  * are the detector enabling bits for the NB MCA CTL register.  The
1981414Scindi  * AMD_NB_CFG_* bits are for the NB CFG register.
1991414Scindi  *
2001414Scindi  * The CTL register can be initialized statically, but portions of the NB CFG
2011414Scindi  * register must be initialized based on the current machine's configuration.
2021414Scindi  *
203*2869Sgavinm  * The MCA NB Control Register maps to MC4_CTL[31:0], but we initialize it
204*2869Sgavinm  * via and MSR write of 64 bits so define all as ULL.
2051414Scindi  *
2061414Scindi  */
207*2869Sgavinm #define	AMD_NB_EN_CORRECC		0x00000001ULL
208*2869Sgavinm #define	AMD_NB_EN_UNCORRECC		0x00000002ULL
209*2869Sgavinm #define	AMD_NB_EN_CRCERR0		0x00000004ULL
210*2869Sgavinm #define	AMD_NB_EN_CRCERR1		0x00000008ULL
211*2869Sgavinm #define	AMD_NB_EN_CRCERR2		0x00000010ULL
212*2869Sgavinm #define	AMD_NB_EN_SYNCPKT0		0x00000020ULL
213*2869Sgavinm #define	AMD_NB_EN_SYNCPKT1		0x00000040ULL
214*2869Sgavinm #define	AMD_NB_EN_SYNCPKT2		0x00000080ULL
215*2869Sgavinm #define	AMD_NB_EN_MSTRABRT		0x00000100ULL
216*2869Sgavinm #define	AMD_NB_EN_TGTABRT		0x00000200ULL
217*2869Sgavinm #define	AMD_NB_EN_GARTTBLWK		0x00000400ULL
218*2869Sgavinm #define	AMD_NB_EN_ATOMICRMW		0x00000800ULL
219*2869Sgavinm #define	AMD_NB_EN_WCHDOGTMR		0x00001000ULL
220*2869Sgavinm #define	AMD_NB_EN_DRAMPAR		0x00040000ULL	/* revs F and G */
2211414Scindi 
222*2869Sgavinm #define	AMD_NB_CTL_INIT_CMN /* Revs B to G; All but GARTTBLWK */ \
2231414Scindi 	(AMD_NB_EN_CORRECC | AMD_NB_EN_UNCORRECC | \
2241414Scindi 	AMD_NB_EN_CRCERR0 | AMD_NB_EN_CRCERR1 | AMD_NB_EN_CRCERR2 | \
2251414Scindi 	AMD_NB_EN_SYNCPKT0 | AMD_NB_EN_SYNCPKT1 | AMD_NB_EN_SYNCPKT2 | \
2261414Scindi 	AMD_NB_EN_MSTRABRT | AMD_NB_EN_TGTABRT | \
2271414Scindi 	AMD_NB_EN_ATOMICRMW | AMD_NB_EN_WCHDOGTMR)
2281414Scindi 
229*2869Sgavinm #define	AMD_NB_CTL_INIT_REV_FG /* Additional bits for revs F and G */ \
230*2869Sgavinm 	AMD_NB_EN_DRAMPAR
231*2869Sgavinm 
232*2869Sgavinm /*
233*2869Sgavinm  * NB MCA Configuration register
234*2869Sgavinm  */
235*2869Sgavinm #define	AMD_NB_CFG_CPUECCERREN			0x00000001
236*2869Sgavinm #define	AMD_NB_CFG_CPURDDATERREN		0x00000002
237*2869Sgavinm #define	AMD_NB_CFG_SYNCONUCECCEN		0x00000004
238*2869Sgavinm #define	AMD_NB_CFG_SYNCPKTGENDIS		0x00000008
239*2869Sgavinm #define	AMD_NB_CFG_SYNCPKTPROPDIS		0x00000010
240*2869Sgavinm #define	AMD_NB_CFG_IOMSTABORTDIS		0x00000020
241*2869Sgavinm #define	AMD_NB_CFG_CPUERRDIS			0x00000040
242*2869Sgavinm #define	AMD_NB_CFG_IOERRDIS			0x00000080
243*2869Sgavinm #define	AMD_NB_CFG_WDOGTMRDIS			0x00000100
244*2869Sgavinm #define	AMD_NB_CFG_SYNCONWDOGEN			0x00100000
245*2869Sgavinm #define	AMD_NB_CFG_SYNCONANYERREN		0x00200000
246*2869Sgavinm #define	AMD_NB_CFG_ECCEN			0x00400000
247*2869Sgavinm #define	AMD_NB_CFG_CHIPKILLECCEN		0x00800000
248*2869Sgavinm #define	AMD_NB_CFG_IORDDATERREN			0x01000000
249*2869Sgavinm #define	AMD_NB_CFG_DISPCICFGCPUERRRSP		0x02000000
250*2869Sgavinm #define	AMD_NB_CFG_NBMCATOMSTCPUEN		0x08000000
251*2869Sgavinm #define	AMD_NB_CFG_DISTGTABTCPUERRRSP		0x10000000
252*2869Sgavinm #define	AMD_NB_CFG_DISMSTABTCPUERRRSP		0x20000000
253*2869Sgavinm #define	AMD_NB_CFG_SYNCONDRAMADRPARERREN	0x40000000 /* Revs F & G */
254*2869Sgavinm 
255*2869Sgavinm /*
256*2869Sgavinm  * We do not initialize the NB config with an absolute value; instead we
257*2869Sgavinm  * selectively add some bits and remove others.  Note that
258*2869Sgavinm  * AMD_NB_CFG_{ADD,REMOVE}_{CMN,REV_FG} below are not the whole
259*2869Sgavinm  * story here - additional config is performed regarding the watchdog (see
260*2869Sgavinm  * ao_mca.c for details).
261*2869Sgavinm  */
262*2869Sgavinm #define	AMD_NB_CFG_ADD_CMN		/* Revs B to G */ \
263*2869Sgavinm 	(AMD_NB_CFG_DISPCICFGCPUERRRSP | AMD_NB_CFG_SYNCONUCECCEN | \
264*2869Sgavinm 	AMD_NB_CFG_CPUECCERREN)
265*2869Sgavinm 
266*2869Sgavinm #define	AMD_NB_CFG_REMOVE_CMN		/* Revs B to G */ \
267*2869Sgavinm 	(AMD_NB_CFG_NBMCATOMSTCPUEN | \
268*2869Sgavinm 	AMD_NB_CFG_IORDDATERREN | AMD_NB_CFG_SYNCONANYERREN | \
269*2869Sgavinm 	AMD_NB_CFG_SYNCONWDOGEN | AMD_NB_CFG_IOERRDIS | \
270*2869Sgavinm 	AMD_NB_CFG_IOMSTABORTDIS | AMD_NB_CFG_SYNCPKTPROPDIS | \
271*2869Sgavinm 	AMD_NB_CFG_SYNCPKTGENDIS)
272*2869Sgavinm 
273*2869Sgavinm #define	AMD_NB_CFG_ADD_REV_FG		/* Revs F and G */ \
274*2869Sgavinm 	AMD_NB_CFG_SYNCONDRAMADRPARERREN
275*2869Sgavinm 
276*2869Sgavinm #define	AMD_NB_CFG_REMOVE_REV_FG 0x0	/* Revs F and G */
2771414Scindi 
2781414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_4095	0x00000000
2791414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_2047	0x00000200
2801414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_1023	0x00000400
2811414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_511	0x00000600
2821414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_255	0x00000800
2831414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_127	0x00000a00
2841414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_63	0x00000c00
2851414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_31	0x00000e00
2861414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_MASK	0x00000e00
2871414Scindi #define	AMD_NB_CFG_WDOGTMRCNTSEL_SHIFT	9
2881414Scindi 
2891414Scindi #define	AMD_NB_CFG_WDOGTMRBASESEL_1MS	0x00000000
2901414Scindi #define	AMD_NB_CFG_WDOGTMRBASESEL_1US	0x00001000
2911414Scindi #define	AMD_NB_CFG_WDOGTMRBASESEL_5NS	0x00002000
2921414Scindi #define	AMD_NB_CFG_WDOGTMRBASESEL_MASK	0x00003000
2931414Scindi #define	AMD_NB_CFG_WDOGTMRBASESEL_SHIFT	12
2941414Scindi 
2951414Scindi #define	AMD_NB_CFG_LDTLINKSEL_MASK	0x0000c000
2961414Scindi #define	AMD_NB_CFG_LDTLINKSEL_SHIFT	14
2971414Scindi 
2981414Scindi #define	AMD_NB_CFG_GENCRCERRBYTE0	0x00010000
2991414Scindi #define	AMD_NB_CFG_GENCRCERRBYTE1	0x00020000
3001414Scindi 
3011414Scindi /* Generic bank status register bits */
3021717Swesolows #define	AMD_BANK_STAT_VALID		0x8000000000000000ULL
3031717Swesolows #define	AMD_BANK_STAT_OVER		0x4000000000000000ULL
3041717Swesolows #define	AMD_BANK_STAT_UC		0x2000000000000000ULL
3051717Swesolows #define	AMD_BANK_STAT_EN		0x1000000000000000ULL
3061717Swesolows #define	AMD_BANK_STAT_MISCV		0x0800000000000000ULL
3071717Swesolows #define	AMD_BANK_STAT_ADDRV		0x0400000000000000ULL
3081717Swesolows #define	AMD_BANK_STAT_PCC		0x0200000000000000ULL
3091414Scindi 
3101717Swesolows #define	AMD_BANK_STAT_CECC		0x0000400000000000ULL
3111717Swesolows #define	AMD_BANK_STAT_UECC		0x0000200000000000ULL
3121717Swesolows #define	AMD_BANK_STAT_SCRUB		0x0000010000000000ULL
3131414Scindi 
3141717Swesolows 	/* syndrome[7:0] */
3151717Swesolows #define	AMD_BANK_STAT_SYND_MASK		0x007f800000000000ULL
3161414Scindi #define	AMD_BANK_STAT_SYND_SHIFT	47
3171414Scindi 
3181414Scindi #define	AMD_BANK_SYND(stat) \
3191414Scindi 	(((stat) & AMD_BANK_STAT_SYND_MASK) >> AMD_BANK_STAT_SYND_SHIFT)
3201414Scindi #define	AMD_BANK_MKSYND(synd) \
3211414Scindi 	(((uint64_t)(synd) << AMD_BANK_STAT_SYND_SHIFT) & \
3221414Scindi 	AMD_BANK_STAT_SYND_MASK)
3231414Scindi 
3241414Scindi /* northbridge (NB) status registers */
3251414Scindi 
3261414Scindi #define	AMD_NB_FUNC			3
3271414Scindi #define	AMD_NB_REG_CFG			0x44
3281414Scindi #define	AMD_NB_REG_STLO			0x48	/* alias: NB_STATUS[0:31] */
3291414Scindi #define	AMD_NB_REG_STHI			0x4c	/* alias: NB_STATUS[32:63] */
3301414Scindi #define	AMD_NB_REG_ADDRLO		0x50	/* alias: NB_ADDR[0:31] */
3311414Scindi #define	AMD_NB_REG_ADDRHI		0x54	/* alias: NB_ADDR[32:63] */
3321414Scindi 
3331414Scindi #define	AMD_NB_REG_SCRUBCTL		0x58
3341414Scindi #define	AMD_NB_REG_SCRUBADDR_LO		0x5c
3351414Scindi #define	AMD_NB_REG_SCRUBADDR_HI		0x60
3361414Scindi 
337*2869Sgavinm #define	AMD_NB_REG_SPARECTL		0xb0
338*2869Sgavinm 
339*2869Sgavinm #define	AMD_NB_STAT_DRAMCHANNEL		0x0000020000000000ULL
340*2869Sgavinm #define	AMD_NB_STAT_LDTLINK_MASK	0x0000007000000000ULL
3411414Scindi #define	AMD_NB_STAT_LDTLINK_SHIFT	4
342*2869Sgavinm #define	AMD_NB_STAT_ERRCPU1		0x0000000200000000ULL
343*2869Sgavinm #define	AMD_NB_STAT_ERRCPU0		0x0000000100000000ULL
344*2869Sgavinm 
3451414Scindi #define	AMD_NB_STAT_CKSYND_MASK		0x00000000ff000000 /* syndrome[15:8] */
3461414Scindi #define	AMD_NB_STAT_CKSYND_SHIFT	(24 - 8) /* shift [31:24] to [15:8] */
3471414Scindi 
3481414Scindi #define	AMD_NB_STAT_CKSYND(stat) \
3491414Scindi 	((((stat) & AMD_NB_STAT_CKSYND_MASK) >> AMD_NB_STAT_CKSYND_SHIFT) | \
3501414Scindi 	AMD_BANK_SYND((stat)))
3511414Scindi 
3521414Scindi #define	AMD_NB_STAT_MKCKSYND(synd) \
3531414Scindi 	((((uint64_t)(synd) << AMD_NB_STAT_CKSYND_SHIFT) & \
3541414Scindi 	AMD_NB_STAT_CKSYND_MASK) | AMD_BANK_MKSYND(synd))
3551414Scindi 
356*2869Sgavinm #define	AMD_ERRCODE_MASK		0x000000000000ffffULL
357*2869Sgavinm #define	AMD_ERREXT_MASK			0x00000000000f0000ULL
3581414Scindi #define	AMD_ERREXT_SHIFT		16
3591414Scindi 
3601414Scindi #define	AMD_ERRCODE_TT_MASK		0x000c
3611414Scindi #define	AMD_ERRCODE_TT_SHIFT		2
3621414Scindi #define	AMD_ERRCODE_TT_INSTR		0x0
3631414Scindi #define	AMD_ERRCODE_TT_DATA		0x1
3641414Scindi #define	AMD_ERRCODE_TT_GEN		0x2
3651414Scindi 
3661414Scindi #define	AMD_ERRCODE_LL_MASK		0x0003
3671414Scindi #define	AMD_ERRCODE_LL_L0		0x0
3681414Scindi #define	AMD_ERRCODE_LL_L1		0x1
3691414Scindi #define	AMD_ERRCODE_LL_L2		0x2
3701414Scindi #define	AMD_ERRCODE_LL_LG		0x3
3711414Scindi 
3721414Scindi #define	AMD_ERRCODE_R4_MASK		0x00f0
3731414Scindi #define	AMD_ERRCODE_R4_SHIFT		4
3741414Scindi #define	AMD_ERRCODE_R4_GEN		0x0
3751414Scindi #define	AMD_ERRCODE_R4_RD		0x1
3761414Scindi #define	AMD_ERRCODE_R4_WR		0x2
3771414Scindi #define	AMD_ERRCODE_R4_DRD		0x3
3781414Scindi #define	AMD_ERRCODE_R4_DWR		0x4
3791414Scindi #define	AMD_ERRCODE_R4_IRD		0x5
3801414Scindi #define	AMD_ERRCODE_R4_PREFETCH		0x6
3811414Scindi #define	AMD_ERRCODE_R4_EVICT		0x7
3821414Scindi #define	AMD_ERRCODE_R4_SNOOP		0x8
3831414Scindi 
3841414Scindi #define	AMD_ERRCODE_PP_MASK		0x0600
3851414Scindi #define	AMD_ERRCODE_PP_SHIFT		9
3861414Scindi #define	AMD_ERRCODE_PP_SRC		0x0
3871414Scindi #define	AMD_ERRCODE_PP_RSP		0x1
3881414Scindi #define	AMD_ERRCODE_PP_OBS		0x2
3891414Scindi #define	AMD_ERRCODE_PP_GEN		0x3
3901414Scindi 
3911414Scindi #define	AMD_ERRCODE_T_MASK		0x0100
3921414Scindi #define	AMD_ERRCODE_T_SHIFT		8
3931414Scindi #define	AMD_ERRCODE_T_NONE		0x0
3941414Scindi #define	AMD_ERRCODE_T_TIMEOUT		0x1
3951414Scindi 
3961414Scindi #define	AMD_ERRCODE_II_MASK		0x000c
3971414Scindi #define	AMD_ERRCODE_II_SHIFT		2
3981414Scindi #define	AMD_ERRCODE_II_MEM		0x0
3991414Scindi #define	AMD_ERRCODE_II_IO		0x2
4001414Scindi #define	AMD_ERRCODE_II_GEN		0x3
4011414Scindi 
4021414Scindi #define	AMD_ERRCODE_TLB_BIT		4
4031414Scindi #define	AMD_ERRCODE_MEM_BIT		8
4041414Scindi #define	AMD_ERRCODE_BUS_BIT		11
4051414Scindi 
4061414Scindi #define	AMD_ERRCODE_TLB_MASK		0xfff0
4071414Scindi #define	AMD_ERRCODE_TLB_VAL		0x0010
4081414Scindi #define	AMD_ERRCODE_MEM_MASK		0xff00
4091414Scindi #define	AMD_ERRCODE_MEM_VAL		0x0100
4101414Scindi #define	AMD_ERRCODE_BUS_MASK		0xf800
4111414Scindi #define	AMD_ERRCODE_BUS_VAL		0x0800
4121414Scindi 
4131414Scindi #define	AMD_ERRCODE_MKTLB(tt, ll) \
4141414Scindi 	(AMD_ERRCODE_TLB_VAL | \
4151414Scindi 	(((tt) << AMD_ERRCODE_TT_SHIFT) & AMD_ERRCODE_TT_MASK) | \
4161414Scindi 	((ll) & AMD_ERRCODE_LL_MASK))
4171414Scindi #define	AMD_ERRCODE_ISTLB(code) \
4181414Scindi 	(((code) & AMD_ERRCODE_TLB_MASK) == AMD_ERRCODE_TLB_VAL)
4191414Scindi 
4201414Scindi #define	AMD_ERRCODE_MKMEM(r4, tt, ll) \
4211414Scindi 	(AMD_ERRCODE_MEM_VAL | \
4221414Scindi 	(((r4) << AMD_ERRCODE_R4_SHIFT) & AMD_ERRCODE_R4_MASK) | \
4231414Scindi 	(((tt) << AMD_ERRCODE_TT_SHIFT) & AMD_ERRCODE_TT_MASK) | \
4241414Scindi 	((ll) & AMD_ERRCODE_LL_MASK))
4251414Scindi #define	AMD_ERRCODE_ISMEM(code) \
4261414Scindi 	(((code) & AMD_ERRCODE_MEM_MASK) == AMD_ERRCODE_MEM_VAL)
4271414Scindi 
4281414Scindi #define	AMD_ERRCODE_MKBUS(pp, t, r4, ii, ll) \
4291414Scindi 	(AMD_ERRCODE_BUS_VAL | \
4301414Scindi 	(((pp) << AMD_ERRCODE_PP_SHIFT) & AMD_ERRCODE_PP_MASK) | \
4311414Scindi 	(((t) << AMD_ERRCODE_T_SHIFT) & AMD_ERRCODE_T_MASK) | \
4321414Scindi 	(((r4) << AMD_ERRCODE_R4_SHIFT) & AMD_ERRCODE_R4_MASK) | \
4331414Scindi 	(((ii) << AMD_ERRCODE_II_SHIFT) & AMD_ERRCODE_II_MASK) | \
4341414Scindi 	((ll) & AMD_ERRCODE_LL_MASK))
4351414Scindi #define	AMD_ERRCODE_ISBUS(code) \
4361414Scindi 	(((code) & AMD_ERRCODE_BUS_MASK) == AMD_ERRCODE_BUS_VAL)
4371414Scindi 
4381414Scindi #define	AMD_NB_ADDRLO_MASK		0xfffffff8
4391414Scindi #define	AMD_NB_ADDRHI_MASK		0x000000ff
4401414Scindi 
4411414Scindi #define	AMD_SYNDTYPE_ECC		0
4421414Scindi #define	AMD_SYNDTYPE_CHIPKILL		1
4431414Scindi 
4441414Scindi #define	AMD_NB_SCRUBCTL_DRAM_MASK	0x0000001f
4451414Scindi #define	AMD_NB_SCRUBCTL_DRAM_SHIFT	0
4461414Scindi #define	AMD_NB_SCRUBCTL_L2_MASK		0x00001f00
4471414Scindi #define	AMD_NB_SCRUBCTL_L2_SHIFT	8
4481414Scindi #define	AMD_NB_SCRUBCTL_DC_MASK		0x001f0000
4491414Scindi #define	AMD_NB_SCRUBCTL_DC_SHIFT	16
4501414Scindi 
4511414Scindi #define	AMD_NB_SCRUBCTL_RATE_NONE	0
4521414Scindi #define	AMD_NB_SCRUBCTL_RATE_MAX	0x16
4531414Scindi 
4541414Scindi #define	AMD_NB_SCRUBADDR_LO_MASK	0xffffffc0
4551414Scindi #define	AMD_NB_SCRUBADDR_LO_SCRUBREDIREN 0x1
4561414Scindi #define	AMD_NB_SCRUBADDR_HI_MASK	0x000000ff
4571414Scindi 
4581414Scindi #define	AMD_NB_SCRUBADDR_MKLO(addr) \
4591414Scindi 	((addr) & AMD_NB_SCRUBADDR_LO_MASK)
4601414Scindi 
4611414Scindi #define	AMD_NB_SCRUBADDR_MKHI(addr) \
4621414Scindi 	(((addr) >> 32) & AMD_NB_SCRUBADDR_HI_MASK)
4631414Scindi 
4641414Scindi #define	AMD_NB_MKSCRUBCTL(dc, l2, dr) ( \
4651414Scindi 	(((dc) << AMD_NB_SCRUBCTL_DC_SHIFT) & AMD_NB_SCRUBCTL_DC_MASK) | \
4661414Scindi 	(((l2) << AMD_NB_SCRUBCTL_L2_SHIFT) & AMD_NB_SCRUBCTL_L2_MASK) | \
4671414Scindi 	(((dr) << AMD_NB_SCRUBCTL_DRAM_SHIFT) & AMD_NB_SCRUBCTL_DRAM_MASK))
4681414Scindi 
4691414Scindi #ifdef __cplusplus
4701414Scindi }
4711414Scindi #endif
4721414Scindi 
4731414Scindi #endif /* _SYS_MCA_AMD_H */
474