On Thursday 8 July 2010, Jesse Barnes <[email protected]> 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. > > Fixes https://bugzilla.kernel.org/show_bug.cgi?id=15469 among others. > > Adding the ignored stolen memory back into the general pool using the > memory hotplug code is left as an exercise for the reader. > > Signed-off-by: Jesse Barnes <[email protected]>
FWIW, given how simple the code actually is: Reviewed-by: Simon Farnsworth <[email protected]> > --- > drivers/char/agp/intel-gtt.c | 11 ++++++++++- > drivers/gpu/drm/i915/i915_dma.c | 8 ++++++++ > 2 files changed, 18 insertions(+), 1 deletions(-) > > diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c > index f97122a..a61a87c 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 = 32 * 1024 * 1024; > +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); > + } 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; > + } > + > dev_priv->wq = create_singlethread_workqueue("i915"); > if (dev_priv->wq == NULL) { > DRM_ERROR("Failed to create our workqueue.\n"); -- Simon Farnsworth Software Engineer ONELAN Limited http://www.onelan.com/ _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
