]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/gpu/drm/i915/i915_dma.c
Merge branch 'drm-intel-next' of git://git.kernel.org/pub/scm/linux/kernel/git/anholt...
[karo-tx-linux.git] / drivers / gpu / drm / i915 / i915_dma.c
index ae7ec03900242542208b03a5bb184ef8438f2b00..45d507ebd3ff0bf192f1290d859b509779a356c6 100644 (file)
@@ -34,6 +34,7 @@
 #include "i915_drm.h"
 #include "i915_drv.h"
 #include "i915_trace.h"
+#include <linux/vgaarb.h>
 
 /* Really want an OS-independent resettable timer.  Would like to have
  * this loop run for (eg) 3 sec, but have the timer reset every time
@@ -1168,6 +1169,19 @@ static void i915_setup_compression(struct drm_device *dev, int size)
                  ll_base, size >> 20);
 }
 
+/* true = enable decode, false = disable decoder */
+static unsigned int i915_vga_set_decode(void *cookie, bool state)
+{
+       struct drm_device *dev = cookie;
+
+       intel_modeset_vga_set_state(dev, state);
+       if (state)
+               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;
+}
+
 static int i915_load_modeset_init(struct drm_device *dev,
                                  unsigned long prealloc_start,
                                  unsigned long prealloc_size,
@@ -1233,6 +1247,11 @@ static int i915_load_modeset_init(struct drm_device *dev,
        if (ret)
                DRM_INFO("failed to find VBIOS tables\n");
 
+       /* if we have > 1 VGA cards, then disable the radeon VGA resources */
+       ret = vga_client_register(dev->pdev, dev, NULL, i915_vga_set_decode);
+       if (ret)
+               goto destroy_ringbuffer;
+
        ret = drm_irq_install(dev);
        if (ret)
                goto destroy_ringbuffer;
@@ -1507,6 +1526,7 @@ int i915_driver_unload(struct drm_device *dev)
 
        if (drm_core_check_feature(dev, DRIVER_MODESET)) {
                drm_irq_uninstall(dev);
+               vga_client_register(dev->pdev, NULL, NULL, NULL);
        }
 
        if (dev->pdev->msi_enabled)