drm/agp/i915: trim stolen space to 32M
Subsystems (3)
PATCH 1/1 drm/agp/i915: trim stolen space to 32M
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.
--- drivers/char/agp/intel-gtt.c | 11 ++++++++++- drivers/gpu/drm/i915/i915_dma.c | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletions(-)
drivers/char/agp/intel-gtt.c +10 -1
@@ -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 );
drivers/gpu/drm/i915/i915_dma.c +8 -0
@@ -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" );
Signature · 1 line
1.7.0.1
Quoted 10 lines · Jesse Barnes
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:
Quoted 60 lines
--- drivers/char/agp/intel-gtt.c | 11 ++++++++++- drivers/gpu/drm/i915/i915_dma.c | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletions(-)drivers/char/agp/intel-gtt.c +10
-1@@ -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 );(quoted diff) +0
-0
b/drivers/gpu/drm/i915/i915_dma.cindex e2dd903..69e25ab 100644drivers/gpu/drm/i915/i915_dma.c +2
-0@@ -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.
drivers/gpu/drm/i915/i915_dma.c +6
-0@@ -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" );
Signature · 4 lines
Simon Farnsworth Software Engineer ONELAN Limited http://www.onelan.com/
Quoted 7 lines · Simon Farnsworth
Quoted 6 lines · Jesse Barnes
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.
Quoted 7 lines
Quoted 4 lines
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]>
Heh, you were meant to say:
"What? Export a magic parameter from intel-gtt.c to indicate how much space to remove from the aperture guestimate, but not replace the *broken* code in i915_dma.c with an interface from intel-gtt.c to query and control the populated GTT more precisely?"
;-)
-ickle
Signature · 1 line
Chris Wilson, Intel Open Source Technology Centre
Quoted 16 lines · On Thu, 08 Jul 2010 17:42:19 +0100 Chris Wilson <[email protected]>…
Quoted 7 lines · Simon Farnsworth
Quoted 6 lines · Jesse Barnes
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.
Quoted 7 lines
Quoted 4 lines
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]>
Quoted 6 lines
Heh, you were meant to say:
"What? Export a magic parameter from
intel-gtt.cto indicate how much space to remove from the aperture guestimate, but not replace the *broken* code ini915_dma.cwith an interface fromintel-gtt.cto query and control the populated GTT more precisely?"
Yeah, that's what this patch does. It'll all be killed by Daniel's AGP rework though!
Signature · 1 line
Jesse Barnes, Intel Open Source Technology Center