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 baa09f5fd8
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>
			
			
This commit is contained in:
		
							parent
							
								
									d46da43776
								
							
						
					
					
						commit
						41907ddc1b
					
				| @ -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); | ||||
| 
 | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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, | ||||
| 				     >t->mappable_base, | ||||
| 				     >t->mappable_end); | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user