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