[Skiboot] [PATCH 4/8] pci: Make handling of config filters generic

Benjamin Herrenschmidt benh at kernel.crashing.org
Tue Jun 6 08:59:20 AEST 2017


Move phb3_pcicfg_filter() to pci.c, rename it to pci_handle_cfg_filters()

Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
---
 core/pci.c    | 24 +++++++++++++++++++++++-
 hw/phb3.c     | 30 ++++--------------------------
 include/pci.h |  4 +++-
 3 files changed, 30 insertions(+), 28 deletions(-)

diff --git a/core/pci.c b/core/pci.c
index 5671b69..c791ebd 100644
--- a/core/pci.c
+++ b/core/pci.c
@@ -1768,11 +1768,33 @@ struct pci_cfg_reg_filter *pci_find_cfg_reg_filter(struct pci_device *pd,
 	return NULL;
 }
 
-bool pci_device_has_cfg_reg_filters(struct phb *phb, uint16_t bdfn)
+static bool pci_device_has_cfg_reg_filters(struct phb *phb, uint16_t bdfn)
 {
        return bitmap_tst_bit(*phb->filter_map, bdfn);
 }
 
+int64_t pci_handle_cfg_filters(struct phb *phb, uint32_t bdfn,
+			       uint32_t offset, uint32_t len,
+			       uint32_t *data, bool write)
+{
+	struct pci_device *pd;
+	struct pci_cfg_reg_filter *pcrf;
+	uint32_t flags;
+
+	if (!pci_device_has_cfg_reg_filters(phb, bdfn))
+		return OPAL_PARTIAL;
+	pd = pci_find_dev(phb, bdfn);
+	pcrf = pd ? pci_find_cfg_reg_filter(pd, offset, len) : NULL;
+	if (!pcrf || !pcrf->func)
+		return OPAL_PARTIAL;
+
+	flags = write ? PCI_REG_FLAG_WRITE : PCI_REG_FLAG_READ;
+	if ((pcrf->flags & flags) != flags)
+		return OPAL_PARTIAL;
+
+	return pcrf->func(pd, pcrf, offset, len, data, write);
+}
+
 struct pci_cfg_reg_filter *pci_add_cfg_reg_filter(struct pci_device *pd,
 						  uint32_t start, uint32_t len,
 						  uint32_t flags,
diff --git a/hw/phb3.c b/hw/phb3.c
index e761cfe..178de7d 100644
--- a/hw/phb3.c
+++ b/hw/phb3.c
@@ -238,28 +238,6 @@ static int64_t phb3_pcicfg_rc_link_speed(void *dev,
 	return OPAL_PARTIAL;
 }
 
-static int64_t phb3_pcicfg_filter(struct phb *phb, uint32_t bdfn,
-				  uint32_t offset, uint32_t len,
-				  uint32_t *data, bool write)
-{
-	struct pci_device *pd;
-	struct pci_cfg_reg_filter *pcrf;
-	uint32_t flags;
-
-	if (!pci_device_has_cfg_reg_filters(phb, bdfn))
-		return OPAL_PARTIAL;
-	pd = pci_find_dev(phb, bdfn);
-	pcrf = pd ? pci_find_cfg_reg_filter(pd, offset, len) : NULL;
-	if (!pcrf || !pcrf->func)
-		return OPAL_PARTIAL;
-
-	flags = write ? PCI_REG_FLAG_WRITE : PCI_REG_FLAG_READ;
-	if ((pcrf->flags & flags) != flags)
-		return OPAL_PARTIAL;
-
-	return pcrf->func(pd, pcrf, offset, len, data, write);
-}
-
 #define PHB3_PCI_CFG_READ(size, type)	\
 static int64_t phb3_pcicfg_read##size(struct phb *phb, uint32_t bdfn,	\
                                       uint32_t offset, type *data)	\
@@ -285,8 +263,8 @@ static int64_t phb3_pcicfg_read##size(struct phb *phb, uint32_t bdfn,	\
 		return OPAL_HARDWARE;					\
 	}								\
 									\
-	rc = phb3_pcicfg_filter(phb, bdfn, offset, sizeof(type),	\
-			   (uint32_t *)data, false);			\
+	rc = pci_handle_cfg_filters(phb, bdfn, offset, sizeof(type),	\
+				    (uint32_t *)data, false);		\
 	if (rc != OPAL_PARTIAL)						\
 		return rc;						\
 									\
@@ -330,8 +308,8 @@ static int64_t phb3_pcicfg_write##size(struct phb *phb, uint32_t bdfn,	\
 		return OPAL_HARDWARE;					\
 	}								\
 									\
-	rc = phb3_pcicfg_filter(phb, bdfn, offset, sizeof(type),	\
-			   (uint32_t *)&data, true);			\
+	rc = pci_handle_cfg_filters(phb, bdfn, offset, sizeof(type),	\
+				    (uint32_t *)&data, true);		\
 	if (rc != OPAL_PARTIAL)						\
 		return rc;						\
 									\
diff --git a/include/pci.h b/include/pci.h
index 1e84b51..0aea56c 100644
--- a/include/pci.h
+++ b/include/pci.h
@@ -427,9 +427,11 @@ extern struct pci_device *pci_walk_dev(struct phb *phb,
 				       void *userdata);
 extern struct pci_device *pci_find_dev(struct phb *phb, uint16_t bdfn);
 extern void pci_restore_bridge_buses(struct phb *phb, struct pci_device *pd);
-extern bool pci_device_has_cfg_reg_filters(struct phb *phb, uint16_t bdfn);
 extern struct pci_cfg_reg_filter *pci_find_cfg_reg_filter(struct pci_device *pd,
 					uint32_t start, uint32_t len);
+extern int64_t pci_handle_cfg_filters(struct phb *phb, uint32_t bdfn,
+				      uint32_t offset, uint32_t len,
+				      uint32_t *data, bool write);
 extern struct pci_cfg_reg_filter *pci_add_cfg_reg_filter(struct pci_device *pd,
 					uint32_t start, uint32_t len,
 					uint32_t flags, pci_cfg_reg_func func);
-- 
2.9.4



More information about the Skiboot mailing list