diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2017-06-06 08:59:20 +1000 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2017-06-06 20:49:05 +1000 |
commit | 5bbbb398544ae2869d1c1818280cd97f537d8cb9 (patch) | |
tree | 1c4110f1f39ddfb668aab86269fc210a10b8b760 | |
parent | 94920c4946b5a9c33c063df22db0864fab2b5efa (diff) | |
download | skiboot-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.c | 24 | ||||
-rw-r--r-- | hw/phb3.c | 30 | ||||
-rw-r--r-- | include/pci.h | 4 |
3 files changed, 30 insertions, 28 deletions
@@ -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, @@ -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); |