Skip site navigation (1)Skip section navigation (2)
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>