Author: kib
Date: Tue Nov 11 12:37:13 2014
New Revision: 274377
URL: https://svnweb.freebsd.org/changeset/base/274377

Log:
  On 965 and higher, map GTT as write-combining.
  
  Sponsored by: The FreeBSD Foundation
  MFC after:    1 week

Modified:
  head/sys/dev/agp/agp_i810.c

Modified: head/sys/dev/agp/agp_i810.c
==============================================================================
--- head/sys/dev/agp/agp_i810.c Tue Nov 11 12:05:59 2014        (r274376)
+++ head/sys/dev/agp/agp_i810.c Tue Nov 11 12:37:13 2014        (r274377)
@@ -115,6 +115,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);
@@ -397,7 +399,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,
@@ -466,7 +468,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,
@@ -489,7 +491,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,
@@ -1406,14 +1408,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.
@@ -1423,10 +1422,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;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to