drm/i915: Fix gen2 mappable calculations
authorBen Widawsky <ben@bwidawsk.net>
Fri, 8 Feb 2013 19:32:47 +0000 (11:32 -0800)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 15 Feb 2013 09:30:38 +0000 (10:30 +0100)
When I refactored the code initially, I forgot that gen2 uses a
different bar for the CPU mappable aperture. The agp-less code knows
nothing of generations less than 5, so we have to expand the gtt_probe
function to include the mappable base and end.

It was originally broken by me:
commit baa09f5fd8a6d033ec075355dda99a65b7f6a0f3
Author: Ben Widawsky <ben@bwidawsk.net>
Date:   Thu Jan 24 13:49:57 2013 -0800

    drm/i915: Add probe and remove to the gtt ops

Reported-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/char/agp/intel-gtt.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem_gtt.c
include/drm/intel-gtt.h

index d8e7e6c9114e39007906f6e8483865a3f5bbb0c1..207e5c36e9eccca4a8007e8669fe444c4644e19a 100644 (file)
@@ -1371,10 +1371,13 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
 }
 EXPORT_SYMBOL(intel_gmch_probe);
 
-void intel_gtt_get(size_t *gtt_total, size_t *stolen_size)
+void intel_gtt_get(size_t *gtt_total, size_t *stolen_size,
+                  phys_addr_t *mappable_base, unsigned long *mappable_end)
 {
        *gtt_total = intel_private.gtt_total_entries << PAGE_SHIFT;
        *stolen_size = intel_private.stolen_size;
+       *mappable_base = intel_private.gma_bus_addr;
+       *mappable_end = intel_private.gtt_mappable_entries << PAGE_SHIFT;
 }
 EXPORT_SYMBOL(intel_gtt_get);
 
index a7860ea21af9b76bf6aa778651ed12033303215a..0f1d15bac51766afa133486ccb64fcbb75a4d70a 100644 (file)
@@ -399,7 +399,8 @@ struct i915_gtt {
 
        /* global gtt ops */
        int (*gtt_probe)(struct drm_device *dev, size_t *gtt_total,
-                         size_t *stolen);
+                         size_t *stolen, phys_addr_t *mappable_base,
+                         unsigned long *mappable_end);
        void (*gtt_remove)(struct drm_device *dev);
        void (*gtt_clear_range)(struct drm_device *dev,
                                unsigned int first_entry,
index bdaca3f4798829c62b7518a104b84a581a3036bd..926a1e2dd2349ea0aa5960bd4b0e089225631083 100644 (file)
@@ -725,7 +725,9 @@ static inline size_t gen7_get_stolen_size(u16 snb_gmch_ctl)
 
 static int gen6_gmch_probe(struct drm_device *dev,
                           size_t *gtt_total,
-                          size_t *stolen)
+                          size_t *stolen,
+                          phys_addr_t *mappable_base,
+                          unsigned long *mappable_end)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        phys_addr_t gtt_bus_addr;
@@ -733,11 +735,13 @@ static int gen6_gmch_probe(struct drm_device *dev,
        u16 snb_gmch_ctl;
        int ret;
 
+       *mappable_base = pci_resource_start(dev->pdev, 2);
+       *mappable_end = pci_resource_len(dev->pdev, 2);
+
        /* 64/512MB is the current min/max we actually know of, but this is just
         * a coarse sanity check.
         */
-       if ((dev_priv->gtt.mappable_end < (64<<20) ||
-            (dev_priv->gtt.mappable_end > (512<<20)))) {
+       if ((*mappable_end < (64<<20) || (*mappable_end > (512<<20)))) {
                DRM_ERROR("Unknown GMADR size (%lx)\n",
                          dev_priv->gtt.mappable_end);
                return -ENXIO;
@@ -782,7 +786,9 @@ static void gen6_gmch_remove(struct drm_device *dev)
 
 static int i915_gmch_probe(struct drm_device *dev,
                           size_t *gtt_total,
-                          size_t *stolen)
+                          size_t *stolen,
+                          phys_addr_t *mappable_base,
+                          unsigned long *mappable_end)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
@@ -793,7 +799,7 @@ static int i915_gmch_probe(struct drm_device *dev,
                return -EIO;
        }
 
-       intel_gtt_get(gtt_total, stolen);
+       intel_gtt_get(gtt_total, stolen, mappable_base, mappable_end);
 
        dev_priv->gtt.do_idle_maps = needs_idle_maps(dev_priv->dev);
        dev_priv->gtt.gtt_clear_range = i915_ggtt_clear_range;
@@ -814,9 +820,6 @@ int i915_gem_gtt_init(struct drm_device *dev)
        unsigned long gtt_size;
        int ret;
 
-       gtt->mappable_base = pci_resource_start(dev->pdev, 2);
-       gtt->mappable_end = pci_resource_len(dev->pdev, 2);
-
        if (INTEL_INFO(dev)->gen <= 5) {
                dev_priv->gtt.gtt_probe = i915_gmch_probe;
                dev_priv->gtt.gtt_remove = i915_gmch_remove;
@@ -826,7 +829,9 @@ int i915_gem_gtt_init(struct drm_device *dev)
        }
 
        ret = dev_priv->gtt.gtt_probe(dev, &dev_priv->gtt.total,
-                                    &dev_priv->gtt.stolen_size);
+                                    &dev_priv->gtt.stolen_size,
+                                    &gtt->mappable_base,
+                                    &gtt->mappable_end);
        if (ret)
                return ret;
 
index cf105557fea9718dad203c055f73dbde5ae1ee67..b08bdade60025679eeecff76746d98cd51f2e7df 100644 (file)
@@ -3,7 +3,8 @@
 #ifndef _DRM_INTEL_GTT_H
 #define        _DRM_INTEL_GTT_H
 
-void intel_gtt_get(size_t *gtt_total, size_t *stolen_size);
+void intel_gtt_get(size_t *gtt_total, size_t *stolen_size,
+                  phys_addr_t *mappable_base, unsigned long *mappable_end);
 
 int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
                     struct agp_bridge_data *bridge);