|
|
@@ -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>
|
|
|
@@ -1449,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;
|
|
|
@@ -1622,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);
|
|
|
|