Skip to contentSkip to conversation

drm/agp/i915: trim stolen space to 32M

PATCH In review Jesse Barnes 3 participants 4 messages Jul 8, 2010

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

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
index f97122a..a61a87c 100644
@@ -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
index e2dd903..69e25ab 100644
@@ -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
Reviewed-by on v1 1/1
#1 lore raw
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.

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
index f97122a..a61a87c 100644
@@ -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.c index e2dd903..69e25ab 100644

drivers/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/
#2 lore raw
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.

FWIW, given how simple the code actually is:

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
#3 lore raw
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.

FWIW, given how simple the code actually is:

Quoted 6 lines

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

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