svn commit: r274649 - stable/10/sys/dev/agp

Konstantin Belousov kib at FreeBSD.org
Tue Nov 18 13:01:42 UTC 2014


Author: kib
Date: Tue Nov 18 13:01:41 2014
New Revision: 274649
URL: https://svnweb.freebsd.org/changeset/base/274649

Log:
  MFC r274377:
  On 965 and higher, map GTT as write-combining.

Modified:
  stable/10/sys/dev/agp/agp_i810.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/agp/agp_i810.c
==============================================================================
--- stable/10/sys/dev/agp/agp_i810.c	Tue Nov 18 12:53:32 2014	(r274648)
+++ stable/10/sys/dev/agp/agp_i810.c	Tue Nov 18 13:01:41 2014	(r274649)
@@ -113,6 +113,8 @@ static int agp_sb_get_gtt_total_entries(
 
 static int agp_i810_install_gatt(device_t dev);
 static int agp_i830_install_gatt(device_t dev);
+static int agp_i965_install_gatt(device_t dev);
+static int agp_g4x_install_gatt(device_t dev);
 
 static void agp_i810_deinstall_gatt(device_t dev);
 static void agp_i830_deinstall_gatt(device_t dev);
@@ -395,7 +397,7 @@ static const struct agp_i810_driver agp_
 	.get_stolen_size = agp_i915_get_stolen_size,
 	.get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
 	.get_gtt_total_entries = agp_i965_get_gtt_total_entries,
-	.install_gatt = agp_i830_install_gatt,
+	.install_gatt = agp_i965_install_gatt,
 	.deinstall_gatt = agp_i830_deinstall_gatt,
 	.write_gtt = agp_i965_write_gtt,
 	.install_gtt_pte = agp_i965_install_gtt_pte,
@@ -464,7 +466,7 @@ static const struct agp_i810_driver agp_
 	.get_stolen_size = agp_i915_get_stolen_size,
 	.get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
 	.get_gtt_total_entries = agp_gen5_get_gtt_total_entries,
-	.install_gatt = agp_i830_install_gatt,
+	.install_gatt = agp_g4x_install_gatt,
 	.deinstall_gatt = agp_i830_deinstall_gatt,
 	.write_gtt = agp_g4x_write_gtt,
 	.install_gtt_pte = agp_g4x_install_gtt_pte,
@@ -487,7 +489,7 @@ static const struct agp_i810_driver agp_
 	.get_stolen_size = agp_sb_get_stolen_size,
 	.get_gtt_mappable_entries = agp_i915_get_gtt_mappable_entries,
 	.get_gtt_total_entries = agp_sb_get_gtt_total_entries,
-	.install_gatt = agp_i830_install_gatt,
+	.install_gatt = agp_g4x_install_gatt,
 	.deinstall_gatt = agp_i830_deinstall_gatt,
 	.write_gtt = agp_sb_write_gtt,
 	.install_gtt_pte = agp_sb_install_gtt_pte,
@@ -1405,14 +1407,11 @@ agp_i810_install_gatt(device_t dev)
 	return (0);
 }
 
-static int
-agp_i830_install_gatt(device_t dev)
+static void
+agp_i830_install_gatt_init(struct agp_i810_softc *sc)
 {
-	struct agp_i810_softc *sc;
 	uint32_t pgtblctl;
 
-	sc = device_get_softc(dev);
-
 	/*
 	 * The i830 automatically initializes the 128k gatt on boot.
 	 * GATT address is already in there, make sure it's enabled.
@@ -1422,10 +1421,46 @@ agp_i830_install_gatt(device_t dev)
 	bus_write_4(sc->sc_res[0], AGP_I810_PGTBL_CTL, pgtblctl);
 	
 	sc->gatt->ag_physical = pgtblctl & ~1;
+}
+
+static int
+agp_i830_install_gatt(device_t dev)
+{
+	struct agp_i810_softc *sc;
+
+	sc = device_get_softc(dev);
+	agp_i830_install_gatt_init(sc);
 	return (0);
 }
 
 static int
+agp_gen4_install_gatt(device_t dev, const vm_size_t gtt_offset)
+{
+	struct agp_i810_softc *sc;
+
+	sc = device_get_softc(dev);
+	pmap_change_attr((vm_offset_t)rman_get_virtual(sc->sc_res[0]) +
+	    gtt_offset, rman_get_size(sc->sc_res[0]) - gtt_offset,
+	    VM_MEMATTR_WRITE_COMBINING);
+	agp_i830_install_gatt_init(sc);
+	return (0);
+}
+
+static int
+agp_i965_install_gatt(device_t dev)
+{
+
+	return (agp_gen4_install_gatt(dev, 512 * 1024));
+}
+
+static int
+agp_g4x_install_gatt(device_t dev)
+{
+
+	return (agp_gen4_install_gatt(dev, 2 * 1024 * 1024));
+}
+
+static int
 agp_i810_attach(device_t dev)
 {
 	struct agp_i810_softc *sc;


More information about the svn-src-stable-10 mailing list