diff mbox series

[RFC,v2,3/6] core/pci: Create the struct pci_device nodes automatically

Message ID 20190307140736.26787-4-s.miroshnichenko@yadro.com
State RFC, archived
Headers show
Series core/pci: Sync VFs and the changes of bdfns between the firmware and the OS | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success Successfully applied on branch master (261ca8e779e5138869a45f174caa49be6a274501)
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot success Test snowpatch/job/snowpatch-skiboot on branch master
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot-dco success Signed-off-by present

Commit Message

Sergei Miroshnichenko March 7, 2019, 2:07 p.m. UTC
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@yadro.com>
---
 core/pci-opal.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)
diff mbox series

Patch

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)