[Skiboot] [PATCH v9 11/22] core/pci: Return value for struct phb_ops::device_init

Gavin Shan gwshan at linux.vnet.ibm.com
Thu Nov 12 13:33:18 AEDT 2015


This adds "int" return value for struct phb_ops::device_init()
so that the function can be called in pci_walk_dev() directly
to reinitialize the PCI devices behind the specified slot in
the following patches.

Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
---
 core/pci.c     |  2 +-
 hw/p7ioc-phb.c | 11 ++++++++---
 hw/phb3.c      | 11 ++++++++---
 include/pci.h  |  2 +-
 4 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/core/pci.c b/core/pci.c
index 1fac425..54509c6 100644
--- a/core/pci.c
+++ b/core/pci.c
@@ -254,7 +254,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 b743bba..0632242 100644
--- a/hw/p7ioc-phb.c
+++ b/hw/p7ioc-phb.c
@@ -2198,7 +2198,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;
@@ -2227,6 +2229,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,
@@ -2234,6 +2238,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;
@@ -2242,8 +2247,8 @@ static int64_t p7ioc_pci_reinit(struct phb *phb,
 	if (!pd)
 		return OPAL_PARAMETER;
 
-	p7ioc_device_init(phb, pd);
-	return OPAL_SUCCESS;
+	ret = p7ioc_device_init(phb, pd, NULL);
+	return ret ? OPAL_HARDWARE : OPAL_SUCCESS;
 }
 
 static uint8_t p7ioc_choose_bus(struct phb *phb __unused,
diff --git a/hw/phb3.c b/hw/phb3.c
index 2053277..26c79dc 100644
--- a/hw/phb3.c
+++ b/hw/phb3.c
@@ -536,7 +536,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;
@@ -568,12 +570,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;
@@ -582,8 +587,8 @@ 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);
-	return OPAL_SUCCESS;
+	ret = phb3_device_init(phb, pd, NULL);
+	return ret ? OPAL_HARDWARE : OPAL_SUCCESS;
 }
 
 static int64_t phb3_presence_detect(struct phb *phb)
diff --git a/include/pci.h b/include/pci.h
index 1f648bd..0f56ed0 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -264,7 +264,7 @@ 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 *pd, void *data);
 
 	/*
 	 * Device node fixup is called when the PCI device node is being
-- 
2.1.0



More information about the Skiboot mailing list