summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-11-18 13:01:41 +0000
committerkib <kib@FreeBSD.org>2014-11-18 13:01:41 +0000
commit1ce4957ffdf838d8da5d64f55e16a53af6aff248 (patch)
tree42a88545cc1355bf0a545508e28ba2437f47ba18 /sys/dev
parente4b2ee7e2b8167b0254356fea784913422730087 (diff)
downloadFreeBSD-src-1ce4957ffdf838d8da5d64f55e16a53af6aff248.zip
FreeBSD-src-1ce4957ffdf838d8da5d64f55e16a53af6aff248.tar.gz
MFC r274377:
On 965 and higher, map GTT as write-combining.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/agp/agp_i810.c51
1 files changed, 43 insertions, 8 deletions
diff --git a/sys/dev/agp/agp_i810.c b/sys/dev/agp/agp_i810.c
index 725aa99..e28aff1 100644
--- a/sys/dev/agp/agp_i810.c
+++ b/sys/dev/agp/agp_i810.c
@@ -113,6 +113,8 @@ static int agp_sb_get_gtt_total_entries(device_t dev);
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_i810_g965_driver = {
.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_i810_g4x_driver = {
.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_i810_sb_driver = {
.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;
OpenPOWER on IntegriCloud