Date: Sun, 22 Nov 2015 01:16:43 +0000 (UTC) From: Justin Hibbits <jhibbits@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r291151 - head/sys/powerpc/mpc85xx Message-ID: <201511220116.tAM1GhDJ052603@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jhibbits Date: Sun Nov 22 01:16:43 2015 New Revision: 291151 URL: https://svnweb.freebsd.org/changeset/base/291151 Log: Modernize mpc85xx PCI hostbridge driver. Summary: * Take advantage of NEW_PCIB to remove a lot of setup code. * Fix some bugs related to multiple PCI bridges. There's still room for more cleanup, and still some bugs leftover, but this cleans up a lot. Test Plan: Tested on P5020 board with IDT PCIe switch. Differential Revision: https://reviews.freebsd.org/D4127 Modified: head/sys/powerpc/mpc85xx/pci_mpc85xx.c head/sys/powerpc/mpc85xx/pci_mpc85xx_pcib.c Modified: head/sys/powerpc/mpc85xx/pci_mpc85xx.c ============================================================================== --- head/sys/powerpc/mpc85xx/pci_mpc85xx.c Sat Nov 21 23:55:46 2015 (r291150) +++ head/sys/powerpc/mpc85xx/pci_mpc85xx.c Sun Nov 22 01:16:43 2015 (r291151) @@ -104,9 +104,9 @@ struct fsl_pcib_softc { device_t sc_dev; int sc_iomem_target; - bus_addr_t sc_iomem_alloc, sc_iomem_start, sc_iomem_end; + bus_addr_t sc_iomem_start, sc_iomem_end; int sc_ioport_target; - bus_addr_t sc_ioport_alloc, sc_ioport_start, sc_ioport_end; + bus_addr_t sc_ioport_start, sc_ioport_end; struct resource *sc_res; bus_space_handle_t sc_bsh; @@ -266,9 +266,8 @@ fsl_pcib_attach(device_t dev) /* * Scan bus using firmware configured, 0 based bus numbering. */ - sc->sc_busnr = 0; maxslot = (sc->sc_pcie) ? 0 : PCI_SLOTMAX; - sc->sc_busnr = fsl_pcib_init(sc, sc->sc_busnr, maxslot); + fsl_pcib_init(sc, sc->sc_busnr, maxslot); if (sc->sc_pcie) { ltssm = fsl_pcib_cfgread(sc, 0, 0, 0, PCIR_LTSSM, 1); @@ -285,6 +284,7 @@ fsl_pcib_attach(device_t dev) return (ofw_pci_attach(dev)); err: + //panic("Because I said so\n"); return (ENXIO); } @@ -294,9 +294,6 @@ fsl_pcib_cfgread(struct fsl_pcib_softc * { uint32_t addr, data; - if (bus == sc->sc_busnr - 1) - bus = 0; - addr = CONFIG_ACCESS_ENABLE; addr |= (bus & 0xff) << 16; addr |= (slot & 0x1f) << 11; @@ -335,9 +332,6 @@ fsl_pcib_cfgwrite(struct fsl_pcib_softc { uint32_t addr; - if (bus == sc->sc_busnr - 1) - bus = 0; - addr = CONFIG_ACCESS_ENABLE; addr |= (bus & 0xff) << 16; addr |= (slot & 0x1f) << 11; @@ -449,74 +443,14 @@ fsl_pcib_init_via(struct fsl_pcib_softc } static int -fsl_pcib_init_bar(struct fsl_pcib_softc *sc, int bus, int slot, int func, - int barno) -{ - bus_addr_t *allocp; - uint32_t addr, mask, size; - int reg, width; - - reg = PCIR_BAR(barno); - - if (DEVFN(bus, slot, func) == sc->sc_devfn_via_ide) { - switch (barno) { - case 0: addr = 0x1f0; break; - case 1: addr = 0x3f4; break; - case 2: addr = 0x170; break; - case 3: addr = 0x374; break; - case 4: addr = 0xcc0; break; - default: return (1); - } - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, reg, addr, 4); - return (1); - } - - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, reg, ~0, 4); - size = fsl_pcib_read_config(sc->sc_dev, bus, slot, func, reg, 4); - if (size == 0) - return (1); - width = ((size & 7) == 4) ? 2 : 1; - - if (size & 1) { /* I/O port */ - allocp = &sc->sc_ioport_alloc; - size &= ~3; - if ((size & 0xffff0000) == 0) - size |= 0xffff0000; - } else { /* memory */ - allocp = &sc->sc_iomem_alloc; - size &= ~15; - } - mask = ~size; - size = mask + 1; - /* Sanity check (must be a power of 2). */ - if (size & mask) - return (width); - - addr = (*allocp + mask) & ~mask; - *allocp = addr + size; - - if (bootverbose) - printf("PCI %u:%u:%u:%u: reg %x: size=%08x: addr=%08x\n", - device_get_unit(sc->sc_dev), bus, slot, func, reg, - size, addr); - - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, reg, addr, 4); - if (width == 2) - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, reg + 4, - 0, 4); - return (width); -} - -static int fsl_pcib_init(struct fsl_pcib_softc *sc, int bus, int maxslot) { int secbus; int old_pribus, old_secbus, old_subbus; int new_pribus, new_secbus, new_subbus; int slot, func, maxfunc; - int bar, maxbar; uint16_t vendor, device; - uint8_t command, hdrtype, class, subclass; + uint8_t command, hdrtype, subclass; secbus = bus; for (slot = 0; slot <= maxslot; slot++) { @@ -550,26 +484,9 @@ fsl_pcib_init(struct fsl_pcib_softc *sc, if (vendor == 0x1106) fsl_pcib_init_via(sc, device, bus, slot, func); - /* Program the base address registers. */ - maxbar = (hdrtype & PCIM_HDRTYPE) ? 1 : 6; - bar = 0; - while (bar < maxbar) - bar += fsl_pcib_init_bar(sc, bus, slot, func, - bar); - - /* Put a placeholder interrupt value */ - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_INTLINE, PCI_INVALID_IRQ, 1); - - command |= PCIM_CMD_MEMEN | PCIM_CMD_PORTEN; - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_COMMAND, command, 1); - /* * Handle PCI-PCI bridges */ - class = fsl_pcib_read_config(sc->sc_dev, bus, slot, - func, PCIR_CLASS, 1); subclass = fsl_pcib_read_config(sc->sc_dev, bus, slot, func, PCIR_SUBCLASS, 1); @@ -579,32 +496,6 @@ fsl_pcib_init(struct fsl_pcib_softc *sc, secbus++; - /* Program I/O decoder. */ - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_IOBASEL_1, sc->sc_ioport_start >> 8, 1); - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_IOLIMITL_1, sc->sc_ioport_end >> 8, 1); - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_IOBASEH_1, sc->sc_ioport_start >> 16, 2); - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_IOLIMITH_1, sc->sc_ioport_end >> 16, 2); - - /* Program (non-prefetchable) memory decoder. */ - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_MEMBASE_1, sc->sc_iomem_start >> 16, 2); - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_MEMLIMIT_1, sc->sc_iomem_end >> 16, 2); - - /* Program prefetchable memory decoder. */ - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_PMBASEL_1, 0x0010, 2); - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_PMLIMITL_1, 0x000f, 2); - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_PMBASEH_1, 0x00000000, 4); - fsl_pcib_write_config(sc->sc_dev, bus, slot, func, - PCIR_PMLIMITH_1, 0x00000000, 4); - /* Read currect bus register configuration */ old_pribus = fsl_pcib_read_config(sc->sc_dev, bus, slot, func, PCIR_PRIBUS_1, 1); @@ -678,10 +569,10 @@ fsl_pcib_outbound(struct fsl_pcib_softc switch (res) { case SYS_RES_MEMORY: - attr = 0x80044000 | (ffsl(size) - 2); + attr = 0x80044000 | (ffsll(size) - 2); break; case SYS_RES_IOPORT: - attr = 0x80088000 | (ffsl(size) - 2); + attr = 0x80088000 | (ffsll(size) - 2); break; default: attr = 0x0004401f; @@ -785,7 +676,6 @@ fsl_pcib_decode_win(phandle_t node, stru sc->sc_ioport_start = sc->pci_sc.sc_range[i].pci; sc->sc_ioport_end = sc->pci_sc.sc_range[i].pci + sc->pci_sc.sc_range[i].size - 1; - sc->sc_ioport_alloc = 0x1000 + sc->pci_sc.sc_range[i].pci; break; case OFW_PCI_PHYS_HI_SPACE_MEM32: case OFW_PCI_PHYS_HI_SPACE_MEM64: @@ -797,7 +687,6 @@ fsl_pcib_decode_win(phandle_t node, stru sc->sc_iomem_start = sc->pci_sc.sc_range[i].pci; sc->sc_iomem_end = sc->pci_sc.sc_range[i].pci + sc->pci_sc.sc_range[i].size - 1; - sc->sc_iomem_alloc = sc->pci_sc.sc_range[i].pci; break; default: panic("Unknown range type %#x\n", Modified: head/sys/powerpc/mpc85xx/pci_mpc85xx_pcib.c ============================================================================== --- head/sys/powerpc/mpc85xx/pci_mpc85xx_pcib.c Sat Nov 21 23:55:46 2015 (r291150) +++ head/sys/powerpc/mpc85xx/pci_mpc85xx_pcib.c Sun Nov 22 01:16:43 2015 (r291151) @@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$"); static int fsl_pcib_rc_probe(device_t dev) { + if (pci_get_vendor(dev) != 0x1957) return (ENXIO); if (pci_get_progif(dev) != 0) @@ -71,28 +72,8 @@ fsl_pcib_rc_probe(device_t dev) return (BUS_PROBE_DEFAULT); } -static int -fsl_pcib_rc_attach(device_t dev) -{ - struct pcib_softc *sc; - device_t child; - - pcib_bridge_init(dev); - pcib_attach_common(dev); - - sc = device_get_softc(dev); - if (sc->bus.sec != 0) { - child = device_add_child(dev, "pci", -1); - if (child != NULL) - return (bus_generic_attach(dev)); - } - - return (0); -} - static device_method_t fsl_pcib_rc_methods[] = { DEVMETHOD(device_probe, fsl_pcib_rc_probe), - DEVMETHOD(device_attach, fsl_pcib_rc_attach), DEVMETHOD_END };
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511220116.tAM1GhDJ052603>