diff options
| -rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 25 | ||||
| -rw-r--r-- | include/linux/vgaarb.h | 7 |
3 files changed, 38 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index fdaa0915ce56..3de60503378e 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1290,9 +1290,12 @@ static int i915_load_modeset_init(struct drm_device *dev) | |||
| 1290 | * then we do not take part in VGA arbitration and the | 1290 | * then we do not take part in VGA arbitration and the |
| 1291 | * vga_client_register() fails with -ENODEV. | 1291 | * vga_client_register() fails with -ENODEV. |
| 1292 | */ | 1292 | */ |
| 1293 | ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode); | 1293 | if (!HAS_PCH_SPLIT(dev)) { |
| 1294 | if (ret && ret != -ENODEV) | 1294 | ret = vga_client_register(dev->pdev, dev, NULL, |
| 1295 | goto out; | 1295 | i915_vga_set_decode); |
| 1296 | if (ret && ret != -ENODEV) | ||
| 1297 | goto out; | ||
| 1298 | } | ||
| 1296 | 1299 | ||
| 1297 | intel_register_dsm_handler(); | 1300 | intel_register_dsm_handler(); |
| 1298 | 1301 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index a1e502b07266..73dec62f871f 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -10041,6 +10041,15 @@ static void i915_disable_vga(struct drm_device *dev) | |||
| 10041 | outb(SR01, VGA_SR_INDEX); | 10041 | outb(SR01, VGA_SR_INDEX); |
| 10042 | sr1 = inb(VGA_SR_DATA); | 10042 | sr1 = inb(VGA_SR_DATA); |
| 10043 | outb(sr1 | 1<<5, VGA_SR_DATA); | 10043 | outb(sr1 | 1<<5, VGA_SR_DATA); |
| 10044 | |||
| 10045 | /* Disable VGA memory on Intel HD */ | ||
| 10046 | if (HAS_PCH_SPLIT(dev)) { | ||
| 10047 | outb(inb(VGA_MSR_READ) & ~VGA_MSR_MEM_EN, VGA_MSR_WRITE); | ||
| 10048 | vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO | | ||
| 10049 | VGA_RSRC_NORMAL_IO | | ||
| 10050 | VGA_RSRC_NORMAL_MEM); | ||
| 10051 | } | ||
| 10052 | |||
| 10044 | vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); | 10053 | vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); |
| 10045 | udelay(300); | 10054 | udelay(300); |
| 10046 | 10055 | ||
| @@ -10048,6 +10057,20 @@ static void i915_disable_vga(struct drm_device *dev) | |||
| 10048 | POSTING_READ(vga_reg); | 10057 | POSTING_READ(vga_reg); |
| 10049 | } | 10058 | } |
| 10050 | 10059 | ||
| 10060 | static void i915_enable_vga(struct drm_device *dev) | ||
| 10061 | { | ||
| 10062 | /* Enable VGA memory on Intel HD */ | ||
| 10063 | if (HAS_PCH_SPLIT(dev)) { | ||
| 10064 | vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO); | ||
| 10065 | outb(inb(VGA_MSR_READ) | VGA_MSR_MEM_EN, VGA_MSR_WRITE); | ||
| 10066 | vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO | | ||
| 10067 | VGA_RSRC_LEGACY_MEM | | ||
| 10068 | VGA_RSRC_NORMAL_IO | | ||
| 10069 | VGA_RSRC_NORMAL_MEM); | ||
| 10070 | vga_put(dev->pdev, VGA_RSRC_LEGACY_IO); | ||
| 10071 | } | ||
| 10072 | } | ||
| 10073 | |||
| 10051 | void intel_modeset_init_hw(struct drm_device *dev) | 10074 | void intel_modeset_init_hw(struct drm_device *dev) |
| 10052 | { | 10075 | { |
| 10053 | intel_init_power_well(dev); | 10076 | intel_init_power_well(dev); |
| @@ -10539,6 +10562,8 @@ void intel_modeset_cleanup(struct drm_device *dev) | |||
| 10539 | 10562 | ||
| 10540 | intel_disable_fbc(dev); | 10563 | intel_disable_fbc(dev); |
| 10541 | 10564 | ||
| 10565 | i915_enable_vga(dev); | ||
| 10566 | |||
| 10542 | intel_disable_gt_powersave(dev); | 10567 | intel_disable_gt_powersave(dev); |
| 10543 | 10568 | ||
| 10544 | ironlake_teardown_rc6(dev); | 10569 | ironlake_teardown_rc6(dev); |
diff --git a/include/linux/vgaarb.h b/include/linux/vgaarb.h index 2c02f3a8d2ba..80cf8173a65b 100644 --- a/include/linux/vgaarb.h +++ b/include/linux/vgaarb.h | |||
| @@ -65,8 +65,15 @@ struct pci_dev; | |||
| 65 | * out of the arbitration process (and can be safe to take | 65 | * out of the arbitration process (and can be safe to take |
| 66 | * interrupts at any time. | 66 | * interrupts at any time. |
| 67 | */ | 67 | */ |
| 68 | #if defined(CONFIG_VGA_ARB) | ||
| 68 | extern void vga_set_legacy_decoding(struct pci_dev *pdev, | 69 | extern void vga_set_legacy_decoding(struct pci_dev *pdev, |
| 69 | unsigned int decodes); | 70 | unsigned int decodes); |
| 71 | #else | ||
| 72 | static inline void vga_set_legacy_decoding(struct pci_dev *pdev, | ||
| 73 | unsigned int decodes) | ||
| 74 | { | ||
| 75 | } | ||
| 76 | #endif | ||
| 70 | 77 | ||
| 71 | /** | 78 | /** |
| 72 | * vga_get - acquire & locks VGA resources | 79 | * vga_get - acquire & locks VGA resources |
