LCOV - code coverage report
Current view: top level - drivers/pci - access.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 165 0.0 %
Date: 2023-04-06 08:38:28 Functions: 0 37 0.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : #include <linux/pci.h>
       3             : #include <linux/module.h>
       4             : #include <linux/slab.h>
       5             : #include <linux/ioport.h>
       6             : #include <linux/wait.h>
       7             : 
       8             : #include "pci.h"
       9             : 
      10             : /*
      11             :  * This interrupt-safe spinlock protects all accesses to PCI
      12             :  * configuration space.
      13             :  */
      14             : 
      15             : DEFINE_RAW_SPINLOCK(pci_lock);
      16             : 
      17             : /*
      18             :  * Wrappers for all PCI configuration access functions.  They just check
      19             :  * alignment, do locking and call the low-level functions pointed to
      20             :  * by pci_dev->ops.
      21             :  */
      22             : 
      23             : #define PCI_byte_BAD 0
      24             : #define PCI_word_BAD (pos & 1)
      25             : #define PCI_dword_BAD (pos & 3)
      26             : 
      27             : #ifdef CONFIG_PCI_LOCKLESS_CONFIG
      28             : # define pci_lock_config(f)     do { (void)(f); } while (0)
      29             : # define pci_unlock_config(f)   do { (void)(f); } while (0)
      30             : #else
      31             : # define pci_lock_config(f)     raw_spin_lock_irqsave(&pci_lock, f)
      32             : # define pci_unlock_config(f)   raw_spin_unlock_irqrestore(&pci_lock, f)
      33             : #endif
      34             : 
      35             : #define PCI_OP_READ(size, type, len) \
      36             : int noinline pci_bus_read_config_##size \
      37             :         (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
      38             : {                                                                       \
      39             :         int res;                                                        \
      40             :         unsigned long flags;                                            \
      41             :         u32 data = 0;                                                   \
      42             :         if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;       \
      43             :         pci_lock_config(flags);                                         \
      44             :         res = bus->ops->read(bus, devfn, pos, len, &data);            \
      45             :         if (res)                                                        \
      46             :                 PCI_SET_ERROR_RESPONSE(value);                          \
      47             :         else                                                            \
      48             :                 *value = (type)data;                                    \
      49             :         pci_unlock_config(flags);                                       \
      50             :         return res;                                                     \
      51             : }
      52             : 
      53             : #define PCI_OP_WRITE(size, type, len) \
      54             : int noinline pci_bus_write_config_##size \
      55             :         (struct pci_bus *bus, unsigned int devfn, int pos, type value)  \
      56             : {                                                                       \
      57             :         int res;                                                        \
      58             :         unsigned long flags;                                            \
      59             :         if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER;       \
      60             :         pci_lock_config(flags);                                         \
      61             :         res = bus->ops->write(bus, devfn, pos, len, value);               \
      62             :         pci_unlock_config(flags);                                       \
      63             :         return res;                                                     \
      64             : }
      65             : 
      66           0 : PCI_OP_READ(byte, u8, 1)
      67           0 : PCI_OP_READ(word, u16, 2)
      68           0 : PCI_OP_READ(dword, u32, 4)
      69           0 : PCI_OP_WRITE(byte, u8, 1)
      70           0 : PCI_OP_WRITE(word, u16, 2)
      71           0 : PCI_OP_WRITE(dword, u32, 4)
      72             : 
      73             : EXPORT_SYMBOL(pci_bus_read_config_byte);
      74             : EXPORT_SYMBOL(pci_bus_read_config_word);
      75             : EXPORT_SYMBOL(pci_bus_read_config_dword);
      76             : EXPORT_SYMBOL(pci_bus_write_config_byte);
      77             : EXPORT_SYMBOL(pci_bus_write_config_word);
      78             : EXPORT_SYMBOL(pci_bus_write_config_dword);
      79             : 
      80           0 : int pci_generic_config_read(struct pci_bus *bus, unsigned int devfn,
      81             :                             int where, int size, u32 *val)
      82             : {
      83             :         void __iomem *addr;
      84             : 
      85           0 :         addr = bus->ops->map_bus(bus, devfn, where);
      86           0 :         if (!addr)
      87             :                 return PCIBIOS_DEVICE_NOT_FOUND;
      88             : 
      89           0 :         if (size == 1)
      90           0 :                 *val = readb(addr);
      91           0 :         else if (size == 2)
      92           0 :                 *val = readw(addr);
      93             :         else
      94           0 :                 *val = readl(addr);
      95             : 
      96             :         return PCIBIOS_SUCCESSFUL;
      97             : }
      98             : EXPORT_SYMBOL_GPL(pci_generic_config_read);
      99             : 
     100           0 : int pci_generic_config_write(struct pci_bus *bus, unsigned int devfn,
     101             :                              int where, int size, u32 val)
     102             : {
     103             :         void __iomem *addr;
     104             : 
     105           0 :         addr = bus->ops->map_bus(bus, devfn, where);
     106           0 :         if (!addr)
     107             :                 return PCIBIOS_DEVICE_NOT_FOUND;
     108             : 
     109           0 :         if (size == 1)
     110           0 :                 writeb(val, addr);
     111           0 :         else if (size == 2)
     112           0 :                 writew(val, addr);
     113             :         else
     114             :                 writel(val, addr);
     115             : 
     116             :         return PCIBIOS_SUCCESSFUL;
     117             : }
     118             : EXPORT_SYMBOL_GPL(pci_generic_config_write);
     119             : 
     120           0 : int pci_generic_config_read32(struct pci_bus *bus, unsigned int devfn,
     121             :                               int where, int size, u32 *val)
     122             : {
     123             :         void __iomem *addr;
     124             : 
     125           0 :         addr = bus->ops->map_bus(bus, devfn, where & ~0x3);
     126           0 :         if (!addr)
     127             :                 return PCIBIOS_DEVICE_NOT_FOUND;
     128             : 
     129           0 :         *val = readl(addr);
     130             : 
     131           0 :         if (size <= 2)
     132           0 :                 *val = (*val >> (8 * (where & 3))) & ((1 << (size * 8)) - 1);
     133             : 
     134             :         return PCIBIOS_SUCCESSFUL;
     135             : }
     136             : EXPORT_SYMBOL_GPL(pci_generic_config_read32);
     137             : 
     138           0 : int pci_generic_config_write32(struct pci_bus *bus, unsigned int devfn,
     139             :                                int where, int size, u32 val)
     140             : {
     141             :         void __iomem *addr;
     142             :         u32 mask, tmp;
     143             : 
     144           0 :         addr = bus->ops->map_bus(bus, devfn, where & ~0x3);
     145           0 :         if (!addr)
     146             :                 return PCIBIOS_DEVICE_NOT_FOUND;
     147             : 
     148           0 :         if (size == 4) {
     149             :                 writel(val, addr);
     150             :                 return PCIBIOS_SUCCESSFUL;
     151             :         }
     152             : 
     153             :         /*
     154             :          * In general, hardware that supports only 32-bit writes on PCI is
     155             :          * not spec-compliant.  For example, software may perform a 16-bit
     156             :          * write.  If the hardware only supports 32-bit accesses, we must
     157             :          * do a 32-bit read, merge in the 16 bits we intend to write,
     158             :          * followed by a 32-bit write.  If the 16 bits we *don't* intend to
     159             :          * write happen to have any RW1C (write-one-to-clear) bits set, we
     160             :          * just inadvertently cleared something we shouldn't have.
     161             :          */
     162           0 :         if (!bus->unsafe_warn) {
     163           0 :                 dev_warn(&bus->dev, "%d-byte config write to %04x:%02x:%02x.%d offset %#x may corrupt adjacent RW1C bits\n",
     164             :                          size, pci_domain_nr(bus), bus->number,
     165             :                          PCI_SLOT(devfn), PCI_FUNC(devfn), where);
     166           0 :                 bus->unsafe_warn = 1;
     167             :         }
     168             : 
     169           0 :         mask = ~(((1 << (size * 8)) - 1) << ((where & 0x3) * 8));
     170           0 :         tmp = readl(addr) & mask;
     171           0 :         tmp |= val << ((where & 0x3) * 8);
     172             :         writel(tmp, addr);
     173             : 
     174             :         return PCIBIOS_SUCCESSFUL;
     175             : }
     176             : EXPORT_SYMBOL_GPL(pci_generic_config_write32);
     177             : 
     178             : /**
     179             :  * pci_bus_set_ops - Set raw operations of pci bus
     180             :  * @bus:        pci bus struct
     181             :  * @ops:        new raw operations
     182             :  *
     183             :  * Return previous raw operations
     184             :  */
     185           0 : struct pci_ops *pci_bus_set_ops(struct pci_bus *bus, struct pci_ops *ops)
     186             : {
     187             :         struct pci_ops *old_ops;
     188             :         unsigned long flags;
     189             : 
     190           0 :         raw_spin_lock_irqsave(&pci_lock, flags);
     191           0 :         old_ops = bus->ops;
     192           0 :         bus->ops = ops;
     193           0 :         raw_spin_unlock_irqrestore(&pci_lock, flags);
     194           0 :         return old_ops;
     195             : }
     196             : EXPORT_SYMBOL(pci_bus_set_ops);
     197             : 
     198             : /*
     199             :  * The following routines are to prevent the user from accessing PCI config
     200             :  * space when it's unsafe to do so.  Some devices require this during BIST and
     201             :  * we're required to prevent it during D-state transitions.
     202             :  *
     203             :  * We have a bit per device to indicate it's blocked and a global wait queue
     204             :  * for callers to sleep on until devices are unblocked.
     205             :  */
     206             : static DECLARE_WAIT_QUEUE_HEAD(pci_cfg_wait);
     207             : 
     208           0 : static noinline void pci_wait_cfg(struct pci_dev *dev)
     209             :         __must_hold(&pci_lock)
     210             : {
     211             :         do {
     212           0 :                 raw_spin_unlock_irq(&pci_lock);
     213           0 :                 wait_event(pci_cfg_wait, !dev->block_cfg_access);
     214           0 :                 raw_spin_lock_irq(&pci_lock);
     215           0 :         } while (dev->block_cfg_access);
     216           0 : }
     217             : 
     218             : /* Returns 0 on success, negative values indicate error. */
     219             : #define PCI_USER_READ_CONFIG(size, type)                                        \
     220             : int pci_user_read_config_##size                                         \
     221             :         (struct pci_dev *dev, int pos, type *val)                       \
     222             : {                                                                       \
     223             :         int ret = PCIBIOS_SUCCESSFUL;                                   \
     224             :         u32 data = -1;                                                  \
     225             :         if (PCI_##size##_BAD)                                           \
     226             :                 return -EINVAL;                                         \
     227             :         raw_spin_lock_irq(&pci_lock);                               \
     228             :         if (unlikely(dev->block_cfg_access))                         \
     229             :                 pci_wait_cfg(dev);                                      \
     230             :         ret = dev->bus->ops->read(dev->bus, dev->devfn,                  \
     231             :                                         pos, sizeof(type), &data);  \
     232             :         raw_spin_unlock_irq(&pci_lock);                             \
     233             :         if (ret)                                                        \
     234             :                 PCI_SET_ERROR_RESPONSE(val);                            \
     235             :         else                                                            \
     236             :                 *val = (type)data;                                      \
     237             :         return pcibios_err_to_errno(ret);                               \
     238             : }                                                                       \
     239             : EXPORT_SYMBOL_GPL(pci_user_read_config_##size);
     240             : 
     241             : /* Returns 0 on success, negative values indicate error. */
     242             : #define PCI_USER_WRITE_CONFIG(size, type)                               \
     243             : int pci_user_write_config_##size                                        \
     244             :         (struct pci_dev *dev, int pos, type val)                        \
     245             : {                                                                       \
     246             :         int ret = PCIBIOS_SUCCESSFUL;                                   \
     247             :         if (PCI_##size##_BAD)                                           \
     248             :                 return -EINVAL;                                         \
     249             :         raw_spin_lock_irq(&pci_lock);                               \
     250             :         if (unlikely(dev->block_cfg_access))                         \
     251             :                 pci_wait_cfg(dev);                                      \
     252             :         ret = dev->bus->ops->write(dev->bus, dev->devfn,         \
     253             :                                         pos, sizeof(type), val);        \
     254             :         raw_spin_unlock_irq(&pci_lock);                             \
     255             :         return pcibios_err_to_errno(ret);                               \
     256             : }                                                                       \
     257             : EXPORT_SYMBOL_GPL(pci_user_write_config_##size);
     258             : 
     259           0 : PCI_USER_READ_CONFIG(byte, u8)
     260           0 : PCI_USER_READ_CONFIG(word, u16)
     261           0 : PCI_USER_READ_CONFIG(dword, u32)
     262           0 : PCI_USER_WRITE_CONFIG(byte, u8)
     263           0 : PCI_USER_WRITE_CONFIG(word, u16)
     264           0 : PCI_USER_WRITE_CONFIG(dword, u32)
     265             : 
     266             : /**
     267             :  * pci_cfg_access_lock - Lock PCI config reads/writes
     268             :  * @dev:        pci device struct
     269             :  *
     270             :  * When access is locked, any userspace reads or writes to config
     271             :  * space and concurrent lock requests will sleep until access is
     272             :  * allowed via pci_cfg_access_unlock() again.
     273             :  */
     274           0 : void pci_cfg_access_lock(struct pci_dev *dev)
     275             : {
     276             :         might_sleep();
     277             : 
     278           0 :         raw_spin_lock_irq(&pci_lock);
     279           0 :         if (dev->block_cfg_access)
     280           0 :                 pci_wait_cfg(dev);
     281           0 :         dev->block_cfg_access = 1;
     282           0 :         raw_spin_unlock_irq(&pci_lock);
     283           0 : }
     284             : EXPORT_SYMBOL_GPL(pci_cfg_access_lock);
     285             : 
     286             : /**
     287             :  * pci_cfg_access_trylock - try to lock PCI config reads/writes
     288             :  * @dev:        pci device struct
     289             :  *
     290             :  * Same as pci_cfg_access_lock, but will return 0 if access is
     291             :  * already locked, 1 otherwise. This function can be used from
     292             :  * atomic contexts.
     293             :  */
     294           0 : bool pci_cfg_access_trylock(struct pci_dev *dev)
     295             : {
     296             :         unsigned long flags;
     297           0 :         bool locked = true;
     298             : 
     299           0 :         raw_spin_lock_irqsave(&pci_lock, flags);
     300           0 :         if (dev->block_cfg_access)
     301             :                 locked = false;
     302             :         else
     303           0 :                 dev->block_cfg_access = 1;
     304           0 :         raw_spin_unlock_irqrestore(&pci_lock, flags);
     305             : 
     306           0 :         return locked;
     307             : }
     308             : EXPORT_SYMBOL_GPL(pci_cfg_access_trylock);
     309             : 
     310             : /**
     311             :  * pci_cfg_access_unlock - Unlock PCI config reads/writes
     312             :  * @dev:        pci device struct
     313             :  *
     314             :  * This function allows PCI config accesses to resume.
     315             :  */
     316           0 : void pci_cfg_access_unlock(struct pci_dev *dev)
     317             : {
     318             :         unsigned long flags;
     319             : 
     320           0 :         raw_spin_lock_irqsave(&pci_lock, flags);
     321             : 
     322             :         /*
     323             :          * This indicates a problem in the caller, but we don't need
     324             :          * to kill them, unlike a double-block above.
     325             :          */
     326           0 :         WARN_ON(!dev->block_cfg_access);
     327             : 
     328           0 :         dev->block_cfg_access = 0;
     329           0 :         raw_spin_unlock_irqrestore(&pci_lock, flags);
     330             : 
     331           0 :         wake_up_all(&pci_cfg_wait);
     332           0 : }
     333             : EXPORT_SYMBOL_GPL(pci_cfg_access_unlock);
     334             : 
     335             : static inline int pcie_cap_version(const struct pci_dev *dev)
     336             : {
     337           0 :         return pcie_caps_reg(dev) & PCI_EXP_FLAGS_VERS;
     338             : }
     339             : 
     340           0 : bool pcie_cap_has_lnkctl(const struct pci_dev *dev)
     341             : {
     342           0 :         int type = pci_pcie_type(dev);
     343             : 
     344           0 :         return type == PCI_EXP_TYPE_ENDPOINT ||
     345           0 :                type == PCI_EXP_TYPE_LEG_END ||
     346           0 :                type == PCI_EXP_TYPE_ROOT_PORT ||
     347           0 :                type == PCI_EXP_TYPE_UPSTREAM ||
     348             :                type == PCI_EXP_TYPE_DOWNSTREAM ||
     349           0 :                type == PCI_EXP_TYPE_PCI_BRIDGE ||
     350             :                type == PCI_EXP_TYPE_PCIE_BRIDGE;
     351             : }
     352             : 
     353           0 : bool pcie_cap_has_lnkctl2(const struct pci_dev *dev)
     354             : {
     355           0 :         return pcie_cap_has_lnkctl(dev) && pcie_cap_version(dev) > 1;
     356             : }
     357             : 
     358             : static inline bool pcie_cap_has_sltctl(const struct pci_dev *dev)
     359             : {
     360           0 :         return pcie_downstream_port(dev) &&
     361           0 :                pcie_caps_reg(dev) & PCI_EXP_FLAGS_SLOT;
     362             : }
     363             : 
     364           0 : bool pcie_cap_has_rtctl(const struct pci_dev *dev)
     365             : {
     366           0 :         int type = pci_pcie_type(dev);
     367             : 
     368           0 :         return type == PCI_EXP_TYPE_ROOT_PORT ||
     369           0 :                type == PCI_EXP_TYPE_RC_EC;
     370             : }
     371             : 
     372           0 : static bool pcie_capability_reg_implemented(struct pci_dev *dev, int pos)
     373             : {
     374           0 :         if (!pci_is_pcie(dev))
     375             :                 return false;
     376             : 
     377           0 :         switch (pos) {
     378             :         case PCI_EXP_FLAGS:
     379             :                 return true;
     380             :         case PCI_EXP_DEVCAP:
     381             :         case PCI_EXP_DEVCTL:
     382             :         case PCI_EXP_DEVSTA:
     383             :                 return true;
     384             :         case PCI_EXP_LNKCAP:
     385             :         case PCI_EXP_LNKCTL:
     386             :         case PCI_EXP_LNKSTA:
     387           0 :                 return pcie_cap_has_lnkctl(dev);
     388             :         case PCI_EXP_SLTCAP:
     389             :         case PCI_EXP_SLTCTL:
     390             :         case PCI_EXP_SLTSTA:
     391           0 :                 return pcie_cap_has_sltctl(dev);
     392             :         case PCI_EXP_RTCTL:
     393             :         case PCI_EXP_RTCAP:
     394             :         case PCI_EXP_RTSTA:
     395           0 :                 return pcie_cap_has_rtctl(dev);
     396             :         case PCI_EXP_DEVCAP2:
     397             :         case PCI_EXP_DEVCTL2:
     398           0 :                 return pcie_cap_version(dev) > 1;
     399             :         case PCI_EXP_LNKCAP2:
     400             :         case PCI_EXP_LNKCTL2:
     401             :         case PCI_EXP_LNKSTA2:
     402           0 :                 return pcie_cap_has_lnkctl2(dev);
     403             :         default:
     404           0 :                 return false;
     405             :         }
     406             : }
     407             : 
     408             : /*
     409             :  * Note that these accessor functions are only for the "PCI Express
     410             :  * Capability" (see PCIe spec r3.0, sec 7.8).  They do not apply to the
     411             :  * other "PCI Express Extended Capabilities" (AER, VC, ACS, MFVC, etc.)
     412             :  */
     413           0 : int pcie_capability_read_word(struct pci_dev *dev, int pos, u16 *val)
     414             : {
     415             :         int ret;
     416             : 
     417           0 :         *val = 0;
     418           0 :         if (pos & 1)
     419             :                 return PCIBIOS_BAD_REGISTER_NUMBER;
     420             : 
     421           0 :         if (pcie_capability_reg_implemented(dev, pos)) {
     422           0 :                 ret = pci_read_config_word(dev, pci_pcie_cap(dev) + pos, val);
     423             :                 /*
     424             :                  * Reset *val to 0 if pci_read_config_word() fails; it may
     425             :                  * have been written as 0xFFFF (PCI_ERROR_RESPONSE) if the
     426             :                  * config read failed on PCI.
     427             :                  */
     428           0 :                 if (ret)
     429           0 :                         *val = 0;
     430             :                 return ret;
     431             :         }
     432             : 
     433             :         /*
     434             :          * For Functions that do not implement the Slot Capabilities,
     435             :          * Slot Status, and Slot Control registers, these spaces must
     436             :          * be hardwired to 0b, with the exception of the Presence Detect
     437             :          * State bit in the Slot Status register of Downstream Ports,
     438             :          * which must be hardwired to 1b.  (PCIe Base Spec 3.0, sec 7.8)
     439             :          */
     440           0 :         if (pci_is_pcie(dev) && pcie_downstream_port(dev) &&
     441             :             pos == PCI_EXP_SLTSTA)
     442           0 :                 *val = PCI_EXP_SLTSTA_PDS;
     443             : 
     444             :         return 0;
     445             : }
     446             : EXPORT_SYMBOL(pcie_capability_read_word);
     447             : 
     448           0 : int pcie_capability_read_dword(struct pci_dev *dev, int pos, u32 *val)
     449             : {
     450             :         int ret;
     451             : 
     452           0 :         *val = 0;
     453           0 :         if (pos & 3)
     454             :                 return PCIBIOS_BAD_REGISTER_NUMBER;
     455             : 
     456           0 :         if (pcie_capability_reg_implemented(dev, pos)) {
     457           0 :                 ret = pci_read_config_dword(dev, pci_pcie_cap(dev) + pos, val);
     458             :                 /*
     459             :                  * Reset *val to 0 if pci_read_config_dword() fails; it may
     460             :                  * have been written as 0xFFFFFFFF (PCI_ERROR_RESPONSE) if
     461             :                  * the config read failed on PCI.
     462             :                  */
     463           0 :                 if (ret)
     464           0 :                         *val = 0;
     465             :                 return ret;
     466             :         }
     467             : 
     468           0 :         if (pci_is_pcie(dev) && pcie_downstream_port(dev) &&
     469             :             pos == PCI_EXP_SLTSTA)
     470           0 :                 *val = PCI_EXP_SLTSTA_PDS;
     471             : 
     472             :         return 0;
     473             : }
     474             : EXPORT_SYMBOL(pcie_capability_read_dword);
     475             : 
     476           0 : int pcie_capability_write_word(struct pci_dev *dev, int pos, u16 val)
     477             : {
     478           0 :         if (pos & 1)
     479             :                 return PCIBIOS_BAD_REGISTER_NUMBER;
     480             : 
     481           0 :         if (!pcie_capability_reg_implemented(dev, pos))
     482             :                 return 0;
     483             : 
     484           0 :         return pci_write_config_word(dev, pci_pcie_cap(dev) + pos, val);
     485             : }
     486             : EXPORT_SYMBOL(pcie_capability_write_word);
     487             : 
     488           0 : int pcie_capability_write_dword(struct pci_dev *dev, int pos, u32 val)
     489             : {
     490           0 :         if (pos & 3)
     491             :                 return PCIBIOS_BAD_REGISTER_NUMBER;
     492             : 
     493           0 :         if (!pcie_capability_reg_implemented(dev, pos))
     494             :                 return 0;
     495             : 
     496           0 :         return pci_write_config_dword(dev, pci_pcie_cap(dev) + pos, val);
     497             : }
     498             : EXPORT_SYMBOL(pcie_capability_write_dword);
     499             : 
     500           0 : int pcie_capability_clear_and_set_word(struct pci_dev *dev, int pos,
     501             :                                        u16 clear, u16 set)
     502             : {
     503             :         int ret;
     504             :         u16 val;
     505             : 
     506           0 :         ret = pcie_capability_read_word(dev, pos, &val);
     507           0 :         if (!ret) {
     508           0 :                 val &= ~clear;
     509           0 :                 val |= set;
     510           0 :                 ret = pcie_capability_write_word(dev, pos, val);
     511             :         }
     512             : 
     513           0 :         return ret;
     514             : }
     515             : EXPORT_SYMBOL(pcie_capability_clear_and_set_word);
     516             : 
     517           0 : int pcie_capability_clear_and_set_dword(struct pci_dev *dev, int pos,
     518             :                                         u32 clear, u32 set)
     519             : {
     520             :         int ret;
     521             :         u32 val;
     522             : 
     523           0 :         ret = pcie_capability_read_dword(dev, pos, &val);
     524           0 :         if (!ret) {
     525           0 :                 val &= ~clear;
     526           0 :                 val |= set;
     527           0 :                 ret = pcie_capability_write_dword(dev, pos, val);
     528             :         }
     529             : 
     530           0 :         return ret;
     531             : }
     532             : EXPORT_SYMBOL(pcie_capability_clear_and_set_dword);
     533             : 
     534           0 : int pci_read_config_byte(const struct pci_dev *dev, int where, u8 *val)
     535             : {
     536           0 :         if (pci_dev_is_disconnected(dev)) {
     537           0 :                 PCI_SET_ERROR_RESPONSE(val);
     538           0 :                 return PCIBIOS_DEVICE_NOT_FOUND;
     539             :         }
     540           0 :         return pci_bus_read_config_byte(dev->bus, dev->devfn, where, val);
     541             : }
     542             : EXPORT_SYMBOL(pci_read_config_byte);
     543             : 
     544           0 : int pci_read_config_word(const struct pci_dev *dev, int where, u16 *val)
     545             : {
     546           0 :         if (pci_dev_is_disconnected(dev)) {
     547           0 :                 PCI_SET_ERROR_RESPONSE(val);
     548           0 :                 return PCIBIOS_DEVICE_NOT_FOUND;
     549             :         }
     550           0 :         return pci_bus_read_config_word(dev->bus, dev->devfn, where, val);
     551             : }
     552             : EXPORT_SYMBOL(pci_read_config_word);
     553             : 
     554           0 : int pci_read_config_dword(const struct pci_dev *dev, int where,
     555             :                                         u32 *val)
     556             : {
     557           0 :         if (pci_dev_is_disconnected(dev)) {
     558           0 :                 PCI_SET_ERROR_RESPONSE(val);
     559           0 :                 return PCIBIOS_DEVICE_NOT_FOUND;
     560             :         }
     561           0 :         return pci_bus_read_config_dword(dev->bus, dev->devfn, where, val);
     562             : }
     563             : EXPORT_SYMBOL(pci_read_config_dword);
     564             : 
     565           0 : int pci_write_config_byte(const struct pci_dev *dev, int where, u8 val)
     566             : {
     567           0 :         if (pci_dev_is_disconnected(dev))
     568             :                 return PCIBIOS_DEVICE_NOT_FOUND;
     569           0 :         return pci_bus_write_config_byte(dev->bus, dev->devfn, where, val);
     570             : }
     571             : EXPORT_SYMBOL(pci_write_config_byte);
     572             : 
     573           0 : int pci_write_config_word(const struct pci_dev *dev, int where, u16 val)
     574             : {
     575           0 :         if (pci_dev_is_disconnected(dev))
     576             :                 return PCIBIOS_DEVICE_NOT_FOUND;
     577           0 :         return pci_bus_write_config_word(dev->bus, dev->devfn, where, val);
     578             : }
     579             : EXPORT_SYMBOL(pci_write_config_word);
     580             : 
     581           0 : int pci_write_config_dword(const struct pci_dev *dev, int where,
     582             :                                          u32 val)
     583             : {
     584           0 :         if (pci_dev_is_disconnected(dev))
     585             :                 return PCIBIOS_DEVICE_NOT_FOUND;
     586           0 :         return pci_bus_write_config_dword(dev->bus, dev->devfn, where, val);
     587             : }
     588             : EXPORT_SYMBOL(pci_write_config_dword);

Generated by: LCOV version 1.14