static int celleb_fake_pci_read_config(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val) { char *config; struct device_node *node; struct pci_controller *hose; unsigned int devno = devfn >> 3; unsigned int fn = devfn & 0x7; /* allignment check */ BUG_ON(where % size); pr_debug(" fake read: bus=0x%x, ", bus->number); node = (struct device_node *)bus->sysdata; hose = pci_find_hose_for_OF_device(node); config = get_fake_config_start(hose, devno, fn); pr_debug("devno=0x%x, where=0x%x, size=0x%x, ", devno, where, size); if (!config) { pr_debug("failed\n"); return PCIBIOS_DEVICE_NOT_FOUND; } celleb_config_read_fake(config, where, size, val); pr_debug("val=0x%x\n", *val); return PCIBIOS_SUCCESSFUL; }
static int celleb_fake_pci_write_config(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val) { char *config; struct device_node *node; struct pci_controller *hose; struct celleb_pci_resource *res; unsigned int devno = devfn >> 3; unsigned int fn = devfn & 0x7; /* allignment check */ BUG_ON(where % size); node = (struct device_node *)bus->sysdata; hose = pci_find_hose_for_OF_device(node); config = get_fake_config_start(hose, devno, fn); if (!config) return PCIBIOS_DEVICE_NOT_FOUND; if (val == ~0) { int i = (where - PCI_BASE_ADDRESS_0) >> 3; switch (where) { case PCI_BASE_ADDRESS_0: case PCI_BASE_ADDRESS_2: if (size != 4) return PCIBIOS_DEVICE_NOT_FOUND; res = get_resource_start(hose, devno, fn); if (!res) return PCIBIOS_DEVICE_NOT_FOUND; celleb_config_write_fake(config, where, size, (res->r[i].end - res->r[i].start)); return PCIBIOS_SUCCESSFUL; case PCI_BASE_ADDRESS_1: case PCI_BASE_ADDRESS_3: case PCI_BASE_ADDRESS_4: case PCI_BASE_ADDRESS_5: break; default: break; } }
static void __init fixup_port_pio(int index, struct device_node *np, struct plat_serial8250_port *port) { #ifdef CONFIG_PCI struct pci_controller *hose; DBG("fixup_port_pio(%d)\n", index); hose = pci_find_hose_for_OF_device(np); if (hose) { unsigned long offset = (unsigned long)hose->io_base_virt - #ifdef CONFIG_PPC64 pci_io_base; #else isa_io_base; #endif DBG("port %d, IO %lx -> %lx\n", index, port->iobase, port->iobase + offset); port->iobase += offset; } #endif }