diff options
author | Gavin Shan <gwshan@linux.vnet.ibm.com> | 2016-06-10 15:03:38 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2016-06-14 16:00:16 +1000 |
commit | 306b47d08a7520a08acdbbe06bcb1668eaf4b42c (patch) | |
tree | 58b7e59f786e2036844be859270a342c2d46f0a1 /hw | |
parent | be7780911564db1b77f43c8e12447ff026947db3 (diff) | |
download | skiboot-306b47d08a7520a08acdbbe06bcb1668eaf4b42c.zip skiboot-306b47d08a7520a08acdbbe06bcb1668eaf4b42c.tar.gz skiboot-306b47d08a7520a08acdbbe06bcb1668eaf4b42c.tar.bz2 |
core/pci: Fix wrong reserved PE# in enumeration
When scanning to non-existing PCI device, EEH (frozen) error is
usually happening. We clear the unexpected frozen PE state after
it. The reserved PE number is assumed to be 0 wrongly. So the
frozen state on the reserved PE number isn't cleared properly.
This introduces struct phb_ops::get_reserved_pe_number() to
retrieve the reserved PE number from platforms. Then the EEH
frozen state checking and clearing are applied to the reserved
PE number.
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/npu.c | 1 | ||||
-rw-r--r-- | hw/p7ioc-phb.c | 6 | ||||
-rw-r--r-- | hw/phb3.c | 6 |
3 files changed, 13 insertions, 0 deletions
@@ -1103,6 +1103,7 @@ static const struct phb_ops npu_ops = { .cfg_write16 = npu_dev_cfg_write16, .cfg_write32 = npu_dev_cfg_write32, .choose_bus = NULL, + .get_reserved_pe_number = NULL, .device_init = NULL, .phb_final_fixup = npu_phb_final_fixup, .presence_detect = NULL, diff --git a/hw/p7ioc-phb.c b/hw/p7ioc-phb.c index a2984d0..54b6f53 100644 --- a/hw/p7ioc-phb.c +++ b/hw/p7ioc-phb.c @@ -2303,6 +2303,11 @@ static uint8_t p7ioc_choose_bus(struct phb *phb __unused, return al; } +static int64_t p7ioc_get_reserved_pe_number(void) +{ + return 127; +} + /* p7ioc_phb_init_ioda_cache - Reset the IODA cache values */ static void p7ioc_phb_init_ioda_cache(struct p7ioc_phb *p) @@ -2557,6 +2562,7 @@ static const struct phb_ops p7ioc_phb_ops = { .cfg_write16 = p7ioc_pcicfg_write16, .cfg_write32 = p7ioc_pcicfg_write32, .choose_bus = p7ioc_choose_bus, + .get_reserved_pe_number = p7ioc_get_reserved_pe_number, .device_init = p7ioc_device_init, .pci_reinit = p7ioc_pci_reinit, .eeh_freeze_status = p7ioc_eeh_freeze_status, @@ -295,6 +295,11 @@ static uint8_t phb3_choose_bus(struct phb *phb __unused, return candidate; } +static int64_t phb3_get_reserved_pe_number(void) +{ + return PHB3_RESERVED_PE_NUM; +} + static void phb3_root_port_init(struct phb *phb, struct pci_device *dev, int ecap, int aercap) { @@ -3633,6 +3638,7 @@ static const struct phb_ops phb3_ops = { .cfg_write16 = phb3_pcicfg_write16, .cfg_write32 = phb3_pcicfg_write32, .choose_bus = phb3_choose_bus, + .get_reserved_pe_number = phb3_get_reserved_pe_number, .device_init = phb3_device_init, .presence_detect = phb3_presence_detect, .ioda_reset = phb3_ioda_reset, |