Linux-libre 5.4.47-gnu
[librecmc/linux-libre.git] / drivers / edac / amd8131_edac.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * amd8131_edac.c, AMD8131 hypertransport chip EDAC kernel module
4  *
5  * Copyright (c) 2008 Wind River Systems, Inc.
6  *
7  * Authors:     Cao Qingtao <qingtao.cao@windriver.com>
8  *              Benjamin Walsh <benjamin.walsh@windriver.com>
9  *              Hu Yongqi <yongqi.hu@windriver.com>
10  */
11
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/interrupt.h>
15 #include <linux/io.h>
16 #include <linux/bitops.h>
17 #include <linux/edac.h>
18 #include <linux/pci_ids.h>
19
20 #include "edac_module.h"
21 #include "amd8131_edac.h"
22
23 #define AMD8131_EDAC_REVISION   " Ver: 1.0.0"
24 #define AMD8131_EDAC_MOD_STR    "amd8131_edac"
25
26 /* Wrapper functions for accessing PCI configuration space */
27 static void edac_pci_read_dword(struct pci_dev *dev, int reg, u32 *val32)
28 {
29         int ret;
30
31         ret = pci_read_config_dword(dev, reg, val32);
32         if (ret != 0)
33                 printk(KERN_ERR AMD8131_EDAC_MOD_STR
34                         " PCI Access Read Error at 0x%x\n", reg);
35 }
36
37 static void edac_pci_write_dword(struct pci_dev *dev, int reg, u32 val32)
38 {
39         int ret;
40
41         ret = pci_write_config_dword(dev, reg, val32);
42         if (ret != 0)
43                 printk(KERN_ERR AMD8131_EDAC_MOD_STR
44                         " PCI Access Write Error at 0x%x\n", reg);
45 }
46
47 static char * const bridge_str[] = {
48         [NORTH_A] = "NORTH A",
49         [NORTH_B] = "NORTH B",
50         [SOUTH_A] = "SOUTH A",
51         [SOUTH_B] = "SOUTH B",
52         [NO_BRIDGE] = "NO BRIDGE",
53 };
54
55 /* Support up to two AMD8131 chipsets on a platform */
56 static struct amd8131_dev_info amd8131_devices[] = {
57         {
58         .inst = NORTH_A,
59         .devfn = DEVFN_PCIX_BRIDGE_NORTH_A,
60         .ctl_name = "AMD8131_PCIX_NORTH_A",
61         },
62         {
63         .inst = NORTH_B,
64         .devfn = DEVFN_PCIX_BRIDGE_NORTH_B,
65         .ctl_name = "AMD8131_PCIX_NORTH_B",
66         },
67         {
68         .inst = SOUTH_A,
69         .devfn = DEVFN_PCIX_BRIDGE_SOUTH_A,
70         .ctl_name = "AMD8131_PCIX_SOUTH_A",
71         },
72         {
73         .inst = SOUTH_B,
74         .devfn = DEVFN_PCIX_BRIDGE_SOUTH_B,
75         .ctl_name = "AMD8131_PCIX_SOUTH_B",
76         },
77         {.inst = NO_BRIDGE,},
78 };
79
80 static void amd8131_pcix_init(struct amd8131_dev_info *dev_info)
81 {
82         u32 val32;
83         struct pci_dev *dev = dev_info->dev;
84
85         /* First clear error detection flags */
86         edac_pci_read_dword(dev, REG_MEM_LIM, &val32);
87         if (val32 & MEM_LIMIT_MASK)
88                 edac_pci_write_dword(dev, REG_MEM_LIM, val32);
89
90         /* Clear Discard Timer Timedout flag */
91         edac_pci_read_dword(dev, REG_INT_CTLR, &val32);
92         if (val32 & INT_CTLR_DTS)
93                 edac_pci_write_dword(dev, REG_INT_CTLR, val32);
94
95         /* Clear CRC Error flag on link side A */
96         edac_pci_read_dword(dev, REG_LNK_CTRL_A, &val32);
97         if (val32 & LNK_CTRL_CRCERR_A)
98                 edac_pci_write_dword(dev, REG_LNK_CTRL_A, val32);
99
100         /* Clear CRC Error flag on link side B */
101         edac_pci_read_dword(dev, REG_LNK_CTRL_B, &val32);
102         if (val32 & LNK_CTRL_CRCERR_B)
103                 edac_pci_write_dword(dev, REG_LNK_CTRL_B, val32);
104
105         /*
106          * Then enable all error detections.
107          *
108          * Setup Discard Timer Sync Flood Enable,
109          * System Error Enable and Parity Error Enable.
110          */
111         edac_pci_read_dword(dev, REG_INT_CTLR, &val32);
112         val32 |= INT_CTLR_PERR | INT_CTLR_SERR | INT_CTLR_DTSE;
113         edac_pci_write_dword(dev, REG_INT_CTLR, val32);
114
115         /* Enable overall SERR Error detection */
116         edac_pci_read_dword(dev, REG_STS_CMD, &val32);
117         val32 |= STS_CMD_SERREN;
118         edac_pci_write_dword(dev, REG_STS_CMD, val32);
119
120         /* Setup CRC Flood Enable for link side A */
121         edac_pci_read_dword(dev, REG_LNK_CTRL_A, &val32);
122         val32 |= LNK_CTRL_CRCFEN;
123         edac_pci_write_dword(dev, REG_LNK_CTRL_A, val32);
124
125         /* Setup CRC Flood Enable for link side B */
126         edac_pci_read_dword(dev, REG_LNK_CTRL_B, &val32);
127         val32 |= LNK_CTRL_CRCFEN;
128         edac_pci_write_dword(dev, REG_LNK_CTRL_B, val32);
129 }
130
131 static void amd8131_pcix_exit(struct amd8131_dev_info *dev_info)
132 {
133         u32 val32;
134         struct pci_dev *dev = dev_info->dev;
135
136         /* Disable SERR, PERR and DTSE Error detection */
137         edac_pci_read_dword(dev, REG_INT_CTLR, &val32);
138         val32 &= ~(INT_CTLR_PERR | INT_CTLR_SERR | INT_CTLR_DTSE);
139         edac_pci_write_dword(dev, REG_INT_CTLR, val32);
140
141         /* Disable overall System Error detection */
142         edac_pci_read_dword(dev, REG_STS_CMD, &val32);
143         val32 &= ~STS_CMD_SERREN;
144         edac_pci_write_dword(dev, REG_STS_CMD, val32);
145
146         /* Disable CRC Sync Flood on link side A */
147         edac_pci_read_dword(dev, REG_LNK_CTRL_A, &val32);
148         val32 &= ~LNK_CTRL_CRCFEN;
149         edac_pci_write_dword(dev, REG_LNK_CTRL_A, val32);
150
151         /* Disable CRC Sync Flood on link side B */
152         edac_pci_read_dword(dev, REG_LNK_CTRL_B, &val32);
153         val32 &= ~LNK_CTRL_CRCFEN;
154         edac_pci_write_dword(dev, REG_LNK_CTRL_B, val32);
155 }
156
157 static void amd8131_pcix_check(struct edac_pci_ctl_info *edac_dev)
158 {
159         struct amd8131_dev_info *dev_info = edac_dev->pvt_info;
160         struct pci_dev *dev = dev_info->dev;
161         u32 val32;
162
163         /* Check PCI-X Bridge Memory Base-Limit Register for errors */
164         edac_pci_read_dword(dev, REG_MEM_LIM, &val32);
165         if (val32 & MEM_LIMIT_MASK) {
166                 printk(KERN_INFO "Error(s) in mem limit register "
167                         "on %s bridge\n", dev_info->ctl_name);
168                 printk(KERN_INFO "DPE: %d, RSE: %d, RMA: %d\n"
169                         "RTA: %d, STA: %d, MDPE: %d\n",
170                         val32 & MEM_LIMIT_DPE,
171                         val32 & MEM_LIMIT_RSE,
172                         val32 & MEM_LIMIT_RMA,
173                         val32 & MEM_LIMIT_RTA,
174                         val32 & MEM_LIMIT_STA,
175                         val32 & MEM_LIMIT_MDPE);
176
177                 val32 |= MEM_LIMIT_MASK;
178                 edac_pci_write_dword(dev, REG_MEM_LIM, val32);
179
180                 edac_pci_handle_npe(edac_dev, edac_dev->ctl_name);
181         }
182
183         /* Check if Discard Timer timed out */
184         edac_pci_read_dword(dev, REG_INT_CTLR, &val32);
185         if (val32 & INT_CTLR_DTS) {
186                 printk(KERN_INFO "Error(s) in interrupt and control register "
187                         "on %s bridge\n", dev_info->ctl_name);
188                 printk(KERN_INFO "DTS: %d\n", val32 & INT_CTLR_DTS);
189
190                 val32 |= INT_CTLR_DTS;
191                 edac_pci_write_dword(dev, REG_INT_CTLR, val32);
192
193                 edac_pci_handle_npe(edac_dev, edac_dev->ctl_name);
194         }
195
196         /* Check if CRC error happens on link side A */
197         edac_pci_read_dword(dev, REG_LNK_CTRL_A, &val32);
198         if (val32 & LNK_CTRL_CRCERR_A) {
199                 printk(KERN_INFO "Error(s) in link conf and control register "
200                         "on %s bridge\n", dev_info->ctl_name);
201                 printk(KERN_INFO "CRCERR: %d\n", val32 & LNK_CTRL_CRCERR_A);
202
203                 val32 |= LNK_CTRL_CRCERR_A;
204                 edac_pci_write_dword(dev, REG_LNK_CTRL_A, val32);
205
206                 edac_pci_handle_npe(edac_dev, edac_dev->ctl_name);
207         }
208
209         /* Check if CRC error happens on link side B */
210         edac_pci_read_dword(dev, REG_LNK_CTRL_B, &val32);
211         if (val32 & LNK_CTRL_CRCERR_B) {
212                 printk(KERN_INFO "Error(s) in link conf and control register "
213                         "on %s bridge\n", dev_info->ctl_name);
214                 printk(KERN_INFO "CRCERR: %d\n", val32 & LNK_CTRL_CRCERR_B);
215
216                 val32 |= LNK_CTRL_CRCERR_B;
217                 edac_pci_write_dword(dev, REG_LNK_CTRL_B, val32);
218
219                 edac_pci_handle_npe(edac_dev, edac_dev->ctl_name);
220         }
221 }
222
223 static struct amd8131_info amd8131_chipset = {
224         .err_dev = PCI_DEVICE_ID_AMD_8131_APIC,
225         .devices = amd8131_devices,
226         .init = amd8131_pcix_init,
227         .exit = amd8131_pcix_exit,
228         .check = amd8131_pcix_check,
229 };
230
231 /*
232  * There are 4 PCIX Bridges on ATCA-6101 that share the same PCI Device ID,
233  * so amd8131_probe() would be called by kernel 4 times, with different
234  * address of pci_dev for each of them each time.
235  */
236 static int amd8131_probe(struct pci_dev *dev, const struct pci_device_id *id)
237 {
238         struct amd8131_dev_info *dev_info;
239
240         for (dev_info = amd8131_chipset.devices; dev_info->inst != NO_BRIDGE;
241                 dev_info++)
242                 if (dev_info->devfn == dev->devfn)
243                         break;
244
245         if (dev_info->inst == NO_BRIDGE) /* should never happen */
246                 return -ENODEV;
247
248         /*
249          * We can't call pci_get_device() as we are used to do because
250          * there are 4 of them but pci_dev_get() instead.
251          */
252         dev_info->dev = pci_dev_get(dev);
253
254         if (pci_enable_device(dev_info->dev)) {
255                 pci_dev_put(dev_info->dev);
256                 printk(KERN_ERR "failed to enable:"
257                         "vendor %x, device %x, devfn %x, name %s\n",
258                         PCI_VENDOR_ID_AMD, amd8131_chipset.err_dev,
259                         dev_info->devfn, dev_info->ctl_name);
260                 return -ENODEV;
261         }
262
263         /*
264          * we do not allocate extra private structure for
265          * edac_pci_ctl_info, but make use of existing
266          * one instead.
267          */
268         dev_info->edac_idx = edac_pci_alloc_index();
269         dev_info->edac_dev = edac_pci_alloc_ctl_info(0, dev_info->ctl_name);
270         if (!dev_info->edac_dev)
271                 return -ENOMEM;
272
273         dev_info->edac_dev->pvt_info = dev_info;
274         dev_info->edac_dev->dev = &dev_info->dev->dev;
275         dev_info->edac_dev->mod_name = AMD8131_EDAC_MOD_STR;
276         dev_info->edac_dev->ctl_name = dev_info->ctl_name;
277         dev_info->edac_dev->dev_name = dev_name(&dev_info->dev->dev);
278
279         if (edac_op_state == EDAC_OPSTATE_POLL)
280                 dev_info->edac_dev->edac_check = amd8131_chipset.check;
281
282         if (amd8131_chipset.init)
283                 amd8131_chipset.init(dev_info);
284
285         if (edac_pci_add_device(dev_info->edac_dev, dev_info->edac_idx) > 0) {
286                 printk(KERN_ERR "failed edac_pci_add_device() for %s\n",
287                         dev_info->ctl_name);
288                 edac_pci_free_ctl_info(dev_info->edac_dev);
289                 return -ENODEV;
290         }
291
292         printk(KERN_INFO "added one device on AMD8131 "
293                 "vendor %x, device %x, devfn %x, name %s\n",
294                 PCI_VENDOR_ID_AMD, amd8131_chipset.err_dev,
295                 dev_info->devfn, dev_info->ctl_name);
296
297         return 0;
298 }
299
300 static void amd8131_remove(struct pci_dev *dev)
301 {
302         struct amd8131_dev_info *dev_info;
303
304         for (dev_info = amd8131_chipset.devices; dev_info->inst != NO_BRIDGE;
305                 dev_info++)
306                 if (dev_info->devfn == dev->devfn)
307                         break;
308
309         if (dev_info->inst == NO_BRIDGE) /* should never happen */
310                 return;
311
312         if (dev_info->edac_dev) {
313                 edac_pci_del_device(dev_info->edac_dev->dev);
314                 edac_pci_free_ctl_info(dev_info->edac_dev);
315         }
316
317         if (amd8131_chipset.exit)
318                 amd8131_chipset.exit(dev_info);
319
320         pci_dev_put(dev_info->dev);
321 }
322
323 static const struct pci_device_id amd8131_edac_pci_tbl[] = {
324         {
325         PCI_VEND_DEV(AMD, 8131_BRIDGE),
326         .subvendor = PCI_ANY_ID,
327         .subdevice = PCI_ANY_ID,
328         .class = 0,
329         .class_mask = 0,
330         .driver_data = 0,
331         },
332         {
333         0,
334         }                       /* table is NULL-terminated */
335 };
336 MODULE_DEVICE_TABLE(pci, amd8131_edac_pci_tbl);
337
338 static struct pci_driver amd8131_edac_driver = {
339         .name = AMD8131_EDAC_MOD_STR,
340         .probe = amd8131_probe,
341         .remove = amd8131_remove,
342         .id_table = amd8131_edac_pci_tbl,
343 };
344
345 static int __init amd8131_edac_init(void)
346 {
347         printk(KERN_INFO "AMD8131 EDAC driver " AMD8131_EDAC_REVISION "\n");
348         printk(KERN_INFO "\t(c) 2008 Wind River Systems, Inc.\n");
349
350         /* Only POLL mode supported so far */
351         edac_op_state = EDAC_OPSTATE_POLL;
352
353         return pci_register_driver(&amd8131_edac_driver);
354 }
355
356 static void __exit amd8131_edac_exit(void)
357 {
358         pci_unregister_driver(&amd8131_edac_driver);
359 }
360
361 module_init(amd8131_edac_init);
362 module_exit(amd8131_edac_exit);
363
364 MODULE_LICENSE("GPL");
365 MODULE_AUTHOR("Cao Qingtao <qingtao.cao@windriver.com>\n");
366 MODULE_DESCRIPTION("AMD8131 HyperTransport PCI-X Tunnel EDAC kernel module");