/* * Fixup all PCIe nodes by setting the device_type property * to "pci-endpoint" instead is "pci" for endpoint ports. * This property will get checked later by the Linux driver * to properly configure the PCIe port in Linux (again). */ void fdt_pcie_setup(void *blob) { const char *compat = "ibm,plb-pciex"; const char *prop = "device_type"; const char *prop_val = "pci-endpoint"; const u32 *port; int no; int rc; /* Search first PCIe node */ no = fdt_node_offset_by_compatible(blob, -1, compat); while (no != -FDT_ERR_NOTFOUND) { port = fdt_getprop(blob, no, "port", NULL); if (port == NULL) { printf("WARNING: could not find port property\n"); } else { if (is_end_point(*port)) { rc = fdt_setprop(blob, no, prop, prop_val, strlen(prop_val) + 1); if (rc < 0) printf("WARNING: could not set %s for %s: %s.\n", prop, compat, fdt_strerror(rc)); } } /* Jump to next PCIe node */ no = fdt_node_offset_by_compatible(blob, no, compat); } }
void pcie_setup_hoses(int busno) { struct pci_controller *hose; int i, bus; int ret = 0; char *env; unsigned int delay; /* * assume we're called after the PCIX hose is initialized, which takes * bus ID 0 and therefore start numbering PCIe's from 1. */ bus = busno; for (i = 0; i <= 2; i++) { /* Check for katmai card presence */ if (!katmai_pcie_card_present(i)) continue; if (is_end_point(i)) ret = ppc4xx_init_pcie_endport(i); else ret = ppc4xx_init_pcie_rootport(i); if (ret) { printf("PCIE%d: initialization as %s failed\n", i, is_end_point(i) ? "endpoint" : "root-complex"); continue; } hose = &pcie_hose[i]; hose->first_busno = bus; hose->last_busno = bus; hose->current_busno = bus; /* setup mem resource */ pci_set_region(hose->regions + 0, CONFIG_SYS_PCIE_MEMBASE + i * CONFIG_SYS_PCIE_MEMSIZE, CONFIG_SYS_PCIE_MEMBASE + i * CONFIG_SYS_PCIE_MEMSIZE, CONFIG_SYS_PCIE_MEMSIZE, PCI_REGION_MEM); hose->region_count = 1; pci_register_hose(hose); if (is_end_point(i)) { ppc4xx_setup_pcie_endpoint(hose, i); /* * Reson for no scanning is endpoint can not generate * upstream configuration accesses. */ } else { ppc4xx_setup_pcie_rootpoint(hose, i); env = getenv ("pciscandelay"); if (env != NULL) { delay = simple_strtoul(env, NULL, 10); if (delay > 5) printf("Warning, expect noticable delay before " "PCIe scan due to 'pciscandelay' value!\n"); mdelay(delay * 1000); } /* * Config access can only go down stream */ hose->last_busno = pci_hose_scan(hose); bus = hose->last_busno + 1; } } }