xref: /dragonfly/sys/dev/misc/ecc/e5_imc_var.h (revision 0c543cdd)
1*0c543cddSSepherosa Ziehau #ifndef _E5_IMC_VAR_H_
2*0c543cddSSepherosa Ziehau #define _E5_IMC_VAR_H_
3*0c543cddSSepherosa Ziehau 
4*0c543cddSSepherosa Ziehau #define E5_IMC_CHAN_VER2	2	/* E5 v2 */
5*0c543cddSSepherosa Ziehau #define E5_IMC_CHAN_VER3	3	/* E5 v3 */
6*0c543cddSSepherosa Ziehau 
7*0c543cddSSepherosa Ziehau struct e5_imc_chan {
8*0c543cddSSepherosa Ziehau 	uint16_t	did;
9*0c543cddSSepherosa Ziehau 	int		slot;
10*0c543cddSSepherosa Ziehau 	int		func;
11*0c543cddSSepherosa Ziehau 	const char	*desc;
12*0c543cddSSepherosa Ziehau 
13*0c543cddSSepherosa Ziehau 	int		chan_ext;	/* external channel */
14*0c543cddSSepherosa Ziehau 	int		chan;
15*0c543cddSSepherosa Ziehau 	int		ver;
16*0c543cddSSepherosa Ziehau 
17*0c543cddSSepherosa Ziehau 	int		ubox_slot;
18*0c543cddSSepherosa Ziehau 	int		ubox_func;
19*0c543cddSSepherosa Ziehau 	uint16_t	ubox_did;
20*0c543cddSSepherosa Ziehau 
21*0c543cddSSepherosa Ziehau 	int		cpgc_slot;
22*0c543cddSSepherosa Ziehau 	int		cpgc_func;
23*0c543cddSSepherosa Ziehau 	uint16_t	cpgc_did;
24*0c543cddSSepherosa Ziehau 	uint32_t	cpgc_chandis;
25*0c543cddSSepherosa Ziehau 
26*0c543cddSSepherosa Ziehau 	int		ctad_slot;
27*0c543cddSSepherosa Ziehau 	int		ctad_func;
28*0c543cddSSepherosa Ziehau 	uint16_t	ctad_did;
29*0c543cddSSepherosa Ziehau };
30*0c543cddSSepherosa Ziehau 
31*0c543cddSSepherosa Ziehau #define E5_IMC_CHAN_END	\
32*0c543cddSSepherosa Ziehau 	{ 0, 0, 0, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
33*0c543cddSSepherosa Ziehau 
34*0c543cddSSepherosa Ziehau #define E5_IMC_CHAN_FIELDS(v, imc, c, c_ext)			\
35*0c543cddSSepherosa Ziehau 	.chan_ext	= c_ext,				\
36*0c543cddSSepherosa Ziehau 	.chan		= c,					\
37*0c543cddSSepherosa Ziehau 	.ver		= E5_IMC_CHAN_VER##v,			\
38*0c543cddSSepherosa Ziehau 								\
39*0c543cddSSepherosa Ziehau 	.ubox_slot	= PCISLOT_E5V##v##_UBOX0,		\
40*0c543cddSSepherosa Ziehau 	.ubox_func	= PCIFUNC_E5V##v##_UBOX0,		\
41*0c543cddSSepherosa Ziehau 	.ubox_did	= PCI_E5V##v##_UBOX0_DID_ID,		\
42*0c543cddSSepherosa Ziehau 								\
43*0c543cddSSepherosa Ziehau 	.cpgc_slot	= PCISLOT_E5V##v##_IMC##imc##_CPGC,	\
44*0c543cddSSepherosa Ziehau 	.cpgc_func	= PCIFUNC_E5V##v##_IMC##imc##_CPGC,	\
45*0c543cddSSepherosa Ziehau 	.cpgc_did	= PCI_E5V##v##_IMC##imc##_CPGC_DID_ID,	\
46*0c543cddSSepherosa Ziehau 	.cpgc_chandis	= PCI_E5V##v##_IMC_CPGC_MCMTR_CHN_DISABLE(c), \
47*0c543cddSSepherosa Ziehau 								\
48*0c543cddSSepherosa Ziehau 	.ctad_slot	= PCISLOT_E5V##v##_IMC##imc##_CTAD,	\
49*0c543cddSSepherosa Ziehau 	.ctad_func	= PCIFUNC_E5V##v##_IMC##imc##_CTAD(c),	\
50*0c543cddSSepherosa Ziehau 	.ctad_did	= PCI_E5V##v##_IMC##imc##_CTAD_DID_ID(c) \
51*0c543cddSSepherosa Ziehau 
52*0c543cddSSepherosa Ziehau #define UBOX_READ(dev, c, ofs, w)			\
53*0c543cddSSepherosa Ziehau 	pcib_read_config((dev), pci_get_bus((dev)),	\
54*0c543cddSSepherosa Ziehau 	    (c)->ubox_slot, (c)->ubox_func, (ofs), (w))
55*0c543cddSSepherosa Ziehau #define UBOX_READ_2(dev, c, ofs)	UBOX_READ((dev), (c), (ofs), 2)
56*0c543cddSSepherosa Ziehau #define UBOX_READ_4(dev, c, ofs)	UBOX_READ((dev), (c), (ofs), 4)
57*0c543cddSSepherosa Ziehau 
58*0c543cddSSepherosa Ziehau #define IMC_CPGC_READ(dev, c, ofs, w)			\
59*0c543cddSSepherosa Ziehau 	pcib_read_config((dev), pci_get_bus((dev)),	\
60*0c543cddSSepherosa Ziehau 	    (c)->cpgc_slot, (c)->cpgc_func, (ofs), (w))
61*0c543cddSSepherosa Ziehau #define IMC_CPGC_READ_2(dev, c, ofs)	IMC_CPGC_READ((dev), (c), (ofs), 2)
62*0c543cddSSepherosa Ziehau #define IMC_CPGC_READ_4(dev, c, ofs)	IMC_CPGC_READ((dev), (c), (ofs), 4)
63*0c543cddSSepherosa Ziehau 
64*0c543cddSSepherosa Ziehau #define IMC_CTAD_READ(dev, c, ofs, w)			\
65*0c543cddSSepherosa Ziehau 	pcib_read_config((dev), pci_get_bus((dev)),	\
66*0c543cddSSepherosa Ziehau 	    (c)->ctad_slot, (c)->ctad_func, (ofs), (w))
67*0c543cddSSepherosa Ziehau #define IMC_CTAD_READ_2(dev, c, ofs)	IMC_CTAD_READ((dev), (c), (ofs), 2)
68*0c543cddSSepherosa Ziehau #define IMC_CTAD_READ_4(dev, c, ofs)	IMC_CTAD_READ((dev), (c), (ofs), 4)
69*0c543cddSSepherosa Ziehau 
70*0c543cddSSepherosa Ziehau static __inline int
e5_imc_node_probe(device_t dev,const struct e5_imc_chan * c)71*0c543cddSSepherosa Ziehau e5_imc_node_probe(device_t dev, const struct e5_imc_chan *c)
72*0c543cddSSepherosa Ziehau {
73*0c543cddSSepherosa Ziehau 	int node, dimm;
74*0c543cddSSepherosa Ziehau 	uint32_t val;
75*0c543cddSSepherosa Ziehau 
76*0c543cddSSepherosa Ziehau 	/* Check CPGC vid/did */
77*0c543cddSSepherosa Ziehau 	if (IMC_CPGC_READ_2(dev, c, PCIR_VENDOR) != PCI_E5_IMC_VID_ID ||
78*0c543cddSSepherosa Ziehau 	    IMC_CPGC_READ_2(dev, c, PCIR_DEVICE) != c->cpgc_did)
79*0c543cddSSepherosa Ziehau 		return -1;
80*0c543cddSSepherosa Ziehau 
81*0c543cddSSepherosa Ziehau 	/* Is this channel disabled */
82*0c543cddSSepherosa Ziehau 	val = IMC_CPGC_READ_4(dev, c, PCI_E5_IMC_CPGC_MCMTR);
83*0c543cddSSepherosa Ziehau 	if (val & c->cpgc_chandis)
84*0c543cddSSepherosa Ziehau 		return -1;
85*0c543cddSSepherosa Ziehau 
86*0c543cddSSepherosa Ziehau 	/* Check CTAD vid/did */
87*0c543cddSSepherosa Ziehau 	if (IMC_CTAD_READ_2(dev, c, PCIR_VENDOR) != PCI_E5_IMC_VID_ID ||
88*0c543cddSSepherosa Ziehau 	    IMC_CTAD_READ_2(dev, c, PCIR_DEVICE) != c->ctad_did)
89*0c543cddSSepherosa Ziehau 		return -1;
90*0c543cddSSepherosa Ziehau 
91*0c543cddSSepherosa Ziehau 	/* Are there any DIMMs populated? */
92*0c543cddSSepherosa Ziehau 	for (dimm = 0; dimm < PCI_E5_IMC_CHN_DIMM_MAX; ++dimm) {
93*0c543cddSSepherosa Ziehau 		val = IMC_CTAD_READ_4(dev, c, PCI_E5_IMC_CTAD_DIMMMTR(dimm));
94*0c543cddSSepherosa Ziehau 		if (val & PCI_E5_IMC_CTAD_DIMMMTR_DIMM_POP)
95*0c543cddSSepherosa Ziehau 			break;
96*0c543cddSSepherosa Ziehau 	}
97*0c543cddSSepherosa Ziehau 	if (dimm == PCI_E5_IMC_CHN_DIMM_MAX)
98*0c543cddSSepherosa Ziehau 		return -1;
99*0c543cddSSepherosa Ziehau 
100*0c543cddSSepherosa Ziehau 	/* Check UBOX vid/did */
101*0c543cddSSepherosa Ziehau 	if (UBOX_READ_2(dev, c, PCIR_VENDOR) != PCI_E5_IMC_VID_ID ||
102*0c543cddSSepherosa Ziehau 	    UBOX_READ_2(dev, c, PCIR_DEVICE) != c->ubox_did)
103*0c543cddSSepherosa Ziehau 		return -1;
104*0c543cddSSepherosa Ziehau 
105*0c543cddSSepherosa Ziehau 	val = UBOX_READ_4(dev, c, PCI_E5_UBOX0_CPUNODEID);
106*0c543cddSSepherosa Ziehau 	node = __SHIFTOUT(val, PCI_E5_UBOX0_CPUNODEID_LCLNODEID);
107*0c543cddSSepherosa Ziehau 
108*0c543cddSSepherosa Ziehau 	return node;
109*0c543cddSSepherosa Ziehau }
110*0c543cddSSepherosa Ziehau 
111*0c543cddSSepherosa Ziehau #endif	/* !_E5_IMC_VAR_H_ */
112