Tested-By: Jianshui Yu <jianshui...@intel.com>

-----Original Message-----
From: Gupta, Anshuman <anshuman.gu...@intel.com> 
Sent: Wednesday, August 16, 2023 8:52 PM
To: intel-gfx@lists.freedesktop.org
Cc: Nilawar, Badal <badal.nila...@intel.com>; Tauro, Riana 
<riana.ta...@intel.com>; Vivi, Rodrigo <rodrigo.v...@intel.com>; Yu, Jianshui 
<jianshui...@intel.com>; Wang, Lidong <lidong.w...@intel.com>; Gupta, Anshuman 
<anshuman.gu...@intel.com>; sta...@vger.kernel.org
Subject: [PATCH v2] drm/i915/dgfx: Enable d3cold at s2idle

System wide suspend already has support for lmem save/restore during suspend 
therefore enabling d3cold for s2idle and keepng it disable for runtime 
PM.(Refer below commit for d3cold runtime PM disable justification) 'commit 
66eb93e71a7a ("drm/i915/dgfx: Keep PCI autosuspend control 'on' by default on 
all dGPU")'

It will reduce the DG2 Card power consumption to ~0 Watt for s2idle power KPI.

v2:
- Added "Cc: sta...@vger.kernel.org".

Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/8755
Cc: sta...@vger.kernel.org
Cc: Rodrigo Vivi <rodrigo.v...@intel.com>
Signed-off-by: Anshuman Gupta <anshuman.gu...@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.v...@intel.com>
---
 drivers/gpu/drm/i915/i915_driver.c | 33 ++++++++++++++++--------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_driver.c 
b/drivers/gpu/drm/i915/i915_driver.c
index b870c0df081a..ec4d26b3c17c 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -443,7 +443,6 @@ static int i915_pcode_init(struct drm_i915_private *i915)  
static int i915_driver_hw_probe(struct drm_i915_private *dev_priv)  {
        struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
-       struct pci_dev *root_pdev;
        int ret;
 
        if (i915_inject_probe_failure(dev_priv))
@@ -557,15 +556,6 @@ static int i915_driver_hw_probe(struct drm_i915_private 
*dev_priv)
 
        intel_bw_init_hw(dev_priv);
 
-       /*
-        * FIXME: Temporary hammer to avoid freezing the machine on our DGFX
-        * This should be totally removed when we handle the pci states properly
-        * on runtime PM and on s2idle cases.
-        */
-       root_pdev = pcie_find_root_port(pdev);
-       if (root_pdev)
-               pci_d3cold_disable(root_pdev);
-
        return 0;
 
 err_opregion:
@@ -591,7 +581,6 @@ static int i915_driver_hw_probe(struct drm_i915_private 
*dev_priv)  static void i915_driver_hw_remove(struct drm_i915_private 
*dev_priv)  {
        struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
-       struct pci_dev *root_pdev;
 
        i915_perf_fini(dev_priv);
 
@@ -599,10 +588,6 @@ static void i915_driver_hw_remove(struct drm_i915_private 
*dev_priv)
 
        if (pdev->msi_enabled)
                pci_disable_msi(pdev);
-
-       root_pdev = pcie_find_root_port(pdev);
-       if (root_pdev)
-               pci_d3cold_enable(root_pdev);
 }
 
 /**
@@ -1519,6 +1504,8 @@ static int intel_runtime_suspend(struct device *kdev)  {
        struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
        struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
+       struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
+       struct pci_dev *root_pdev;
        struct intel_gt *gt;
        int ret, i;
 
@@ -1570,6 +1557,15 @@ static int intel_runtime_suspend(struct device *kdev)
                drm_err(&dev_priv->drm,
                        "Unclaimed access detected prior to suspending\n");
 
+       /*
+        * FIXME: Temporary hammer to avoid freezing the machine on our DGFX
+        * This should be totally removed when we handle the pci states properly
+        * on runtime PM.
+        */
+       root_pdev = pcie_find_root_port(pdev);
+       if (root_pdev)
+               pci_d3cold_disable(root_pdev);
+
        rpm->suspended = true;
 
        /*
@@ -1608,6 +1604,8 @@ static int intel_runtime_resume(struct device *kdev)  {
        struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
        struct intel_runtime_pm *rpm = &dev_priv->runtime_pm;
+       struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
+       struct pci_dev *root_pdev;
        struct intel_gt *gt;
        int ret, i;
 
@@ -1621,6 +1619,11 @@ static int intel_runtime_resume(struct device *kdev)
 
        intel_opregion_notify_adapter(dev_priv, PCI_D0);
        rpm->suspended = false;
+
+       root_pdev = pcie_find_root_port(pdev);
+       if (root_pdev)
+               pci_d3cold_enable(root_pdev);
+
        if (intel_uncore_unclaimed_mmio(&dev_priv->uncore))
                drm_dbg(&dev_priv->drm,
                        "Unclaimed access during suspend, bios?\n");
--
2.25.1

Reply via email to