aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-09-05 13:40:52 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-09-06 17:27:03 -0400
commit6e1b4fdad5157bb9e88777d525704aba24389bee (patch)
tree9b217d89a73fed7d314edef15005a5eda525e00d /drivers/gpu/drm
parentcac6a5ae0118832936eb162ec4cedb30f2422bcc (diff)
drm/i915: Delay disabling of VGA memory until vgacon->fbcon handoff is done
When transitioning away from vgacon the system tries to save the current contents of the VGA memory, so that it can be cleanly handed off to fbcon (or whatever comes afterwards). The recent change commit 81b5c7bc8de3e6f63419139c2fc91bf81dea8a7d Author: Alex Williamson <alex.williamson@redhat.com> Date: Wed Aug 28 09:39:08 2013 -0600 i915: Update VGA arbiter support for newer devices caused i915 to disable VGA memory decode for the IGD when i915 is initializing. Unfortunately that happens before the vgacon->fbcon handoff so vgacon_save_screen() will read out all ones from the VGA memory. After the handoff fbcon will inherit the bogus state from vgacon, and pre-fills the fb with matching contents. The end result is a white rectangle in the top left corner of the screen, the size of which matches the now inactive VGA console. To remedy the situation delay the disabling of VGA memory until the vgacon->fbcon handoff has happened. Also rename i915_enable_vga to i915_enable_vga_mem to make the relationship between these functions clearer. Cc: Alex Williamson <alex.williamson@redhat.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c6
-rw-r--r--drivers/gpu/drm/i915/intel_display.c27
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
3 files changed, 23 insertions, 11 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 3de60503378e..9b265a4c6a3d 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1351,6 +1351,12 @@ static int i915_load_modeset_init(struct drm_device *dev)
1351 */ 1351 */
1352 intel_fbdev_initial_config(dev); 1352 intel_fbdev_initial_config(dev);
1353 1353
1354 /*
1355 * Must do this after fbcon init so that
1356 * vgacon_save_screen() works during the handover.
1357 */
1358 i915_disable_vga_mem(dev);
1359
1354 /* Only enable hotplug handling once the fbdev is fully set up. */ 1360 /* Only enable hotplug handling once the fbdev is fully set up. */
1355 dev_priv->enable_hotplug_processing = true; 1361 dev_priv->enable_hotplug_processing = true;
1356 1362
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 0ee89011c19a..2489d0b4c7d2 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -10040,15 +10040,6 @@ static void i915_disable_vga(struct drm_device *dev)
10040 outb(SR01, VGA_SR_INDEX); 10040 outb(SR01, VGA_SR_INDEX);
10041 sr1 = inb(VGA_SR_DATA); 10041 sr1 = inb(VGA_SR_DATA);
10042 outb(sr1 | 1<<5, VGA_SR_DATA); 10042 outb(sr1 | 1<<5, VGA_SR_DATA);
10043
10044 /* Disable VGA memory on Intel HD */
10045 if (HAS_PCH_SPLIT(dev)) {
10046 outb(inb(VGA_MSR_READ) & ~VGA_MSR_MEM_EN, VGA_MSR_WRITE);
10047 vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO |
10048 VGA_RSRC_NORMAL_IO |
10049 VGA_RSRC_NORMAL_MEM);
10050 }
10051
10052 vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); 10043 vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
10053 udelay(300); 10044 udelay(300);
10054 10045
@@ -10056,7 +10047,7 @@ static void i915_disable_vga(struct drm_device *dev)
10056 POSTING_READ(vga_reg); 10047 POSTING_READ(vga_reg);
10057} 10048}
10058 10049
10059static void i915_enable_vga(struct drm_device *dev) 10050static void i915_enable_vga_mem(struct drm_device *dev)
10060{ 10051{
10061 /* Enable VGA memory on Intel HD */ 10052 /* Enable VGA memory on Intel HD */
10062 if (HAS_PCH_SPLIT(dev)) { 10053 if (HAS_PCH_SPLIT(dev)) {
@@ -10070,6 +10061,19 @@ static void i915_enable_vga(struct drm_device *dev)
10070 } 10061 }
10071} 10062}
10072 10063
10064void i915_disable_vga_mem(struct drm_device *dev)
10065{
10066 /* Disable VGA memory on Intel HD */
10067 if (HAS_PCH_SPLIT(dev)) {
10068 vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
10069 outb(inb(VGA_MSR_READ) & ~VGA_MSR_MEM_EN, VGA_MSR_WRITE);
10070 vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO |
10071 VGA_RSRC_NORMAL_IO |
10072 VGA_RSRC_NORMAL_MEM);
10073 vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
10074 }
10075}
10076
10073void intel_modeset_init_hw(struct drm_device *dev) 10077void intel_modeset_init_hw(struct drm_device *dev)
10074{ 10078{
10075 intel_init_power_well(dev); 10079 intel_init_power_well(dev);
@@ -10348,6 +10352,7 @@ void i915_redisable_vga(struct drm_device *dev)
10348 if (I915_READ(vga_reg) != VGA_DISP_DISABLE) { 10352 if (I915_READ(vga_reg) != VGA_DISP_DISABLE) {
10349 DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n"); 10353 DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
10350 i915_disable_vga(dev); 10354 i915_disable_vga(dev);
10355 i915_disable_vga_mem(dev);
10351 } 10356 }
10352} 10357}
10353 10358
@@ -10561,7 +10566,7 @@ void intel_modeset_cleanup(struct drm_device *dev)
10561 10566
10562 intel_disable_fbc(dev); 10567 intel_disable_fbc(dev);
10563 10568
10564 i915_enable_vga(dev); 10569 i915_enable_vga_mem(dev);
10565 10570
10566 intel_disable_gt_powersave(dev); 10571 intel_disable_gt_powersave(dev);
10567 10572
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index dbfe5f7bb3de..a47799e832c6 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -792,5 +792,6 @@ extern void hsw_pc8_disable_interrupts(struct drm_device *dev);
792extern void hsw_pc8_restore_interrupts(struct drm_device *dev); 792extern void hsw_pc8_restore_interrupts(struct drm_device *dev);
793extern void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv); 793extern void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv);
794extern void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv); 794extern void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv);
795extern void i915_disable_vga_mem(struct drm_device *dev);
795 796
796#endif /* __INTEL_DRV_H__ */ 797#endif /* __INTEL_DRV_H__ */