Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
eeh_driver.c
Go to the documentation of this file.
1 /*
2  * PCI Error Recovery Driver for RPA-compliant PPC64 platform.
3  * Copyright IBM Corp. 2004 2005
4  * Copyright Linas Vepstas <[email protected]> 2004, 2005
5  *
6  * All rights reserved.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or (at
11  * your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
16  * NON INFRINGEMENT. See the GNU General Public License for more
17  * details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  *
23  * Send comments and feedback to Linas Vepstas <[email protected]>
24  */
25 #include <linux/delay.h>
26 #include <linux/interrupt.h>
27 #include <linux/irq.h>
28 #include <linux/module.h>
29 #include <linux/pci.h>
30 #include <asm/eeh.h>
31 #include <asm/eeh_event.h>
32 #include <asm/ppc-pci.h>
33 #include <asm/pci-bridge.h>
34 #include <asm/prom.h>
35 #include <asm/rtas.h>
36 
44 static inline const char *eeh_pcid_name(struct pci_dev *pdev)
45 {
46  if (pdev && pdev->dev.driver)
47  return pdev->dev.driver->name;
48  return "";
49 }
50 
60 static inline struct pci_driver *eeh_pcid_get(struct pci_dev *pdev)
61 {
62  if (!pdev || !pdev->driver)
63  return NULL;
64 
65  if (!try_module_get(pdev->driver->driver.owner))
66  return NULL;
67 
68  return pdev->driver;
69 }
70 
78 static inline void eeh_pcid_put(struct pci_dev *pdev)
79 {
80  if (!pdev || !pdev->driver)
81  return;
82 
83  module_put(pdev->driver->driver.owner);
84 }
85 
86 #if 0
87 static void print_device_node_tree(struct pci_dn *pdn, int dent)
88 {
89  int i;
90  struct device_node *pc;
91 
92  if (!pdn)
93  return;
94  for (i = 0; i < dent; i++)
95  printk(" ");
96  printk("dn=%s mode=%x \tcfg_addr=%x pe_addr=%x \tfull=%s\n",
97  pdn->node->name, pdn->eeh_mode, pdn->eeh_config_addr,
98  pdn->eeh_pe_config_addr, pdn->node->full_name);
99  dent += 3;
100  pc = pdn->node->child;
101  while (pc) {
102  print_device_node_tree(PCI_DN(pc), dent);
103  pc = pc->sibling;
104  }
105 }
106 #endif
107 
118 static void eeh_disable_irq(struct pci_dev *dev)
119 {
120  struct eeh_dev *edev = pci_dev_to_eeh_dev(dev);
121 
122  /* Don't disable MSI and MSI-X interrupts. They are
123  * effectively disabled by the DMA Stopped state
124  * when an EEH error occurs.
125  */
126  if (dev->msi_enabled || dev->msix_enabled)
127  return;
128 
129  if (!irq_has_action(dev->irq))
130  return;
131 
132  edev->mode |= EEH_DEV_IRQ_DISABLED;
133  disable_irq_nosync(dev->irq);
134 }
135 
143 static void eeh_enable_irq(struct pci_dev *dev)
144 {
145  struct eeh_dev *edev = pci_dev_to_eeh_dev(dev);
146 
147  if ((edev->mode) & EEH_DEV_IRQ_DISABLED) {
148  edev->mode &= ~EEH_DEV_IRQ_DISABLED;
149  enable_irq(dev->irq);
150  }
151 }
152 
162 static void *eeh_report_error(void *data, void *userdata)
163 {
164  struct eeh_dev *edev = (struct eeh_dev *)data;
165  struct pci_dev *dev = eeh_dev_to_pci_dev(edev);
166  enum pci_ers_result rc, *res = userdata;
167  struct pci_driver *driver;
168 
169  /* We might not have the associated PCI device,
170  * then we should continue for next one.
171  */
172  if (!dev) return NULL;
174 
175  driver = eeh_pcid_get(dev);
176  if (!driver) return NULL;
177 
178  eeh_disable_irq(dev);
179 
180  if (!driver->err_handler ||
181  !driver->err_handler->error_detected) {
182  eeh_pcid_put(dev);
183  return NULL;
184  }
185 
186  rc = driver->err_handler->error_detected(dev, pci_channel_io_frozen);
187 
188  /* A driver that needs a reset trumps all others */
189  if (rc == PCI_ERS_RESULT_NEED_RESET) *res = rc;
190  if (*res == PCI_ERS_RESULT_NONE) *res = rc;
191 
192  eeh_pcid_put(dev);
193  return NULL;
194 }
195 
205 static void *eeh_report_mmio_enabled(void *data, void *userdata)
206 {
207  struct eeh_dev *edev = (struct eeh_dev *)data;
208  struct pci_dev *dev = eeh_dev_to_pci_dev(edev);
209  enum pci_ers_result rc, *res = userdata;
210  struct pci_driver *driver;
211 
212  driver = eeh_pcid_get(dev);
213  if (!driver) return NULL;
214 
215  if (!driver->err_handler ||
216  !driver->err_handler->mmio_enabled) {
217  eeh_pcid_put(dev);
218  return NULL;
219  }
220 
221  rc = driver->err_handler->mmio_enabled(dev);
222 
223  /* A driver that needs a reset trumps all others */
224  if (rc == PCI_ERS_RESULT_NEED_RESET) *res = rc;
225  if (*res == PCI_ERS_RESULT_NONE) *res = rc;
226 
227  eeh_pcid_put(dev);
228  return NULL;
229 }
230 
241 static void *eeh_report_reset(void *data, void *userdata)
242 {
243  struct eeh_dev *edev = (struct eeh_dev *)data;
244  struct pci_dev *dev = eeh_dev_to_pci_dev(edev);
245  enum pci_ers_result rc, *res = userdata;
246  struct pci_driver *driver;
247 
248  if (!dev) return NULL;
250 
251  driver = eeh_pcid_get(dev);
252  if (!driver) return NULL;
253 
254  eeh_enable_irq(dev);
255 
256  if (!driver->err_handler ||
257  !driver->err_handler->slot_reset) {
258  eeh_pcid_put(dev);
259  return NULL;
260  }
261 
262  rc = driver->err_handler->slot_reset(dev);
263  if ((*res == PCI_ERS_RESULT_NONE) ||
264  (*res == PCI_ERS_RESULT_RECOVERED)) *res = rc;
265  if (*res == PCI_ERS_RESULT_DISCONNECT &&
266  rc == PCI_ERS_RESULT_NEED_RESET) *res = rc;
267 
268  eeh_pcid_put(dev);
269  return NULL;
270 }
271 
281 static void *eeh_report_resume(void *data, void *userdata)
282 {
283  struct eeh_dev *edev = (struct eeh_dev *)data;
284  struct pci_dev *dev = eeh_dev_to_pci_dev(edev);
285  struct pci_driver *driver;
286 
287  if (!dev) return NULL;
289 
290  driver = eeh_pcid_get(dev);
291  if (!driver) return NULL;
292 
293  eeh_enable_irq(dev);
294 
295  if (!driver->err_handler ||
296  !driver->err_handler->resume) {
297  eeh_pcid_put(dev);
298  return NULL;
299  }
300 
301  driver->err_handler->resume(dev);
302 
303  eeh_pcid_put(dev);
304  return NULL;
305 }
306 
315 static void *eeh_report_failure(void *data, void *userdata)
316 {
317  struct eeh_dev *edev = (struct eeh_dev *)data;
318  struct pci_dev *dev = eeh_dev_to_pci_dev(edev);
319  struct pci_driver *driver;
320 
321  if (!dev) return NULL;
323 
324  driver = eeh_pcid_get(dev);
325  if (!driver) return NULL;
326 
327  eeh_disable_irq(dev);
328 
329  if (!driver->err_handler ||
330  !driver->err_handler->error_detected) {
331  eeh_pcid_put(dev);
332  return NULL;
333  }
334 
335  driver->err_handler->error_detected(dev, pci_channel_io_perm_failure);
336 
337  eeh_pcid_put(dev);
338  return NULL;
339 }
340 
350 static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus)
351 {
352  int cnt, rc;
353 
354  /* pcibios will clear the counter; save the value */
355  cnt = pe->freeze_count;
356 
357  /*
358  * We don't remove the corresponding PE instances because
359  * we need the information afterwords. The attached EEH
360  * devices are expected to be attached soon when calling
361  * into pcibios_add_pci_devices().
362  */
363  if (bus)
365 
366  /* Reset the pci controller. (Asserts RST#; resets config space).
367  * Reconfigure bridges and devices. Don't try to bring the system
368  * up if the reset failed for some reason.
369  */
370  rc = eeh_reset_pe(pe);
371  if (rc)
372  return rc;
373 
374  /* Restore PE */
375  eeh_ops->configure_bridge(pe);
377 
378  /* Give the system 5 seconds to finish running the user-space
379  * hotplug shutdown scripts, e.g. ifdown for ethernet. Yes,
380  * this is a hack, but if we don't do this, and try to bring
381  * the device up before the scripts have taken it down,
382  * potentially weird things happen.
383  */
384  if (bus) {
385  ssleep(5);
387  }
388  pe->freeze_count = cnt;
389 
390  return 0;
391 }
392 
393 /* The longest amount of time to wait for a pci device
394  * to come back on line, in seconds.
395  */
396 #define MAX_WAIT_FOR_RECOVERY 150
397 
415 void eeh_handle_event(struct eeh_pe *pe)
416 {
417  struct pci_bus *frozen_bus;
418  int rc = 0;
420 
421  frozen_bus = eeh_pe_bus_get(pe);
422  if (!frozen_bus) {
423  pr_err("%s: Cannot find PCI bus for PHB#%d-PE#%x\n",
424  __func__, pe->phb->global_number, pe->addr);
425  return;
426  }
427 
428  pe->freeze_count++;
429  if (pe->freeze_count > EEH_MAX_ALLOWED_FREEZES)
430  goto excess_failures;
431  pr_warning("EEH: This PCI device has failed %d times in the last hour\n",
432  pe->freeze_count);
433 
434  /* Walk the various device drivers attached to this slot through
435  * a reset sequence, giving each an opportunity to do what it needs
436  * to accomplish the reset. Each child gets a report of the
437  * status ... if any child can't handle the reset, then the entire
438  * slot is dlpar removed and added.
439  */
440  eeh_pe_dev_traverse(pe, eeh_report_error, &result);
441 
442  /* Get the current PCI slot state. This can take a long time,
443  * sometimes over 3 seconds for certain systems.
444  */
445  rc = eeh_ops->wait_state(pe, MAX_WAIT_FOR_RECOVERY*1000);
446  if (rc < 0 || rc == EEH_STATE_NOT_SUPPORT) {
447  printk(KERN_WARNING "EEH: Permanent failure\n");
448  goto hard_fail;
449  }
450 
451  /* Since rtas may enable MMIO when posting the error log,
452  * don't post the error log until after all dev drivers
453  * have been informed.
454  */
455  eeh_slot_error_detail(pe, EEH_LOG_TEMP);
456 
457  /* If all device drivers were EEH-unaware, then shut
458  * down all of the device drivers, and hope they
459  * go down willingly, without panicing the system.
460  */
461  if (result == PCI_ERS_RESULT_NONE) {
462  rc = eeh_reset_device(pe, frozen_bus);
463  if (rc) {
464  printk(KERN_WARNING "EEH: Unable to reset, rc=%d\n", rc);
465  goto hard_fail;
466  }
467  }
468 
469  /* If all devices reported they can proceed, then re-enable MMIO */
470  if (result == PCI_ERS_RESULT_CAN_RECOVER) {
471  rc = eeh_pci_enable(pe, EEH_OPT_THAW_MMIO);
472 
473  if (rc < 0)
474  goto hard_fail;
475  if (rc) {
476  result = PCI_ERS_RESULT_NEED_RESET;
477  } else {
478  result = PCI_ERS_RESULT_NONE;
479  eeh_pe_dev_traverse(pe, eeh_report_mmio_enabled, &result);
480  }
481  }
482 
483  /* If all devices reported they can proceed, then re-enable DMA */
484  if (result == PCI_ERS_RESULT_CAN_RECOVER) {
485  rc = eeh_pci_enable(pe, EEH_OPT_THAW_DMA);
486 
487  if (rc < 0)
488  goto hard_fail;
489  if (rc)
490  result = PCI_ERS_RESULT_NEED_RESET;
491  else
492  result = PCI_ERS_RESULT_RECOVERED;
493  }
494 
495  /* If any device has a hard failure, then shut off everything. */
496  if (result == PCI_ERS_RESULT_DISCONNECT) {
497  printk(KERN_WARNING "EEH: Device driver gave up\n");
498  goto hard_fail;
499  }
500 
501  /* If any device called out for a reset, then reset the slot */
502  if (result == PCI_ERS_RESULT_NEED_RESET) {
503  rc = eeh_reset_device(pe, NULL);
504  if (rc) {
505  printk(KERN_WARNING "EEH: Cannot reset, rc=%d\n", rc);
506  goto hard_fail;
507  }
508  result = PCI_ERS_RESULT_NONE;
509  eeh_pe_dev_traverse(pe, eeh_report_reset, &result);
510  }
511 
512  /* All devices should claim they have recovered by now. */
513  if ((result != PCI_ERS_RESULT_RECOVERED) &&
514  (result != PCI_ERS_RESULT_NONE)) {
515  printk(KERN_WARNING "EEH: Not recovered\n");
516  goto hard_fail;
517  }
518 
519  /* Tell all device drivers that they can resume operations */
520  eeh_pe_dev_traverse(pe, eeh_report_resume, NULL);
521 
522  return;
523 
524 excess_failures:
525  /*
526  * About 90% of all real-life EEH failures in the field
527  * are due to poorly seated PCI cards. Only 10% or so are
528  * due to actual, failed cards.
529  */
530  pr_err("EEH: PHB#%d-PE#%x has failed %d times in the\n"
531  "last hour and has been permanently disabled.\n"
532  "Please try reseating or replacing it.\n",
533  pe->phb->global_number, pe->addr,
534  pe->freeze_count);
535  goto perm_error;
536 
537 hard_fail:
538  pr_err("EEH: Unable to recover from failure from PHB#%d-PE#%x.\n"
539  "Please try reseating or replacing it\n",
540  pe->phb->global_number, pe->addr);
541 
542 perm_error:
543  eeh_slot_error_detail(pe, EEH_LOG_PERM);
544 
545  /* Notify all devices that they're about to go down. */
546  eeh_pe_dev_traverse(pe, eeh_report_failure, NULL);
547 
548  /* Shut down the device drivers for good. */
549  if (frozen_bus)
550  pcibios_remove_pci_devices(frozen_bus);
551 }
552