Lines Matching +full:bus +full:- +full:addr

1 // SPDX-License-Identifier: GPL-2.0
11 * This interrupt-safe spinlock protects all accesses to PCI
19 * alignment, do locking and call the low-level functions pointed to
20 * by pci_dev->ops.
37 (struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
44 res = bus->ops->read(bus, devfn, pos, len, &data); \
55 (struct pci_bus *bus, unsigned int devfn, int pos, type value) \
61 res = bus->ops->write(bus, devfn, pos, len, value); \
80 int pci_generic_config_read(struct pci_bus *bus, unsigned int devfn, in pci_generic_config_read() argument
83 void __iomem *addr; in pci_generic_config_read() local
85 addr = bus->ops->map_bus(bus, devfn, where); in pci_generic_config_read()
86 if (!addr) in pci_generic_config_read()
90 *val = readb(addr); in pci_generic_config_read()
92 *val = readw(addr); in pci_generic_config_read()
94 *val = readl(addr); in pci_generic_config_read()
100 int pci_generic_config_write(struct pci_bus *bus, unsigned int devfn, in pci_generic_config_write() argument
103 void __iomem *addr; in pci_generic_config_write() local
105 addr = bus->ops->map_bus(bus, devfn, where); in pci_generic_config_write()
106 if (!addr) in pci_generic_config_write()
110 writeb(val, addr); in pci_generic_config_write()
112 writew(val, addr); in pci_generic_config_write()
114 writel(val, addr); in pci_generic_config_write()
120 int pci_generic_config_read32(struct pci_bus *bus, unsigned int devfn, in pci_generic_config_read32() argument
123 void __iomem *addr; in pci_generic_config_read32() local
125 addr = bus->ops->map_bus(bus, devfn, where & ~0x3); in pci_generic_config_read32()
126 if (!addr) in pci_generic_config_read32()
129 *val = readl(addr); in pci_generic_config_read32()
132 *val = (*val >> (8 * (where & 3))) & ((1 << (size * 8)) - 1); in pci_generic_config_read32()
138 int pci_generic_config_write32(struct pci_bus *bus, unsigned int devfn, in pci_generic_config_write32() argument
141 void __iomem *addr; in pci_generic_config_write32() local
144 addr = bus->ops->map_bus(bus, devfn, where & ~0x3); in pci_generic_config_write32()
145 if (!addr) in pci_generic_config_write32()
149 writel(val, addr); in pci_generic_config_write32()
154 * In general, hardware that supports only 32-bit writes on PCI is in pci_generic_config_write32()
155 * not spec-compliant. For example, software may perform a 16-bit in pci_generic_config_write32()
156 * write. If the hardware only supports 32-bit accesses, we must in pci_generic_config_write32()
157 * do a 32-bit read, merge in the 16 bits we intend to write, in pci_generic_config_write32()
158 * followed by a 32-bit write. If the 16 bits we *don't* intend to in pci_generic_config_write32()
159 * write happen to have any RW1C (write-one-to-clear) bits set, we in pci_generic_config_write32()
162 if (!bus->unsafe_warn) { in pci_generic_config_write32()
163 …dev_warn(&bus->dev, "%d-byte config write to %04x:%02x:%02x.%d offset %#x may corrupt adjacent RW1… in pci_generic_config_write32()
164 size, pci_domain_nr(bus), bus->number, in pci_generic_config_write32()
166 bus->unsafe_warn = 1; in pci_generic_config_write32()
169 mask = ~(((1 << (size * 8)) - 1) << ((where & 0x3) * 8)); in pci_generic_config_write32()
170 tmp = readl(addr) & mask; in pci_generic_config_write32()
172 writel(tmp, addr); in pci_generic_config_write32()
179 * pci_bus_set_ops - Set raw operations of pci bus
180 * @bus: pci bus struct
185 struct pci_ops *pci_bus_set_ops(struct pci_bus *bus, struct pci_ops *ops) in pci_bus_set_ops() argument
191 old_ops = bus->ops; in pci_bus_set_ops()
192 bus->ops = ops; in pci_bus_set_ops()
201 * we're required to prevent it during D-state transitions.
213 wait_event(pci_cfg_wait, !dev->block_cfg_access); in pci_wait_cfg()
215 } while (dev->block_cfg_access); in pci_wait_cfg()
224 u32 data = -1; \
226 return -EINVAL; \
228 if (unlikely(dev->block_cfg_access)) \
230 ret = dev->bus->ops->read(dev->bus, dev->devfn, \
248 return -EINVAL; \
250 if (unlikely(dev->block_cfg_access)) \
252 ret = dev->bus->ops->write(dev->bus, dev->devfn, \
267 * pci_cfg_access_lock - Lock PCI config reads/writes in PCI_USER_READ_CONFIG()
279 if (dev->block_cfg_access) in PCI_USER_READ_CONFIG()
281 dev->block_cfg_access = 1; in PCI_USER_READ_CONFIG()
287 * pci_cfg_access_trylock - try to lock PCI config reads/writes
300 if (dev->block_cfg_access) in pci_cfg_access_trylock()
303 dev->block_cfg_access = 1; in pci_cfg_access_trylock()
311 * pci_cfg_access_unlock - Unlock PCI config reads/writes
324 * to kill them, unlike a double-block above. in pci_cfg_access_unlock()
326 WARN_ON(!dev->block_cfg_access); in pci_cfg_access_unlock()
328 dev->block_cfg_access = 0; in pci_cfg_access_unlock()
534 return pci_bus_read_config_byte(dev->bus, dev->devfn, where, val); in pci_read_config_byte()
544 return pci_bus_read_config_word(dev->bus, dev->devfn, where, val); in pci_read_config_word()
555 return pci_bus_read_config_dword(dev->bus, dev->devfn, where, val); in pci_read_config_dword()
563 return pci_bus_write_config_byte(dev->bus, dev->devfn, where, val); in pci_write_config_byte()
571 return pci_bus_write_config_word(dev->bus, dev->devfn, where, val); in pci_write_config_word()
580 return pci_bus_write_config_dword(dev->bus, dev->devfn, where, val); in pci_write_config_dword()