Merge tag 'drm-misc-next-2019-10-09-2' of git://anongit.freedesktop.org/drm/drm-misc...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / i915_drv.c
index dd9613e..9354924 100644 (file)
@@ -36,7 +36,6 @@
 #include <linux/pm_runtime.h>
 #include <linux/pnp.h>
 #include <linux/slab.h>
-#include <linux/vgaarb.h>
 #include <linux/vga_switcheroo.h>
 #include <linux/vt.h>
 #include <acpi/video.h>
 #include "display/intel_display_types.h"
 #include "display/intel_dp.h"
 #include "display/intel_fbdev.h"
-#include "display/intel_gmbus.h"
 #include "display/intel_hotplug.h"
 #include "display/intel_overlay.h"
 #include "display/intel_pipe_crc.h"
 #include "display/intel_sprite.h"
+#include "display/intel_vga.h"
 
 #include "gem/i915_gem_context.h"
 #include "gem/i915_gem_ioctls.h"
@@ -72,6 +71,7 @@
 #include "i915_perf.h"
 #include "i915_query.h"
 #include "i915_suspend.h"
+#include "i915_switcheroo.h"
 #include "i915_sysfs.h"
 #include "i915_trace.h"
 #include "i915_vgpu.h"
@@ -269,69 +269,8 @@ intel_teardown_mchbar(struct drm_i915_private *dev_priv)
                release_resource(&dev_priv->mch_res);
 }
 
-/* true = enable decode, false = disable decoder */
-static unsigned int i915_vga_set_decode(void *cookie, bool state)
-{
-       struct drm_i915_private *dev_priv = cookie;
-
-       intel_modeset_vga_set_state(dev_priv, 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_resume_switcheroo(struct drm_i915_private *i915);
-static int i915_suspend_switcheroo(struct drm_i915_private *i915,
-                                  pm_message_t state);
-
-static void i915_switcheroo_set_state(struct pci_dev *pdev, enum vga_switcheroo_state state)
-{
-       struct drm_i915_private *i915 = pdev_to_i915(pdev);
-       pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
-
-       if (!i915) {
-               dev_err(&pdev->dev, "DRM not initialized, aborting switch.\n");
-               return;
-       }
-
-       if (state == VGA_SWITCHEROO_ON) {
-               pr_info("switched on\n");
-               i915->drm.switch_power_state = DRM_SWITCH_POWER_CHANGING;
-               /* i915 resume handler doesn't set to D0 */
-               pci_set_power_state(pdev, PCI_D0);
-               i915_resume_switcheroo(i915);
-               i915->drm.switch_power_state = DRM_SWITCH_POWER_ON;
-       } else {
-               pr_info("switched off\n");
-               i915->drm.switch_power_state = DRM_SWITCH_POWER_CHANGING;
-               i915_suspend_switcheroo(i915, pmm);
-               i915->drm.switch_power_state = DRM_SWITCH_POWER_OFF;
-       }
-}
-
-static bool i915_switcheroo_can_switch(struct pci_dev *pdev)
-{
-       struct drm_i915_private *i915 = pdev_to_i915(pdev);
-
-       /*
-        * FIXME: open_count is protected by drm_global_mutex but that would lead to
-        * locking inversion with the driver load path. And the access here is
-        * completely racy anyway. So don't bother with locking for now.
-        */
-       return i915 && i915->drm.open_count == 0;
-}
-
-static const struct vga_switcheroo_client_ops i915_switcheroo_ops = {
-       .set_gpu_state = i915_switcheroo_set_state,
-       .reprobe = NULL,
-       .can_switch = i915_switcheroo_can_switch,
-};
-
 static int i915_driver_modeset_probe(struct drm_i915_private *i915)
 {
-       struct pci_dev *pdev = i915->drm.pdev;
        int ret;
 
        if (i915_inject_probe_failure(i915))
@@ -346,20 +285,13 @@ static int i915_driver_modeset_probe(struct drm_i915_private *i915)
 
        intel_bios_init(i915);
 
-       /* If we have > 1 VGA cards, then we need to arbitrate access
-        * to the common VGA resources.
-        *
-        * If we are a secondary display controller (!PCI_DISPLAY_CLASS_VGA),
-        * then we do not take part in VGA arbitration and the
-        * vga_client_register() fails with -ENODEV.
-        */
-       ret = vga_client_register(pdev, i915, NULL, i915_vga_set_decode);
-       if (ret && ret != -ENODEV)
+       ret = intel_vga_register(i915);
+       if (ret)
                goto out;
 
        intel_register_dsm_handler();
 
-       ret = vga_switcheroo_register_client(pdev, &i915_switcheroo_ops, false);
+       ret = i915_switcheroo_register(i915);
        if (ret)
                goto cleanup_vga_client;
 
@@ -374,8 +306,6 @@ static int i915_driver_modeset_probe(struct drm_i915_private *i915)
        if (ret)
                goto cleanup_csr;
 
-       intel_gmbus_setup(i915);
-
        /* Important: The output setup functions called by modeset_init need
         * working irqs for e.g. gmbus and dp aux transfers. */
        ret = intel_modeset_init(i915);
@@ -410,52 +340,25 @@ cleanup_modeset:
        intel_modeset_driver_remove(i915);
 cleanup_irq:
        intel_irq_uninstall(i915);
-       intel_gmbus_teardown(i915);
 cleanup_csr:
        intel_csr_ucode_fini(i915);
        intel_power_domains_driver_remove(i915);
-       vga_switcheroo_unregister_client(pdev);
+       i915_switcheroo_unregister(i915);
 cleanup_vga_client:
-       vga_client_register(pdev, NULL, NULL, NULL);
+       intel_vga_unregister(i915);
 out:
        return ret;
 }
 
-static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv)
-{
-       struct apertures_struct *ap;
-       struct pci_dev *pdev = dev_priv->drm.pdev;
-       struct i915_ggtt *ggtt = &dev_priv->ggtt;
-       bool primary;
-       int ret;
-
-       ap = alloc_apertures(1);
-       if (!ap)
-               return -ENOMEM;
-
-       ap->ranges[0].base = ggtt->gmadr.start;
-       ap->ranges[0].size = ggtt->mappable_end;
-
-       primary =
-               pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
-
-       ret = drm_fb_helper_remove_conflicting_framebuffers(ap, "inteldrmfb", primary);
-
-       kfree(ap);
-
-       return ret;
-}
-
 static void i915_driver_modeset_remove(struct drm_i915_private *i915)
 {
-       struct pci_dev *pdev = i915->drm.pdev;
-
        intel_modeset_driver_remove(i915);
 
        intel_bios_driver_remove(i915);
 
-       vga_switcheroo_unregister_client(pdev);
-       vga_client_register(pdev, NULL, NULL, NULL);
+       i915_switcheroo_unregister(i915);
+
+       intel_vga_unregister(i915);
 
        intel_csr_ucode_fini(i915);
 }
@@ -614,9 +517,7 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv)
 
        intel_gt_init_early(&dev_priv->gt, dev_priv);
 
-       ret = i915_gem_init_early(dev_priv);
-       if (ret < 0)
-               goto err_gt;
+       i915_gem_init_early(dev_priv);
 
        /* This must be called before any calls to HAS_PCH_* */
        intel_detect_pch(dev_priv);
@@ -638,7 +539,6 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv)
 
 err_gem:
        i915_gem_cleanup_early(dev_priv);
-err_gt:
        intel_gt_driver_late_release(&dev_priv->gt);
        vlv_free_s0ix_state(dev_priv);
 err_workqueues:
@@ -1262,21 +1162,9 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
        if (ret)
                goto err_perf;
 
-       /*
-        * WARNING: Apparently we must kick fbdev drivers before vgacon,
-        * otherwise the vga fbdev driver falls over.
-        */
-       ret = i915_kick_out_firmware_fb(dev_priv);
-       if (ret) {
-               DRM_ERROR("failed to remove conflicting framebuffer drivers\n");
-               goto err_ggtt;
-       }
-
-       ret = vga_remove_vgacon(pdev);
-       if (ret) {
-               DRM_ERROR("failed to remove conflicting VGA console\n");
+       ret = drm_fb_helper_remove_conflicting_pci_framebuffers(pdev, "inteldrmfb");
+       if (ret)
                goto err_ggtt;
-       }
 
        ret = i915_ggtt_init_hw(dev_priv);
        if (ret)
@@ -1725,10 +1613,8 @@ static void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
 {
        struct drm_i915_file_private *file_priv = file->driver_priv;
 
-       mutex_lock(&dev->struct_mutex);
        i915_gem_context_close(file);
        i915_gem_release(dev, file);
-       mutex_unlock(&dev->struct_mutex);
 
        kfree_rcu(file_priv, rcu);
 
@@ -1885,8 +1771,7 @@ out:
        return ret;
 }
 
-static int
-i915_suspend_switcheroo(struct drm_i915_private *i915, pm_message_t state)
+int i915_suspend_switcheroo(struct drm_i915_private *i915, pm_message_t state)
 {
        int error;
 
@@ -1918,10 +1803,8 @@ static int i915_drm_resume(struct drm_device *dev)
        if (ret)
                DRM_ERROR("failed to re-enable GGTT\n");
 
-       mutex_lock(&dev_priv->drm.struct_mutex);
        i915_gem_restore_gtt_mappings(dev_priv);
        i915_gem_restore_fences(dev_priv);
-       mutex_unlock(&dev_priv->drm.struct_mutex);
 
        intel_csr_ucode_resume(dev_priv);
 
@@ -2054,7 +1937,7 @@ static int i915_drm_resume_early(struct drm_device *dev)
        return ret;
 }
 
-static int i915_resume_switcheroo(struct drm_i915_private *i915)
+int i915_resume_switcheroo(struct drm_i915_private *i915)
 {
        int ret;