Merge tag 'drm-intel-next-2022-07-06' of git://anongit.freedesktop.org/drm/drm-intel...
[linux-2.6-microblaze.git] / drivers / gpu / drm / i915 / i915_driver.c
index a67f207..deb8a8b 100644 (file)
@@ -77,6 +77,7 @@
 #include "i915_file_private.h"
 #include "i915_debugfs.h"
 #include "i915_driver.h"
+#include "i915_drm_client.h"
 #include "i915_drv.h"
 #include "i915_getparam.h"
 #include "i915_ioc32.h"
 #include "intel_region_ttm.h"
 #include "vlv_suspend.h"
 
+/* Intel Rapid Start Technology ACPI device name */
+static const char irst_name[] = "INT3392";
+
 static const struct drm_driver i915_drm_driver;
 
 static int i915_get_bridge_dev(struct drm_i915_private *dev_priv)
@@ -322,9 +326,7 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv)
        intel_device_info_subplatform_init(dev_priv);
        intel_step_init(dev_priv);
 
-       intel_gt_init_early(to_gt(dev_priv), dev_priv);
        intel_uncore_mmio_debug_init_early(&dev_priv->mmio_debug);
-       intel_uncore_init_early(&dev_priv->uncore, to_gt(dev_priv));
 
        spin_lock_init(&dev_priv->irq_lock);
        spin_lock_init(&dev_priv->gpu_error.lock);
@@ -355,7 +357,9 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv)
 
        intel_wopcm_init_early(&dev_priv->wopcm);
 
-       __intel_gt_init_early(to_gt(dev_priv), dev_priv);
+       intel_root_gt_init_early(dev_priv);
+
+       i915_drm_clients_init(&dev_priv->clients, dev_priv);
 
        i915_gem_init_early(dev_priv);
 
@@ -376,7 +380,8 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv)
 
 err_gem:
        i915_gem_cleanup_early(dev_priv);
-       intel_gt_driver_late_release(to_gt(dev_priv));
+       intel_gt_driver_late_release_all(dev_priv);
+       i915_drm_clients_fini(&dev_priv->clients);
        intel_region_ttm_device_fini(dev_priv);
 err_ttm:
        vlv_suspend_cleanup(dev_priv);
@@ -395,7 +400,8 @@ static void i915_driver_late_release(struct drm_i915_private *dev_priv)
        intel_irq_fini(dev_priv);
        intel_power_domains_cleanup(dev_priv);
        i915_gem_cleanup_early(dev_priv);
-       intel_gt_driver_late_release(to_gt(dev_priv));
+       intel_gt_driver_late_release_all(dev_priv);
+       i915_drm_clients_fini(&dev_priv->clients);
        intel_region_ttm_device_fini(dev_priv);
        vlv_suspend_cleanup(dev_priv);
        i915_workqueues_cleanup(dev_priv);
@@ -426,13 +432,9 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
        if (ret < 0)
                return ret;
 
-       ret = intel_uncore_setup_mmio(&dev_priv->uncore);
-       if (ret < 0)
-               goto err_bridge;
-
        ret = intel_uncore_init_mmio(&dev_priv->uncore);
        if (ret)
-               goto err_mmio;
+               return ret;
 
        /* Try to make sure MCHBAR is enabled before poking at it */
        intel_setup_mchbar(dev_priv);
@@ -450,9 +452,6 @@ static int i915_driver_mmio_probe(struct drm_i915_private *dev_priv)
 err_uncore:
        intel_teardown_mchbar(dev_priv);
        intel_uncore_fini_mmio(&dev_priv->uncore);
-err_mmio:
-       intel_uncore_cleanup_mmio(&dev_priv->uncore);
-err_bridge:
        pci_dev_put(dev_priv->bridge_dev);
 
        return ret;
@@ -466,7 +465,6 @@ static void i915_driver_mmio_release(struct drm_i915_private *dev_priv)
 {
        intel_teardown_mchbar(dev_priv);
        intel_uncore_fini_mmio(&dev_priv->uncore);
-       intel_uncore_cleanup_mmio(&dev_priv->uncore);
        pci_dev_put(dev_priv->bridge_dev);
 }
 
@@ -525,6 +523,22 @@ mask_err:
        return ret;
 }
 
+static int i915_pcode_init(struct drm_i915_private *i915)
+{
+       struct intel_gt *gt;
+       int id, ret;
+
+       for_each_gt(gt, i915, id) {
+               ret = intel_pcode_init(gt->uncore);
+               if (ret) {
+                       drm_err(&gt->i915->drm, "gt%d: intel_pcode_init failed %d\n", id, ret);
+                       return ret;
+               }
+       }
+
+       return 0;
+}
+
 /**
  * i915_driver_hw_probe - setup state requiring device access
  * @dev_priv: device private
@@ -593,7 +607,7 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
        if (ret)
                goto err_ggtt;
 
-       ret = intel_gt_probe_lmem(to_gt(dev_priv));
+       ret = intel_gt_tiles_init(dev_priv);
        if (ret)
                goto err_mem_regions;
 
@@ -635,7 +649,7 @@ static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)
 
        intel_opregion_setup(dev_priv);
 
-       ret = intel_pcode_init(&dev_priv->uncore);
+       ret = i915_pcode_init(dev_priv);
        if (ret)
                goto err_msi;
 
@@ -856,10 +870,14 @@ int i915_driver_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        intel_vgpu_detect(i915);
 
-       ret = i915_driver_mmio_probe(i915);
+       ret = intel_gt_probe_all(i915);
        if (ret < 0)
                goto out_runtime_pm_put;
 
+       ret = i915_driver_mmio_probe(i915);
+       if (ret < 0)
+               goto out_tiles_cleanup;
+
        ret = i915_driver_hw_probe(i915);
        if (ret < 0)
                goto out_cleanup_mmio;
@@ -916,6 +934,8 @@ out_cleanup_hw:
        i915_ggtt_driver_late_release(i915);
 out_cleanup_mmio:
        i915_driver_mmio_release(i915);
+out_tiles_cleanup:
+       intel_gt_release_all(i915);
 out_runtime_pm_put:
        enable_rpm_wakeref_asserts(&i915->runtime_pm);
        i915_driver_late_release(i915);
@@ -1019,6 +1039,7 @@ static void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
        struct drm_i915_file_private *file_priv = file->driver_priv;
 
        i915_gem_context_close(file);
+       i915_drm_client_put(file_priv->client);
 
        kfree_rcu(file_priv, rcu);
 
@@ -1256,7 +1277,7 @@ static int i915_drm_resume(struct drm_device *dev)
 
        disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
-       ret = intel_pcode_init(&dev_priv->uncore);
+       ret = i915_pcode_init(dev_priv);
        if (ret)
                return ret;
 
@@ -1428,6 +1449,8 @@ static int i915_pm_suspend(struct device *kdev)
                return -ENODEV;
        }
 
+       i915_ggtt_mark_pte_lost(i915, false);
+
        if (i915->drm.switch_power_state == DRM_SWITCH_POWER_OFF)
                return 0;
 
@@ -1480,6 +1503,14 @@ static int i915_pm_resume(struct device *kdev)
        if (i915->drm.switch_power_state == DRM_SWITCH_POWER_OFF)
                return 0;
 
+       /*
+        * If IRST is enabled, or if we can't detect whether it's enabled,
+        * then we must assume we lost the GGTT page table entries, since
+        * they are not retained if IRST decided to enter S4.
+        */
+       if (!IS_ENABLED(CONFIG_ACPI) || acpi_dev_present(irst_name, NULL, -1))
+               i915_ggtt_mark_pte_lost(i915, true);
+
        return i915_drm_resume(&i915->drm);
 }
 
@@ -1539,6 +1570,9 @@ static int i915_pm_restore_early(struct device *kdev)
 
 static int i915_pm_restore(struct device *kdev)
 {
+       struct drm_i915_private *i915 = kdev_to_i915(kdev);
+
+       i915_ggtt_mark_pte_lost(i915, true);
        return i915_pm_resume(kdev);
 }
 
@@ -1732,6 +1766,9 @@ static const struct file_operations i915_driver_fops = {
        .read = drm_read,
        .compat_ioctl = i915_ioc32_compat_ioctl,
        .llseek = noop_llseek,
+#ifdef CONFIG_PROC_FS
+       .show_fdinfo = i915_drm_client_fdinfo,
+#endif
 };
 
 static int