Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 21 Aug 2016 00:00:04 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r304551 - projects/powernv/powerpc/powernv
Message-ID:  <201608210000.u7L004Rt002562@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nwhitehorn
Date: Sun Aug 21 00:00:04 2016
New Revision: 304551
URL: https://svnweb.freebsd.org/changeset/base/304551

Log:
  Interpret Maxmem correctly when setting up DMA.

Modified:
  projects/powernv/powerpc/powernv/opal_pci.c

Modified: projects/powernv/powerpc/powernv/opal_pci.c
==============================================================================
--- projects/powernv/powerpc/powernv/opal_pci.c	Sat Aug 20 23:58:13 2016	(r304550)
+++ projects/powernv/powerpc/powernv/opal_pci.c	Sun Aug 21 00:00:04 2016	(r304551)
@@ -130,7 +130,8 @@ struct opalpci_softc {
 static devclass_t	opalpci_devclass;
 DEFINE_CLASS_1(pcib, opalpci_driver, opalpci_methods,
     sizeof(struct opalpci_softc), ofw_pci_driver);
-DRIVER_MODULE(opalpci, ofwbus, opalpci_driver, opalpci_devclass, 0, 0);
+EARLY_DRIVER_MODULE(opalpci, ofwbus, opalpci_driver, opalpci_devclass, 0, 0,
+    BUS_PASS_BUS);
 
 static int
 opalpci_probe(device_t dev)
@@ -189,6 +190,12 @@ opalpci_attach(device_t dev)
 		device_printf(dev, "IODA table reset failed: %d\n", err);
 		return (ENXIO);
 	}
+	while ((err = opal_call(OPAL_PCI_POLL, sc->phb_id)) > 0)
+		DELAY(1000*err); /* Returns expected delay in ms */
+	if (err < 0) {
+		device_printf(dev, "PHB IODA reset poll failed: %d\n", err);
+		return (ENXIO);
+	}
 
 	/*
 	 * Reset everything. Especially important if we have inherited the
@@ -266,9 +273,13 @@ opalpci_attach(device_t dev)
 	/*
 	 * Also disable the IOMMU for the time being for PE 1 (everything)
 	 */
+	if (bootverbose)
+		device_printf(dev, "Mapping 0-%#lx for DMA\n",
+		    roundup2(powerpc_ptob(Maxmem), 16*1024*1024));
 	err = opal_call(OPAL_PCI_MAP_PE_DMA_WINDOW_REAL, sc->phb_id,
-	    OPAL_PCI_DEFAULT_PE, 2, 0 /* start address */,
-	    roundup2(Maxmem, 16*1024*1024)/* all RAM */);
+	    OPAL_PCI_DEFAULT_PE, OPAL_PCI_DEFAULT_PE << 1,
+	    0 /* start address */, roundup2(powerpc_ptob(Maxmem),
+	    16*1024*1024)/* all RAM */);
 	if (err != 0) {
 		device_printf(dev, "DMA mapping failed: %d\n", err);
 		return (ENXIO);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201608210000.u7L004Rt002562>