Lines Matching +full:bus +full:- +full:addr
1 // SPDX-License-Identifier: GPL-2.0-only
17 #include <asm/pci-bridge.h>
18 #include <asm/isa-bridge.h>
21 #include <asm/ppc-pci.h>
25 #define PA_PXP_CFA(bus, devfn, off) (((bus) << 20) | ((devfn) << 12) | (off)) argument
27 static inline int pa_pxp_offset_valid(u8 bus, u8 devfn, int offset) in pa_pxp_offset_valid() argument
30 * well, so allow larger offset. It's really a two-function device but the in pa_pxp_offset_valid()
33 if (bus == 0 && devfn == 0) in pa_pxp_offset_valid()
40 u8 bus, u8 devfn, int offset) in pa_pxp_cfg_addr() argument
42 return hose->cfg_data + PA_PXP_CFA(bus, devfn, offset); in pa_pxp_cfg_addr()
57 static int workaround_5945(struct pci_bus *bus, unsigned int devfn, in workaround_5945() argument
61 void volatile __iomem *addr, *dummy; in workaround_5945() local
65 if (!is_root_port(bus->number, devfn) || !is_5945_reg(offset)) in workaround_5945()
68 hose = pci_bus_to_host(bus); in workaround_5945()
70 addr = pa_pxp_cfg_addr(hose, bus->number, devfn, offset & ~0x3); in workaround_5945()
74 * and write back what we read. We must read/write the full 32-bit in workaround_5945()
77 dummy = pa_pxp_cfg_addr(hose, bus->number, devfn, 0x10); in workaround_5945()
79 tmp = in_le32(addr); in workaround_5945()
80 out_le32(addr, tmp); in workaround_5945()
105 static void sb600_set_flag(int bus) in sb600_set_flag() argument
113 dn = of_find_compatible_node(NULL, "isa", "pasemi,1682m-iob"); in sb600_set_flag()
133 if (bus == SB600_BUS) { in sb600_set_flag()
135 * This is the SB600's bus, tell the PCI-e root port in sb600_set_flag()
136 * to allow non-zero devices to enumerate. in sb600_set_flag()
150 static void sb600_set_flag(int bus) in sb600_set_flag() argument
155 static int pa_pxp_read_config(struct pci_bus *bus, unsigned int devfn, in pa_pxp_read_config() argument
159 void volatile __iomem *addr; in pa_pxp_read_config() local
161 hose = pci_bus_to_host(bus); in pa_pxp_read_config()
165 if (!pa_pxp_offset_valid(bus->number, devfn, offset)) in pa_pxp_read_config()
168 if (workaround_5945(bus, devfn, offset, len, val)) in pa_pxp_read_config()
171 addr = pa_pxp_cfg_addr(hose, bus->number, devfn, offset); in pa_pxp_read_config()
173 sb600_set_flag(bus->number); in pa_pxp_read_config()
181 *val = in_8(addr); in pa_pxp_read_config()
184 *val = in_le16(addr); in pa_pxp_read_config()
187 *val = in_le32(addr); in pa_pxp_read_config()
194 static int pa_pxp_write_config(struct pci_bus *bus, unsigned int devfn, in pa_pxp_write_config() argument
198 void volatile __iomem *addr; in pa_pxp_write_config() local
200 hose = pci_bus_to_host(bus); in pa_pxp_write_config()
204 if (!pa_pxp_offset_valid(bus->number, devfn, offset)) in pa_pxp_write_config()
207 addr = pa_pxp_cfg_addr(hose, bus->number, devfn, offset); in pa_pxp_write_config()
209 sb600_set_flag(bus->number); in pa_pxp_write_config()
217 out_8(addr, val); in pa_pxp_write_config()
220 out_le16(addr, val); in pa_pxp_write_config()
223 out_le32(addr, val); in pa_pxp_write_config()
236 hose->ops = &pa_pxp_ops; in setup_pa_pxp()
237 hose->cfg_data = ioremap(0xe0000000, 0x10000000); in setup_pa_pxp()
248 return -ENOMEM; in pas_add_bridge()
250 hose->first_busno = 0; in pas_add_bridge()
251 hose->last_busno = 0xff; in pas_add_bridge()
252 hose->controller_ops = pasemi_pci_controller_ops; in pas_add_bridge()
256 pr_info("Found PA-PXP PCI host bridge.\n"); in pas_add_bridge()
294 hose = pci_bus_to_host(dev->bus); in pasemi_pci_getcfgaddr()
296 return (void __iomem *)pa_pxp_cfg_addr(hose, dev->bus->number, dev->devfn, offset); in pasemi_pci_getcfgaddr()