Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 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>

authored by

Ben Widawsky and committed by
Daniel Vetter
41907ddc d46da437

+22 -12
+4 -1
drivers/char/agp/intel-gtt.c
··· 1371 1371 } 1372 1372 EXPORT_SYMBOL(intel_gmch_probe); 1373 1373 1374 - void intel_gtt_get(size_t *gtt_total, size_t *stolen_size) 1374 + void intel_gtt_get(size_t *gtt_total, size_t *stolen_size, 1375 + phys_addr_t *mappable_base, unsigned long *mappable_end) 1375 1376 { 1376 1377 *gtt_total = intel_private.gtt_total_entries << PAGE_SHIFT; 1377 1378 *stolen_size = intel_private.stolen_size; 1379 + *mappable_base = intel_private.gma_bus_addr; 1380 + *mappable_end = intel_private.gtt_mappable_entries << PAGE_SHIFT; 1378 1381 } 1379 1382 EXPORT_SYMBOL(intel_gtt_get); 1380 1383
+2 -1
drivers/gpu/drm/i915/i915_drv.h
··· 399 399 400 400 /* global gtt ops */ 401 401 int (*gtt_probe)(struct drm_device *dev, size_t *gtt_total, 402 - size_t *stolen); 402 + size_t *stolen, phys_addr_t *mappable_base, 403 + unsigned long *mappable_end); 403 404 void (*gtt_remove)(struct drm_device *dev); 404 405 void (*gtt_clear_range)(struct drm_device *dev, 405 406 unsigned int first_entry,
+14 -9
drivers/gpu/drm/i915/i915_gem_gtt.c
··· 725 725 726 726 static int gen6_gmch_probe(struct drm_device *dev, 727 727 size_t *gtt_total, 728 - size_t *stolen) 728 + size_t *stolen, 729 + phys_addr_t *mappable_base, 730 + unsigned long *mappable_end) 729 731 { 730 732 struct drm_i915_private *dev_priv = dev->dev_private; 731 733 phys_addr_t gtt_bus_addr; ··· 735 733 u16 snb_gmch_ctl; 736 734 int ret; 737 735 736 + *mappable_base = pci_resource_start(dev->pdev, 2); 737 + *mappable_end = pci_resource_len(dev->pdev, 2); 738 + 738 739 /* 64/512MB is the current min/max we actually know of, but this is just 739 740 * a coarse sanity check. 740 741 */ 741 - if ((dev_priv->gtt.mappable_end < (64<<20) || 742 - (dev_priv->gtt.mappable_end > (512<<20)))) { 742 + if ((*mappable_end < (64<<20) || (*mappable_end > (512<<20)))) { 743 743 DRM_ERROR("Unknown GMADR size (%lx)\n", 744 744 dev_priv->gtt.mappable_end); 745 745 return -ENXIO; ··· 786 782 787 783 static int i915_gmch_probe(struct drm_device *dev, 788 784 size_t *gtt_total, 789 - size_t *stolen) 785 + size_t *stolen, 786 + phys_addr_t *mappable_base, 787 + unsigned long *mappable_end) 790 788 { 791 789 struct drm_i915_private *dev_priv = dev->dev_private; 792 790 int ret; ··· 799 793 return -EIO; 800 794 } 801 795 802 - intel_gtt_get(gtt_total, stolen); 796 + intel_gtt_get(gtt_total, stolen, mappable_base, mappable_end); 803 797 804 798 dev_priv->gtt.do_idle_maps = needs_idle_maps(dev_priv->dev); 805 799 dev_priv->gtt.gtt_clear_range = i915_ggtt_clear_range; ··· 820 814 unsigned long gtt_size; 821 815 int ret; 822 816 823 - gtt->mappable_base = pci_resource_start(dev->pdev, 2); 824 - gtt->mappable_end = pci_resource_len(dev->pdev, 2); 825 - 826 817 if (INTEL_INFO(dev)->gen <= 5) { 827 818 dev_priv->gtt.gtt_probe = i915_gmch_probe; 828 819 dev_priv->gtt.gtt_remove = i915_gmch_remove; ··· 829 826 } 830 827 831 828 ret = dev_priv->gtt.gtt_probe(dev, &dev_priv->gtt.total, 832 - &dev_priv->gtt.stolen_size); 829 + &dev_priv->gtt.stolen_size, 830 + &gtt->mappable_base, 831 + &gtt->mappable_end); 833 832 if (ret) 834 833 return ret; 835 834
+2 -1
include/drm/intel-gtt.h
··· 3 3 #ifndef _DRM_INTEL_GTT_H 4 4 #define _DRM_INTEL_GTT_H 5 5 6 - void intel_gtt_get(size_t *gtt_total, size_t *stolen_size); 6 + void intel_gtt_get(size_t *gtt_total, size_t *stolen_size, 7 + phys_addr_t *mappable_base, unsigned long *mappable_end); 7 8 8 9 int intel_gmch_probe(struct pci_dev *bridge_pdev, struct pci_dev *gpu_pdev, 9 10 struct agp_bridge_data *bridge);