mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 23:21:31 +00:00
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 81b5c7bc8d
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>
This commit is contained in:
parent
cac6a5ae01
commit
6e1b4fdad5
@ -1351,6 +1351,12 @@ static int i915_load_modeset_init(struct drm_device *dev)
|
|||||||
*/
|
*/
|
||||||
intel_fbdev_initial_config(dev);
|
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. */
|
/* Only enable hotplug handling once the fbdev is fully set up. */
|
||||||
dev_priv->enable_hotplug_processing = true;
|
dev_priv->enable_hotplug_processing = true;
|
||||||
|
|
||||||
|
@ -10040,15 +10040,6 @@ static void i915_disable_vga(struct drm_device *dev)
|
|||||||
outb(SR01, VGA_SR_INDEX);
|
outb(SR01, VGA_SR_INDEX);
|
||||||
sr1 = inb(VGA_SR_DATA);
|
sr1 = inb(VGA_SR_DATA);
|
||||||
outb(sr1 | 1<<5, 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);
|
vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
|
||||||
udelay(300);
|
udelay(300);
|
||||||
|
|
||||||
@ -10056,7 +10047,7 @@ static void i915_disable_vga(struct drm_device *dev)
|
|||||||
POSTING_READ(vga_reg);
|
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 */
|
/* Enable VGA memory on Intel HD */
|
||||||
if (HAS_PCH_SPLIT(dev)) {
|
if (HAS_PCH_SPLIT(dev)) {
|
||||||
@ -10070,6 +10061,19 @@ static void i915_enable_vga(struct drm_device *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
void intel_modeset_init_hw(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
intel_init_power_well(dev);
|
intel_init_power_well(dev);
|
||||||
@ -10348,6 +10352,7 @@ void i915_redisable_vga(struct drm_device *dev)
|
|||||||
if (I915_READ(vga_reg) != VGA_DISP_DISABLE) {
|
if (I915_READ(vga_reg) != VGA_DISP_DISABLE) {
|
||||||
DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
|
DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
|
||||||
i915_disable_vga(dev);
|
i915_disable_vga(dev);
|
||||||
|
i915_disable_vga_mem(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10561,7 +10566,7 @@ void intel_modeset_cleanup(struct drm_device *dev)
|
|||||||
|
|
||||||
intel_disable_fbc(dev);
|
intel_disable_fbc(dev);
|
||||||
|
|
||||||
i915_enable_vga(dev);
|
i915_enable_vga_mem(dev);
|
||||||
|
|
||||||
intel_disable_gt_powersave(dev);
|
intel_disable_gt_powersave(dev);
|
||||||
|
|
||||||
|
@ -792,5 +792,6 @@ extern void hsw_pc8_disable_interrupts(struct drm_device *dev);
|
|||||||
extern void hsw_pc8_restore_interrupts(struct drm_device *dev);
|
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_get(struct drm_i915_private *dev_priv);
|
||||||
extern void intel_aux_display_runtime_put(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__ */
|
#endif /* __INTEL_DRV_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user