]> err.no Git - linux-2.6/blob - arch/powerpc/platforms/pseries/eeh.c
Merge branch 'irq-cleanups-upstream' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6] / 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 <asm/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 #undef DEBUG
43
44 /** Overview:
45  *  EEH, or "Extended Error Handling" is a PCI bridge technology for
46  *  dealing with PCI bus errors that can't be dealt with within the
47  *  usual PCI framework, except by check-stopping the CPU.  Systems
48  *  that are designed for high-availability/reliability cannot afford
49  *  to crash due to a "mere" PCI error, thus the need for EEH.
50  *  An EEH-capable bridge operates by converting a detected error
51  *  into a "slot freeze", taking the PCI adapter off-line, making
52  *  the slot behave, from the OS'es point of view, as if the slot
53  *  were "empty": all reads return 0xff's and all writes are silently
54  *  ignored.  EEH slot isolation events can be triggered by parity
55  *  errors on the address or data busses (e.g. during posted writes),
56  *  which in turn might be caused by low voltage on the bus, dust,
57  *  vibration, humidity, radioactivity or plain-old failed hardware.
58  *
59  *  Note, however, that one of the leading causes of EEH slot
60  *  freeze events are buggy device drivers, buggy device microcode,
61  *  or buggy device hardware.  This is because any attempt by the
62  *  device to bus-master data to a memory address that is not
63  *  assigned to the device will trigger a slot freeze.   (The idea
64  *  is to prevent devices-gone-wild from corrupting system memory).
65  *  Buggy hardware/drivers will have a miserable time co-existing
66  *  with EEH.
67  *
68  *  Ideally, a PCI device driver, when suspecting that an isolation
69  *  event has occured (e.g. by reading 0xff's), will then ask EEH
70  *  whether this is the case, and then take appropriate steps to
71  *  reset the PCI slot, the PCI device, and then resume operations.
72  *  However, until that day,  the checking is done here, with the
73  *  eeh_check_failure() routine embedded in the MMIO macros.  If
74  *  the slot is found to be isolated, an "EEH Event" is synthesized
75  *  and sent out for processing.
76  */
77
78 /* If a device driver keeps reading an MMIO register in an interrupt
79  * handler after a slot isolation event has occurred, we assume it
80  * is broken and panic.  This sets the threshold for how many read
81  * attempts we allow before panicking.
82  */
83 #define EEH_MAX_FAILS   2100000
84
85 /* Time to wait for a PCI slot to report status, in milliseconds */
86 #define PCI_BUS_RESET_WAIT_MSEC (60*1000)
87
88 /* RTAS tokens */
89 static int ibm_set_eeh_option;
90 static int ibm_set_slot_reset;
91 static int ibm_read_slot_reset_state;
92 static int ibm_read_slot_reset_state2;
93 static int ibm_slot_error_detail;
94 static int ibm_get_config_addr_info;
95 static int ibm_get_config_addr_info2;
96 static int ibm_configure_bridge;
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_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         loglen = gather_pci_data(pdn, pci_regs_buf, EEH_PCI_REGS_LOG_LEN);
266
267         rtas_slot_error_detail(pdn, severity, pci_regs_buf, loglen);
268 }
269
270 /**
271  * read_slot_reset_state - Read the reset state of a device node's slot
272  * @dn: device node to read
273  * @rets: array to return results in
274  */
275 static int read_slot_reset_state(struct pci_dn *pdn, int rets[])
276 {
277         int token, outputs;
278         int config_addr;
279
280         if (ibm_read_slot_reset_state2 != RTAS_UNKNOWN_SERVICE) {
281                 token = ibm_read_slot_reset_state2;
282                 outputs = 4;
283         } else {
284                 token = ibm_read_slot_reset_state;
285                 rets[2] = 0; /* fake PE Unavailable info */
286                 outputs = 3;
287         }
288
289         /* Use PE configuration address, if present */
290         config_addr = pdn->eeh_config_addr;
291         if (pdn->eeh_pe_config_addr)
292                 config_addr = pdn->eeh_pe_config_addr;
293
294         return rtas_call(token, 3, outputs, rets, config_addr,
295                          BUID_HI(pdn->phb->buid), BUID_LO(pdn->phb->buid));
296 }
297
298 /**
299  * eeh_wait_for_slot_status - returns error status of slot
300  * @pdn pci device node
301  * @max_wait_msecs maximum number to millisecs to wait
302  *
303  * Return negative value if a permanent error, else return
304  * Partition Endpoint (PE) status value.
305  *
306  * If @max_wait_msecs is positive, then this routine will
307  * sleep until a valid status can be obtained, or until
308  * the max allowed wait time is exceeded, in which case
309  * a -2 is returned.
310  */
311 int
312 eeh_wait_for_slot_status(struct pci_dn *pdn, int max_wait_msecs)
313 {
314         int rc;
315         int rets[3];
316         int mwait;
317
318         while (1) {
319                 rc = read_slot_reset_state(pdn, rets);
320                 if (rc) return rc;
321                 if (rets[1] == 0) return -1;  /* EEH is not supported */
322
323                 if (rets[0] != 5) return rets[0]; /* return actual status */
324
325                 if (rets[2] == 0) return -1; /* permanently unavailable */
326
327                 if (max_wait_msecs <= 0) break;
328
329                 mwait = rets[2];
330                 if (mwait <= 0) {
331                         printk (KERN_WARNING
332                                 "EEH: Firmware returned bad wait value=%d\n", mwait);
333                         mwait = 1000;
334                 } else if (mwait > 300*1000) {
335                         printk (KERN_WARNING
336                                 "EEH: Firmware is taking too long, time=%d\n", mwait);
337                         mwait = 300*1000;
338                 }
339                 max_wait_msecs -= mwait;
340                 msleep (mwait);
341         }
342
343         printk(KERN_WARNING "EEH: Timed out waiting for slot status\n");
344         return -2;
345 }
346
347 /**
348  * eeh_token_to_phys - convert EEH address token to phys address
349  * @token i/o token, should be address in the form 0xA....
350  */
351 static inline unsigned long eeh_token_to_phys(unsigned long token)
352 {
353         pte_t *ptep;
354         unsigned long pa;
355
356         ptep = find_linux_pte(init_mm.pgd, token);
357         if (!ptep)
358                 return token;
359         pa = pte_pfn(*ptep) << PAGE_SHIFT;
360
361         return pa | (token & (PAGE_SIZE-1));
362 }
363
364 /** 
365  * Return the "partitionable endpoint" (pe) under which this device lies
366  */
367 struct device_node * find_device_pe(struct device_node *dn)
368 {
369         while ((dn->parent) && PCI_DN(dn->parent) &&
370               (PCI_DN(dn->parent)->eeh_mode & EEH_MODE_SUPPORTED)) {
371                 dn = dn->parent;
372         }
373         return dn;
374 }
375
376 /** Mark all devices that are children of this device as failed.
377  *  Mark the device driver too, so that it can see the failure
378  *  immediately; this is critical, since some drivers poll
379  *  status registers in interrupts ... If a driver is polling,
380  *  and the slot is frozen, then the driver can deadlock in
381  *  an interrupt context, which is bad.
382  */
383
384 static void __eeh_mark_slot(struct device_node *parent, int mode_flag)
385 {
386         struct device_node *dn;
387
388         for_each_child_of_node(parent, dn) {
389                 if (PCI_DN(dn)) {
390                         /* Mark the pci device driver too */
391                         struct pci_dev *dev = PCI_DN(dn)->pcidev;
392
393                         PCI_DN(dn)->eeh_mode |= mode_flag;
394
395                         if (dev && dev->driver)
396                                 dev->error_state = pci_channel_io_frozen;
397
398                         __eeh_mark_slot(dn, mode_flag);
399                 }
400         }
401 }
402
403 void eeh_mark_slot (struct device_node *dn, int mode_flag)
404 {
405         struct pci_dev *dev;
406         dn = find_device_pe (dn);
407
408         /* Back up one, since config addrs might be shared */
409         if (!pcibios_find_pci_bus(dn) && PCI_DN(dn->parent))
410                 dn = dn->parent;
411
412         PCI_DN(dn)->eeh_mode |= mode_flag;
413
414         /* Mark the pci device too */
415         dev = PCI_DN(dn)->pcidev;
416         if (dev)
417                 dev->error_state = pci_channel_io_frozen;
418
419         __eeh_mark_slot(dn, mode_flag);
420 }
421
422 static void __eeh_clear_slot(struct device_node *parent, int mode_flag)
423 {
424         struct device_node *dn;
425
426         for_each_child_of_node(parent, dn) {
427                 if (PCI_DN(dn)) {
428                         PCI_DN(dn)->eeh_mode &= ~mode_flag;
429                         PCI_DN(dn)->eeh_check_count = 0;
430                         __eeh_clear_slot(dn, mode_flag);
431                 }
432         }
433 }
434
435 void eeh_clear_slot (struct device_node *dn, int mode_flag)
436 {
437         unsigned long flags;
438         spin_lock_irqsave(&confirm_error_lock, flags);
439         
440         dn = find_device_pe (dn);
441         
442         /* Back up one, since config addrs might be shared */
443         if (!pcibios_find_pci_bus(dn) && PCI_DN(dn->parent))
444                 dn = dn->parent;
445
446         PCI_DN(dn)->eeh_mode &= ~mode_flag;
447         PCI_DN(dn)->eeh_check_count = 0;
448         __eeh_clear_slot(dn, mode_flag);
449         spin_unlock_irqrestore(&confirm_error_lock, flags);
450 }
451
452 /**
453  * eeh_dn_check_failure - check if all 1's data is due to EEH slot freeze
454  * @dn device node
455  * @dev pci device, if known
456  *
457  * Check for an EEH failure for the given device node.  Call this
458  * routine if the result of a read was all 0xff's and you want to
459  * find out if this is due to an EEH slot freeze.  This routine
460  * will query firmware for the EEH status.
461  *
462  * Returns 0 if there has not been an EEH error; otherwise returns
463  * a non-zero value and queues up a slot isolation event notification.
464  *
465  * It is safe to call this routine in an interrupt context.
466  */
467 int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
468 {
469         int ret;
470         int rets[3];
471         unsigned long flags;
472         struct pci_dn *pdn;
473         int rc = 0;
474
475         total_mmio_ffs++;
476
477         if (!eeh_subsystem_enabled)
478                 return 0;
479
480         if (!dn) {
481                 no_dn++;
482                 return 0;
483         }
484         dn = find_device_pe(dn);
485         pdn = PCI_DN(dn);
486
487         /* Access to IO BARs might get this far and still not want checking. */
488         if (!(pdn->eeh_mode & EEH_MODE_SUPPORTED) ||
489             pdn->eeh_mode & EEH_MODE_NOCHECK) {
490                 ignored_check++;
491 #ifdef DEBUG
492                 printk ("EEH:ignored check (%x) for %s %s\n", 
493                         pdn->eeh_mode, pci_name (dev), dn->full_name);
494 #endif
495                 return 0;
496         }
497
498         if (!pdn->eeh_config_addr && !pdn->eeh_pe_config_addr) {
499                 no_cfg_addr++;
500                 return 0;
501         }
502
503         /* If we already have a pending isolation event for this
504          * slot, we know it's bad already, we don't need to check.
505          * Do this checking under a lock; as multiple PCI devices
506          * in one slot might report errors simultaneously, and we
507          * only want one error recovery routine running.
508          */
509         spin_lock_irqsave(&confirm_error_lock, flags);
510         rc = 1;
511         if (pdn->eeh_mode & EEH_MODE_ISOLATED) {
512                 pdn->eeh_check_count ++;
513                 if (pdn->eeh_check_count >= EEH_MAX_FAILS) {
514                         printk (KERN_ERR "EEH: Device driver ignored %d bad reads, panicing\n",
515                                 pdn->eeh_check_count);
516                         dump_stack();
517                         msleep(5000);
518                         
519                         /* re-read the slot reset state */
520                         if (read_slot_reset_state(pdn, rets) != 0)
521                                 rets[0] = -1;   /* reset state unknown */
522
523                         /* If we are here, then we hit an infinite loop. Stop. */
524                         panic("EEH: MMIO halt (%d) on device:%s\n", rets[0], pci_name(dev));
525                 }
526                 goto dn_unlock;
527         }
528
529         /*
530          * Now test for an EEH failure.  This is VERY expensive.
531          * Note that the eeh_config_addr may be a parent device
532          * in the case of a device behind a bridge, or it may be
533          * function zero of a multi-function device.
534          * In any case they must share a common PHB.
535          */
536         ret = read_slot_reset_state(pdn, rets);
537
538         /* If the call to firmware failed, punt */
539         if (ret != 0) {
540                 printk(KERN_WARNING "EEH: read_slot_reset_state() failed; rc=%d dn=%s\n",
541                        ret, dn->full_name);
542                 false_positives++;
543                 pdn->eeh_false_positives ++;
544                 rc = 0;
545                 goto dn_unlock;
546         }
547
548         /* Note that config-io to empty slots may fail;
549          * they are empty when they don't have children. */
550         if ((rets[0] == 5) && (rets[2] == 0) && (dn->child == NULL)) {
551                 false_positives++;
552                 pdn->eeh_false_positives ++;
553                 rc = 0;
554                 goto dn_unlock;
555         }
556
557         /* If EEH is not supported on this device, punt. */
558         if (rets[1] != 1) {
559                 printk(KERN_WARNING "EEH: event on unsupported device, rc=%d dn=%s\n",
560                        ret, dn->full_name);
561                 false_positives++;
562                 pdn->eeh_false_positives ++;
563                 rc = 0;
564                 goto dn_unlock;
565         }
566
567         /* If not the kind of error we know about, punt. */
568         if (rets[0] != 1 && rets[0] != 2 && rets[0] != 4 && rets[0] != 5) {
569                 false_positives++;
570                 pdn->eeh_false_positives ++;
571                 rc = 0;
572                 goto dn_unlock;
573         }
574
575         slot_resets++;
576  
577         /* Avoid repeated reports of this failure, including problems
578          * with other functions on this device, and functions under
579          * bridges. */
580         eeh_mark_slot (dn, EEH_MODE_ISOLATED);
581         spin_unlock_irqrestore(&confirm_error_lock, flags);
582
583         eeh_send_failure_event (dn, dev);
584
585         /* Most EEH events are due to device driver bugs.  Having
586          * a stack trace will help the device-driver authors figure
587          * out what happened.  So print that out. */
588         dump_stack();
589         return 1;
590
591 dn_unlock:
592         spin_unlock_irqrestore(&confirm_error_lock, flags);
593         return rc;
594 }
595
596 EXPORT_SYMBOL_GPL(eeh_dn_check_failure);
597
598 /**
599  * eeh_check_failure - check if all 1's data is due to EEH slot freeze
600  * @token i/o token, should be address in the form 0xA....
601  * @val value, should be all 1's (XXX why do we need this arg??)
602  *
603  * Check for an EEH failure at the given token address.  Call this
604  * routine if the result of a read was all 0xff's and you want to
605  * find out if this is due to an EEH slot freeze event.  This routine
606  * will query firmware for the EEH status.
607  *
608  * Note this routine is safe to call in an interrupt context.
609  */
610 unsigned long eeh_check_failure(const volatile void __iomem *token, unsigned long val)
611 {
612         unsigned long addr;
613         struct pci_dev *dev;
614         struct device_node *dn;
615
616         /* Finding the phys addr + pci device; this is pretty quick. */
617         addr = eeh_token_to_phys((unsigned long __force) token);
618         dev = pci_get_device_by_addr(addr);
619         if (!dev) {
620                 no_device++;
621                 return val;
622         }
623
624         dn = pci_device_to_OF_node(dev);
625         eeh_dn_check_failure (dn, dev);
626
627         pci_dev_put(dev);
628         return val;
629 }
630
631 EXPORT_SYMBOL(eeh_check_failure);
632
633 /* ------------------------------------------------------------- */
634 /* The code below deals with error recovery */
635
636 /**
637  * rtas_pci_enable - enable MMIO or DMA transfers for this slot
638  * @pdn pci device node
639  */
640
641 int
642 rtas_pci_enable(struct pci_dn *pdn, int function)
643 {
644         int config_addr;
645         int rc;
646
647         /* Use PE configuration address, if present */
648         config_addr = pdn->eeh_config_addr;
649         if (pdn->eeh_pe_config_addr)
650                 config_addr = pdn->eeh_pe_config_addr;
651
652         rc = rtas_call(ibm_set_eeh_option, 4, 1, NULL,
653                        config_addr,
654                        BUID_HI(pdn->phb->buid),
655                        BUID_LO(pdn->phb->buid),
656                             function);
657
658         if (rc)
659                 printk(KERN_WARNING "EEH: Unexpected state change %d, err=%d dn=%s\n",
660                         function, rc, pdn->node->full_name);
661
662         rc = eeh_wait_for_slot_status (pdn, PCI_BUS_RESET_WAIT_MSEC);
663         if ((rc == 4) && (function == EEH_THAW_MMIO))
664                 return 0;
665
666         return rc;
667 }
668
669 /**
670  * rtas_pci_slot_reset - raises/lowers the pci #RST line
671  * @pdn pci device node
672  * @state: 1/0 to raise/lower the #RST
673  *
674  * Clear the EEH-frozen condition on a slot.  This routine
675  * asserts the PCI #RST line if the 'state' argument is '1',
676  * and drops the #RST line if 'state is '0'.  This routine is
677  * safe to call in an interrupt context.
678  *
679  */
680
681 static void
682 rtas_pci_slot_reset(struct pci_dn *pdn, int state)
683 {
684         int config_addr;
685         int rc;
686
687         BUG_ON (pdn==NULL); 
688
689         if (!pdn->phb) {
690                 printk (KERN_WARNING "EEH: in slot reset, device node %s has no phb\n",
691                         pdn->node->full_name);
692                 return;
693         }
694
695         /* Use PE configuration address, if present */
696         config_addr = pdn->eeh_config_addr;
697         if (pdn->eeh_pe_config_addr)
698                 config_addr = pdn->eeh_pe_config_addr;
699
700         rc = rtas_call(ibm_set_slot_reset,4,1, NULL,
701                        config_addr,
702                        BUID_HI(pdn->phb->buid),
703                        BUID_LO(pdn->phb->buid),
704                        state);
705         if (rc)
706                 printk (KERN_WARNING "EEH: Unable to reset the failed slot,"
707                         " (%d) #RST=%d dn=%s\n",
708                         rc, state, pdn->node->full_name);
709 }
710
711 /**
712  * pcibios_set_pcie_slot_reset - Set PCI-E reset state
713  * @dev:        pci device struct
714  * @state:      reset state to enter
715  *
716  * Return value:
717  *      0 if success
718  **/
719 int pcibios_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state)
720 {
721         struct device_node *dn = pci_device_to_OF_node(dev);
722         struct pci_dn *pdn = PCI_DN(dn);
723
724         switch (state) {
725         case pcie_deassert_reset:
726                 rtas_pci_slot_reset(pdn, 0);
727                 break;
728         case pcie_hot_reset:
729                 rtas_pci_slot_reset(pdn, 1);
730                 break;
731         case pcie_warm_reset:
732                 rtas_pci_slot_reset(pdn, 3);
733                 break;
734         default:
735                 return -EINVAL;
736         };
737
738         return 0;
739 }
740
741 /**
742  * rtas_set_slot_reset -- assert the pci #RST line for 1/4 second
743  * @pdn: pci device node to be reset.
744  *
745  *  Return 0 if success, else a non-zero value.
746  */
747
748 static void __rtas_set_slot_reset(struct pci_dn *pdn)
749 {
750         rtas_pci_slot_reset (pdn, 1);
751
752         /* The PCI bus requires that the reset be held high for at least
753          * a 100 milliseconds. We wait a bit longer 'just in case'.  */
754
755 #define PCI_BUS_RST_HOLD_TIME_MSEC 250
756         msleep (PCI_BUS_RST_HOLD_TIME_MSEC);
757         
758         /* We might get hit with another EEH freeze as soon as the 
759          * pci slot reset line is dropped. Make sure we don't miss
760          * these, and clear the flag now. */
761         eeh_clear_slot (pdn->node, EEH_MODE_ISOLATED);
762
763         rtas_pci_slot_reset (pdn, 0);
764
765         /* After a PCI slot has been reset, the PCI Express spec requires
766          * a 1.5 second idle time for the bus to stabilize, before starting
767          * up traffic. */
768 #define PCI_BUS_SETTLE_TIME_MSEC 1800
769         msleep (PCI_BUS_SETTLE_TIME_MSEC);
770 }
771
772 int rtas_set_slot_reset(struct pci_dn *pdn)
773 {
774         int i, rc;
775
776         /* Take three shots at resetting the bus */
777         for (i=0; i<3; i++) {
778                 __rtas_set_slot_reset(pdn);
779
780                 rc = eeh_wait_for_slot_status(pdn, PCI_BUS_RESET_WAIT_MSEC);
781                 if (rc == 0)
782                         return 0;
783
784                 if (rc < 0) {
785                         printk(KERN_ERR "EEH: unrecoverable slot failure %s\n",
786                                pdn->node->full_name);
787                         return -1;
788                 }
789                 printk(KERN_ERR "EEH: bus reset %d failed on slot %s, rc=%d\n",
790                        i+1, pdn->node->full_name, rc);
791         }
792
793         return -1;
794 }
795
796 /* ------------------------------------------------------- */
797 /** Save and restore of PCI BARs
798  *
799  * Although firmware will set up BARs during boot, it doesn't
800  * set up device BAR's after a device reset, although it will,
801  * if requested, set up bridge configuration. Thus, we need to
802  * configure the PCI devices ourselves.  
803  */
804
805 /**
806  * __restore_bars - Restore the Base Address Registers
807  * @pdn: pci device node
808  *
809  * Loads the PCI configuration space base address registers,
810  * the expansion ROM base address, the latency timer, and etc.
811  * from the saved values in the device node.
812  */
813 static inline void __restore_bars (struct pci_dn *pdn)
814 {
815         int i;
816
817         if (NULL==pdn->phb) return;
818         for (i=4; i<10; i++) {
819                 rtas_write_config(pdn, i*4, 4, pdn->config_space[i]);
820         }
821
822         /* 12 == Expansion ROM Address */
823         rtas_write_config(pdn, 12*4, 4, pdn->config_space[12]);
824
825 #define BYTE_SWAP(OFF) (8*((OFF)/4)+3-(OFF))
826 #define SAVED_BYTE(OFF) (((u8 *)(pdn->config_space))[BYTE_SWAP(OFF)])
827
828         rtas_write_config (pdn, PCI_CACHE_LINE_SIZE, 1,
829                     SAVED_BYTE(PCI_CACHE_LINE_SIZE));
830
831         rtas_write_config (pdn, PCI_LATENCY_TIMER, 1,
832                     SAVED_BYTE(PCI_LATENCY_TIMER));
833
834         /* max latency, min grant, interrupt pin and line */
835         rtas_write_config(pdn, 15*4, 4, pdn->config_space[15]);
836 }
837
838 /**
839  * eeh_restore_bars - restore the PCI config space info
840  *
841  * This routine performs a recursive walk to the children
842  * of this device as well.
843  */
844 void eeh_restore_bars(struct pci_dn *pdn)
845 {
846         struct device_node *dn;
847         if (!pdn) 
848                 return;
849         
850         if ((pdn->eeh_mode & EEH_MODE_SUPPORTED) && !IS_BRIDGE(pdn->class_code))
851                 __restore_bars (pdn);
852
853         for_each_child_of_node(pdn->node, dn)
854                 eeh_restore_bars (PCI_DN(dn));
855 }
856
857 /**
858  * eeh_save_bars - save device bars
859  *
860  * Save the values of the device bars. Unlike the restore
861  * routine, this routine is *not* recursive. This is because
862  * PCI devices are added individuallly; but, for the restore,
863  * an entire slot is reset at a time.
864  */
865 static void eeh_save_bars(struct pci_dn *pdn)
866 {
867         int i;
868
869         if (!pdn )
870                 return;
871         
872         for (i = 0; i < 16; i++)
873                 rtas_read_config(pdn, i * 4, 4, &pdn->config_space[i]);
874 }
875
876 void
877 rtas_configure_bridge(struct pci_dn *pdn)
878 {
879         int config_addr;
880         int rc;
881
882         /* Use PE configuration address, if present */
883         config_addr = pdn->eeh_config_addr;
884         if (pdn->eeh_pe_config_addr)
885                 config_addr = pdn->eeh_pe_config_addr;
886
887         rc = rtas_call(ibm_configure_bridge,3,1, NULL,
888                        config_addr,
889                        BUID_HI(pdn->phb->buid),
890                        BUID_LO(pdn->phb->buid));
891         if (rc) {
892                 printk (KERN_WARNING "EEH: Unable to configure device bridge (%d) for %s\n",
893                         rc, pdn->node->full_name);
894         }
895 }
896
897 /* ------------------------------------------------------------- */
898 /* The code below deals with enabling EEH for devices during  the
899  * early boot sequence.  EEH must be enabled before any PCI probing
900  * can be done.
901  */
902
903 #define EEH_ENABLE 1
904
905 struct eeh_early_enable_info {
906         unsigned int buid_hi;
907         unsigned int buid_lo;
908 };
909
910 static int get_pe_addr (int config_addr,
911                         struct eeh_early_enable_info *info)
912 {
913         unsigned int rets[3];
914         int ret;
915
916         /* Use latest config-addr token on power6 */
917         if (ibm_get_config_addr_info2 != RTAS_UNKNOWN_SERVICE) {
918                 /* Make sure we have a PE in hand */
919                 ret = rtas_call (ibm_get_config_addr_info2, 4, 2, rets,
920                         config_addr, info->buid_hi, info->buid_lo, 1);
921                 if (ret || (rets[0]==0))
922                         return 0;
923
924                 ret = rtas_call (ibm_get_config_addr_info2, 4, 2, rets,
925                         config_addr, info->buid_hi, info->buid_lo, 0);
926                 if (ret)
927                         return 0;
928                 return rets[0];
929         }
930
931         /* Use older config-addr token on power5 */
932         if (ibm_get_config_addr_info != RTAS_UNKNOWN_SERVICE) {
933                 ret = rtas_call (ibm_get_config_addr_info, 4, 2, rets,
934                         config_addr, info->buid_hi, info->buid_lo, 0);
935                 if (ret)
936                         return 0;
937                 return rets[0];
938         }
939         return 0;
940 }
941
942 /* Enable eeh for the given device node. */
943 static void *early_enable_eeh(struct device_node *dn, void *data)
944 {
945         unsigned int rets[3];
946         struct eeh_early_enable_info *info = data;
947         int ret;
948         const u32 *class_code = of_get_property(dn, "class-code", NULL);
949         const u32 *vendor_id = of_get_property(dn, "vendor-id", NULL);
950         const u32 *device_id = of_get_property(dn, "device-id", NULL);
951         const u32 *regs;
952         int enable;
953         struct pci_dn *pdn = PCI_DN(dn);
954
955         pdn->class_code = 0;
956         pdn->eeh_mode = 0;
957         pdn->eeh_check_count = 0;
958         pdn->eeh_freeze_count = 0;
959         pdn->eeh_false_positives = 0;
960
961         if (!of_device_is_available(dn))
962                 return NULL;
963
964         /* Ignore bad nodes. */
965         if (!class_code || !vendor_id || !device_id)
966                 return NULL;
967
968         /* There is nothing to check on PCI to ISA bridges */
969         if (dn->type && !strcmp(dn->type, "isa")) {
970                 pdn->eeh_mode |= EEH_MODE_NOCHECK;
971                 return NULL;
972         }
973         pdn->class_code = *class_code;
974
975         /* Ok... see if this device supports EEH.  Some do, some don't,
976          * and the only way to find out is to check each and every one. */
977         regs = of_get_property(dn, "reg", NULL);
978         if (regs) {
979                 /* First register entry is addr (00BBSS00)  */
980                 /* Try to enable eeh */
981                 ret = rtas_call(ibm_set_eeh_option, 4, 1, NULL,
982                                 regs[0], info->buid_hi, info->buid_lo,
983                                 EEH_ENABLE);
984
985                 enable = 0;
986                 if (ret == 0) {
987                         pdn->eeh_config_addr = regs[0];
988
989                         /* If the newer, better, ibm,get-config-addr-info is supported, 
990                          * then use that instead. */
991                         pdn->eeh_pe_config_addr = get_pe_addr(pdn->eeh_config_addr, info);
992
993                         /* Some older systems (Power4) allow the
994                          * ibm,set-eeh-option call to succeed even on nodes
995                          * where EEH is not supported. Verify support
996                          * explicitly. */
997                         ret = read_slot_reset_state(pdn, rets);
998                         if ((ret == 0) && (rets[1] == 1))
999                                 enable = 1;
1000                 }
1001
1002                 if (enable) {
1003                         eeh_subsystem_enabled = 1;
1004                         pdn->eeh_mode |= EEH_MODE_SUPPORTED;
1005
1006 #ifdef DEBUG
1007                         printk(KERN_DEBUG "EEH: %s: eeh enabled, config=%x pe_config=%x\n",
1008                                dn->full_name, pdn->eeh_config_addr, pdn->eeh_pe_config_addr);
1009 #endif
1010                 } else {
1011
1012                         /* This device doesn't support EEH, but it may have an
1013                          * EEH parent, in which case we mark it as supported. */
1014                         if (dn->parent && PCI_DN(dn->parent)
1015                             && (PCI_DN(dn->parent)->eeh_mode & EEH_MODE_SUPPORTED)) {
1016                                 /* Parent supports EEH. */
1017                                 pdn->eeh_mode |= EEH_MODE_SUPPORTED;
1018                                 pdn->eeh_config_addr = PCI_DN(dn->parent)->eeh_config_addr;
1019                                 return NULL;
1020                         }
1021                 }
1022         } else {
1023                 printk(KERN_WARNING "EEH: %s: unable to get reg property.\n",
1024                        dn->full_name);
1025         }
1026
1027         eeh_save_bars(pdn);
1028         return NULL;
1029 }
1030
1031 /*
1032  * Initialize EEH by trying to enable it for all of the adapters in the system.
1033  * As a side effect we can determine here if eeh is supported at all.
1034  * Note that we leave EEH on so failed config cycles won't cause a machine
1035  * check.  If a user turns off EEH for a particular adapter they are really
1036  * telling Linux to ignore errors.  Some hardware (e.g. POWER5) won't
1037  * grant access to a slot if EEH isn't enabled, and so we always enable
1038  * EEH for all slots/all devices.
1039  *
1040  * The eeh-force-off option disables EEH checking globally, for all slots.
1041  * Even if force-off is set, the EEH hardware is still enabled, so that
1042  * newer systems can boot.
1043  */
1044 void __init eeh_init(void)
1045 {
1046         struct device_node *phb, *np;
1047         struct eeh_early_enable_info info;
1048
1049         spin_lock_init(&confirm_error_lock);
1050         spin_lock_init(&slot_errbuf_lock);
1051
1052         np = of_find_node_by_path("/rtas");
1053         if (np == NULL)
1054                 return;
1055
1056         ibm_set_eeh_option = rtas_token("ibm,set-eeh-option");
1057         ibm_set_slot_reset = rtas_token("ibm,set-slot-reset");
1058         ibm_read_slot_reset_state2 = rtas_token("ibm,read-slot-reset-state2");
1059         ibm_read_slot_reset_state = rtas_token("ibm,read-slot-reset-state");
1060         ibm_slot_error_detail = rtas_token("ibm,slot-error-detail");
1061         ibm_get_config_addr_info = rtas_token("ibm,get-config-addr-info");
1062         ibm_get_config_addr_info2 = rtas_token("ibm,get-config-addr-info2");
1063         ibm_configure_bridge = rtas_token ("ibm,configure-bridge");
1064
1065         if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE)
1066                 return;
1067
1068         eeh_error_buf_size = rtas_token("rtas-error-log-max");
1069         if (eeh_error_buf_size == RTAS_UNKNOWN_SERVICE) {
1070                 eeh_error_buf_size = 1024;
1071         }
1072         if (eeh_error_buf_size > RTAS_ERROR_LOG_MAX) {
1073                 printk(KERN_WARNING "EEH: rtas-error-log-max is bigger than allocated "
1074                       "buffer ! (%d vs %d)", eeh_error_buf_size, RTAS_ERROR_LOG_MAX);
1075                 eeh_error_buf_size = RTAS_ERROR_LOG_MAX;
1076         }
1077
1078         /* Enable EEH for all adapters.  Note that eeh requires buid's */
1079         for (phb = of_find_node_by_name(NULL, "pci"); phb;
1080              phb = of_find_node_by_name(phb, "pci")) {
1081                 unsigned long buid;
1082
1083                 buid = get_phb_buid(phb);
1084                 if (buid == 0 || PCI_DN(phb) == NULL)
1085                         continue;
1086
1087                 info.buid_lo = BUID_LO(buid);
1088                 info.buid_hi = BUID_HI(buid);
1089                 traverse_pci_devices(phb, early_enable_eeh, &info);
1090         }
1091
1092         if (eeh_subsystem_enabled)
1093                 printk(KERN_INFO "EEH: PCI Enhanced I/O Error Handling Enabled\n");
1094         else
1095                 printk(KERN_WARNING "EEH: No capable adapters found\n");
1096 }
1097
1098 /**
1099  * eeh_add_device_early - enable EEH for the indicated device_node
1100  * @dn: device node for which to set up EEH
1101  *
1102  * This routine must be used to perform EEH initialization for PCI
1103  * devices that were added after system boot (e.g. hotplug, dlpar).
1104  * This routine must be called before any i/o is performed to the
1105  * adapter (inluding any config-space i/o).
1106  * Whether this actually enables EEH or not for this device depends
1107  * on the CEC architecture, type of the device, on earlier boot
1108  * command-line arguments & etc.
1109  */
1110 static void eeh_add_device_early(struct device_node *dn)
1111 {
1112         struct pci_controller *phb;
1113         struct eeh_early_enable_info info;
1114
1115         if (!dn || !PCI_DN(dn))
1116                 return;
1117         phb = PCI_DN(dn)->phb;
1118
1119         /* USB Bus children of PCI devices will not have BUID's */
1120         if (NULL == phb || 0 == phb->buid)
1121                 return;
1122
1123         info.buid_hi = BUID_HI(phb->buid);
1124         info.buid_lo = BUID_LO(phb->buid);
1125         early_enable_eeh(dn, &info);
1126 }
1127
1128 void eeh_add_device_tree_early(struct device_node *dn)
1129 {
1130         struct device_node *sib;
1131
1132         for_each_child_of_node(dn, sib)
1133                 eeh_add_device_tree_early(sib);
1134         eeh_add_device_early(dn);
1135 }
1136 EXPORT_SYMBOL_GPL(eeh_add_device_tree_early);
1137
1138 /**
1139  * eeh_add_device_late - perform EEH initialization for the indicated pci device
1140  * @dev: pci device for which to set up EEH
1141  *
1142  * This routine must be used to complete EEH initialization for PCI
1143  * devices that were added after system boot (e.g. hotplug, dlpar).
1144  */
1145 static void eeh_add_device_late(struct pci_dev *dev)
1146 {
1147         struct device_node *dn;
1148         struct pci_dn *pdn;
1149
1150         if (!dev || !eeh_subsystem_enabled)
1151                 return;
1152
1153 #ifdef DEBUG
1154         printk(KERN_DEBUG "EEH: adding device %s\n", pci_name(dev));
1155 #endif
1156
1157         pci_dev_get (dev);
1158         dn = pci_device_to_OF_node(dev);
1159         pdn = PCI_DN(dn);
1160         pdn->pcidev = dev;
1161
1162         pci_addr_cache_insert_device(dev);
1163         eeh_sysfs_add_device(dev);
1164 }
1165
1166 void eeh_add_device_tree_late(struct pci_bus *bus)
1167 {
1168         struct pci_dev *dev;
1169
1170         list_for_each_entry(dev, &bus->devices, bus_list) {
1171                 eeh_add_device_late(dev);
1172                 if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
1173                         struct pci_bus *subbus = dev->subordinate;
1174                         if (subbus)
1175                                 eeh_add_device_tree_late(subbus);
1176                 }
1177         }
1178 }
1179 EXPORT_SYMBOL_GPL(eeh_add_device_tree_late);
1180
1181 /**
1182  * eeh_remove_device - undo EEH setup for the indicated pci device
1183  * @dev: pci device to be removed
1184  *
1185  * This routine should be called when a device is removed from
1186  * a running system (e.g. by hotplug or dlpar).  It unregisters
1187  * the PCI device from the EEH subsystem.  I/O errors affecting
1188  * this device will no longer be detected after this call; thus,
1189  * i/o errors affecting this slot may leave this device unusable.
1190  */
1191 static void eeh_remove_device(struct pci_dev *dev)
1192 {
1193         struct device_node *dn;
1194         if (!dev || !eeh_subsystem_enabled)
1195                 return;
1196
1197         /* Unregister the device with the EEH/PCI address search system */
1198 #ifdef DEBUG
1199         printk(KERN_DEBUG "EEH: remove device %s\n", pci_name(dev));
1200 #endif
1201         pci_addr_cache_remove_device(dev);
1202         eeh_sysfs_remove_device(dev);
1203
1204         dn = pci_device_to_OF_node(dev);
1205         if (PCI_DN(dn)->pcidev) {
1206                 PCI_DN(dn)->pcidev = NULL;
1207                 pci_dev_put (dev);
1208         }
1209 }
1210
1211 void eeh_remove_bus_device(struct pci_dev *dev)
1212 {
1213         struct pci_bus *bus = dev->subordinate;
1214         struct pci_dev *child, *tmp;
1215
1216         eeh_remove_device(dev);
1217
1218         if (bus && dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
1219                 list_for_each_entry_safe(child, tmp, &bus->devices, bus_list)
1220                          eeh_remove_bus_device(child);
1221         }
1222 }
1223 EXPORT_SYMBOL_GPL(eeh_remove_bus_device);
1224
1225 static int proc_eeh_show(struct seq_file *m, void *v)
1226 {
1227         if (0 == eeh_subsystem_enabled) {
1228                 seq_printf(m, "EEH Subsystem is globally disabled\n");
1229                 seq_printf(m, "eeh_total_mmio_ffs=%ld\n", total_mmio_ffs);
1230         } else {
1231                 seq_printf(m, "EEH Subsystem is enabled\n");
1232                 seq_printf(m,
1233                                 "no device=%ld\n"
1234                                 "no device node=%ld\n"
1235                                 "no config address=%ld\n"
1236                                 "check not wanted=%ld\n"
1237                                 "eeh_total_mmio_ffs=%ld\n"
1238                                 "eeh_false_positives=%ld\n"
1239                                 "eeh_slot_resets=%ld\n",
1240                                 no_device, no_dn, no_cfg_addr, 
1241                                 ignored_check, total_mmio_ffs, 
1242                                 false_positives,
1243                                 slot_resets);
1244         }
1245
1246         return 0;
1247 }
1248
1249 static int proc_eeh_open(struct inode *inode, struct file *file)
1250 {
1251         return single_open(file, proc_eeh_show, NULL);
1252 }
1253
1254 static const struct file_operations proc_eeh_operations = {
1255         .open      = proc_eeh_open,
1256         .read      = seq_read,
1257         .llseek    = seq_lseek,
1258         .release   = single_release,
1259 };
1260
1261 static int __init eeh_init_proc(void)
1262 {
1263         struct proc_dir_entry *e;
1264
1265         if (machine_is(pseries)) {
1266                 e = create_proc_entry("ppc64/eeh", 0, NULL);
1267                 if (e)
1268                         e->proc_fops = &proc_eeh_operations;
1269         }
1270
1271         return 0;
1272 }
1273 __initcall(eeh_init_proc);