-
-
Save anonymous/732acf9551136a78e91b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c | |
index 0cab2d0..5558f6f 100644 | |
--- a/drivers/gpu/drm/i915/i915_dma.c | |
+++ b/drivers/gpu/drm/i915/i915_dma.c | |
@@ -1290,9 +1290,13 @@ static int i915_load_modeset_init(struct drm_device *dev) | |
* then we do not take part in VGA arbitration and the | |
* vga_client_register() fails with -ENODEV. | |
*/ | |
- ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode); | |
- if (ret && ret != -ENODEV) | |
- goto out; | |
+ if (!HAS_PCH_SPLIT(dev)) { | |
+ ret = vga_client_register(dev->pdev, dev, NULL, | |
+ i915_vga_set_decode); | |
+ if (ret && ret != -ENODEV) | |
+ goto out; | |
+ } | |
+ | |
intel_register_dsm_handler(); | |
@@ -1352,6 +1356,12 @@ static int i915_load_modeset_init(struct drm_device *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. */ | |
dev_priv->enable_hotplug_processing = true; | |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | |
index 080f6fd..05527c9 100644 | |
--- a/drivers/gpu/drm/i915/intel_display.c | |
+++ b/drivers/gpu/drm/i915/intel_display.c | |
@@ -10592,6 +10592,33 @@ static void i915_disable_vga(struct drm_device *dev) | |
POSTING_READ(vga_reg); | |
} | |
+static void i915_enable_vga_mem(struct drm_device *dev) | |
+{ | |
+ /* Enable 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_LEGACY_MEM | | |
+ VGA_RSRC_NORMAL_IO | | |
+ VGA_RSRC_NORMAL_MEM); | |
+ vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); | |
+ } | |
+} | |
+ | |
+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) | |
{ | |
struct drm_i915_private *dev_priv = dev->dev_private; | |
@@ -10877,6 +10904,7 @@ void i915_redisable_vga(struct drm_device *dev) | |
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); | |
} | |
} | |
@@ -11082,6 +11110,8 @@ void intel_modeset_cleanup(struct drm_device *dev) | |
intel_disable_fbc(dev); | |
+ i915_enable_vga_mem(dev); | |
+ | |
intel_disable_gt_powersave(dev); | |
ironlake_teardown_rc6(dev); | |
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h | |
index a18e88b..af651d9 100644 | |
--- a/drivers/gpu/drm/i915/intel_drv.h | |
+++ b/drivers/gpu/drm/i915/intel_drv.h | |
@@ -843,6 +843,7 @@ void gen6_rps_idle(struct drm_i915_private *dev_priv); | |
void gen6_rps_boost(struct drm_i915_private *dev_priv); | |
void intel_aux_display_runtime_get(struct drm_i915_private *dev_priv); | |
void intel_aux_display_runtime_put(struct drm_i915_private *dev_priv); | |
+void i915_disable_vga_mem(struct drm_device *dev); | |
void ilk_wm_get_hw_state(struct drm_device *dev); | |
diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h | |
index 2c02f3a..87e7ec4 100644 | |
--- a/include/linux/vgaarb.h | |
+++ b/include/linux/vgaarb.h | |
@@ -65,8 +65,15 @@ struct pci_dev; | |
* out of the arbitration process (and can be safe to take | |
* interrupts at any time. | |
*/ | |
+#if defined(CONFIG_VGA_ARB) | |
extern void vga_set_legacy_decoding(struct pci_dev *pdev, | |
unsigned int decodes); | |
+#else | |
+static inline void vga_set_legacy_decoding(struct pci_dev *pdev, | |
+ unsigned int decodes) | |
+{ | |
+} | |
+#endif | |
/** | |
* vga_get - acquire & locks VGA resources |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment