Commit 41907ddc authored by Ben Widawsky's avatar Ben Widawsky Committed by Daniel Vetter

drm/i915: Fix gen2 mappable calculations

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 baa09f5f
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: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarBen Widawsky <ben@bwidawsk.net>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent d46da437
...@@ -1371,10 +1371,13 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev, ...@@ -1371,10 +1371,13 @@ int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
} }
EXPORT_SYMBOL(intel_gmch_probe); 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; *gtt_total = intel_private.gtt_total_entries << PAGE_SHIFT;
*stolen_size = intel_private.stolen_size; *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); EXPORT_SYMBOL(intel_gtt_get);
......
...@@ -399,7 +399,8 @@ struct i915_gtt { ...@@ -399,7 +399,8 @@ struct i915_gtt {
/* global gtt ops */ /* global gtt ops */
int (*gtt_probe)(struct drm_device *dev, size_t *gtt_total, 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_remove)(struct drm_device *dev);
void (*gtt_clear_range)(struct drm_device *dev, void (*gtt_clear_range)(struct drm_device *dev,
unsigned int first_entry, unsigned int first_entry,
......
...@@ -725,7 +725,9 @@ static inline size_t gen7_get_stolen_size(u16 snb_gmch_ctl) ...@@ -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, static int gen6_gmch_probe(struct drm_device *dev,
size_t *gtt_total, 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; struct drm_i915_private *dev_priv = dev->dev_private;
phys_addr_t gtt_bus_addr; phys_addr_t gtt_bus_addr;
...@@ -733,11 +735,13 @@ static int gen6_gmch_probe(struct drm_device *dev, ...@@ -733,11 +735,13 @@ static int gen6_gmch_probe(struct drm_device *dev,
u16 snb_gmch_ctl; u16 snb_gmch_ctl;
int ret; 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 /* 64/512MB is the current min/max we actually know of, but this is just
* a coarse sanity check. * a coarse sanity check.
*/ */
if ((dev_priv->gtt.mappable_end < (64<<20) || if ((*mappable_end < (64<<20) || (*mappable_end > (512<<20)))) {
(dev_priv->gtt.mappable_end > (512<<20)))) {
DRM_ERROR("Unknown GMADR size (%lx)\n", DRM_ERROR("Unknown GMADR size (%lx)\n",
dev_priv->gtt.mappable_end); dev_priv->gtt.mappable_end);
return -ENXIO; return -ENXIO;
...@@ -782,7 +786,9 @@ static void gen6_gmch_remove(struct drm_device *dev) ...@@ -782,7 +786,9 @@ static void gen6_gmch_remove(struct drm_device *dev)
static int i915_gmch_probe(struct drm_device *dev, static int i915_gmch_probe(struct drm_device *dev,
size_t *gtt_total, 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; struct drm_i915_private *dev_priv = dev->dev_private;
int ret; int ret;
...@@ -793,7 +799,7 @@ static int i915_gmch_probe(struct drm_device *dev, ...@@ -793,7 +799,7 @@ static int i915_gmch_probe(struct drm_device *dev,
return -EIO; 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.do_idle_maps = needs_idle_maps(dev_priv->dev);
dev_priv->gtt.gtt_clear_range = i915_ggtt_clear_range; dev_priv->gtt.gtt_clear_range = i915_ggtt_clear_range;
...@@ -814,9 +820,6 @@ int i915_gem_gtt_init(struct drm_device *dev) ...@@ -814,9 +820,6 @@ int i915_gem_gtt_init(struct drm_device *dev)
unsigned long gtt_size; unsigned long gtt_size;
int ret; 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) { if (INTEL_INFO(dev)->gen <= 5) {
dev_priv->gtt.gtt_probe = i915_gmch_probe; dev_priv->gtt.gtt_probe = i915_gmch_probe;
dev_priv->gtt.gtt_remove = i915_gmch_remove; dev_priv->gtt.gtt_remove = i915_gmch_remove;
...@@ -826,7 +829,9 @@ int i915_gem_gtt_init(struct drm_device *dev) ...@@ -826,7 +829,9 @@ int i915_gem_gtt_init(struct drm_device *dev)
} }
ret = dev_priv->gtt.gtt_probe(dev, &dev_priv->gtt.total, 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) if (ret)
return ret; return ret;
......
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
#ifndef _DRM_INTEL_GTT_H #ifndef _DRM_INTEL_GTT_H
#define _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, int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev,
struct agp_bridge_data *bridge); struct agp_bridge_data *bridge);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment