| From 3eee396d8db215999c6243d77632d51e35653496 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> |
| Date: Thu, 5 Sep 2013 20:40:52 +0300 |
| Subject: drm/i915: Delay disabling of VGA memory until vgacon->fbcon handoff |
| is done |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| 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> |
| (cherry picked from commit 6e1b4fdad5157bb9e88777d525704aba24389bee) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_dma.c | 6 ++++++ |
| drivers/gpu/drm/i915/intel_display.c | 27 ++++++++++++++++----------- |
| drivers/gpu/drm/i915/intel_drv.h | 1 + |
| 3 files changed, 23 insertions(+), 11 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/i915_dma.c |
| +++ b/drivers/gpu/drm/i915/i915_dma.c |
| @@ -1359,6 +1359,12 @@ static int i915_load_modeset_init(struct |
| */ |
| intel_fbdev_initial_config(dev); |
| |
| + /* |
| + * Must do this after fbcon init so that |
| + * vgacon_save_screen() works during the handover. |
| + */ |
| + i915_disable_vga_mem(dev); |
| + |
| /* Only enable hotplug handling once the fbdev is fully set up. */ |
| dev_priv->enable_hotplug_processing = true; |
| |
| --- a/drivers/gpu/drm/i915/intel_display.c |
| +++ b/drivers/gpu/drm/i915/intel_display.c |
| @@ -10065,15 +10065,6 @@ static void i915_disable_vga(struct drm_ |
| outb(SR01, VGA_SR_INDEX); |
| sr1 = inb(VGA_SR_DATA); |
| outb(sr1 | 1<<5, VGA_SR_DATA); |
| - |
| - /* Disable VGA memory on Intel HD */ |
| - if (HAS_PCH_SPLIT(dev)) { |
| - outb(inb(VGA_MSR_READ) & ~VGA_MSR_MEM_EN, VGA_MSR_WRITE); |
| - vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO | |
| - VGA_RSRC_NORMAL_IO | |
| - VGA_RSRC_NORMAL_MEM); |
| - } |
| - |
| vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); |
| udelay(300); |
| |
| @@ -10081,7 +10072,7 @@ static void i915_disable_vga(struct drm_ |
| POSTING_READ(vga_reg); |
| } |
| |
| -static void i915_enable_vga(struct drm_device *dev) |
| +static void i915_enable_vga_mem(struct drm_device *dev) |
| { |
| /* Enable VGA memory on Intel HD */ |
| if (HAS_PCH_SPLIT(dev)) { |
| @@ -10095,6 +10086,19 @@ static void i915_enable_vga(struct drm_d |
| } |
| } |
| |
| +void i915_disable_vga_mem(struct drm_device *dev) |
| +{ |
| + /* Disable VGA memory on Intel HD */ |
| + if (HAS_PCH_SPLIT(dev)) { |
| + vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO); |
| + outb(inb(VGA_MSR_READ) & ~VGA_MSR_MEM_EN, VGA_MSR_WRITE); |
| + vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO | |
| + VGA_RSRC_NORMAL_IO | |
| + VGA_RSRC_NORMAL_MEM); |
| + vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); |
| + } |
| +} |
| + |
| void intel_modeset_init_hw(struct drm_device *dev) |
| { |
| intel_init_power_well(dev); |
| @@ -10375,6 +10379,7 @@ void i915_redisable_vga(struct drm_devic |
| if (I915_READ(vga_reg) != VGA_DISP_DISABLE) { |
| DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n"); |
| i915_disable_vga(dev); |
| + i915_disable_vga_mem(dev); |
| } |
| } |
| |
| @@ -10590,7 +10595,7 @@ void intel_modeset_cleanup(struct drm_de |
| |
| intel_disable_fbc(dev); |
| |
| - i915_enable_vga(dev); |
| + i915_enable_vga_mem(dev); |
| |
| intel_disable_gt_powersave(dev); |
| |
| --- a/drivers/gpu/drm/i915/intel_drv.h |
| +++ b/drivers/gpu/drm/i915/intel_drv.h |
| @@ -798,5 +798,6 @@ extern void hsw_pc8_disable_interrupts(s |
| extern void hsw_pc8_restore_interrupts(struct drm_device *dev); |
| extern void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv); |
| extern void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv); |
| +extern void i915_disable_vga_mem(struct drm_device *dev); |
| |
| #endif /* __INTEL_DRV_H__ */ |