aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_dma.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2009-01-23 15:57:47 -0500
committerDave Airlie <airlied@linux.ie>2009-02-08 06:37:50 -0500
commitab657db12d7020629f26f30d287558a8d0e32b41 (patch)
tree66672f54f4958beae00b98d0bb1f464ff9e08a65 /drivers/gpu/drm/i915/i915_dma.c
parent725e30ad6601d7fe443d9215d6331758a9d7e0c8 (diff)
drm/i915: Set up an MTRR covering the GTT at driver load.
We'd love to just be using PAT, but even on chips with PAT it gets disabled sometimes due to an errata. It would probably be better to have pat_enabled exported and only bother with this when !pat_enabled. Signed-off-by: Eric Anholt <eric@anholt.net> Signed-off-by: Dave Airlie <airlied@linux.ie>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_dma.c')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index ee64b7301f6..1e01e784715 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -966,10 +966,6 @@ static int i915_load_modeset_init(struct drm_device *dev)
966 if (ret) 966 if (ret)
967 goto kfree_devname; 967 goto kfree_devname;
968 968
969 dev_priv->mm.gtt_mapping =
970 io_mapping_create_wc(dev->agp->base,
971 dev->agp->agp_info.aper_size * 1024*1024);
972
973 /* Allow hardware batchbuffers unless told otherwise. 969 /* Allow hardware batchbuffers unless told otherwise.
974 */ 970 */
975 dev_priv->allow_batchbuffer = 1; 971 dev_priv->allow_batchbuffer = 1;
@@ -1081,6 +1077,23 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1081 goto free_priv; 1077 goto free_priv;
1082 } 1078 }
1083 1079
1080 dev_priv->mm.gtt_mapping =
1081 io_mapping_create_wc(dev->agp->base,
1082 dev->agp->agp_info.aper_size * 1024*1024);
1083 /* Set up a WC MTRR for non-PAT systems. This is more common than
1084 * one would think, because the kernel disables PAT on first
1085 * generation Core chips because WC PAT gets overridden by a UC
1086 * MTRR if present. Even if a UC MTRR isn't present.
1087 */
1088 dev_priv->mm.gtt_mtrr = mtrr_add(dev->agp->base,
1089 dev->agp->agp_info.aper_size *
1090 1024 * 1024,
1091 MTRR_TYPE_WRCOMB, 1);
1092 if (dev_priv->mm.gtt_mtrr < 0) {
1093 DRM_INFO("MTRR allocation failed\n. Graphics "
1094 "performance may suffer.\n");
1095 }
1096
1084#ifdef CONFIG_HIGHMEM64G 1097#ifdef CONFIG_HIGHMEM64G
1085 /* don't enable GEM on PAE - needs agp + set_memory_* interface fixes */ 1098 /* don't enable GEM on PAE - needs agp + set_memory_* interface fixes */
1086 dev_priv->has_gem = 0; 1099 dev_priv->has_gem = 0;
@@ -1145,8 +1158,14 @@ int i915_driver_unload(struct drm_device *dev)
1145{ 1158{
1146 struct drm_i915_private *dev_priv = dev->dev_private; 1159 struct drm_i915_private *dev_priv = dev->dev_private;
1147 1160
1161 io_mapping_free(dev_priv->mm.gtt_mapping);
1162 if (dev_priv->mm.gtt_mtrr >= 0) {
1163 mtrr_del(dev_priv->mm.gtt_mtrr, dev->agp->base,
1164 dev->agp->agp_info.aper_size * 1024 * 1024);
1165 dev_priv->mm.gtt_mtrr = -1;
1166 }
1167
1148 if (drm_core_check_feature(dev, DRIVER_MODESET)) { 1168 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
1149 io_mapping_free(dev_priv->mm.gtt_mapping);
1150 drm_irq_uninstall(dev); 1169 drm_irq_uninstall(dev);
1151 } 1170 }
1152 1171