diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_vga.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_vga.c | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_vga.c b/drivers/gpu/drm/i915/display/intel_vga.c index 6e125564db34..c45c4bbc3f95 100644 --- a/drivers/gpu/drm/i915/display/intel_vga.c +++ b/drivers/gpu/drm/i915/display/intel_vga.c @@ -9,12 +9,12 @@ #include <drm/drm_device.h> #include <drm/drm_print.h> +#include <drm/intel/i915_drm.h> #include <video/vga.h> -#include "soc/intel_gmch.h" - #include "intel_de.h" #include "intel_display.h" +#include "intel_display_types.h" #include "intel_vga.h" #include "intel_vga_regs.h" @@ -95,6 +95,46 @@ void intel_vga_reset_io_mem(struct intel_display *display) vga_put(pdev, VGA_RSRC_LEGACY_IO); } +static int intel_gmch_vga_set_state(struct intel_display *display, bool enable_decode) +{ + struct pci_dev *pdev = to_pci_dev(display->drm->dev); + unsigned int reg = DISPLAY_VER(display) >= 6 ? SNB_GMCH_CTRL : INTEL_GMCH_CTRL; + u16 gmch_ctrl; + + if (pci_bus_read_config_word(pdev->bus, PCI_DEVFN(0, 0), reg, &gmch_ctrl)) { + drm_err(display->drm, "failed to read control word\n"); + return -EIO; + } + + if (!!(gmch_ctrl & INTEL_GMCH_VGA_DISABLE) == !enable_decode) + return 0; + + if (enable_decode) + gmch_ctrl &= ~INTEL_GMCH_VGA_DISABLE; + else + gmch_ctrl |= INTEL_GMCH_VGA_DISABLE; + + if (pci_bus_write_config_word(pdev->bus, PCI_DEVFN(0, 0), reg, gmch_ctrl)) { + drm_err(display->drm, "failed to write control word\n"); + return -EIO; + } + + return 0; +} + +static unsigned int intel_gmch_vga_set_decode(struct pci_dev *pdev, bool enable_decode) +{ + struct intel_display *display = to_intel_display(pdev); + + intel_gmch_vga_set_state(display, enable_decode); + + if (enable_decode) + return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM | + VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; + else + return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; +} + int intel_vga_register(struct intel_display *display) { |
