[Skiboot] [PATCH v9 09/22] core/pci: Extend pci_walk_dev() for PCI slot

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


Currently, pci_walk_dev() iterates all PCI devices behind the
specified PHB. This extends the function and allows it to iterate
the PCI devices behind the specified PCI slot so that it can be
used by subsequent patches.

Signed-off-by: Gavin Shan <gwshan at linux.vnet.ibm.com>
---
 core/pci.c    | 12 ++++++++----
 hw/npu.c      |  2 +-
 include/pci.h |  1 +
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/core/pci.c b/core/pci.c
index 22d38b5..ad3b17a 100644
--- a/core/pci.c
+++ b/core/pci.c
@@ -787,9 +787,9 @@ static void pci_scan_phb(void *data)
 	pci_scan(phb, 0, 0xff, &phb->devices, NULL, has_link);
 
 	/* Configure MPS (Max Payload Size) for PCIe domain */
-	pci_walk_dev(phb, pci_get_mps, &mps);
+	pci_walk_dev(phb, NULL, pci_get_mps, &mps);
 	phb->mps = mps;
-	pci_walk_dev(phb, pci_configure_mps, NULL);
+	pci_walk_dev(phb, NULL, pci_configure_mps, NULL);
 }
 
 int64_t pci_register_phb(struct phb *phb, int opal_id)
@@ -1557,11 +1557,15 @@ static struct pci_device *__pci_walk_dev(struct phb *phb,
 }
 
 struct pci_device *pci_walk_dev(struct phb *phb,
+				struct pci_device *pd,
 				int (*cb)(struct phb *,
 					  struct pci_device *,
 					  void *),
 				void *userdata)
 {
+	if (pd)
+		return __pci_walk_dev(phb, &pd->children, cb, userdata);
+
 	return __pci_walk_dev(phb, &phb->devices, cb, userdata);
 }
 
@@ -1581,7 +1585,7 @@ static int __pci_find_dev(struct phb *phb,
 
 struct pci_device *pci_find_dev(struct phb *phb, uint16_t bdfn)
 {
-	return pci_walk_dev(phb, __pci_find_dev, &bdfn);
+	return pci_walk_dev(phb, NULL, __pci_find_dev, &bdfn);
 }
 
 static int __pci_restore_bridge_buses(struct phb *phb,
@@ -1602,7 +1606,7 @@ static int __pci_restore_bridge_buses(struct phb *phb,
 
 void pci_restore_bridge_buses(struct phb *phb)
 {
-	pci_walk_dev(phb, __pci_restore_bridge_buses, NULL);
+	pci_walk_dev(phb, NULL, __pci_restore_bridge_buses, NULL);
 }
 
 struct pci_cfg_reg_filter *pci_find_cfg_reg_filter(struct pci_device *pd,
diff --git a/hw/npu.c b/hw/npu.c
index 3649728..9c8d73d 100644
--- a/hw/npu.c
+++ b/hw/npu.c
@@ -543,7 +543,7 @@ static void npu_dev_bind_pci_dev(struct npu_dev *dev)
 		if (!phb)
 			continue;
 
-		dev->pd = pci_walk_dev(phb, __npu_dev_bind_pci_dev, dev);
+		dev->pd = pci_walk_dev(phb, NULL, __npu_dev_bind_pci_dev, dev);
 		if (dev->pd) {
 			dev->phb = phb;
 			return;
diff --git a/include/pci.h b/include/pci.h
index 52579ad..fbc62c0 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -518,6 +518,7 @@ extern int64_t pci_find_ecap(struct phb *phb, uint16_t bdfn, uint16_t cap,
 			     uint8_t *version);
 extern void pci_device_init(struct phb *phb, struct pci_device *pd);
 extern struct pci_device *pci_walk_dev(struct phb *phb,
+				       struct pci_device *pd,
 				       int (*cb)(struct phb *,
 						 struct pci_device *,
 						 void *),
-- 
2.1.0



More information about the Skiboot mailing list