svn commit: r213336 - head/sys/powerpc/ofw

Nathan Whitehorn nwhitehorn at FreeBSD.org
Fri Oct 1 19:02:32 UTC 2010


Author: nwhitehorn
Date: Fri Oct  1 19:02:31 2010
New Revision: 213336
URL: http://svn.freebsd.org/changeset/base/213336

Log:
  Map the Open Firmware framebuffer console with write combining turned on,
  and set memory attributes appropriately for mmap() calls on /dev/console.
  Xorg no longer uses /dev/console to mmap the framebuffer, so framebuffer
  write combining support in X will arrive in the next patch.

Modified:
  head/sys/powerpc/ofw/ofw_syscons.c

Modified: head/sys/powerpc/ofw/ofw_syscons.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_syscons.c	Fri Oct  1 18:59:30 2010	(r213335)
+++ head/sys/powerpc/ofw/ofw_syscons.c	Fri Oct  1 19:02:31 2010	(r213336)
@@ -44,6 +44,7 @@ __FBSDID("$FreeBSD$");
 
 #include <machine/bus.h>
 #include <machine/sc_machdep.h>
+#include <machine/vm.h>
 
 #include <sys/rman.h>
 
@@ -280,7 +281,7 @@ ofwfb_configure(int flags)
 	OF_getprop(node, "address", &fb_phys, sizeof(fb_phys));
 
 	bus_space_map(&bs_be_tag, fb_phys, sc->sc_height * sc->sc_stride,
-	    0, &sc->sc_addr);
+	    BUS_SPACE_MAP_PREFETCHABLE, &sc->sc_addr);
 
 	/*
 	 * Get the PCI addresses of the adapter. The node may be the
@@ -632,8 +633,25 @@ ofwfb_mmap(video_adapter_t *adp, vm_ooff
 
 	sc = (struct ofwfb_softc *)adp;
 
-	if (sc->sc_num_pciaddrs == 0)
-		return (ENOMEM);
+	/*
+	 * Make sure the requested address lies within the PCI device's
+	 * assigned addrs
+	 */
+	for (i = 0; i < sc->sc_num_pciaddrs; i++)
+	  if (offset >= sc->sc_pciaddrs[i].phys_lo &&
+	    offset < (sc->sc_pciaddrs[i].phys_lo + sc->sc_pciaddrs[i].size_lo))
+		{
+			/*
+			 * If this is a prefetchable BAR, we can (and should)
+			 * enable write-combining.
+			 */
+			if (sc->sc_pciaddrs[i].phys_hi &
+			    OFW_PCI_PHYS_HI_PREFETCHABLE)
+				*memattr = VM_MEMATTR_WRITE_COMBINING;
+
+			*paddr = offset;
+			return (0);
+		}
 
 	/*
 	 * Hack for Radeon...
@@ -644,16 +662,6 @@ ofwfb_mmap(video_adapter_t *adp, vm_ooff
 	}
 
 	/*
-	 * Make sure the requested address lies within the PCI device's assigned addrs
-	 */
-	for (i = 0; i < sc->sc_num_pciaddrs; i++)
-		if (offset >= sc->sc_pciaddrs[i].phys_lo &&
-		    offset < (sc->sc_pciaddrs[i].phys_lo + sc->sc_pciaddrs[i].size_lo)) {
-			*paddr = offset;
-			return (0);
-		}
-
-	/*
 	 * This might be a legacy VGA mem request: if so, just point it at the
 	 * framebuffer, since it shouldn't be touched
 	 */
@@ -662,6 +670,12 @@ ofwfb_mmap(video_adapter_t *adp, vm_ooff
 		return (0);
 	}
 
+	/*
+	 * Error if we didn't have a better idea.
+	 */
+	if (sc->sc_num_pciaddrs == 0)
+		return (ENOMEM);
+
 	return (EINVAL);
 }
 


More information about the svn-src-all mailing list