diff options
| author | Linas Vepstas <linas@linas.org> | 2005-11-03 19:49:01 -0500 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2005-11-09 19:33:14 -0500 |
| commit | df7242b1156966c3b1aa0fd2bc63e3736099b592 (patch) | |
| tree | 4b6777aa3631c1a78775051c8f4ef383ec699468 /arch/ppc64 | |
| parent | 177bc9367efe89a642bc9a07351726fd2c31f5ff (diff) | |
[PATCH] ppc64: RTAS error reporting restructuring
05-eeh-slot-error-detail.patch
This patch encapsulates a section of code that reports the EEH event.
The new subroutine can be used in several places to report the error.
Signed-off-by: Linas Vepstas <linas@linas.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/ppc64')
| -rw-r--r-- | arch/ppc64/kernel/eeh.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/arch/ppc64/kernel/eeh.c b/arch/ppc64/kernel/eeh.c index 926d3110dfd7..b23159464abb 100644 --- a/arch/ppc64/kernel/eeh.c +++ b/arch/ppc64/kernel/eeh.c | |||
| @@ -397,6 +397,28 @@ void __init pci_addr_cache_build(void) | |||
| 397 | /* --------------------------------------------------------------- */ | 397 | /* --------------------------------------------------------------- */ |
| 398 | /* Above lies the PCI Address Cache. Below lies the EEH event infrastructure */ | 398 | /* Above lies the PCI Address Cache. Below lies the EEH event infrastructure */ |
| 399 | 399 | ||
| 400 | void eeh_slot_error_detail (struct pci_dn *pdn, int severity) | ||
| 401 | { | ||
| 402 | unsigned long flags; | ||
| 403 | int rc; | ||
| 404 | |||
| 405 | /* Log the error with the rtas logger */ | ||
| 406 | spin_lock_irqsave(&slot_errbuf_lock, flags); | ||
| 407 | memset(slot_errbuf, 0, eeh_error_buf_size); | ||
| 408 | |||
| 409 | rc = rtas_call(ibm_slot_error_detail, | ||
| 410 | 8, 1, NULL, pdn->eeh_config_addr, | ||
| 411 | BUID_HI(pdn->phb->buid), | ||
| 412 | BUID_LO(pdn->phb->buid), NULL, 0, | ||
| 413 | virt_to_phys(slot_errbuf), | ||
| 414 | eeh_error_buf_size, | ||
| 415 | severity); | ||
| 416 | |||
| 417 | if (rc == 0) | ||
| 418 | log_error(slot_errbuf, ERR_TYPE_RTAS_LOG, 0); | ||
| 419 | spin_unlock_irqrestore(&slot_errbuf_lock, flags); | ||
| 420 | } | ||
| 421 | |||
| 400 | /** | 422 | /** |
| 401 | * eeh_register_notifier - Register to find out about EEH events. | 423 | * eeh_register_notifier - Register to find out about EEH events. |
| 402 | * @nb: notifier block to callback on events | 424 | * @nb: notifier block to callback on events |
| @@ -454,9 +476,12 @@ static void eeh_panic(struct pci_dev *dev, int reset_state) | |||
| 454 | * Since the panic_on_oops sysctl is used to halt the system | 476 | * Since the panic_on_oops sysctl is used to halt the system |
| 455 | * in light of potential corruption, we can use it here. | 477 | * in light of potential corruption, we can use it here. |
| 456 | */ | 478 | */ |
| 457 | if (panic_on_oops) | 479 | if (panic_on_oops) { |
| 480 | struct device_node *dn = pci_device_to_OF_node(dev); | ||
| 481 | eeh_slot_error_detail (PCI_DN(dn), 2 /* Permanent Error */); | ||
| 458 | panic("EEH: MMIO failure (%d) on device:%s\n", reset_state, | 482 | panic("EEH: MMIO failure (%d) on device:%s\n", reset_state, |
| 459 | pci_name(dev)); | 483 | pci_name(dev)); |
| 484 | } | ||
| 460 | else { | 485 | else { |
| 461 | __get_cpu_var(ignored_failures)++; | 486 | __get_cpu_var(ignored_failures)++; |
| 462 | printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s\n", | 487 | printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s\n", |
| @@ -539,7 +564,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
| 539 | int ret; | 564 | int ret; |
| 540 | int rets[3]; | 565 | int rets[3]; |
| 541 | unsigned long flags; | 566 | unsigned long flags; |
| 542 | int rc, reset_state; | 567 | int reset_state; |
| 543 | struct eeh_event *event; | 568 | struct eeh_event *event; |
| 544 | struct pci_dn *pdn; | 569 | struct pci_dn *pdn; |
| 545 | 570 | ||
| @@ -603,20 +628,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
| 603 | 628 | ||
| 604 | reset_state = rets[0]; | 629 | reset_state = rets[0]; |
| 605 | 630 | ||
| 606 | spin_lock_irqsave(&slot_errbuf_lock, flags); | 631 | eeh_slot_error_detail (pdn, 1 /* Temporary Error */); |
| 607 | memset(slot_errbuf, 0, eeh_error_buf_size); | ||
| 608 | |||
| 609 | rc = rtas_call(ibm_slot_error_detail, | ||
| 610 | 8, 1, NULL, pdn->eeh_config_addr, | ||
| 611 | BUID_HI(pdn->phb->buid), | ||
| 612 | BUID_LO(pdn->phb->buid), NULL, 0, | ||
| 613 | virt_to_phys(slot_errbuf), | ||
| 614 | eeh_error_buf_size, | ||
| 615 | 1 /* Temporary Error */); | ||
| 616 | |||
| 617 | if (rc == 0) | ||
| 618 | log_error(slot_errbuf, ERR_TYPE_RTAS_LOG, 0); | ||
| 619 | spin_unlock_irqrestore(&slot_errbuf_lock, flags); | ||
| 620 | 632 | ||
| 621 | printk(KERN_INFO "EEH: MMIO failure (%d) on device: %s %s\n", | 633 | printk(KERN_INFO "EEH: MMIO failure (%d) on device: %s %s\n", |
| 622 | rets[0], dn->name, dn->full_name); | 634 | rets[0], dn->name, dn->full_name); |
| @@ -783,6 +795,8 @@ void __init eeh_init(void) | |||
| 783 | struct device_node *phb, *np; | 795 | struct device_node *phb, *np; |
| 784 | struct eeh_early_enable_info info; | 796 | struct eeh_early_enable_info info; |
| 785 | 797 | ||
| 798 | spin_lock_init(&slot_errbuf_lock); | ||
| 799 | |||
| 786 | np = of_find_node_by_path("/rtas"); | 800 | np = of_find_node_by_path("/rtas"); |
| 787 | if (np == NULL) | 801 | if (np == NULL) |
| 788 | return; | 802 | return; |
