What should be noted here is that by simply using the preset fifo sizes of 28, 31 we cannot accommodate the external display which requires 43 entires [43 >> 31].
As this is a 915 we should have 96 entries to play with, but the advice is not to modify the fifo sizes at runtime, so to test the hypothesis we can try setting the DSPARB to give the maximum bandwidth to external displays at init:
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 9ddb7b5..edaae6c 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1434,6 +1434,13 @@ static int i915_load_modeset_init(struct drm_device *dev,
I915_WRITE(INSTPM, (1 << 5) | (1 << 21));
+ /* XXX hack for bug 22996, preset the FIFO to accommodate a 2048 external display */
+ {
+ uint32_t size = I915_READ(DSPARB) & 0x7f;
+ size = (95 - size) << DSPARB_CSTART_SHIFT;
+ I915_WRITE(DSPARB, size);
+ }
+
ret = intel_fbdev_init(dev);
if (ret) goto cleanup_irq;
The argument centers around:
[drm:intel_ update_ watermarks] , plane B (pipe 0) clock: 138500 update_ watermarks] , plane A (pipe 1) clock: 68940 get_fifo_ size], FIFO size - (0x00001d9c) A: 28 get_fifo_ size], FIFO size - (0x00001d9c) B: 31 calculate_ wm], FIFO entries required for mode: 21 calculate_ wm], FIFO watermark level: 5 calculate_ wm], FIFO entries required for mode: 43 calculate_ wm], FIFO watermark level: -14 update_ wm], FIFO watermarks - A: 5, B: 1 update_ wm], Setting FIFO watermarks - A: 5, B: 1, C: 2, SR 1
[drm:intel_
[drm:i9xx_
[drm:i9xx_
[drm:intel_
[drm:intel_
[drm:intel_
[drm:intel_
[drm:i9xx_
[drm:i9xx_
What should be noted here is that by simply using the preset fifo sizes of 28, 31 we cannot accommodate the external display which requires 43 entires [43 >> 31].
As this is a 915 we should have 96 entries to play with, but the advice is not to modify the fifo sizes at runtime, so to test the hypothesis we can try setting the DSPARB to give the maximum bandwidth to external displays at init:
diff --git a/drivers/ gpu/drm/ i915/i915_ dma.c b/drivers/ gpu/drm/ i915/i915_ dma.c gpu/drm/ i915/i915_ dma.c gpu/drm/ i915/i915_ dma.c modeset_ init(struct drm_device *dev,
index 9ddb7b5..edaae6c 100644
--- a/drivers/
+++ b/drivers/
@@ -1434,6 +1434,13 @@ static int i915_load_
+ /* XXX hack for bug 22996, preset the FIFO to accommodate a 2048 external display */ CSTART_ SHIFT; init(dev) ;
goto cleanup_irq;
+ {
+ uint32_t size = I915_READ(DSPARB) & 0x7f;
+ size = (95 - size) << DSPARB_
+ I915_WRITE(DSPARB, size);
+ }
+
ret = intel_fbdev_
if (ret)