aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/pci.c12
-rw-r--r--hw/npu.c4
-rw-r--r--include/pci.h1
3 files changed, 11 insertions, 6 deletions
diff --git a/core/pci.c b/core/pci.c
index fd785ee..4311b97 100644
--- a/core/pci.c
+++ b/core/pci.c
@@ -804,9 +804,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)
@@ -1588,11 +1588,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);
}
@@ -1612,7 +1616,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,
@@ -1633,7 +1637,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 a8f9f06..f57d34d 100644
--- a/hw/npu.c
+++ b/hw/npu.c
@@ -541,7 +541,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;
/* Found the device, set the bit in config space */
@@ -618,7 +618,7 @@ static int npu_dn_fixup(struct phb *phb,
static void npu_phb_final_fixup(struct phb *phb)
{
- pci_walk_dev(phb, npu_dn_fixup, NULL);
+ pci_walk_dev(phb, NULL, npu_dn_fixup, NULL);
}
static void npu_ioda_init(struct npu *p)
diff --git a/include/pci.h b/include/pci.h
index bd966ba..1039f10 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -524,6 +524,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 *),