aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2017-06-06 08:59:20 +1000
committerStewart Smith <stewart@linux.vnet.ibm.com>2017-06-06 20:49:05 +1000
commit5bbbb398544ae2869d1c1818280cd97f537d8cb9 (patch)
tree1c4110f1f39ddfb668aab86269fc210a10b8b760
parent94920c4946b5a9c33c063df22db0864fab2b5efa (diff)
downloadskiboot-5bbbb398544ae2869d1c1818280cd97f537d8cb9.zip
skiboot-5bbbb398544ae2869d1c1818280cd97f537d8cb9.tar.gz
skiboot-5bbbb398544ae2869d1c1818280cd97f537d8cb9.tar.bz2
pci: Make handling of config filters generic
Move phb3_pcicfg_filter() to pci.c, rename it to pci_handle_cfg_filters() Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--core/pci.c24
-rw-r--r--hw/phb3.c30
-rw-r--r--include/pci.h4
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);