atomic: use <linux/atomic.h>
[linux-2.6.git] / arch / powerpc / platforms / pseries / eeh.c
1 /*
2  * eeh.c
3  * Copyright IBM Corporation 2001, 2005, 2006
4  * Copyright Dave Engebretsen & Todd Inglett 2001
5  * Copyright Linas Vepstas 2005, 2006
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20  *
21  * Please address comments and feedback to Linas Vepstas <linas@austin.ibm.com>
22  */
23
24 #include <linux/delay.h>
25 #include <linux/init.h>
26 #include <linux/list.h>
27 #include <linux/pci.h>
28 #include <linux/proc_fs.h>
29 #include <linux/rbtree.h>
30 #include <linux/seq_file.h>
31 #include <linux/spinlock.h>
32 #include <linux/of.h>
33
34 #include <linux/atomic.h>
35 #include <asm/eeh.h>
36 #include <asm/eeh_event.h>
37 #include <asm/io.h>
38 #include <asm/machdep.h>
39 #include <asm/ppc-pci.h>
40 #include <asm/rtas.h>
41
42
43 /** Overview:
44  *  EEH, or "Extended Error Handling" is a PCI bridge technology for
45  *  dealing with PCI bus errors that can't be dealt with within the
46  *  usual PCI framework, except by check-stopping the CPU.  Systems
47  *  that are designed for high-availability/reliability cannot afford
48  *  to crash due to a "mere" PCI error, thus the need for EEH.
49  *  An EEH-capable bridge operates by converting a detected error
50  *  into a "slot freeze", taking the PCI adapter off-line, making
51  *  the slot behave, from the OS'es point of view, as if the slot
52  *  were "empty": all reads return 0xff's and all writes are silently
53  *  ignored.  EEH slot isolation events can be triggered by parity
54  *  errors on the address or data busses (e.g. during posted writes),
55  *  which in turn might be caused by low voltage on the bus, dust,
56  *  vibration, humidity, radioactivity or plain-old failed hardware.
57  *
58  *  Note, however, that one of the leading causes of EEH slot
59  *  freeze events are buggy device drivers, buggy device microcode,
60  *  or buggy device hardware.  This is because any attempt by the
61  *  device to bus-master data to a memory address that is not
62  *  assigned to the device will trigger a slot freeze.   (The idea
63  *  is to prevent devices-gone-wild from corrupting system memory).
64  *  Buggy hardware/drivers will have a miserable time co-existing
65  *  with EEH.
66  *
67  *  Ideally, a PCI device driver, when suspecting that an isolation
68  *  event has occurred (e.g. by reading 0xff's), will then ask EEH
69  *  whether this is the case, and then take appropriate steps to
70  *  reset the PCI slot, the PCI device, and then resume operations.
71  *  However, until that day,  the checking is done here, with the
72  *  eeh_check_failure() routine embedded in the MMIO macros.  If
73  *  the slot is found to be isolated, an "EEH Event" is synthesized
74  *  and sent out for processing.
75  */
76
77 /* If a device driver keeps reading an MMIO register in an interrupt
78  * handler after a slot isolation event, it might be broken.
79  * This sets the threshold for how many read attempts we allow
80  * before printing an error message.
81  */
82 #define EEH_MAX_FAILS   2100000
83
84 /* Time to wait for a PCI slot to report status, in milliseconds */
85 #define PCI_BUS_RESET_WAIT_MSEC (60*1000)
86
87 /* RTAS tokens */
88 static int ibm_set_eeh_option;
89 static int ibm_set_slot_reset;
90 static int ibm_read_slot_reset_state;
91 static int ibm_read_slot_reset_state2;
92 static int ibm_slot_error_detail;
93 static int ibm_get_config_addr_info;
94 static int ibm_get_config_addr_info2;
95 static int ibm_configure_bridge;
96 static int ibm_configure_pe;
97
98 int eeh_subsystem_enabled;
99 EXPORT_SYMBOL(eeh_subsystem_enabled);
100
101 /* Lock to avoid races due to multiple reports of an error */
102 static DEFINE_RAW_SPINLOCK(confirm_error_lock);
103
104 /* Buffer for reporting slot-error-detail rtas calls. Its here
105  * in BSS, and not dynamically alloced, so that it ends up in
106  * RMO where RTAS can access it.
107  */
108 static unsigned char slot_errbuf[RTAS_ERROR_LOG_MAX];
109 static DEFINE_SPINLOCK(slot_errbuf_lock);
110 static int eeh_error_buf_size;
111
112 /* Buffer for reporting pci register dumps. Its here in BSS, and
113  * not dynamically alloced, so that it ends up in RMO where RTAS
114  * can access it.
115  */
116 #define EEH_PCI_REGS_LOG_LEN 4096
117 static unsigned char pci_regs_buf[EEH_PCI_REGS_LOG_LEN];
118
119 /* System monitoring statistics */
120 static unsigned long no_device;
121 static unsigned long no_dn;
122 static unsigned long no_cfg_addr;
123 static unsigned long ignored_check;
124 static unsigned long total_mmio_ffs;
125 static unsigned long false_positives;
126 static unsigned long slot_resets;
127
128 #define IS_BRIDGE(class_code) (((class_code)<<16) == PCI_BASE_CLASS_BRIDGE)
129
130 /* --------------------------------------------------------------- */
131 /* Below lies the EEH event infrastructure */
132
133 static void rtas_slot_error_detail(struct pci_dn *pdn, int severity,
134                                    char *driver_log, size_t loglen)
135 {
136         int config_addr;
137         unsigned long flags;
138         int rc;
139
140         /* Log the error with the rtas logger */
141         spin_lock_irqsave(&slot_errbuf_lock, flags);
142         memset(slot_errbuf, 0, eeh_error_buf_size);
143
144         /* Use PE configuration address, if present */
145         config_addr = pdn->eeh_config_addr;
146         if (pdn->eeh_pe_config_addr)
147                 config_addr = pdn->eeh_pe_config_addr;
148
149         rc = rtas_call(ibm_slot_error_detail,
150                        8, 1, NULL, config_addr,
151                        BUID_HI(pdn->phb->buid),
152                        BUID_LO(pdn->phb->buid),
153                        virt_to_phys(driver_log), loglen,
154                        virt_to_phys(slot_errbuf),
155                        eeh_error_buf_size,
156                        severity);
157
158         if (rc == 0)
159                 log_error(slot_errbuf, ERR_TYPE_RTAS_LOG, 0);
160         spin_unlock_irqrestore(&slot_errbuf_lock, flags);
161 }
162
163 /**
164  * gather_pci_data - copy assorted PCI config space registers to buff
165  * @pdn: device to report data for
166  * @buf: point to buffer in which to log
167  * @len: amount of room in buffer
168  *
169  * This routine captures assorted PCI configuration space data,
170  * and puts them into a buffer for RTAS error logging.
171  */
172 static size_t gather_pci_data(struct pci_dn *pdn, char * buf, size_t len)
173 {
174         struct pci_dev *dev = pdn->pcidev;
175         u32 cfg;
176         int cap, i;
177         int n = 0;
178
179         n += scnprintf(buf+n, len-n, "%s\n", pdn->node->full_name);
180         printk(KERN_WARNING "EEH: of node=%s\n", pdn->node->full_name);
181
182         rtas_read_config(pdn, PCI_VENDOR_ID, 4, &cfg);
183         n += scnprintf(buf+n, len-n, "dev/vend:%08x\n", cfg);
184         printk(KERN_WARNING "EEH: PCI device/vendor: %08x\n", cfg);
185
186         rtas_read_config(pdn, PCI_COMMAND, 4, &cfg);
187         n += scnprintf(buf+n, len-n, "cmd/stat:%x\n", cfg);
188         printk(KERN_WARNING "EEH: PCI cmd/status register: %08x\n", cfg);
189
190         if (!dev) {
191                 printk(KERN_WARNING "EEH: no PCI device for this of node\n");
192                 return n;
193         }
194
195         /* Gather bridge-specific registers */
196         if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
197                 rtas_read_config(pdn, PCI_SEC_STATUS, 2, &cfg);
198                 n += scnprintf(buf+n, len-n, "sec stat:%x\n", cfg);
199                 printk(KERN_WARNING "EEH: Bridge secondary status: %04x\n", cfg);
200
201                 rtas_read_config(pdn, PCI_BRIDGE_CONTROL, 2, &cfg);
202                 n += scnprintf(buf+n, len-n, "brdg ctl:%x\n", cfg);
203                 printk(KERN_WARNING "EEH: Bridge control: %04x\n", cfg);
204         }
205
206         /* Dump out the PCI-X command and status regs */
207         cap = pci_find_capability(dev, PCI_CAP_ID_PCIX);
208         if (cap) {
209                 rtas_read_config(pdn, cap, 4, &cfg);
210                 n += scnprintf(buf+n, len-n, "pcix-cmd:%x\n", cfg);
211                 printk(KERN_WARNING "EEH: PCI-X cmd: %08x\n", cfg);
212
213                 rtas_read_config(pdn, cap+4, 4, &cfg);
214                 n += scnprintf(buf+n, len-n, "pcix-stat:%x\n", cfg);
215                 printk(KERN_WARNING "EEH: PCI-X status: %08x\n", cfg);
216         }
217
218         /* If PCI-E capable, dump PCI-E cap 10, and the AER */
219         cap = pci_find_capability(dev, PCI_CAP_ID_EXP);
220         if (cap) {
221                 n += scnprintf(buf+n, len-n, "pci-e cap10:\n");
222                 printk(KERN_WARNING
223                        "EEH: PCI-E capabilities and status follow:\n");
224
225                 for (i=0; i<=8; i++) {
226                         rtas_read_config(pdn, cap+4*i, 4, &cfg);
227                         n += scnprintf(buf+n, len-n, "%02x:%x\n", 4*i, cfg);
228                         printk(KERN_WARNING "EEH: PCI-E %02x: %08x\n", i, cfg);
229                 }
230
231                 cap = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
232                 if (cap) {
233                         n += scnprintf(buf+n, len-n, "pci-e AER:\n");
234                         printk(KERN_WARNING
235                                "EEH: PCI-E AER capability register set follows:\n");
236
237                         for (i=0; i<14; i++) {
238                                 rtas_read_config(pdn, cap+4*i, 4, &cfg);
239                                 n += scnprintf(buf+n, len-n, "%02x:%x\n", 4*i, cfg);
240                                 printk(KERN_WARNING "EEH: PCI-E AER %02x: %08x\n", i, cfg);
241                         }
242                 }
243         }
244
245         /* Gather status on devices under the bridge */
246         if (dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) {
247                 struct device_node *dn;
248
249                 for_each_child_of_node(pdn->node, dn) {
250                         pdn = PCI_DN(dn);
251                         if (pdn)
252                                 n += gather_pci_data(pdn, buf+n, len-n);
253                 }
254         }
255
256         return n;
257 }
258
259 void eeh_slot_error_detail(struct pci_dn *pdn, int severity)
260 {
261         size_t loglen = 0;
262         pci_regs_buf[0] = 0;
263
264         rtas_pci_enable(pdn, EEH_THAW_MMIO);
265         rtas_configure_bridge(pdn);
266         eeh_restore_bars(pdn);
267         loglen = gather_pci_data(pdn, pci_regs_buf, EEH_PCI_REGS_LOG_LEN);
268
269         rtas_slot_error_detail(pdn, severity, pci_regs_buf, loglen);
270 }
271
272 /**
273  * read_slot_reset_state - Read the reset state of a device node's slot
274  * @dn: device node to read
275  * @rets: array to return results in
276  */
277 static int read_slot_reset_state(struct pci_dn *pdn, int rets[])
278 {
279         int token, outputs;
280         int config_addr;
281
282         if (ibm_read_slot_reset_state2 != RTAS_UNKNOWN_SERVICE) {
283                 token = ibm_read_slot_reset_state2;
284                 outputs = 4;
285         } else {
286                 token = ibm_read_slot_reset_state;
287                 rets[2] = 0; /* fake PE Unavailable info */
288                 outputs = 3;
289         }
290
291         /* Use PE configuration address, if present */
292         config_addr = pdn->eeh_config_addr;
293         if (pdn->eeh_pe_config_addr)
294                 config_addr = pdn->eeh_pe_config_addr;
295
296         return rtas_call(token, 3, outputs, rets, config_addr,
297                          BUID_HI(pdn->phb->buid), BUID_LO(pdn->phb->buid));
298 }
299
300 /**
301  * eeh_wait_for_slot_status - returns error status of slot
302  * @pdn pci device node
303  * @max_wait_msecs maximum number to millisecs to wait
304  *
305  * Return negative value if a permanent error, else return
306  * Partition Endpoint (PE) status value.
307  *
308  * If @max_wait_msecs is positive, then this routine will
309  * sleep until a valid status can be obtained, or until
310  * the max allowed wait time is exceeded, in which case
311  * a -2 is returned.
312  */
313 int
314 eeh_wait_for_slot_status(struct pci_dn *pdn, int max_wait_msecs)
315 {
316         int rc;
317         int rets[3];
318         int mwait;
319
320         while (1) {
321                 rc = read_slot_reset_state(pdn, rets);
322                 if (rc) return rc;
323                 if (rets[1] == 0) return -1;  /* EEH is not supported */
324
325                 if (rets[0] != 5) return rets[0]; /* return actual status */
326
327                 if (rets[2] == 0) return -1; /* permanently unavailable */
328
329                 if (max_wait_msecs <= 0) break;
330
331                 mwait = rets[2];
332                 if (mwait <= 0) {
333                         printk (KERN_WARNING
334                                 "EEH: Firmware returned bad wait value=%d\n", mwait);
335                         mwait = 1000;
336                 } else if (mwait > 300*1000) {
337                         printk (KERN_WARNING
338                                 "EEH: Firmware is taking too long, time=%d\n", mwait);
339                         mwait = 300*1000;
340                 }
341                 max_wait_msecs -= mwait;
342                 msleep (mwait);
343         }
344
345         printk(KERN_WARNING "EEH: Timed out waiting for slot status\n");
346         return -2;
347 }
348
349 /**
350  * eeh_token_to_phys - convert EEH address token to phys address
351  * @token i/o token, should be address in the form 0xA....
352  */
353 static inline unsigned long eeh_token_to_phys(unsigned long token)
354 {
355         pte_t *ptep;
356         unsigned long pa;
357
358         ptep = find_linux_pte(init_mm.pgd, token);
359         if (!ptep)
360                 return token;
361         pa = pte_pfn(*ptep) << PAGE_SHIFT;
362
363         return pa | (token & (PAGE_SIZE-1));
364 }
365
366 /** 
367  * Return the "partitionable endpoint" (pe) under which this device lies
368  */
369 struct device_node * find_device_pe(struct device_node *dn)
370 {
371         while ((dn->parent) && PCI_DN(dn->parent) &&
372               (PCI_DN(dn->parent)->eeh_mode & EEH_MODE_SUPPORTED)) {
373                 dn = dn->parent;
374         }
375         return dn;
376 }
377
378 /** Mark all devices that are children of this device as failed.
379  *  Mark the device driver too, so that it can see the failure
380  *  immediately; this is critical, since some drivers poll
381  *  status registers in interrupts ... If a driver is polling,
382  *  and the slot is frozen, then the driver can deadlock in
383  *  an interrupt context, which is bad.
384  */
385
386 static void __eeh_mark_slot(struct device_node *parent, int mode_flag)
387 {
388         struct device_node *dn;
389
390         for_each_child_of_node(parent, dn) {
391                 if (PCI_DN(dn)) {
392                         /* Mark the pci device driver too */
393                         struct pci_dev *dev = PCI_DN(dn)->pcidev;
394
395                         PCI_DN(dn)->eeh_mode |= mode_flag;
396
397                         if (dev && dev->driver)
398                                 dev->error_state = pci_channel_io_frozen;
399
400                         __eeh_mark_slot(dn, mode_flag);
401                 }
402         }
403 }
404
405 void eeh_mark_slot (struct device_node *dn, int mode_flag)
406 {
407         struct pci_dev *dev;
408         dn = find_device_pe (dn);
409
410         /* Back up one, since config addrs might be shared */
411         if (!pcibios_find_pci_bus(dn) && PCI_DN(dn->parent))
412                 dn = dn->parent;
413
414         PCI_DN(dn)->eeh_mode |= mode_flag;
415
416         /* Mark the pci device too */
417         dev = PCI_DN(dn)->pcidev;
418         if (dev)
419                 dev->error_state = pci_channel_io_frozen;
420
421         __eeh_mark_slot(dn, mode_flag);
422 }
423
424 static void __eeh_clear_slot(struct device_node *parent, int mode_flag)
425 {
426         struct device_node *dn;
427
428         for_each_child_of_node(parent, dn) {
429                 if (PCI_DN(dn)) {
430                         PCI_DN(dn)->eeh_mode &= ~mode_flag;
431                         PCI_DN(dn)->eeh_check_count = 0;
432                         __eeh_clear_slot(dn, mode_flag);
433                 }
434         }
435 }
436
437 void eeh_clear_slot (struct device_node *dn, int mode_flag)
438 {
439         unsigned long flags;
440         raw_spin_lock_irqsave(&confirm_error_lock, flags);
441         
442         dn = find_device_pe (dn);
443         
444         /* Back up one, since config addrs might be shared */
445         if (!pcibios_find_pci_bus(dn) && PCI_DN(dn->parent))
446                 dn = dn->parent;
447
448         PCI_DN(dn)->eeh_mode &= ~mode_flag;
449         PCI_DN(dn)->eeh_check_count = 0;
450         __eeh_clear_slot(dn, mode_flag);
451         raw_spin_unlock_irqrestore(&confirm_error_lock, flags);
452 }
453
454 void __eeh_set_pe_freset(struct device_node *parent, unsigned int *freset)
455 {
456         struct device_node *dn;
457
458         for_each_child_of_node(parent, dn) {
459                 if (PCI_DN(dn)) {
460
461                         struct pci_dev *dev = PCI_DN(dn)->pcidev;
462
463                         if (dev && dev->driver)
464                                 *freset |= dev->needs_freset;
465
466                         __eeh_set_pe_freset(dn, freset);
467                 }
468         }
469 }
470
471 void eeh_set_pe_freset(struct device_node *dn, unsigned int *freset)
472 {
473         struct pci_dev *dev;
474         dn = find_device_pe(dn);
475
476         /* Back up one, since config addrs might be shared */
477         if (!pcibios_find_pci_bus(dn) && PCI_DN(dn->parent))
478                 dn = dn->parent;
479
480         dev = PCI_DN(dn)->pcidev;
481         if (dev)
482                 *freset |= dev->needs_freset;
483
484         __eeh_set_pe_freset(dn, freset);
485 }
486
487 /**
488  * eeh_dn_check_failure - check if all 1's data is due to EEH slot freeze
489  * @dn device node
490  * @dev pci device, if known
491  *
492  * Check for an EEH failure for the given device node.  Call this
493  * routine if the result of a read was all 0xff's and you want to
494  * find out if this is due to an EEH slot freeze.  This routine
495  * will query firmware for the EEH status.
496  *
497  * Returns 0 if there has not been an EEH error; otherwise returns
498  * a non-zero value and queues up a slot isolation event notification.
499  *
500  * It is safe to call this routine in an interrupt context.
501  */
502 int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
503 {
504         int ret;
505         int rets[3];
506         unsigned long flags;
507         struct pci_dn *pdn;
508         int rc = 0;
509         const char *location;
510
511         total_mmio_ffs++;
512
513         if (!eeh_subsystem_enabled)
514                 return 0;
515
516         if (!dn) {
517                 no_dn++;
518                 return 0;
519         }
520         dn = find_device_pe(dn);
521         pdn = PCI_DN(dn);
522
523         /* Access to IO BARs might get this far and still not want checking. */
524         if (!(pdn->eeh_mode & EEH_MODE_SUPPORTED) ||
525             pdn->eeh_mode & EEH_MODE_NOCHECK) {
526                 ignored_check++;
527                 pr_debug("EEH: Ignored check (%x) for %s %s\n",
528                          pdn->eeh_mode, eeh_pci_name(dev), dn->full_name);
529                 return 0;
530         }
531
532         if (!pdn->eeh_config_addr && !pdn->eeh_pe_config_addr) {
533                 no_cfg_addr++;
534                 return 0;
535         }
536
537         /* If we already have a pending isolation event for this
538          * slot, we know it's bad already, we don't need to check.
539          * Do this checking under a lock; as multiple PCI devices
540          * in one slot might report errors simultaneously, and we
541          * only want one error recovery routine running.
542          */
543         raw_spin_lock_irqsave(&confirm_error_lock, flags);
544         rc = 1;
545         if (pdn->eeh_mode & EEH_MODE_ISOLATED) {
546                 pdn->eeh_check_count ++;
547                 if (pdn->eeh_check_count % EEH_MAX_FAILS == 0) {
548                         location = of_get_property(dn, "ibm,loc-code", NULL);
549                         printk (KERN_ERR "EEH: %d reads ignored for recovering device at "
550                                 "location=%s driver=%s pci addr=%s\n",
551                                 pdn->eeh_check_count, location,
552                                 dev->driver->name, eeh_pci_name(dev));
553                         printk (KERN_ERR "EEH: Might be infinite loop in %s driver\n",
554                                 dev->driver->name);
555                         dump_stack();
556                 }
557                 goto dn_unlock;
558         }
559
560         /*
561          * Now test for an EEH failure.  This is VERY expensive.
562          * Note that the eeh_config_addr may be a parent device
563          * in the case of a device behind a bridge, or it may be
564          * function zero of a multi-function device.
565          * In any case they must share a common PHB.
566          */
567         ret = read_slot_reset_state(pdn, rets);
568
569         /* If the call to firmware failed, punt */
570         if (ret != 0) {
571                 printk(KERN_WARNING "EEH: read_slot_reset_state() failed; rc=%d dn=%s\n",
572                        ret, dn->full_name);
573                 false_positives++;
574                 pdn->eeh_false_positives ++;
575                 rc = 0;
576                 goto dn_unlock;
577         }
578
579         /* Note that config-io to empty slots may fail;
580          * they are empty when they don't have children. */
581         if ((rets[0] == 5) && (rets[2] == 0) && (dn->child == NULL)) {
582                 false_positives++;
583                 pdn->eeh_false_positives ++;
584                 rc = 0;
585                 goto dn_unlock;
586         }
587
588         /* If EEH is not supported on this device, punt. */
589         if (rets[1] != 1) {
590                 printk(KERN_WARNING "EEH: event on unsupported device, rc=%d dn=%s\n",
591                        ret, dn->full_name);
592                 false_positives++;
593                 pdn->eeh_false_positives ++;
594                 rc = 0;
595                 goto dn_unlock;
596         }
597
598         /* If not the kind of error we know about, punt. */
599         if (rets[0] != 1 && rets[0] != 2 && rets[0] != 4 && rets[0] != 5) {
600                 false_positives++;
601                 pdn->eeh_false_positives ++;
602                 rc = 0;
603                 goto dn_unlock;
604         }
605
606         slot_resets++;
607  
608         /* Avoid repeated reports of this failure, including problems
609          * with other functions on this device, and functions under
610          * bridges. */
611         eeh_mark_slot (dn, EEH_MODE_ISOLATED);
612         raw_spin_unlock_irqrestore(&confirm_error_lock, flags);
613
614         eeh_send_failure_event (dn, dev);
615
616         /* Most EEH events are due to device driver bugs.  Having
617          * a stack trace will help the device-driver authors figure
618          * out what happened.  So print that out. */
619         dump_stack();
620         return 1;
621
622 dn_unlock:
623         raw_spin_unlock_irqrestore(&confirm_error_lock, flags);
624         return rc;
625 }
626
627 EXPORT_SYMBOL_GPL(eeh_dn_check_failure);
628
629 /**
630  * eeh_check_failure - check if all 1's data is due to EEH slot freeze
631  * @token i/o token, should be address in the form 0xA....
632  * @val value, should be all 1's (XXX why do we need this arg??)
633  *
634  * Check for an EEH failure at the given token address.  Call this
635  * routine if the result of a read was all 0xff's and you want to
636  * find out if this is due to an EEH slot freeze event.  This routine
637  * will query firmware for the EEH status.
638  *
639  * Note this routine is safe to call in an interrupt context.
640  */
641 unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val)
642 {
643         unsigned long addr;
644         struct pci_dev *dev;
645         struct device_node *dn;
646
647         /* Finding the phys addr + pci device; this is pretty quick. */
648         addr = eeh_token_to_phys((unsigned long __force) token);
649         dev = pci_get_device_by_addr(addr);
650         if (!dev) {
651                 no_device++;
652                 return val;
653         }
654
655         dn = pci_device_to_OF_node(dev);
656         eeh_dn_check_failure (dn, dev);
657
658         pci_dev_put(dev);
659         return val;
660 }
661
662 EXPORT_SYMBOL(eeh_check_failure);
663
664 /* ------------------------------------------------------------- */
665 /* The code below deals with error recovery */
666
667 /**
668  * rtas_pci_enable - enable MMIO or DMA transfers for this slot
669  * @pdn pci device node
670  */
671
672 int
673 rtas_pci_enable(struct pci_dn *pdn, int function)
674 {
675         int config_addr;
676         int rc;
677
678         /* Use PE configuration address, if present */
679         config_addr = pdn->eeh_config_addr;
680         if (pdn->eeh_pe_config_addr)
681                 config_addr = pdn->eeh_pe_config_addr;
682
683         rc = rtas_call(ibm_set_eeh_option, 4, 1, NULL,
684                        config_addr,
685                        BUID_HI(pdn->phb->buid),
686                        BUID_LO(pdn->phb->buid),
687                             function);
688
689         if (rc)
690                 printk(KERN_WARNING "EEH: Unexpected state change %d, err=%d dn=%s\n",
691                         function, rc, pdn->node->full_name);
692
693         rc = eeh_wait_for_slot_status (pdn, PCI_BUS_RESET_WAIT_MSEC);
694         if ((rc == 4) && (function == EEH_THAW_MMIO))
695                 return 0;
696
697         return rc;
698 }
699
700 /**
701  * rtas_pci_slot_reset - raises/lowers the pci #RST line
702  * @pdn pci device node
703  * @state: 1/0 to raise/lower the #RST
704  *
705  * Clear the EEH-frozen condition on a slot.  This routine
706  * asserts the PCI #RST line if the 'state' argument is '1',
707  * and drops the #RST line if 'state is '0'.  This routine is
708  * safe to call in an interrupt context.
709  *
710  */
711
712 static void
713 rtas_pci_slot_reset(struct pci_dn *pdn, int state)
714 {
715         int config_addr;
716         int rc;
717
718         BUG_ON (pdn==NULL); 
719
720         if (!pdn->phb) {
721                 printk (KERN_WARNING "EEH: in slot reset, device node %s has no phb\n",
722                         pdn->node->full_name);
723                 return;
724         }
725
726         /* Use PE configuration address, if present */
727         config_addr = pdn->eeh_config_addr;
728         if (pdn->eeh_pe_config_addr)
729                 config_addr = pdn->eeh_pe_config_addr;
730
731         rc = rtas_call(ibm_set_slot_reset, 4, 1, NULL,
732                        config_addr,
733                        BUID_HI(pdn->phb->buid),
734                        BUID_LO(pdn->phb->buid),
735                        state);
736
737         /* Fundamental-reset not supported on this PE, try hot-reset */
738         if (rc == -8 && state == 3) {
739                 rc = rtas_call(ibm_set_slot_reset, 4, 1, NULL,
740                                config_addr,
741                                BUID_HI(pdn->phb->buid),
742                                BUID_LO(pdn->phb->buid), 1);
743                 if (rc)
744                         printk(KERN_WARNING
745                                 "EEH: Unable to reset the failed slot,"
746                                 " #RST=%d dn=%s\n",
747                                 rc, pdn->node->full_name);
748         }
749 }
750
751 /**
752  * pcibios_set_pcie_slot_reset - Set PCI-E reset state
753  * @dev:        pci device struct
754  * @state:      reset state to enter
755  *
756  * Return value:
757  *      0 if success
758  **/
759 int pcibios_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state)
760 {
761         struct device_node *dn = pci_device_to_OF_node(dev);
762         struct pci_dn *pdn = PCI_DN(dn);
763
764         switch (state) {
765         case pcie_deassert_reset:
766                 rtas_pci_slot_reset(pdn, 0);
767                 break;
768         case pcie_hot_reset:
769                 rtas_pci_slot_reset(pdn, 1);
770                 break;
771         case pcie_warm_reset:
772                 rtas_pci_slot_reset(pdn, 3);
773                 break;
774         default:
775                 return -EINVAL;
776         };
777
778         return 0;
779 }
780
781 /**
782  * rtas_set_slot_reset -- assert the pci #RST line for 1/4 second
783  * @pdn: pci device node to be reset.
784  */
785
786 static void __rtas_set_slot_reset(struct pci_dn *pdn)
787 {
788         unsigned int freset = 0;
789
790         /* Determine type of EEH reset required for
791          * Partitionable Endpoint, a hot-reset (1)
792          * or a fundamental reset (3).
793          * A fundamental reset required by any device under
794          * Partitionable Endpoint trumps hot-reset.
795          */
796         eeh_set_pe_freset(pdn->node, &freset);
797
798         if (freset)
799                 rtas_pci_slot_reset(pdn, 3);
800         else
801                 rtas_pci_slot_reset(pdn, 1);
802
803         /* The PCI bus requires that the reset be held high for at least
804          * a 100 milliseconds. We wait a bit longer 'just in case'.  */
805
806 #define PCI_BUS_RST_HOLD_TIME_MSEC 250
807         msleep (PCI_BUS_RST_HOLD_TIME_MSEC);
808         
809         /* We might get hit with another EEH freeze as soon as the 
810          * pci slot reset line is dropped. Make sure we don't miss
811          * these, and clear the flag now. */
812         eeh_clear_slot (pdn->node, EEH_MODE_ISOLATED);
813
814         rtas_pci_slot_reset (pdn, 0);
815
816         /* After a PCI slot has been reset, the PCI Express spec requires
817          * a 1.5 second idle time for the bus to stabilize, before starting
818          * up traffic. */
819 #define PCI_BUS_SETTLE_TIME_MSEC 1800
820         msleep (PCI_BUS_SETTLE_TIME_MSEC);
821 }
822
823 int rtas_set_slot_reset(struct pci_dn *pdn)
824 {
825         int i, rc;
826
827         /* Take three shots at resetting the bus */
828         for (i=0; i<3; i++) {
829                 __rtas_set_slot_reset(pdn);
830
831                 rc = eeh_wait_for_slot_status(pdn, PCI_BUS_RESET_WAIT_MSEC);
832                 if (rc == 0)
833                         return 0;
834
835                 if (rc < 0) {
836                         printk(KERN_ERR "EEH: unrecoverable slot failure %s\n",
837                                pdn->node->full_name);
838                         return -1;
839                 }
840                 printk(KERN_ERR "EEH: bus reset %d failed on slot %s, rc=%d\n",
841                        i+1, pdn->node->full_name, rc);
842         }
843
844         return -1;
845 }
846
847 /* ------------------------------------------------------- */
848 /** Save and restore of PCI BARs
849  *
850  * Although firmware will set up BARs during boot, it doesn't
851  * set up device BAR's after a device reset, although it will,
852  * if requested, set up bridge configuration. Thus, we need to
853  * configure the PCI devices ourselves.  
854  */
855
856 /**
857  * __restore_bars - Restore the Base Address Registers
858  * @pdn: pci device node
859  *
860  * Loads the PCI configuration space base address registers,
861  * the expansion ROM base address, the latency timer, and etc.
862  * from the saved values in the device node.
863  */
864 static inline void __restore_bars (struct pci_dn *pdn)
865 {
866         int i;
867         u32 cmd;
868
869         if (NULL==pdn->phb) return;
870         for (i=4; i<10; i++) {
871                 rtas_write_config(pdn, i*4, 4, pdn->config_space[i]);
872         }
873
874         /* 12 == Expansion ROM Address */
875         rtas_write_config(pdn, 12*4, 4, pdn->config_space[12]);
876
877 #define BYTE_SWAP(OFF) (8*((OFF)/4)+3-(OFF))
878 #define SAVED_BYTE(OFF) (((u8 *)(pdn->config_space))[BYTE_SWAP(OFF)])
879
880         rtas_write_config (pdn, PCI_CACHE_LINE_SIZE, 1,
881                     SAVED_BYTE(PCI_CACHE_LINE_SIZE));
882
883         rtas_write_config (pdn, PCI_LATENCY_TIMER, 1,
884                     SAVED_BYTE(PCI_LATENCY_TIMER));
885
886         /* max latency, min grant, interrupt pin and line */
887         rtas_write_config(pdn, 15*4, 4, pdn->config_space[15]);
888
889         /* Restore PERR & SERR bits, some devices require it,
890            don't touch the other command bits */
891         rtas_read_config(pdn, PCI_COMMAND, 4, &cmd);
892         if (pdn->config_space[1] & PCI_COMMAND_PARITY)
893                 cmd |= PCI_COMMAND_PARITY;
894         else
895                 cmd &= ~PCI_COMMAND_PARITY;
896         if (pdn->config_space[1] & PCI_COMMAND_SERR)
897                 cmd |= PCI_COMMAND_SERR;
898         else
899                 cmd &= ~PCI_COMMAND_SERR;
900         rtas_write_config(pdn, PCI_COMMAND, 4, cmd);
901 }
902
903 /**
904  * eeh_restore_bars - restore the PCI config space info
905  *
906  * This routine performs a recursive walk to the children
907  * of this device as well.
908  */
909 void eeh_restore_bars(struct pci_dn *pdn)
910 {
911         struct device_node *dn;
912         if (!pdn) 
913                 return;
914         
915         if ((pdn->eeh_mode & EEH_MODE_SUPPORTED) && !IS_BRIDGE(pdn->class_code))
916                 __restore_bars (pdn);
917
918         for_each_child_of_node(pdn->node, dn)
919                 eeh_restore_bars (PCI_DN(dn));
920 }
921
922 /**
923  * eeh_save_bars - save device bars
924  *
925  * Save the values of the device bars. Unlike the restore
926  * routine, this routine is *not* recursive. This is because
927  * PCI devices are added individually; but, for the restore,
928  * an entire slot is reset at a time.
929  */
930 static void eeh_save_bars(struct pci_dn *pdn)
931 {
932         int i;
933
934         if (!pdn )
935                 return;
936         
937         for (i = 0; i < 16; i++)
938                 rtas_read_config(pdn, i * 4, 4, &pdn->config_space[i]);
939 }
940
941 void
942 rtas_configure_bridge(struct pci_dn *pdn)
943 {
944         int config_addr;
945         int rc;
946         int token;
947
948         /* Use PE configuration address, if present */
949         config_addr = pdn->eeh_config_addr;
950         if (pdn->eeh_pe_config_addr)
951                 config_addr = pdn->eeh_pe_config_addr;
952
953         /* Use new configure-pe function, if supported */
954         if (ibm_configure_pe != RTAS_UNKNOWN_SERVICE)
955                 token = ibm_configure_pe;
956         else
957                 token = ibm_configure_bridge;
958
959         rc = rtas_call(token, 3, 1, NULL,
960                        config_addr,
961                        BUID_HI(pdn->phb->buid),
962                        BUID_LO(pdn->phb->buid));
963         if (rc) {
964                 printk (KERN_WARNING "EEH: Unable to configure device bridge (%d) for %s\n",
965                         rc, pdn->node->full_name);
966         }
967 }
968
969 /* ------------------------------------------------------------- */
970 /* The code below deals with enabling EEH for devices during  the
971  * early boot sequence.  EEH must be enabled before any PCI probing
972  * can be done.
973  */
974
975 #define EEH_ENABLE 1
976
977 struct eeh_early_enable_info {
978         unsigned int buid_hi;
979         unsigned int buid_lo;
980 };
981
982 static int get_pe_addr (int config_addr,
983                         struct eeh_early_enable_info *info)
984 {
985         unsigned int rets[3];
986         int ret;
987
988         /* Use latest config-addr token on power6 */
989         if (ibm_get_config_addr_info2 != RTAS_UNKNOWN_SERVICE) {
990                 /* Make sure we have a PE in hand */
991                 ret = rtas_call (ibm_get_config_addr_info2, 4, 2, rets,
992                         config_addr, info->buid_hi, info->buid_lo, 1);
993                 if (ret || (rets[0]==0))
994                         return 0;
995
996                 ret = rtas_call (ibm_get_config_addr_info2, 4, 2, rets,
997                         config_addr, info->buid_hi, info->buid_lo, 0);
998                 if (ret)
999                         return 0;
1000                 return rets[0];
1001         }
1002
1003         /* Use older config-addr token on power5 */
1004         if (ibm_get_config_addr_info != RTAS_UNKNOWN_SERVICE) {
1005                 ret = rtas_call (ibm_get_config_addr_info, 4, 2, rets,
1006                         config_addr, info->buid_hi, info->buid_lo, 0);
1007                 if (ret)
1008                         return 0;
1009                 return rets[0];
1010         }
1011         return 0;
1012 }
1013
1014 /* Enable eeh for the given device node. */
1015 static void *early_enable_eeh(struct device_node *dn, void *data)
1016 {
1017         unsigned int rets[3];
1018         struct eeh_early_enable_info *info = data;
1019         int ret;
1020         const u32 *class_code = of_get_property(dn, "class-code", NULL);
1021         const u32 *vendor_id = of_get_property(dn, "vendor-id", NULL);
1022         const u32 *device_id = of_get_property(dn, "device-id", NULL);
1023         const u32 *regs;
1024         int enable;
1025         struct pci_dn *pdn = PCI_DN(dn);
1026
1027         pdn->class_code = 0;
1028         pdn->eeh_mode = 0;
1029         pdn->eeh_check_count = 0;
1030         pdn->eeh_freeze_count = 0;
1031         pdn->eeh_false_positives = 0;
1032
1033         if (!of_device_is_available(dn))
1034                 return NULL;
1035
1036         /* Ignore bad nodes. */
1037         if (!class_code || !vendor_id || !device_id)
1038                 return NULL;
1039
1040         /* There is nothing to check on PCI to ISA bridges */
1041         if (dn->type && !strcmp(dn->type, "isa")) {
1042                 pdn->eeh_mode |= EEH_MODE_NOCHECK;
1043                 return NULL;
1044         }
1045         pdn->class_code = *class_code;
1046
1047         /* Ok... see if this device supports EEH.  Some do, some don't,
1048          * and the only way to find out is to check each and every one. */
1049         regs = of_get_property(dn, "reg", NULL);
1050         if (regs) {
1051                 /* First register entry is addr (00BBSS00)  */
1052                 /* Try to enable eeh */
1053                 ret = rtas_call(ibm_set_eeh_option, 4, 1, NULL,
1054                                 regs[0], info->buid_hi, info->buid_lo,
1055                                 EEH_ENABLE);
1056
1057                 enable = 0;
1058                 if (ret == 0) {
1059                         pdn->eeh_config_addr = regs[0];
1060
1061                         /* If the newer, better, ibm,get-config-addr-info is supported, 
1062                          * then use that instead. */
1063                         pdn->eeh_pe_config_addr = get_pe_addr(pdn->eeh_config_addr, info);
1064
1065                         /* Some older systems (Power4) allow the
1066                          * ibm,set-eeh-option call to succeed even on nodes
1067                          * where EEH is not supported. Verify support
1068                          * explicitly. */
1069                         ret = read_slot_reset_state(pdn, rets);
1070                         if ((ret == 0) && (rets[1] == 1))
1071                                 enable = 1;
1072                 }
1073
1074                 if (enable) {
1075                         eeh_subsystem_enabled = 1;
1076                         pdn->eeh_mode |= EEH_MODE_SUPPORTED;
1077
1078                         pr_debug("EEH: %s: eeh enabled, config=%x pe_config=%x\n",
1079                                  dn->full_name, pdn->eeh_config_addr,
1080                                  pdn->eeh_pe_config_addr);
1081                 } else {
1082
1083                         /* This device doesn't support EEH, but it may have an
1084                          * EEH parent, in which case we mark it as supported. */
1085                         if (dn->parent && PCI_DN(dn->parent)
1086                             && (PCI_DN(dn->parent)->eeh_mode & EEH_MODE_SUPPORTED)) {
1087                                 /* Parent supports EEH. */
1088                                 pdn->eeh_mode |= EEH_MODE_SUPPORTED;
1089                                 pdn->eeh_config_addr = PCI_DN(dn->parent)->eeh_config_addr;
1090                                 return NULL;
1091                         }
1092                 }
1093         } else {
1094                 printk(KERN_WARNING "EEH: %s: unable to get reg property.\n",
1095                        dn->full_name);
1096         }
1097
1098         eeh_save_bars(pdn);
1099         return NULL;
1100 }
1101
1102 /*
1103  * Initialize EEH by trying to enable it for all of the adapters in the system.
1104  * As a side effect we can determine here if eeh is supported at all.
1105  * Note that we leave EEH on so failed config cycles won't cause a machine
1106  * check.  If a user turns off EEH for a particular adapter they are really
1107  * telling Linux to ignore errors.  Some hardware (e.g. POWER5) won't
1108  * grant access to a slot if EEH isn't enabled, and so we always enable
1109  * EEH for all slots/all devices.
1110  *
1111  * The eeh-force-off option disables EEH checking globally, for all slots.
1112  * Even if force-off is set, the EEH hardware is still enabled, so that
1113  * newer systems can boot.
1114  */
1115 void __init eeh_init(void)
1116 {
1117         struct device_node *phb, *np;
1118         struct eeh_early_enable_info info;
1119
1120         raw_spin_lock_init(&confirm_error_lock);
1121         spin_lock_init(&slot_errbuf_lock);
1122
1123         np = of_find_node_by_path("/rtas");
1124         if (np == NULL)
1125                 return;
1126
1127         ibm_set_eeh_option = rtas_token("ibm,set-eeh-option");
1128         ibm_set_slot_reset = rtas_token("ibm,set-slot-reset");
1129         ibm_read_slot_reset_state2 = rtas_token("ibm,read-slot-reset-state2");
1130         ibm_read_slot_reset_state = rtas_token("ibm,read-slot-reset-state");
1131         ibm_slot_error_detail = rtas_token("ibm,slot-error-detail");
1132         ibm_get_config_addr_info = rtas_token("ibm,get-config-addr-info");
1133         ibm_get_config_addr_info2 = rtas_token("ibm,get-config-addr-info2");
1134         ibm_configure_bridge = rtas_token ("ibm,configure-bridge");
1135         ibm_configure_pe = rtas_token("ibm,configure-pe");
1136
1137         if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE)
1138                 return;
1139
1140         eeh_error_buf_size = rtas_token("rtas-error-log-max");
1141         if (eeh_error_buf_size == RTAS_UNKNOWN_SERVICE) {
1142                 eeh_error_buf_size = 1024;
1143         }
1144         if (eeh_error_buf_size > RTAS_ERROR_LOG_MAX) {
1145                 printk(KERN_WARNING "EEH: rtas-error-log-max is bigger than allocated "
1146                       "buffer ! (%d vs %d)", eeh_error_buf_size, RTAS_ERROR_LOG_MAX);
1147                 eeh_error_buf_size = RTAS_ERROR_LOG_MAX;
1148         }
1149
1150         /* Enable EEH for all adapters.  Note that eeh requires buid's */
1151         for (phb = of_find_node_by_name(NULL, "pci"); phb;
1152              phb = of_find_node_by_name(phb, "pci")) {
1153                 unsigned long buid;
1154
1155                 buid = get_phb_buid(phb);
1156                 if (buid == 0 || PCI_DN(phb) == NULL)
1157                         continue;
1158
1159                 info.buid_lo = BUID_LO(buid);
1160                 info.buid_hi = BUID_HI(buid);
1161                 traverse_pci_devices(phb, early_enable_eeh, &info);
1162         }
1163
1164         if (eeh_subsystem_enabled)
1165                 printk(KERN_INFO "EEH: PCI Enhanced I/O Error Handling Enabled\n");
1166         else
1167                 printk(KERN_WARNING "EEH: No capable adapters found\n");
1168 }
1169
1170 /**
1171  * eeh_add_device_early - enable EEH for the indicated device_node
1172  * @dn: device node for which to set up EEH
1173  *
1174  * This routine must be used to perform EEH initialization for PCI
1175  * devices that were added after system boot (e.g. hotplug, dlpar).
1176  * This routine must be called before any i/o is performed to the
1177  * adapter (inluding any config-space i/o).
1178  * Whether this actually enables EEH or not for this device depends
1179  * on the CEC architecture, type of the device, on earlier boot
1180  * command-line arguments & etc.
1181  */
1182 static void eeh_add_device_early(struct device_node *dn)
1183 {
1184         struct pci_controller *phb;
1185         struct eeh_early_enable_info info;
1186
1187         if (!dn || !PCI_DN(dn))
1188                 return;
1189         phb = PCI_DN(dn)->phb;
1190
1191         /* USB Bus children of PCI devices will not have BUID's */
1192         if (NULL == phb || 0 == phb->buid)
1193                 return;
1194
1195         info.buid_hi = BUID_HI(phb->buid);
1196         info.buid_lo = BUID_LO(phb->buid);
1197         early_enable_eeh(dn, &info);
1198 }
1199
1200 void eeh_add_device_tree_early(struct device_node *dn)
1201 {
1202         struct device_node *sib;
1203
1204         for_each_child_of_node(dn, sib)
1205                 eeh_add_device_tree_early(sib);
1206         eeh_add_device_early(dn);
1207 }
1208 EXPORT_SYMBOL_GPL(eeh_add_device_tree_early);
1209
1210 /**
1211  * eeh_add_device_late - perform EEH initialization for the indicated pci device
1212  * @dev: pci device for which to set up EEH
1213  *
1214  * This routine must be used to complete EEH initialization for PCI
1215  * devices that were added after system boot (e.g. hotplug, dlpar).
1216  */
1217 static void eeh_add_device_late(struct pci_dev *dev)
1218 {
1219         struct device_node *dn;
1220         struct pci_dn *pdn;
1221
1222         if (!dev || !eeh_subsystem_enabled)
1223                 return;
1224
1225         pr_debug("EEH: Adding device %s\n", pci_name(dev));
1226
1227         dn = pci_device_to_OF_node(dev);
1228         pdn = PCI_DN(dn);
1229         if (pdn->pcidev == dev) {
1230                 pr_debug("EEH: Already referenced !\n");
1231                 return;
1232         }
1233         WARN_ON(pdn->pcidev);
1234
1235         pci_dev_get (dev);
1236         pdn->pcidev = dev;
1237
1238         pci_addr_cache_insert_device(dev);
1239         eeh_sysfs_add_device(dev);
1240 }
1241
1242 void eeh_add_device_tree_late(struct pci_bus *bus)
1243 {
1244         struct pci_dev *dev;
1245
1246         list_for_each_entry(dev, &bus->devices, bus_list) {
1247                 eeh_add_device_late(dev);
1248                 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
1249                         struct pci_bus *subbus = dev->subordinate;
1250                         if (subbus)
1251                                 eeh_add_device_tree_late(subbus);
1252                 }
1253         }
1254 }
1255 EXPORT_SYMBOL_GPL(eeh_add_device_tree_late);
1256
1257 /**
1258  * eeh_remove_device - undo EEH setup for the indicated pci device
1259  * @dev: pci device to be removed
1260  *
1261  * This routine should be called when a device is removed from
1262  * a running system (e.g. by hotplug or dlpar).  It unregisters
1263  * the PCI device from the EEH subsystem.  I/O errors affecting
1264  * this device will no longer be detected after this call; thus,
1265  * i/o errors affecting this slot may leave this device unusable.
1266  */
1267 static void eeh_remove_device(struct pci_dev *dev)
1268 {
1269         struct device_node *dn;
1270         if (!dev || !eeh_subsystem_enabled)
1271                 return;
1272
1273         /* Unregister the device with the EEH/PCI address search system */
1274         pr_debug("EEH: Removing device %s\n", pci_name(dev));
1275
1276         dn = pci_device_to_OF_node(dev);
1277         if (PCI_DN(dn)->pcidev == NULL) {
1278                 pr_debug("EEH: Not referenced !\n");
1279                 return;
1280         }
1281         PCI_DN(dn)->pcidev = NULL;
1282         pci_dev_put (dev);
1283
1284         pci_addr_cache_remove_device(dev);
1285         eeh_sysfs_remove_device(dev);
1286 }
1287
1288 void eeh_remove_bus_device(struct pci_dev *dev)
1289 {
1290         struct pci_bus *bus = dev->subordinate;
1291         struct pci_dev *child, *tmp;
1292
1293         eeh_remove_device(dev);
1294
1295         if (bus && dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
1296                 list_for_each_entry_safe(child, tmp, &bus->devices, bus_list)
1297                          eeh_remove_bus_device(child);
1298         }
1299 }
1300 EXPORT_SYMBOL_GPL(eeh_remove_bus_device);
1301
1302 static int proc_eeh_show(struct seq_file *m, void *v)
1303 {
1304         if (0 == eeh_subsystem_enabled) {
1305                 seq_printf(m, "EEH Subsystem is globally disabled\n");
1306                 seq_printf(m, "eeh_total_mmio_ffs=%ld\n", total_mmio_ffs);
1307         } else {
1308                 seq_printf(m, "EEH Subsystem is enabled\n");
1309                 seq_printf(m,
1310                                 "no device=%ld\n"
1311                                 "no device node=%ld\n"
1312                                 "no config address=%ld\n"
1313                                 "check not wanted=%ld\n"
1314                                 "eeh_total_mmio_ffs=%ld\n"
1315                                 "eeh_false_positives=%ld\n"
1316                                 "eeh_slot_resets=%ld\n",
1317                                 no_device, no_dn, no_cfg_addr, 
1318                                 ignored_check, total_mmio_ffs, 
1319                                 false_positives,
1320                                 slot_resets);
1321         }
1322
1323         return 0;
1324 }
1325
1326 static int proc_eeh_open(struct inode *inode, struct file *file)
1327 {
1328         return single_open(file, proc_eeh_show, NULL);
1329 }
1330
1331 static const struct file_operations proc_eeh_operations = {
1332         .open      = proc_eeh_open,
1333         .read      = seq_read,
1334         .llseek    = seq_lseek,
1335         .release   = single_release,
1336 };
1337
1338 static int __init eeh_init_proc(void)
1339 {
1340         if (machine_is(pseries))
1341                 proc_create("ppc64/eeh", 0, NULL, &proc_eeh_operations);
1342         return 0;
1343 }
1344 __initcall(eeh_init_proc);