|
@@ -36,6 +36,8 @@
|
|
|
#include "i915_drv.h"
|
|
|
#include "i915_trace.h"
|
|
|
#include <linux/pci.h>
|
|
|
+#include <linux/console.h>
|
|
|
+#include <linux/vt.h>
|
|
|
#include <linux/vgaarb.h>
|
|
|
#include <linux/acpi.h>
|
|
|
#include <linux/pnp.h>
|
|
@@ -1386,7 +1388,6 @@ cleanup_gem:
|
|
|
i915_gem_context_fini(dev);
|
|
|
mutex_unlock(&dev->struct_mutex);
|
|
|
WARN_ON(dev_priv->mm.aliasing_ppgtt);
|
|
|
- drm_mm_takedown(&dev_priv->gtt.base.mm);
|
|
|
cleanup_irq:
|
|
|
drm_irq_uninstall(dev);
|
|
|
cleanup_gem_stolen:
|
|
@@ -1450,6 +1451,38 @@ static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+#if !defined(CONFIG_VGA_CONSOLE)
|
|
|
+static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#elif !defined(CONFIG_DUMMY_CONSOLE)
|
|
|
+static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
|
|
|
+{
|
|
|
+ return -ENODEV;
|
|
|
+}
|
|
|
+#else
|
|
|
+static int i915_kick_out_vgacon(struct drm_i915_private *dev_priv)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ DRM_INFO("Replacing VGA console driver\n");
|
|
|
+
|
|
|
+ console_lock();
|
|
|
+ ret = do_take_over_console(&dummy_con, 0, MAX_NR_CONSOLES - 1, 1);
|
|
|
+ if (ret == 0) {
|
|
|
+ ret = do_unregister_con_driver(&vga_con);
|
|
|
+
|
|
|
+ /* Ignore "already unregistered". */
|
|
|
+ if (ret == -ENODEV)
|
|
|
+ ret = 0;
|
|
|
+ }
|
|
|
+ console_unlock();
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
static void i915_dump_device_info(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
const struct intel_device_info *info = &dev_priv->info;
|
|
@@ -1623,8 +1656,15 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
|
|
|
if (ret)
|
|
|
goto out_regs;
|
|
|
|
|
|
- if (drm_core_check_feature(dev, DRIVER_MODESET))
|
|
|
+ if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
|
|
+ ret = i915_kick_out_vgacon(dev_priv);
|
|
|
+ if (ret) {
|
|
|
+ DRM_ERROR("failed to remove conflicting VGA console\n");
|
|
|
+ goto out_gtt;
|
|
|
+ }
|
|
|
+
|
|
|
i915_kick_out_firmware_fb(dev_priv);
|
|
|
+ }
|
|
|
|
|
|
pci_set_master(dev->pdev);
|
|
|
|
|
@@ -1756,8 +1796,6 @@ out_mtrrfree:
|
|
|
arch_phys_wc_del(dev_priv->gtt.mtrr);
|
|
|
io_mapping_free(dev_priv->gtt.mappable);
|
|
|
out_gtt:
|
|
|
- list_del(&dev_priv->gtt.base.global_link);
|
|
|
- drm_mm_takedown(&dev_priv->gtt.base.mm);
|
|
|
dev_priv->gtt.base.cleanup(&dev_priv->gtt.base);
|
|
|
out_regs:
|
|
|
intel_uncore_fini(dev);
|
|
@@ -1846,7 +1884,6 @@ int i915_driver_unload(struct drm_device *dev)
|
|
|
i915_free_hws(dev);
|
|
|
}
|
|
|
|
|
|
- list_del(&dev_priv->gtt.base.global_link);
|
|
|
WARN_ON(!list_empty(&dev_priv->vm_list));
|
|
|
|
|
|
drm_vblank_cleanup(dev);
|