aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGavin Shan <gwshan@linux.vnet.ibm.com>2016-06-10 15:03:41 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2016-06-14 16:00:16 +1000
commit0bf9c3c44bf1bde1c7bec86d33a6e3ccb6e56c90 (patch)
tree249a264686be313a00fbbc345722f47d1db025ec
parentcc406eb92d69690e26c3c5f52f48060c6c8c0b43 (diff)
downloadskiboot-0bf9c3c44bf1bde1c7bec86d33a6e3ccb6e56c90.zip
skiboot-0bf9c3c44bf1bde1c7bec86d33a6e3ccb6e56c90.tar.gz
skiboot-0bf9c3c44bf1bde1c7bec86d33a6e3ccb6e56c90.tar.bz2
core/pci: Return value for struct phb_ops::device_init
This adds @data argument and "int" return value for struct phb_ops:: device_init() so that it can be called in pci_walk_dev() directly to reinitialize the PCI devices behind the specified slot in subsequent patches. Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--core/pci.c2
-rw-r--r--hw/p7ioc-phb.c12
-rw-r--r--hw/phb3.c12
-rw-r--r--include/pci.h3
4 files changed, 23 insertions, 6 deletions
diff --git a/core/pci.c b/core/pci.c
index 05d2fa7..d869ec2 100644
--- a/core/pci.c
+++ b/core/pci.c
@@ -262,7 +262,7 @@ static struct pci_device *pci_scan_one(struct phb *phb, struct pci_device *paren
* Call PHB hook
*/
if (phb->ops->device_init)
- phb->ops->device_init(phb, pd);
+ phb->ops->device_init(phb, pd, NULL);
return pd;
fail:
diff --git a/hw/p7ioc-phb.c b/hw/p7ioc-phb.c
index 9edf134..3ef3137 100644
--- a/hw/p7ioc-phb.c
+++ b/hw/p7ioc-phb.c
@@ -2179,7 +2179,9 @@ static void p7ioc_endpoint_init(struct phb *phb,
pci_cfg_write32(phb, bdfn, aercap + PCIECAP_AER_CAPCTL, val32);
}
-static void p7ioc_device_init(struct phb *phb, struct pci_device *dev)
+static int p7ioc_device_init(struct phb *phb,
+ struct pci_device *dev,
+ void *data __unused)
{
int ecap = 0;
int aercap = 0;
@@ -2208,6 +2210,8 @@ static void p7ioc_device_init(struct phb *phb, struct pci_device *dev)
p7ioc_switch_port_init(phb, dev, ecap, aercap);
else
p7ioc_endpoint_init(phb, dev, ecap, aercap);
+
+ return 0;
}
static int64_t p7ioc_pci_reinit(struct phb *phb,
@@ -2215,6 +2219,7 @@ static int64_t p7ioc_pci_reinit(struct phb *phb,
{
struct pci_device *pd;
uint16_t bdfn = data;
+ int ret;
if (scope != OPAL_REINIT_PCI_DEV)
return OPAL_PARAMETER;
@@ -2223,7 +2228,10 @@ static int64_t p7ioc_pci_reinit(struct phb *phb,
if (!pd)
return OPAL_PARAMETER;
- p7ioc_device_init(phb, pd);
+ ret = p7ioc_device_init(phb, pd, NULL);
+ if (ret)
+ return OPAL_HARDWARE;
+
return OPAL_SUCCESS;
}
diff --git a/hw/phb3.c b/hw/phb3.c
index 110d9f2..026a97a 100644
--- a/hw/phb3.c
+++ b/hw/phb3.c
@@ -526,7 +526,9 @@ static void phb3_check_device_quirks(struct phb *phb, struct pci_device *dev)
}
}
-static void phb3_device_init(struct phb *phb, struct pci_device *dev)
+static int phb3_device_init(struct phb *phb,
+ struct pci_device *dev,
+ void *data __unused)
{
int ecap = 0;
int aercap = 0;
@@ -558,12 +560,15 @@ static void phb3_device_init(struct phb *phb, struct pci_device *dev)
phb3_switch_port_init(phb, dev, ecap, aercap);
else
phb3_endpoint_init(phb, dev, ecap, aercap);
+
+ return 0;
}
static int64_t phb3_pci_reinit(struct phb *phb, uint64_t scope, uint64_t data)
{
struct pci_device *pd;
uint16_t bdfn = data;
+ int ret;
if (scope != OPAL_REINIT_PCI_DEV)
return OPAL_PARAMETER;
@@ -572,7 +577,10 @@ static int64_t phb3_pci_reinit(struct phb *phb, uint64_t scope, uint64_t data)
if (!pd)
return OPAL_PARAMETER;
- phb3_device_init(phb, pd);
+ ret = phb3_device_init(phb, pd, NULL);
+ if (ret)
+ return OPAL_HARDWARE;
+
return OPAL_SUCCESS;
}
diff --git a/include/pci.h b/include/pci.h
index 788f1ef..69be49e 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -261,7 +261,8 @@ struct phb_ops {
* and before probing further. It can alter things like scan_map
* for bridge ports etc...
*/
- void (*device_init)(struct phb *phb, struct pci_device *device);
+ int (*device_init)(struct phb *phb, struct pci_device *device,
+ void *data);
/* PHB final fixup is called after PCI probing is completed */
void (*phb_final_fixup)(struct phb *phb);