[Skiboot] [PATCH RFC v2 3/6] core/pci: Create the struct pci_device nodes automatically
Sergey Miroshnichenko
s.miroshnichenko at yadro.com
Fri Mar 8 01:07:33 AEDT 2019
Currently the struct pci_device nodes are created only during the bus
rescan in skiboot (pci_scan_bus) initiated by an OS via OPAL. But these
structures also could be created if reading the configuration space via
OPAL reveals a new hotplugged device.
This will allow using the standard platform-independent PCIe hotplug driver
in Linux kernel ("pciehp") instead of requesting a Device Tree update.
Signed-off-by: Sergey Miroshnichenko <s.miroshnichenko at yadro.com>
---
core/pci-opal.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)
diff --git a/core/pci-opal.c b/core/pci-opal.c
index d7abb15b..51162c14 100644
--- a/core/pci-opal.c
+++ b/core/pci-opal.c
@@ -23,13 +23,21 @@
#include <timebase.h>
#include <timer.h>
+static struct pci_device *pci_create_dn(struct phb *phb, uint16_t bdfn)
+{
+ struct pci_device *parent = pci_find_parent_dev(phb, bdfn);
+
+ return pci_scan_one(phb, parent, bdfn);
+}
+
#define OPAL_PCICFG_ACCESS_READ(op, cb, type) \
static int64_t opal_pci_config_##op(uint64_t phb_id, \
uint64_t bus_dev_func, \
- uint64_t offset, type data) \
+ uint64_t offset, type *data) \
{ \
struct phb *phb = pci_get_phb(phb_id); \
int64_t rc; \
+ bool dev_found; \
\
if (!opal_addr_valid((void *)data)) \
return OPAL_PARAMETER; \
@@ -37,7 +45,14 @@ static int64_t opal_pci_config_##op(uint64_t phb_id, \
if (!phb) \
return OPAL_PARAMETER; \
phb_lock(phb); \
+ \
+ dev_found = pci_find_dev_safe(phb, bus_dev_func); \
+ \
rc = phb->ops->cfg_##cb(phb, bus_dev_func, offset, data); \
+ \
+ if (!rc && !dev_found && *data != (type)0xffffffff) \
+ pci_create_dn(phb, bus_dev_func); \
+ \
phb_unlock(phb); \
\
return rc; \
@@ -60,9 +75,9 @@ static int64_t opal_pci_config_##op(uint64_t phb_id, \
return rc; \
}
-OPAL_PCICFG_ACCESS_READ(read_byte, read8, uint8_t *)
-OPAL_PCICFG_ACCESS_READ(read_half_word, read16, uint16_t *)
-OPAL_PCICFG_ACCESS_READ(read_word, read32, uint32_t *)
+OPAL_PCICFG_ACCESS_READ(read_byte, read8, uint8_t)
+OPAL_PCICFG_ACCESS_READ(read_half_word, read16, uint16_t)
+OPAL_PCICFG_ACCESS_READ(read_word, read32, uint32_t)
OPAL_PCICFG_ACCESS_WRITE(write_byte, write8, uint8_t)
OPAL_PCICFG_ACCESS_WRITE(write_half_word, write16, uint16_t)
OPAL_PCICFG_ACCESS_WRITE(write_word, write32, uint32_t)
--
2.20.1
More information about the Skiboot
mailing list