[Intel-gfx] [PATCH] drm/agp/i915: trim stolen space to 32M

Jesse Barnes jbarnes at virtuousgeek.org
Thu Jul 8 18:01:44 CEST 2010


On Thu, 8 Jul 2010 10:58:21 +0100
Simon Farnsworth <simon.farnsworth at onelan.com> wrote:

> On Wednesday 7 July 2010, Jesse Barnes <jbarnes at virtuousgeek.org> wrote:
> > Some BIOSes will claim a large chunk of stolen space.  Unless we
> > reclaim it, our aperture for remapping buffer objects will be
> > constrained.  So clamp the stolen space to 32M and ignore the rest.
> > 
> I'm not sure that this changelog fits the patch - if I'm understanding the code 
> correctly, you're clamping to 16M, not 32M.
> 
> Apart from that, the code looks sensible.

Oops updated to 32M for Ironlake but didn't update the changelog or
comments.

> 
> > diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
> > index f97122a..54ed0e1 100644
> > --- a/drivers/char/agp/intel-gtt.c
> > +++ b/drivers/char/agp/intel-gtt.c
> > @@ -25,6 +25,10 @@
> >  #define USE_PCI_DMA_API 1
> >  #endif
> > 
> > +/* Max amount of stolen space, anything above will be returned to Linux */
> > +int intel_max_stolen = 16 * 1024 * 1024;
> 
> This is 16M, not 32M
> 
> > +EXPORT_SYMBOL(intel_max_stolen);
> > +
> >  static const struct aper_size_info_fixed intel_i810_sizes[] =
> >  {
> >  	{64, 16384, 4},
> > @@ -710,7 +714,12 @@ static void intel_i830_init_gtt_entries(void)
> >  			break;
> >  		}
> >  	}
> > -	if (gtt_entries > 0) {
> > +	if (!local && gtt_entries > intel_max_stolen) {
> > +		dev_info(&agp_bridge->dev->dev,
> > +			 "detected %dK stolen memory, trimming to %dK\n",
> > +			 gtt_entries / KB(1), intel_max_stolen / KB(1));
> > +		gtt_entries = intel_max_stolen / KB(4);
> 
> This appears to limit to intel_max_stolen bytes, not intel_max_stolen * 2 
> bytes.

I think that's what I want to do, so I'm not sure what you mean?  Each
GTT entry covers a 4k page so we have to convert the total size into
the number of entries...

> 
> > +	} else if (gtt_entries > 0) {
> >  		dev_info(&agp_bridge->dev->dev, "detected %dK %s memory\n",
> >  		       gtt_entries / KB(1), local ? "local" : "stolen");
> >  		gtt_entries /= KB(4);
> > diff --git a/drivers/gpu/drm/i915/i915_dma.c
> > b/drivers/gpu/drm/i915/i915_dma.c index e2dd903..69e25ab 100644
> > --- a/drivers/gpu/drm/i915/i915_dma.c
> > +++ b/drivers/gpu/drm/i915/i915_dma.c
> > @@ -40,6 +40,8 @@
> >  #include <linux/vga_switcheroo.h>
> >  #include <linux/slab.h>
> > 
> > +extern int intel_max_stolen; /* from AGP driver */
> > +
> >  /**
> >   * Sets up the hardware status page for devices that need a physical
> > address * in the register.
> > @@ -2105,6 +2107,12 @@ int i915_driver_load(struct drm_device *dev,
> > unsigned long flags) if (ret)
> >  		goto out_iomapfree;
> > 
> > +	if (prealloc_size > intel_max_stolen) {
> > +		DRM_INFO("detected %dM stolen memory, trimming to %dM\n",
> > +			 prealloc_size >> 20, intel_max_stolen >> 20);
> > +		prealloc_size = intel_max_stolen;
> 
> And again here, you appear to limit to intel_max_stolen, not to twice that.
> 
> > +	}
> > +
> >  	dev_priv->wq = create_singlethread_workqueue("i915");
> >  	if (dev_priv->wq == NULL) {
> >  		DRM_ERROR("Failed to create our workqueue.\n");


-- 
Jesse Barnes, Intel Open Source Technology Center



More information about the Intel-gfx mailing list