intel-xe.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences
@ 2024-09-24 20:35 Rodrigo Vivi
  2024-09-24 20:35 ` [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display Rodrigo Vivi
                   ` (35 more replies)
  0 siblings, 36 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Reconcile i915's and xe's display power management sequences.

The main goal of this series is to ensure that the display
power management sequences from both drivers are fully aligned.
So, it needs to live under i915/display/ and xe_display_pm
can only be a wrapper to check for the xe's module
parameter before jumping in the i915/display functions.

During this process, it was clear that the Xe's runtime pm
sequences for integrated gfx (non d3cold capable) was totally
misaligned with i915 and prune to more bugs. So, this series ends
up fixing this and bringing a full alignment there as well.

The one new thing under i915 is the d3cold sequences. Apparently
that can be reduced, but for now this is what is validated and
stable on both DG2 and BMG. So, let's move that to the
i915/display side as well and continue on the improvements with
the code in the right place.

When I started this work I was hoping that I could run more
conversions to intel_display struct before moving things from
i915_driver.c to intel_display_driver, however that was a deeper
task and this series is already deep enough.

Cc: Imre Deak <imre.deak@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>


Rodrigo Vivi (31):
  drm/i915: Remove vga and gmbus seq out of i915_restore_display
  drm/i915/display: Convert i915_suspend into i9xx_display_sr
  drm/i915/display: Move regfile registers intel_display.restore
  drm/i915/display: Move shutdown sequences under display driver
  drm/xe: At shutdown disable commit helpers instead of flushing
  drm/xe: Use i915-display shutdown sequence directly
  drm/{i915,xe}/display: Move DP MST calls to display_driver
  drm/i915/display: Move suspend sequences to intel_display_driver
  drm/xe/display: Delay hpd_init resume
  drm/xe/display: Spin-off xe_display runtime/d3cold sequences
  drm/{i915,xe}: Consolidate display resume functions
  drm/i915: Remove lingering pci_save_state
  drm/{i915,xe}: Consolidate display suspend functions
  drm/i915/display: Move resume sequences to intel_display_driver
  drm/xe/display: Delay dsm handler registration
  drm/{i915,xe}: Move power_domains suspend/resume to display_power
  drm/{i915,xe}: Move remaining intel_power_domains to intel_display
  drm/i915/display: Split resume_noirq calls for now
  drm/xe/display: Align display resume sequence with i915
  drm/xe/display: Align suspend sequence with i915
  drm/{i915,xe}/display: Move dsm registration under intel_driver
  drm/i915/display: Move runtime pm related calls under
    intel_display_driver
  drm/xe/display: Prepare runtime pm functions
  drm/xe/display: Call intel_hpd_init on every runtime resume
  drm/xe/display: Move hpd_poll calls to later runtime stages
  drm/xe/display: Add missing watermark ipc update at runtime resume
  drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold
  drm/xe/display: Move display runtime suspend to a later point
  drm/xe/display: Kill crtc commit flush
  drm/xe/display: Add missing power display handling on non-d3cold rpm
  drm/{i915,xe}/display: Consolidade entire runtime pm sequence

 drivers/gpu/drm/i915/Makefile                 |   2 +-
 .../gpu/drm/i915/display/i9xx_display_sr.c    |  99 +++++++
 .../gpu/drm/i915/display/i9xx_display_sr.h    |  14 +
 .../gpu/drm/i915/display/intel_display_core.h |   5 +
 .../drm/i915/display/intel_display_driver.c   | 247 ++++++++++++++++++
 .../drm/i915/display/intel_display_driver.h   |  18 ++
 .../drm/i915/display/intel_display_power.c    |   6 +-
 .../drm/i915/display/intel_display_power.h    |   2 +-
 drivers/gpu/drm/i915/i915_driver.c            | 161 ++----------
 drivers/gpu/drm/i915/i915_drv.h               |   9 -
 drivers/gpu/drm/i915/i915_suspend.c           | 141 ----------
 drivers/gpu/drm/i915/i915_suspend.h           |  14 -
 drivers/gpu/drm/xe/display/xe_display.c       | 185 ++++---------
 drivers/gpu/drm/xe/display/xe_display.h       |  11 +-
 drivers/gpu/drm/xe/display/xe_fb_pin.c        |   8 +
 drivers/gpu/drm/xe/xe_device.c                |   4 +-
 drivers/gpu/drm/xe/xe_pm.c                    |  16 +-
 17 files changed, 498 insertions(+), 444 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.c
 create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.h
 delete mode 100644 drivers/gpu/drm/i915/i915_suspend.c
 delete mode 100644 drivers/gpu/drm/i915/i915_suspend.h

-- 
2.46.0


^ permalink raw reply	[flat|nested] 81+ messages in thread

* [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-09-25 10:20   ` Jani Nikula
  2024-10-07 19:15   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 02/31] drm/i915/display: Convert i915_suspend into i9xx_display_sr Rodrigo Vivi
                   ` (34 subsequent siblings)
  35 siblings, 2 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi, Jani Nikula

Restrict this function to only save and restore registers
functionality. Then, that can be moved out later to under
display with a proper name.

Cc: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/i915/i915_driver.c  | 6 ++++++
 drivers/gpu/drm/i915/i915_suspend.c | 6 ------
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 6dc0104a3e36..c5ffcf229f42 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -60,6 +60,7 @@
 #include "display/intel_pch_refclk.h"
 #include "display/intel_pps.h"
 #include "display/intel_sprite_uapi.h"
+#include "display/intel_vga.h"
 #include "display/skl_watermark.h"
 
 #include "gem/i915_gem_context.h"
@@ -1167,6 +1168,11 @@ static int i915_drm_resume(struct drm_device *dev)
 	intel_dmc_resume(display);
 
 	i915_restore_display(dev_priv);
+
+	intel_vga_redisable(display);
+
+	intel_gmbus_reset(dev_priv);
+
 	intel_pps_unlock_regs_wa(display);
 
 	intel_init_pch_refclk(dev_priv);
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
index 9d3d9b983032..fb67b05cd864 100644
--- a/drivers/gpu/drm/i915/i915_suspend.c
+++ b/drivers/gpu/drm/i915/i915_suspend.c
@@ -26,7 +26,6 @@
 
 #include "display/intel_de.h"
 #include "display/intel_gmbus.h"
-#include "display/intel_vga.h"
 
 #include "i915_drv.h"
 #include "i915_reg.h"
@@ -118,7 +117,6 @@ void i915_save_display(struct drm_i915_private *dev_priv)
 
 void i915_restore_display(struct drm_i915_private *dev_priv)
 {
-	struct intel_display *display = &dev_priv->display;
 	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
 
 	if (!HAS_DISPLAY(dev_priv))
@@ -134,8 +132,4 @@ void i915_restore_display(struct drm_i915_private *dev_priv)
 	if (GRAPHICS_VER(dev_priv) <= 4)
 		intel_de_write(dev_priv, DSPARB(dev_priv),
 			       dev_priv->regfile.saveDSPARB);
-
-	intel_vga_redisable(display);
-
-	intel_gmbus_reset(dev_priv);
 }
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 02/31] drm/i915/display: Convert i915_suspend into i9xx_display_sr
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
  2024-09-24 20:35 ` [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-01 13:21   ` Jani Nikula
  2024-10-07 19:15   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 03/31] drm/i915/display: Move regfile registers intel_display.restore Rodrigo Vivi
                   ` (33 subsequent siblings)
  35 siblings, 2 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi, Jesse Barnes, Jani Nikula

These save & restore functions inside i915_suspend are old display
functions to save and restore a bunch of display related registers.

Move it under display and rename accordantly. Just don't move it
entirely towards intel_display struct yet because it depends
on drm_i915_private for the IS_MOBILE.

While doing this conversion also update the MIT header using
the new SPDX ones.

v2: Fix Makefile and include (Jani)
    Removed vga and gmbus (Jani, Ville)

Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
Cc: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/i915/Makefile                 |   2 +-
 .../gpu/drm/i915/display/i9xx_display_sr.c    |  95 ++++++++++++
 .../gpu/drm/i915/display/i9xx_display_sr.h    |  14 ++
 drivers/gpu/drm/i915/i915_driver.c            |   6 +-
 drivers/gpu/drm/i915/i915_suspend.c           | 135 ------------------
 drivers/gpu/drm/i915/i915_suspend.h           |  14 --
 6 files changed, 113 insertions(+), 153 deletions(-)
 create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.c
 create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.h
 delete mode 100644 drivers/gpu/drm/i915/i915_suspend.c
 delete mode 100644 drivers/gpu/drm/i915/i915_suspend.h

diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 70771e521b1c..f21c28d471e7 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -30,7 +30,6 @@ i915-y += \
 	i915_params.o \
 	i915_pci.o \
 	i915_scatterlist.o \
-	i915_suspend.o \
 	i915_switcheroo.o \
 	i915_sysfs.o \
 	i915_utils.o \
@@ -219,6 +218,7 @@ i915-$(CONFIG_HWMON) += \
 i915-y += \
 	display/hsw_ips.o \
 	display/i9xx_plane.o \
+	display/i9xx_display_sr.o \
 	display/i9xx_wm.o \
 	display/intel_alpm.o \
 	display/intel_atomic.o \
diff --git a/drivers/gpu/drm/i915/display/i9xx_display_sr.c b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
new file mode 100644
index 000000000000..4dd0ce267994
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#include "i915_drv.h"
+#include "i915_reg.h"
+#include "i9xx_display_sr.h"
+#include "intel_de.h"
+#include "intel_gmbus.h"
+#include "intel_pci_config.h"
+
+static void i9xx_display_save_swf(struct drm_i915_private *i915)
+{
+	int i;
+
+	/* Scratch space */
+	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
+		for (i = 0; i < 7; i++) {
+			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
+			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
+		}
+		for (i = 0; i < 3; i++)
+			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
+	} else if (GRAPHICS_VER(i915) == 2) {
+		for (i = 0; i < 7; i++)
+			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
+	} else if (HAS_GMCH(i915)) {
+		for (i = 0; i < 16; i++) {
+			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
+			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
+		}
+		for (i = 0; i < 3; i++)
+			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
+	}
+}
+
+static void i9xx_display_restore_swf(struct drm_i915_private *i915)
+{
+	int i;
+
+	/* Scratch space */
+	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
+		for (i = 0; i < 7; i++) {
+			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
+			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
+		}
+		for (i = 0; i < 3; i++)
+			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
+	} else if (GRAPHICS_VER(i915) == 2) {
+		for (i = 0; i < 7; i++)
+			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
+	} else if (HAS_GMCH(i915)) {
+		for (i = 0; i < 16; i++) {
+			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
+			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
+		}
+		for (i = 0; i < 3; i++)
+			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
+	}
+}
+
+void i9xx_display_sr_save(struct drm_i915_private *i915)
+{
+	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
+
+	if (!HAS_DISPLAY(i915))
+		return;
+
+	/* Display arbitration control */
+	if (GRAPHICS_VER(i915) <= 4)
+		i915->regfile.saveDSPARB = intel_de_read(i915, DSPARB(i915));
+
+	if (GRAPHICS_VER(i915) == 4)
+		pci_read_config_word(pdev, GCDGMBUS, &i915->regfile.saveGCDGMBUS);
+
+	i9xx_display_save_swf(i915);
+}
+
+void i9xx_display_sr_restore(struct drm_i915_private *i915)
+{
+	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
+
+	if (!HAS_DISPLAY(i915))
+		return;
+
+	i9xx_display_restore_swf(i915);
+
+	if (GRAPHICS_VER(i915) == 4)
+		pci_write_config_word(pdev, GCDGMBUS, i915->regfile.saveGCDGMBUS);
+
+	/* Display arbitration */
+	if (GRAPHICS_VER(i915) <= 4)
+		intel_de_write(i915, DSPARB(i915), i915->regfile.saveDSPARB);
+}
diff --git a/drivers/gpu/drm/i915/display/i9xx_display_sr.h b/drivers/gpu/drm/i915/display/i9xx_display_sr.h
new file mode 100644
index 000000000000..30383758f97e
--- /dev/null
+++ b/drivers/gpu/drm/i915/display/i9xx_display_sr.h
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Copyright © 2024 Intel Corporation
+ */
+
+#ifndef __I9XX_DISPLAY_SR_H__
+#define __I9XX_DISPLAY_SR_H__
+
+struct drm_i915_private;
+
+void i9xx_display_sr_save(struct drm_i915_private *i915);
+void i9xx_display_sr_restore(struct drm_i915_private *i915);
+
+#endif
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index c5ffcf229f42..ae5906885359 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -45,6 +45,7 @@
 #include <drm/drm_managed.h>
 #include <drm/drm_probe_helper.h>
 
+#include "display/i9xx_display_sr.h"
 #include "display/intel_acpi.h"
 #include "display/intel_bw.h"
 #include "display/intel_cdclk.h"
@@ -94,7 +95,6 @@
 #include "i915_memcpy.h"
 #include "i915_perf.h"
 #include "i915_query.h"
-#include "i915_suspend.h"
 #include "i915_switcheroo.h"
 #include "i915_sysfs.h"
 #include "i915_utils.h"
@@ -1048,7 +1048,7 @@ static int i915_drm_suspend(struct drm_device *dev)
 	intel_dpt_suspend(dev_priv);
 	i915_ggtt_suspend(to_gt(dev_priv)->ggtt);
 
-	i915_save_display(dev_priv);
+	i9xx_display_sr_save(dev_priv);
 
 	opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold;
 	intel_opregion_suspend(display, opregion_target_state);
@@ -1167,7 +1167,7 @@ static int i915_drm_resume(struct drm_device *dev)
 
 	intel_dmc_resume(display);
 
-	i915_restore_display(dev_priv);
+	i9xx_display_sr_restore(dev_priv);
 
 	intel_vga_redisable(display);
 
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
deleted file mode 100644
index fb67b05cd864..000000000000
--- a/drivers/gpu/drm/i915/i915_suspend.c
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *
- * Copyright 2008 (c) Intel Corporation
- *   Jesse Barnes <jbarnes@virtuousgeek.org>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include "display/intel_de.h"
-#include "display/intel_gmbus.h"
-
-#include "i915_drv.h"
-#include "i915_reg.h"
-#include "i915_suspend.h"
-#include "intel_pci_config.h"
-
-static void intel_save_swf(struct drm_i915_private *dev_priv)
-{
-	int i;
-
-	/* Scratch space */
-	if (GRAPHICS_VER(dev_priv) == 2 && IS_MOBILE(dev_priv)) {
-		for (i = 0; i < 7; i++) {
-			dev_priv->regfile.saveSWF0[i] = intel_de_read(dev_priv,
-								      SWF0(dev_priv, i));
-			dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv,
-								      SWF1(dev_priv, i));
-		}
-		for (i = 0; i < 3; i++)
-			dev_priv->regfile.saveSWF3[i] = intel_de_read(dev_priv,
-								      SWF3(dev_priv, i));
-	} else if (GRAPHICS_VER(dev_priv) == 2) {
-		for (i = 0; i < 7; i++)
-			dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv,
-								      SWF1(dev_priv, i));
-	} else if (HAS_GMCH(dev_priv)) {
-		for (i = 0; i < 16; i++) {
-			dev_priv->regfile.saveSWF0[i] = intel_de_read(dev_priv,
-								      SWF0(dev_priv, i));
-			dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv,
-								      SWF1(dev_priv, i));
-		}
-		for (i = 0; i < 3; i++)
-			dev_priv->regfile.saveSWF3[i] = intel_de_read(dev_priv,
-								      SWF3(dev_priv, i));
-	}
-}
-
-static void intel_restore_swf(struct drm_i915_private *dev_priv)
-{
-	int i;
-
-	/* Scratch space */
-	if (GRAPHICS_VER(dev_priv) == 2 && IS_MOBILE(dev_priv)) {
-		for (i = 0; i < 7; i++) {
-			intel_de_write(dev_priv, SWF0(dev_priv, i),
-				       dev_priv->regfile.saveSWF0[i]);
-			intel_de_write(dev_priv, SWF1(dev_priv, i),
-				       dev_priv->regfile.saveSWF1[i]);
-		}
-		for (i = 0; i < 3; i++)
-			intel_de_write(dev_priv, SWF3(dev_priv, i),
-				       dev_priv->regfile.saveSWF3[i]);
-	} else if (GRAPHICS_VER(dev_priv) == 2) {
-		for (i = 0; i < 7; i++)
-			intel_de_write(dev_priv, SWF1(dev_priv, i),
-				       dev_priv->regfile.saveSWF1[i]);
-	} else if (HAS_GMCH(dev_priv)) {
-		for (i = 0; i < 16; i++) {
-			intel_de_write(dev_priv, SWF0(dev_priv, i),
-				       dev_priv->regfile.saveSWF0[i]);
-			intel_de_write(dev_priv, SWF1(dev_priv, i),
-				       dev_priv->regfile.saveSWF1[i]);
-		}
-		for (i = 0; i < 3; i++)
-			intel_de_write(dev_priv, SWF3(dev_priv, i),
-				       dev_priv->regfile.saveSWF3[i]);
-	}
-}
-
-void i915_save_display(struct drm_i915_private *dev_priv)
-{
-	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
-
-	if (!HAS_DISPLAY(dev_priv))
-		return;
-
-	/* Display arbitration control */
-	if (GRAPHICS_VER(dev_priv) <= 4)
-		dev_priv->regfile.saveDSPARB = intel_de_read(dev_priv,
-							     DSPARB(dev_priv));
-
-	if (GRAPHICS_VER(dev_priv) == 4)
-		pci_read_config_word(pdev, GCDGMBUS,
-				     &dev_priv->regfile.saveGCDGMBUS);
-
-	intel_save_swf(dev_priv);
-}
-
-void i915_restore_display(struct drm_i915_private *dev_priv)
-{
-	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
-
-	if (!HAS_DISPLAY(dev_priv))
-		return;
-
-	intel_restore_swf(dev_priv);
-
-	if (GRAPHICS_VER(dev_priv) == 4)
-		pci_write_config_word(pdev, GCDGMBUS,
-				      dev_priv->regfile.saveGCDGMBUS);
-
-	/* Display arbitration */
-	if (GRAPHICS_VER(dev_priv) <= 4)
-		intel_de_write(dev_priv, DSPARB(dev_priv),
-			       dev_priv->regfile.saveDSPARB);
-}
diff --git a/drivers/gpu/drm/i915/i915_suspend.h b/drivers/gpu/drm/i915/i915_suspend.h
deleted file mode 100644
index e5a611ee3d15..000000000000
--- a/drivers/gpu/drm/i915/i915_suspend.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright © 2019 Intel Corporation
- */
-
-#ifndef __I915_SUSPEND_H__
-#define __I915_SUSPEND_H__
-
-struct drm_i915_private;
-
-void i915_save_display(struct drm_i915_private *i915);
-void i915_restore_display(struct drm_i915_private *i915);
-
-#endif /* __I915_SUSPEND_H__ */
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 03/31] drm/i915/display: Move regfile registers intel_display.restore
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
  2024-09-24 20:35 ` [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display Rodrigo Vivi
  2024-09-24 20:35 ` [PATCH 02/31] drm/i915/display: Convert i915_suspend into i9xx_display_sr Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 19:17   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 04/31] drm/i915/display: Move shutdown sequences under display driver Rodrigo Vivi
                   ` (32 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

The intel_display struct already has a place for save/restore
stuff. Move the i915's regfile there since they are only
related to display.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 .../gpu/drm/i915/display/i9xx_display_sr.c    | 40 ++++++++++---------
 .../gpu/drm/i915/display/intel_display_core.h |  5 +++
 drivers/gpu/drm/i915/i915_drv.h               |  9 -----
 3 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/i9xx_display_sr.c b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
index 4dd0ce267994..4c78b7165831 100644
--- a/drivers/gpu/drm/i915/display/i9xx_display_sr.c
+++ b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
@@ -12,56 +12,59 @@
 
 static void i9xx_display_save_swf(struct drm_i915_private *i915)
 {
+	struct intel_display *display = &i915->display;
 	int i;
 
 	/* Scratch space */
 	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
 		for (i = 0; i < 7; i++) {
-			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
-			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
+			display->restore.saveSWF0[i] = intel_de_read(display, SWF0(i915, i));
+			display->restore.saveSWF1[i] = intel_de_read(display, SWF1(i915, i));
 		}
 		for (i = 0; i < 3; i++)
-			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
+			display->restore.saveSWF3[i] = intel_de_read(display, SWF3(i915, i));
 	} else if (GRAPHICS_VER(i915) == 2) {
 		for (i = 0; i < 7; i++)
-			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
+			display->restore.saveSWF1[i] = intel_de_read(display, SWF1(i915, i));
 	} else if (HAS_GMCH(i915)) {
 		for (i = 0; i < 16; i++) {
-			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
-			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
+			display->restore.saveSWF0[i] = intel_de_read(display, SWF0(i915, i));
+			display->restore.saveSWF1[i] = intel_de_read(display, SWF1(i915, i));
 		}
 		for (i = 0; i < 3; i++)
-			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
+			display->restore.saveSWF3[i] = intel_de_read(display, SWF3(i915, i));
 	}
 }
 
 static void i9xx_display_restore_swf(struct drm_i915_private *i915)
 {
+	struct intel_display *display = &i915->display;
 	int i;
 
 	/* Scratch space */
 	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
 		for (i = 0; i < 7; i++) {
-			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
-			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
+			intel_de_write(display, SWF0(i915, i), display->restore.saveSWF0[i]);
+			intel_de_write(display, SWF1(i915, i), display->restore.saveSWF1[i]);
 		}
 		for (i = 0; i < 3; i++)
-			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
+			intel_de_write(display, SWF3(i915, i), display->restore.saveSWF3[i]);
 	} else if (GRAPHICS_VER(i915) == 2) {
 		for (i = 0; i < 7; i++)
-			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
+			intel_de_write(display, SWF1(i915, i), display->restore.saveSWF1[i]);
 	} else if (HAS_GMCH(i915)) {
 		for (i = 0; i < 16; i++) {
-			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
-			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
+			intel_de_write(display, SWF0(i915, i), display->restore.saveSWF0[i]);
+			intel_de_write(display, SWF1(i915, i), display->restore.saveSWF1[i]);
 		}
 		for (i = 0; i < 3; i++)
-			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
+			intel_de_write(display, SWF3(i915, i), display->restore.saveSWF3[i]);
 	}
 }
 
 void i9xx_display_sr_save(struct drm_i915_private *i915)
 {
+	struct intel_display *display = &i915->display;
 	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
 
 	if (!HAS_DISPLAY(i915))
@@ -69,16 +72,17 @@ void i9xx_display_sr_save(struct drm_i915_private *i915)
 
 	/* Display arbitration control */
 	if (GRAPHICS_VER(i915) <= 4)
-		i915->regfile.saveDSPARB = intel_de_read(i915, DSPARB(i915));
+		display->restore.saveDSPARB = intel_de_read(display, DSPARB(i915));
 
 	if (GRAPHICS_VER(i915) == 4)
-		pci_read_config_word(pdev, GCDGMBUS, &i915->regfile.saveGCDGMBUS);
+		pci_read_config_word(pdev, GCDGMBUS, &display->restore.saveGCDGMBUS);
 
 	i9xx_display_save_swf(i915);
 }
 
 void i9xx_display_sr_restore(struct drm_i915_private *i915)
 {
+	struct intel_display *display = &i915->display;
 	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
 
 	if (!HAS_DISPLAY(i915))
@@ -87,9 +91,9 @@ void i9xx_display_sr_restore(struct drm_i915_private *i915)
 	i9xx_display_restore_swf(i915);
 
 	if (GRAPHICS_VER(i915) == 4)
-		pci_write_config_word(pdev, GCDGMBUS, i915->regfile.saveGCDGMBUS);
+		pci_write_config_word(pdev, GCDGMBUS, display->restore.saveGCDGMBUS);
 
 	/* Display arbitration */
 	if (GRAPHICS_VER(i915) <= 4)
-		intel_de_write(i915, DSPARB(i915), i915->regfile.saveDSPARB);
+		intel_de_write(display, DSPARB(i915), display->restore.saveDSPARB);
 }
diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
index 982dd9469195..2f4dfc8dbedc 100644
--- a/drivers/gpu/drm/i915/display/intel_display_core.h
+++ b/drivers/gpu/drm/i915/display/intel_display_core.h
@@ -500,6 +500,11 @@ struct intel_display {
 		/* restore state for suspend/resume and display reset */
 		struct drm_atomic_state *modeset_state;
 		struct drm_modeset_acquire_ctx reset_ctx;
+		u32 saveDSPARB;
+		u32 saveSWF0[16];
+		u32 saveSWF1[16];
+		u32 saveSWF3[3];
+		u16 saveGCDGMBUS;
 	} restore;
 
 	struct {
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index def3ca135406..9030ea7d54b1 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -101,14 +101,6 @@ struct i915_dsm {
 	resource_size_t usable_size;
 };
 
-struct i915_suspend_saved_registers {
-	u32 saveDSPARB;
-	u32 saveSWF0[16];
-	u32 saveSWF1[16];
-	u32 saveSWF3[3];
-	u16 saveGCDGMBUS;
-};
-
 #define MAX_L3_SLICES 2
 struct intel_l3_parity {
 	u32 *remap_info[MAX_L3_SLICES];
@@ -291,7 +283,6 @@ struct drm_i915_private {
 	struct i915_gpu_error gpu_error;
 
 	u32 suspend_count;
-	struct i915_suspend_saved_registers regfile;
 	struct vlv_s0ix_state *vlv_s0ix_state;
 
 	struct dram_info {
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 04/31] drm/i915/display: Move shutdown sequences under display driver
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (2 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 03/31] drm/i915/display: Move regfile registers intel_display.restore Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 19:18   ` Cavitt, Jonathan
  2024-10-08 15:57   ` Imre Deak
  2024-09-24 20:35 ` [PATCH 05/31] drm/xe: At shutdown disable commit helpers instead of flushing Rodrigo Vivi
                   ` (31 subsequent siblings)
  35 siblings, 2 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Move display related shutdown sequences from i915_driver to
intel_display_driver.

No functional change. Just taking the right ownership and
start some reconciliation of them between i915 and Xe.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 .../drm/i915/display/intel_display_driver.c   | 40 +++++++++++++++++++
 .../drm/i915/display/intel_display_driver.h   |  3 ++
 drivers/gpu/drm/i915/i915_driver.c            | 29 ++------------
 3 files changed, 47 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index c106fb2dd20b..e40b1105168e 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -39,6 +39,7 @@
 #include "intel_dp_tunnel.h"
 #include "intel_dpll.h"
 #include "intel_dpll_mgr.h"
+#include "intel_encoder.h"
 #include "intel_fb.h"
 #include "intel_fbc.h"
 #include "intel_fbdev.h"
@@ -755,3 +756,42 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
 	if (state)
 		drm_atomic_state_put(state);
 }
+
+void intel_display_driver_shutdown(struct drm_i915_private *i915)
+{
+	intel_power_domains_disable(i915);
+
+	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
+	if (HAS_DISPLAY(i915)) {
+		drm_kms_helper_poll_disable(&i915->drm);
+		intel_display_driver_disable_user_access(i915);
+
+		drm_atomic_helper_shutdown(&i915->drm);
+	}
+
+	intel_dp_mst_suspend(i915);
+}
+
+void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915)
+{
+	intel_hpd_cancel_work(i915);
+
+	if (HAS_DISPLAY(i915))
+		intel_display_driver_suspend_access(i915);
+
+	intel_encoder_suspend_all(&i915->display);
+	intel_encoder_shutdown_all(&i915->display);
+
+	intel_dmc_suspend(&i915->display);
+}
+
+void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915)
+{
+	/*
+	 * The only requirement is to reboot with display DC states disabled,
+	 * for now leaving all display power wells in the INIT power domain
+	 * enabled.
+	 */
+
+	intel_power_domains_driver_remove(i915);
+}
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
index 42cc4af6d3fd..1ee37fb58d38 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.h
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
@@ -26,6 +26,9 @@ void intel_display_driver_remove_nogem(struct drm_i915_private *i915);
 void intel_display_driver_unregister(struct drm_i915_private *i915);
 int intel_display_driver_suspend(struct drm_i915_private *i915);
 void intel_display_driver_resume(struct drm_i915_private *i915);
+void intel_display_driver_shutdown(struct drm_i915_private *i915);
+void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
+void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915);
 
 /* interface for intel_display_reset.c */
 int __intel_display_driver_resume(struct drm_i915_private *i915,
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index ae5906885359..38c845ad86e5 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -939,43 +939,22 @@ void i915_driver_shutdown(struct drm_i915_private *i915)
 {
 	disable_rpm_wakeref_asserts(&i915->runtime_pm);
 	intel_runtime_pm_disable(&i915->runtime_pm);
-	intel_power_domains_disable(i915);
 
-	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
-	if (HAS_DISPLAY(i915)) {
-		drm_kms_helper_poll_disable(&i915->drm);
-		intel_display_driver_disable_user_access(i915);
-
-		drm_atomic_helper_shutdown(&i915->drm);
-	}
-
-	intel_dp_mst_suspend(i915);
+	intel_display_driver_shutdown(i915);
 
 	intel_irq_suspend(i915);
-	intel_hpd_cancel_work(i915);
-
-	if (HAS_DISPLAY(i915))
-		intel_display_driver_suspend_access(i915);
 
-	intel_encoder_suspend_all(&i915->display);
-	intel_encoder_shutdown_all(&i915->display);
-
-	intel_dmc_suspend(&i915->display);
+	intel_display_driver_shutdown_noirq(i915);
 
 	i915_gem_suspend(i915);
 
-	/*
-	 * The only requirement is to reboot with display DC states disabled,
-	 * for now leaving all display power wells in the INIT power domain
-	 * enabled.
-	 *
-	 * TODO:
+	/* TODO:
 	 * - unify the pci_driver::shutdown sequence here with the
 	 *   pci_driver.driver.pm.poweroff,poweroff_late sequence.
 	 * - unify the driver remove and system/runtime suspend sequences with
 	 *   the above unified shutdown/poweroff sequence.
 	 */
-	intel_power_domains_driver_remove(i915);
+
 	enable_rpm_wakeref_asserts(&i915->runtime_pm);
 
 	intel_runtime_pm_driver_last_release(&i915->runtime_pm);
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 05/31] drm/xe: At shutdown disable commit helpers instead of flushing
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (3 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 04/31] drm/i915/display: Move shutdown sequences under display driver Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 19:42   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 06/31] drm/xe: Use i915-display shutdown sequence directly Rodrigo Vivi
                   ` (30 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi, Maarten Lankhort

This aligns with the current i915 display sequence.

Cc: Maarten Lankhort <maarten.lankhorst@linux.intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 5cbee5040e91..0237d458078b 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -10,6 +10,7 @@
 
 #include <drm/drm_drv.h>
 #include <drm/drm_managed.h>
+#include <drm/drm_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 #include <uapi/drm/xe_drm.h>
 
@@ -364,10 +365,10 @@ void xe_display_pm_shutdown(struct xe_device *xe)
 	if (has_display(xe)) {
 		drm_kms_helper_poll_disable(&xe->drm);
 		intel_display_driver_disable_user_access(xe);
-		intel_display_driver_suspend(xe);
+
+		drm_atomic_helper_shutdown(&xe->drm);
 	}
 
-	xe_display_flush_cleanup_work(xe);
 	intel_dp_mst_suspend(xe);
 	intel_hpd_cancel_work(xe);
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 06/31] drm/xe: Use i915-display shutdown sequence directly
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (4 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 05/31] drm/xe: At shutdown disable commit helpers instead of flushing Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 19:44   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 07/31] drm/{i915, xe}/display: Move DP MST calls to display_driver Rodrigo Vivi
                   ` (29 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Start the xe-i915-display reconciliation by using the same
shutdown sequences.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 46 +++++++------------------
 drivers/gpu/drm/xe/display/xe_display.h |  5 +--
 drivers/gpu/drm/xe/xe_device.c          |  4 ++-
 3 files changed, 19 insertions(+), 36 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 0237d458078b..b5a2a09e7a71 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -10,7 +10,6 @@
 
 #include <drm/drm_drv.h>
 #include <drm/drm_managed.h>
-#include <drm/drm_atomic_helper.h>
 #include <drm/drm_probe_helper.h>
 #include <uapi/drm/xe_drm.h>
 
@@ -355,32 +354,26 @@ void xe_display_pm_suspend(struct xe_device *xe)
 
 void xe_display_pm_shutdown(struct xe_device *xe)
 {
-	struct intel_display *display = &xe->display;
-
 	if (!xe->info.probe_display)
 		return;
 
-	intel_power_domains_disable(xe);
-	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
-	if (has_display(xe)) {
-		drm_kms_helper_poll_disable(&xe->drm);
-		intel_display_driver_disable_user_access(xe);
-
-		drm_atomic_helper_shutdown(&xe->drm);
-	}
-
-	intel_dp_mst_suspend(xe);
-	intel_hpd_cancel_work(xe);
+	intel_display_driver_shutdown(xe);
+}
 
-	if (has_display(xe))
-		intel_display_driver_suspend_access(xe);
+void xe_display_pm_shutdown_noirq(struct xe_device *xe)
+{
+	if (!xe->info.probe_display)
+		return;
 
-	intel_encoder_suspend_all(display);
-	intel_encoder_shutdown_all(display);
+	intel_display_driver_shutdown_noirq(xe);
+}
 
-	intel_opregion_suspend(display, PCI_D3cold);
+void xe_display_pm_shutdown_noaccel(struct xe_device *xe)
+{
+	if (!xe->info.probe_display)
+		return;
 
-	intel_dmc_suspend(display);
+	intel_display_driver_shutdown_nogem(xe);
 }
 
 void xe_display_pm_runtime_suspend(struct xe_device *xe)
@@ -405,19 +398,6 @@ void xe_display_pm_suspend_late(struct xe_device *xe)
 	intel_display_power_suspend_late(xe);
 }
 
-void xe_display_pm_shutdown_late(struct xe_device *xe)
-{
-	if (!xe->info.probe_display)
-		return;
-
-	/*
-	 * The only requirement is to reboot with display DC states disabled,
-	 * for now leaving all display power wells in the INIT power domain
-	 * enabled.
-	 */
-	intel_power_domains_driver_remove(xe);
-}
-
 void xe_display_pm_resume_early(struct xe_device *xe)
 {
 	if (!xe->info.probe_display)
diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
index 17afa537aee5..a801db19b64f 100644
--- a/drivers/gpu/drm/xe/display/xe_display.h
+++ b/drivers/gpu/drm/xe/display/xe_display.h
@@ -35,9 +35,10 @@ void xe_display_irq_reset(struct xe_device *xe);
 void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt);
 
 void xe_display_pm_suspend(struct xe_device *xe);
-void xe_display_pm_shutdown(struct xe_device *xe);
 void xe_display_pm_suspend_late(struct xe_device *xe);
-void xe_display_pm_shutdown_late(struct xe_device *xe);
+void xe_display_pm_shutdown(struct xe_device *xe);
+void xe_display_pm_shutdown_noirq(struct xe_device *xe);
+void xe_display_pm_shutdown_noaccel(struct xe_device *xe);
 void xe_display_pm_resume_early(struct xe_device *xe);
 void xe_display_pm_resume(struct xe_device *xe);
 void xe_display_pm_runtime_suspend(struct xe_device *xe);
diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
index cb5a9fd820cf..7c698b4b265b 100644
--- a/drivers/gpu/drm/xe/xe_device.c
+++ b/drivers/gpu/drm/xe/xe_device.c
@@ -822,10 +822,12 @@ void xe_device_shutdown(struct xe_device *xe)
 
 		xe_irq_suspend(xe);
 
+		xe_display_pm_shutdown_noirq(xe);
+
 		for_each_gt(gt, xe, id)
 			xe_gt_shutdown(gt);
 
-		xe_display_pm_shutdown_late(xe);
+		xe_display_pm_shutdown_noaccel(xe);
 	} else {
 		/* BOOM! */
 		__xe_driver_flr(xe);
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 07/31] drm/{i915, xe}/display: Move DP MST calls to display_driver
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (5 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 06/31] drm/xe: Use i915-display shutdown sequence directly Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 19:46   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 08/31] drm/i915/display: Move suspend sequences to intel_display_driver Rodrigo Vivi
                   ` (28 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Move dp_mst suspend/resume functions from the drivers towards
intel_display_driver to continue with the unification.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_driver.c | 6 ++++++
 drivers/gpu/drm/i915/i915_driver.c                  | 4 ----
 drivers/gpu/drm/xe/display/xe_display.c             | 7 -------
 3 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index e40b1105168e..51fc1c148283 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -676,6 +676,9 @@ int intel_display_driver_suspend(struct drm_i915_private *i915)
 			ret);
 	else
 		i915->display.restore.modeset_state = state;
+
+	intel_dp_mst_suspend(i915);
+
 	return ret;
 }
 
@@ -729,6 +732,9 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
 	if (!HAS_DISPLAY(i915))
 		return;
 
+	/* MST sideband requires HPD interrupts enabled */
+	intel_dp_mst_resume(i915);
+
 	i915->display.restore.modeset_state = NULL;
 	if (state)
 		state->acquire_ctx = &ctx;
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 38c845ad86e5..d166a8164b42 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1013,8 +1013,6 @@ static int i915_drm_suspend(struct drm_device *dev)
 
 	intel_display_driver_suspend(dev_priv);
 
-	intel_dp_mst_suspend(dev_priv);
-
 	intel_irq_suspend(dev_priv);
 	intel_hpd_cancel_work(dev_priv);
 
@@ -1182,8 +1180,6 @@ static int i915_drm_resume(struct drm_device *dev)
 
 	intel_hpd_init(dev_priv);
 
-	/* MST sideband requires HPD interrupts enabled */
-	intel_dp_mst_resume(dev_priv);
 	intel_display_driver_resume(dev_priv);
 
 	if (HAS_DISPLAY(dev_priv)) {
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index b5a2a09e7a71..bc5c00437ab3 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -332,9 +332,6 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
 
 	xe_display_flush_cleanup_work(xe);
 
-	if (!runtime)
-		intel_dp_mst_suspend(xe);
-
 	intel_hpd_cancel_work(xe);
 
 	if (!runtime && has_display(xe)) {
@@ -426,10 +423,6 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
 	if (!runtime && has_display(xe))
 		intel_display_driver_resume_access(xe);
 
-	/* MST sideband requires HPD interrupts enabled */
-	if (!runtime)
-		intel_dp_mst_resume(xe);
-
 	if (!runtime && has_display(xe)) {
 		intel_display_driver_resume(xe);
 		drm_kms_helper_poll_enable(&xe->drm);
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 08/31] drm/i915/display: Move suspend sequences to intel_display_driver
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (6 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 07/31] drm/{i915, xe}/display: Move DP MST calls to display_driver Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 20:28   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 09/31] drm/xe/display: Delay hpd_init resume Rodrigo Vivi
                   ` (27 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

The goal is to reconcile the Xe and i915 PM functions.
Start by moving the display sequences from i915_drv towards
intel_display_driver.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 .../drm/i915/display/intel_display_driver.c   | 20 +++++++++++++++++++
 .../drm/i915/display/intel_display_driver.h   |  3 +++
 drivers/gpu/drm/i915/i915_driver.c            | 14 ++-----------
 drivers/gpu/drm/xe/display/xe_fb_pin.c        |  4 ++++
 4 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index 51fc1c148283..42624bf80f91 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -36,6 +36,7 @@
 #include "intel_dkl_phy.h"
 #include "intel_dmc.h"
 #include "intel_dp.h"
+#include "intel_dpt.h"
 #include "intel_dp_tunnel.h"
 #include "intel_dpll.h"
 #include "intel_dpll_mgr.h"
@@ -682,6 +683,25 @@ int intel_display_driver_suspend(struct drm_i915_private *i915)
 	return ret;
 }
 
+void intel_display_driver_suspend_noirq(struct drm_i915_private *i915)
+{
+	intel_hpd_cancel_work(i915);
+
+	if (HAS_DISPLAY(i915))
+		intel_display_driver_suspend_access(i915);
+
+	intel_encoder_suspend_all(&i915->display);
+
+	/* Must be called before GGTT is suspended. */
+	intel_dpt_suspend(i915);
+}
+
+void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2idle)
+{
+	intel_opregion_suspend(display, s2idle ? PCI_D1 : PCI_D3cold);
+	intel_dmc_suspend(display);
+}
+
 int
 __intel_display_driver_resume(struct drm_i915_private *i915,
 			      struct drm_atomic_state *state,
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
index 1ee37fb58d38..179fbb86923a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.h
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
@@ -12,6 +12,7 @@ struct drm_atomic_state;
 struct drm_i915_private;
 struct drm_modeset_acquire_ctx;
 struct pci_dev;
+struct intel_display;
 
 bool intel_display_driver_probe_defer(struct pci_dev *pdev);
 void intel_display_driver_init_hw(struct drm_i915_private *i915);
@@ -25,6 +26,8 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915);
 void intel_display_driver_remove_nogem(struct drm_i915_private *i915);
 void intel_display_driver_unregister(struct drm_i915_private *i915);
 int intel_display_driver_suspend(struct drm_i915_private *i915);
+void intel_display_driver_suspend_noirq(struct drm_i915_private *i915);
+void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2idle);
 void intel_display_driver_resume(struct drm_i915_private *i915);
 void intel_display_driver_shutdown(struct drm_i915_private *i915);
 void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index d166a8164b42..ac8bf00458b5 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -996,7 +996,6 @@ static int i915_drm_suspend(struct drm_device *dev)
 	struct drm_i915_private *dev_priv = to_i915(dev);
 	struct intel_display *display = &dev_priv->display;
 	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
-	pci_power_t opregion_target_state;
 
 	disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
@@ -1014,26 +1013,17 @@ static int i915_drm_suspend(struct drm_device *dev)
 	intel_display_driver_suspend(dev_priv);
 
 	intel_irq_suspend(dev_priv);
-	intel_hpd_cancel_work(dev_priv);
 
-	if (HAS_DISPLAY(dev_priv))
-		intel_display_driver_suspend_access(dev_priv);
-
-	intel_encoder_suspend_all(&dev_priv->display);
+	intel_display_driver_suspend_noirq(dev_priv);
 
-	/* Must be called before GGTT is suspended. */
-	intel_dpt_suspend(dev_priv);
 	i915_ggtt_suspend(to_gt(dev_priv)->ggtt);
 
 	i9xx_display_sr_save(dev_priv);
 
-	opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold;
-	intel_opregion_suspend(display, opregion_target_state);
+	intel_display_driver_suspend_noggtt(display, suspend_to_idle(dev_priv));
 
 	dev_priv->suspend_count++;
 
-	intel_dmc_suspend(display);
-
 	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
 	i915_gem_drain_freed_objects(dev_priv);
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 79dbbbe03c7f..49dc91bdbcb0 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -408,3 +408,7 @@ u64 intel_dpt_offset(struct i915_vma *dpt_vma)
 {
 	return 0;
 }
+
+void intel_dpt_suspend(struct xe_device *xe)
+{
+}
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 09/31] drm/xe/display: Delay hpd_init resume
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (7 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 08/31] drm/i915/display: Move suspend sequences to intel_display_driver Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 20:29   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 10/31] drm/xe/display: Spin-off xe_display runtime/d3cold sequences Rodrigo Vivi
                   ` (26 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Align with i915 and only initialize hotplugs after the display driver
access has been resumed.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index bc5c00437ab3..be431d9907df 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -418,11 +418,12 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
 		drm_mode_config_reset(&xe->drm);
 
 	intel_display_driver_init_hw(xe);
-	intel_hpd_init(xe);
 
 	if (!runtime && has_display(xe))
 		intel_display_driver_resume_access(xe);
 
+	intel_hpd_init(xe);
+
 	if (!runtime && has_display(xe)) {
 		intel_display_driver_resume(xe);
 		drm_kms_helper_poll_enable(&xe->drm);
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 10/31] drm/xe/display: Spin-off xe_display runtime/d3cold sequences
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (8 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 09/31] drm/xe/display: Delay hpd_init resume Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 20:43   ` Cavitt, Jonathan
  2024-10-08 16:27   ` Imre Deak
  2024-09-24 20:35 ` [PATCH 11/31] drm/{i915,xe}: Consolidate display resume functions Rodrigo Vivi
                   ` (25 subsequent siblings)
  35 siblings, 2 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

No functional change. This patch only splits the xe_display_pm
suspend/resume functions in the regular suspend/resume from the
runtime/d3cold ones.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 68 ++++++++++++++++---------
 1 file changed, 45 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index be431d9907df..a4705a452adb 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -308,8 +308,41 @@ static void xe_display_flush_cleanup_work(struct xe_device *xe)
 	}
 }
 
-/* TODO: System and runtime suspend/resume sequences will be sanitized as a follow-up. */
-static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
+static void xe_display_to_d3cold(struct xe_device *xe)
+{
+	struct intel_display *display = &xe->display;
+
+	/* We do a lot of poking in a lot of registers, make sure they work properly. */
+	intel_power_domains_disable(xe);
+
+	xe_display_flush_cleanup_work(xe);
+
+	intel_hpd_cancel_work(xe);
+
+	intel_opregion_suspend(display, PCI_D3cold);
+
+	intel_dmc_suspend(display);
+}
+
+static void xe_display_from_d3cold(struct xe_device *xe)
+{
+	struct intel_display *display = &xe->display;
+
+	intel_dmc_resume(display);
+
+	if (has_display(xe))
+		drm_mode_config_reset(&xe->drm);
+
+	intel_display_driver_init_hw(xe);
+
+	intel_hpd_init(xe);
+
+	intel_opregion_resume(display);
+
+	intel_power_domains_enable(xe);
+}
+
+void xe_display_pm_suspend(struct xe_device *xe)
 {
 	struct intel_display *display = &xe->display;
 	bool s2idle = suspend_to_idle();
@@ -321,10 +354,10 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
 	 * properly.
 	 */
 	intel_power_domains_disable(xe);
-	if (!runtime)
-		intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
 
-	if (!runtime && has_display(xe)) {
+	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
+
+	if (has_display(xe)) {
 		drm_kms_helper_poll_disable(&xe->drm);
 		intel_display_driver_disable_user_access(xe);
 		intel_display_driver_suspend(xe);
@@ -334,7 +367,7 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
 
 	intel_hpd_cancel_work(xe);
 
-	if (!runtime && has_display(xe)) {
+	if (has_display(xe)) {
 		intel_display_driver_suspend_access(xe);
 		intel_encoder_suspend_all(&xe->display);
 	}
@@ -344,11 +377,6 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
 	intel_dmc_suspend(display);
 }
 
-void xe_display_pm_suspend(struct xe_device *xe)
-{
-	__xe_display_pm_suspend(xe, false);
-}
-
 void xe_display_pm_shutdown(struct xe_device *xe)
 {
 	if (!xe->info.probe_display)
@@ -379,7 +407,7 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
 		return;
 
 	if (xe->d3cold.allowed)
-		__xe_display_pm_suspend(xe, true);
+		xe_display_to_d3cold(xe);
 
 	intel_hpd_poll_enable(xe);
 }
@@ -405,7 +433,7 @@ void xe_display_pm_resume_early(struct xe_device *xe)
 	intel_power_domains_resume(xe);
 }
 
-static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
+void xe_display_pm_resume(struct xe_device *xe)
 {
 	struct intel_display *display = &xe->display;
 
@@ -419,12 +447,12 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
 
 	intel_display_driver_init_hw(xe);
 
-	if (!runtime && has_display(xe))
+	if (has_display(xe))
 		intel_display_driver_resume_access(xe);
 
 	intel_hpd_init(xe);
 
-	if (!runtime && has_display(xe)) {
+	if (has_display(xe)) {
 		intel_display_driver_resume(xe);
 		drm_kms_helper_poll_enable(&xe->drm);
 		intel_display_driver_enable_user_access(xe);
@@ -433,17 +461,11 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
 
 	intel_opregion_resume(display);
 
-	if (!runtime)
-		intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_RUNNING, false);
+	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_RUNNING, false);
 
 	intel_power_domains_enable(xe);
 }
 
-void xe_display_pm_resume(struct xe_device *xe)
-{
-	__xe_display_pm_resume(xe, false);
-}
-
 void xe_display_pm_runtime_resume(struct xe_device *xe)
 {
 	if (!xe->info.probe_display)
@@ -452,7 +474,7 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
 	intel_hpd_poll_disable(xe);
 
 	if (xe->d3cold.allowed)
-		__xe_display_pm_resume(xe, true);
+		xe_display_from_d3cold(xe);
 }
 
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 11/31] drm/{i915,xe}: Consolidate display resume functions
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (9 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 10/31] drm/xe/display: Spin-off xe_display runtime/d3cold sequences Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 21:02   ` [PATCH 11/31] drm/{i915, xe}: " Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 12/31] drm/i915: Remove lingering pci_save_state Rodrigo Vivi
                   ` (24 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Same sequences are currently executed by i915 and xe during
system resume. Consolidate them in the intel_display_driver
side.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 .../drm/i915/display/intel_display_driver.c    | 16 ++++++++++++++++
 drivers/gpu/drm/i915/i915_driver.c             | 17 -----------------
 drivers/gpu/drm/xe/display/xe_display.c        | 18 +-----------------
 3 files changed, 17 insertions(+), 34 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index 42624bf80f91..86d6ebf0c82f 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -752,6 +752,10 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
 	if (!HAS_DISPLAY(i915))
 		return;
 
+	intel_display_driver_resume_access(i915);
+
+	intel_hpd_init(i915);
+
 	/* MST sideband requires HPD interrupts enabled */
 	intel_dp_mst_resume(i915);
 
@@ -781,6 +785,18 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
 			"Restoring old state failed with %i\n", ret);
 	if (state)
 		drm_atomic_state_put(state);
+
+	intel_display_driver_enable_user_access(i915);
+
+	drm_kms_helper_poll_enable(&i915->drm);
+
+	intel_hpd_poll_disable(i915);
+
+	intel_opregion_resume(&i915->display);
+
+	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_RUNNING, false);
+
+	intel_power_domains_enable(i915);
 }
 
 void intel_display_driver_shutdown(struct drm_i915_private *i915)
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index ac8bf00458b5..ce2dd03136d3 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1165,25 +1165,8 @@ static int i915_drm_resume(struct drm_device *dev)
 
 	intel_clock_gating_init(dev_priv);
 
-	if (HAS_DISPLAY(dev_priv))
-		intel_display_driver_resume_access(dev_priv);
-
-	intel_hpd_init(dev_priv);
-
 	intel_display_driver_resume(dev_priv);
 
-	if (HAS_DISPLAY(dev_priv)) {
-		intel_display_driver_enable_user_access(dev_priv);
-		drm_kms_helper_poll_enable(dev);
-	}
-	intel_hpd_poll_disable(dev_priv);
-
-	intel_opregion_resume(display);
-
-	intel_fbdev_set_suspend(dev, FBINFO_STATE_RUNNING, false);
-
-	intel_power_domains_enable(dev_priv);
-
 	intel_gvt_resume(dev_priv);
 
 	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index a4705a452adb..98ff603a1f84 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -447,23 +447,7 @@ void xe_display_pm_resume(struct xe_device *xe)
 
 	intel_display_driver_init_hw(xe);
 
-	if (has_display(xe))
-		intel_display_driver_resume_access(xe);
-
-	intel_hpd_init(xe);
-
-	if (has_display(xe)) {
-		intel_display_driver_resume(xe);
-		drm_kms_helper_poll_enable(&xe->drm);
-		intel_display_driver_enable_user_access(xe);
-		intel_hpd_poll_disable(xe);
-	}
-
-	intel_opregion_resume(display);
-
-	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_RUNNING, false);
-
-	intel_power_domains_enable(xe);
+	intel_display_driver_resume(xe);
 }
 
 void xe_display_pm_runtime_resume(struct xe_device *xe)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 12/31] drm/i915: Remove lingering pci_save_state
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (10 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 11/31] drm/{i915,xe}: Consolidate display resume functions Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-09-27  8:45   ` Gupta, Anshuman
  2024-10-07 21:10   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 13/31] drm/{i915,xe}: Consolidate display suspend functions Rodrigo Vivi
                   ` (23 subsequent siblings)
  35 siblings, 2 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe
  Cc: imre.deak, Rodrigo Vivi, Anshuman Gupta, Ville Syrjälä

The pairing pci_restore_state was removed by commit
'b7e53aba2f0e ("drm/i915: remove restore in resume")'
to fix a hardware hang in resume.

Furthermore, it looks like PCI subsystem should be taking care
of the save and restore here.

Remove the lingering/stand-alone pci_save_state call.

Cc: Anshuman Gupta <anshuman.gupta@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/i915/i915_driver.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index ce2dd03136d3..4fc9d8bce1fd 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1008,8 +1008,6 @@ static int i915_drm_suspend(struct drm_device *dev)
 		intel_display_driver_disable_user_access(dev_priv);
 	}
 
-	pci_save_state(pdev);
-
 	intel_display_driver_suspend(dev_priv);
 
 	intel_irq_suspend(dev_priv);
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 13/31] drm/{i915,xe}: Consolidate display suspend functions
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (11 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 12/31] drm/i915: Remove lingering pci_save_state Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 21:14   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 14/31] drm/i915/display: Move resume sequences to intel_display_driver Rodrigo Vivi
                   ` (22 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Same sequences are currently executed by i915 and xe during
system suspend. Consolidate them in the intel_display_driver
side.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 .../gpu/drm/i915/display/intel_display_driver.c   |  9 +++++++++
 drivers/gpu/drm/i915/i915_driver.c                | 12 ------------
 drivers/gpu/drm/xe/display/xe_display.c           | 15 ++-------------
 3 files changed, 11 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index 86d6ebf0c82f..f509ed1503c1 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -670,6 +670,15 @@ int intel_display_driver_suspend(struct drm_i915_private *i915)
 	if (!HAS_DISPLAY(i915))
 		return 0;
 
+	/* We do a lot of poking in a lot of registers, make sure they work properly. */
+	intel_power_domains_disable(i915);
+
+	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
+
+	drm_kms_helper_poll_disable(&i915->drm);
+
+	intel_display_driver_disable_user_access(i915);
+
 	state = drm_atomic_helper_suspend(&i915->drm);
 	ret = PTR_ERR_OR_ZERO(state);
 	if (ret)
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 4fc9d8bce1fd..12639fa232b3 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -43,7 +43,6 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_managed.h>
-#include <drm/drm_probe_helper.h>
 
 #include "display/i9xx_display_sr.h"
 #include "display/intel_acpi.h"
@@ -55,7 +54,6 @@
 #include "display/intel_dp.h"
 #include "display/intel_dpt.h"
 #include "display/intel_encoder.h"
-#include "display/intel_fbdev.h"
 #include "display/intel_hotplug.h"
 #include "display/intel_overlay.h"
 #include "display/intel_pch_refclk.h"
@@ -995,19 +993,9 @@ static int i915_drm_suspend(struct drm_device *dev)
 {
 	struct drm_i915_private *dev_priv = to_i915(dev);
 	struct intel_display *display = &dev_priv->display;
-	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
 
 	disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
-	/* We do a lot of poking in a lot of registers, make sure they work
-	 * properly. */
-	intel_power_domains_disable(dev_priv);
-	intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED, true);
-	if (HAS_DISPLAY(dev_priv)) {
-		drm_kms_helper_poll_disable(dev);
-		intel_display_driver_disable_user_access(dev_priv);
-	}
-
 	intel_display_driver_suspend(dev_priv);
 
 	intel_irq_suspend(dev_priv);
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 98ff603a1f84..45949b095d7e 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -346,22 +346,11 @@ void xe_display_pm_suspend(struct xe_device *xe)
 {
 	struct intel_display *display = &xe->display;
 	bool s2idle = suspend_to_idle();
+
 	if (!xe->info.probe_display)
 		return;
 
-	/*
-	 * We do a lot of poking in a lot of registers, make sure they work
-	 * properly.
-	 */
-	intel_power_domains_disable(xe);
-
-	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
-
-	if (has_display(xe)) {
-		drm_kms_helper_poll_disable(&xe->drm);
-		intel_display_driver_disable_user_access(xe);
-		intel_display_driver_suspend(xe);
-	}
+	intel_display_driver_suspend(xe);
 
 	xe_display_flush_cleanup_work(xe);
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 14/31] drm/i915/display: Move resume sequences to intel_display_driver
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (12 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 13/31] drm/{i915,xe}: Consolidate display suspend functions Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 21:16   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 15/31] drm/xe/display: Delay dsm handler registration Rodrigo Vivi
                   ` (21 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

The goal is to reconcile the Xe and i915 PM functions.
Continue by moving the display sequences related to system
resume from i915_drv towards intel_display_driver.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 .../drm/i915/display/intel_display_driver.c   | 25 +++++++++++++++++++
 .../drm/i915/display/intel_display_driver.h   |  2 ++
 drivers/gpu/drm/i915/i915_driver.c            | 17 ++-----------
 drivers/gpu/drm/xe/display/xe_fb_pin.c        |  4 +++
 4 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index f509ed1503c1..2a171cb2613a 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -53,6 +53,7 @@
 #include "intel_modeset_setup.h"
 #include "intel_opregion.h"
 #include "intel_overlay.h"
+#include "intel_pch_refclk.h"
 #include "intel_plane_initial.h"
 #include "intel_pmdemand.h"
 #include "intel_pps.h"
@@ -711,6 +712,30 @@ void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2i
 	intel_dmc_suspend(display);
 }
 
+void intel_display_driver_resume_noirq(struct drm_i915_private *i915)
+{
+	struct intel_display *display = &i915->display;
+
+	/* Must be called after GGTT is resumed. */
+	intel_dpt_resume(i915);
+
+	intel_dmc_resume(display);
+
+	intel_vga_redisable(display);
+
+	intel_gmbus_reset(i915);
+
+	intel_pps_unlock_regs_wa(display);
+
+	intel_init_pch_refclk(i915);
+}
+
+void intel_display_driver_resume_nogem(struct intel_display *display)
+{
+	if (HAS_DISPLAY(display))
+		drm_mode_config_reset(display->drm);
+}
+
 int
 __intel_display_driver_resume(struct drm_i915_private *i915,
 			      struct drm_atomic_state *state,
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
index 179fbb86923a..dec93f2f37c6 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.h
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
@@ -29,6 +29,8 @@ int intel_display_driver_suspend(struct drm_i915_private *i915);
 void intel_display_driver_suspend_noirq(struct drm_i915_private *i915);
 void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2idle);
 void intel_display_driver_resume(struct drm_i915_private *i915);
+void intel_display_driver_resume_noirq(struct drm_i915_private *i915);
+void intel_display_driver_resume_nogem(struct intel_display *display);
 void intel_display_driver_shutdown(struct drm_i915_private *i915);
 void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
 void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915);
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 12639fa232b3..c9df361f898f 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -56,7 +56,6 @@
 #include "display/intel_encoder.h"
 #include "display/intel_hotplug.h"
 #include "display/intel_overlay.h"
-#include "display/intel_pch_refclk.h"
 #include "display/intel_pps.h"
 #include "display/intel_sprite_uapi.h"
 #include "display/intel_vga.h"
@@ -1115,20 +1114,9 @@ static int i915_drm_resume(struct drm_device *dev)
 		if (GRAPHICS_VER(gt->i915) >= 8)
 			setup_private_pat(gt);
 
-	/* Must be called after GGTT is resumed. */
-	intel_dpt_resume(dev_priv);
-
-	intel_dmc_resume(display);
-
 	i9xx_display_sr_restore(dev_priv);
 
-	intel_vga_redisable(display);
-
-	intel_gmbus_reset(dev_priv);
-
-	intel_pps_unlock_regs_wa(display);
-
-	intel_init_pch_refclk(dev_priv);
+	intel_display_driver_resume_noirq(dev_priv);
 
 	/*
 	 * Interrupts have to be enabled before any batches are run. If not the
@@ -1142,8 +1130,7 @@ static int i915_drm_resume(struct drm_device *dev)
 	 */
 	intel_irq_resume(dev_priv);
 
-	if (HAS_DISPLAY(dev_priv))
-		drm_mode_config_reset(dev);
+	intel_display_driver_resume_nogem(display);
 
 	i915_gem_resume(dev_priv);
 
diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 49dc91bdbcb0..c26a47dac332 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -412,3 +412,7 @@ u64 intel_dpt_offset(struct i915_vma *dpt_vma)
 void intel_dpt_suspend(struct xe_device *xe)
 {
 }
+
+void intel_dpt_resume(struct xe_device *xe)
+{
+}
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 15/31] drm/xe/display: Delay dsm handler registration
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (13 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 14/31] drm/i915/display: Move resume sequences to intel_display_driver Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 21:17   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 16/31] drm/{i915, xe}: Move power_domains suspend/resume to display_power Rodrigo Vivi
                   ` (20 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Bring some consistency to register/unregister order at the
same time it aligns with i915 sequence order.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 45949b095d7e..e5df50221a04 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -217,8 +217,8 @@ void xe_display_register(struct xe_device *xe)
 		return;
 
 	intel_display_driver_register(xe);
-	intel_register_dsm_handler();
 	intel_power_domains_enable(xe);
+	intel_register_dsm_handler();
 }
 
 void xe_display_unregister(struct xe_device *xe)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 16/31] drm/{i915, xe}: Move power_domains suspend/resume to display_power
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (14 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 15/31] drm/xe/display: Delay dsm handler registration Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 21:25   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 17/31] drm/{i915, xe}: Move remaining intel_power_domains to intel_display Rodrigo Vivi
                   ` (19 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Move intel_power_domains_{suspend,resume} to inside
intel_display_power_{suspend_late, resume_early}.

With this also change the VLV suspend failure to call
the intel_display_power_resume_early. In the end, the only
function executed there for VLV is the intel_power_domains_resume.
Besides make the code more consistency give the call that was
immediately before: intel_display_power_suspend_late.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_power.c | 6 +++++-
 drivers/gpu/drm/i915/display/intel_display_power.h | 2 +-
 drivers/gpu/drm/i915/i915_driver.c                 | 8 ++------
 drivers/gpu/drm/xe/display/xe_display.c            | 7 ++-----
 4 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
index ecabb674644b..923178a4ffe5 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power.c
+++ b/drivers/gpu/drm/i915/display/intel_display_power.c
@@ -2231,10 +2231,12 @@ static void intel_power_domains_verify_state(struct drm_i915_private *i915)
 
 #endif
 
-void intel_display_power_suspend_late(struct drm_i915_private *i915)
+void intel_display_power_suspend_late(struct drm_i915_private *i915, bool s2idle)
 {
 	struct intel_display *display = &i915->display;
 
+	intel_power_domains_suspend(i915, s2idle);
+
 	if (DISPLAY_VER(i915) >= 11 || IS_GEMINILAKE(i915) ||
 	    IS_BROXTON(i915)) {
 		bxt_enable_dc9(display);
@@ -2262,6 +2264,8 @@ void intel_display_power_resume_early(struct drm_i915_private *i915)
 	/* Tweaked Wa_14010685332:cnp,icp,jsp,mcc,tgp,adp */
 	if (INTEL_PCH_TYPE(i915) >= PCH_CNP && INTEL_PCH_TYPE(i915) < PCH_DG1)
 		intel_de_rmw(i915, SOUTH_CHICKEN1, SBCLK_RUN_REFCLK_DIS, 0);
+
+	intel_power_domains_resume(i915);
 }
 
 void intel_display_power_suspend(struct drm_i915_private *i915)
diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
index 425452c5a469..ccac3c06b2f7 100644
--- a/drivers/gpu/drm/i915/display/intel_display_power.h
+++ b/drivers/gpu/drm/i915/display/intel_display_power.h
@@ -176,7 +176,7 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv, bool s2idle)
 void intel_power_domains_resume(struct drm_i915_private *dev_priv);
 void intel_power_domains_sanitize_state(struct drm_i915_private *dev_priv);
 
-void intel_display_power_suspend_late(struct drm_i915_private *i915);
+void intel_display_power_suspend_late(struct drm_i915_private *i915, bool s2idle);
 void intel_display_power_resume_early(struct drm_i915_private *i915);
 void intel_display_power_suspend(struct drm_i915_private *i915);
 void intel_display_power_resume(struct drm_i915_private *i915);
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index c9df361f898f..9e788e1c178e 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1034,14 +1034,12 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
 	for_each_gt(gt, dev_priv, i)
 		intel_uncore_suspend(gt->uncore);
 
-	intel_power_domains_suspend(dev_priv, s2idle);
-
-	intel_display_power_suspend_late(dev_priv);
+	intel_display_power_suspend_late(dev_priv, s2idle);
 
 	ret = vlv_suspend_complete(dev_priv);
 	if (ret) {
 		drm_err(&dev_priv->drm, "Suspend complete failed: %d\n", ret);
-		intel_power_domains_resume(dev_priv);
+		intel_display_power_resume_early(dev_priv);
 
 		goto out;
 	}
@@ -1211,8 +1209,6 @@ static int i915_drm_resume_early(struct drm_device *dev)
 
 	intel_display_power_resume_early(dev_priv);
 
-	intel_power_domains_resume(dev_priv);
-
 	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
 
 	return ret;
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index e5df50221a04..d5be622f831b 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -404,12 +404,11 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
 void xe_display_pm_suspend_late(struct xe_device *xe)
 {
 	bool s2idle = suspend_to_idle();
+
 	if (!xe->info.probe_display)
 		return;
 
-	intel_power_domains_suspend(xe, s2idle);
-
-	intel_display_power_suspend_late(xe);
+	intel_display_power_suspend_late(xe, s2idle);
 }
 
 void xe_display_pm_resume_early(struct xe_device *xe)
@@ -418,8 +417,6 @@ void xe_display_pm_resume_early(struct xe_device *xe)
 		return;
 
 	intel_display_power_resume_early(xe);
-
-	intel_power_domains_resume(xe);
 }
 
 void xe_display_pm_resume(struct xe_device *xe)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 17/31] drm/{i915, xe}: Move remaining intel_power_domains to intel_display
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (15 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 16/31] drm/{i915, xe}: Move power_domains suspend/resume to display_power Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 21:27   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 18/31] drm/i915/display: Split resume_noirq calls for now Rodrigo Vivi
                   ` (18 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Consolidate the intel_power_domains calls under
intel_display_driver.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_driver.c | 9 +++++++++
 drivers/gpu/drm/i915/display/intel_display_driver.h | 1 +
 drivers/gpu/drm/i915/i915_driver.c                  | 4 +---
 drivers/gpu/drm/xe/display/xe_display.c             | 4 +---
 4 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index 2a171cb2613a..a64468e3a052 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -563,6 +563,13 @@ void intel_display_driver_register(struct drm_i915_private *i915)
 
 	intel_display_device_info_print(DISPLAY_INFO(i915),
 					DISPLAY_RUNTIME_INFO(i915), &p);
+
+	intel_power_domains_enable(i915);
+}
+
+void intel_display_driver_cleanup(struct drm_i915_private *i915)
+{
+	intel_power_domains_cleanup(i915);
 }
 
 /* part #1: call before irq uninstall */
@@ -640,6 +647,8 @@ void intel_display_driver_unregister(struct drm_i915_private *i915)
 	if (!HAS_DISPLAY(i915))
 		return;
 
+	intel_power_domains_disable(i915);
+
 	drm_client_dev_unregister(&i915->drm);
 
 	/*
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
index dec93f2f37c6..4b2c041667e0 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.h
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
@@ -21,6 +21,7 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915);
 int intel_display_driver_probe_nogem(struct drm_i915_private *i915);
 int intel_display_driver_probe(struct drm_i915_private *i915);
 void intel_display_driver_register(struct drm_i915_private *i915);
+void intel_display_driver_cleanup(struct drm_i915_private *i915);
 void intel_display_driver_remove(struct drm_i915_private *i915);
 void intel_display_driver_remove_noirq(struct drm_i915_private *i915);
 void intel_display_driver_remove_nogem(struct drm_i915_private *i915);
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 9e788e1c178e..53960326b68d 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -281,7 +281,7 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv)
 static void i915_driver_late_release(struct drm_i915_private *dev_priv)
 {
 	intel_irq_fini(dev_priv);
-	intel_power_domains_cleanup(dev_priv);
+	intel_display_driver_cleanup(dev_priv);
 	i915_gem_cleanup_early(dev_priv);
 	intel_gt_driver_late_release_all(dev_priv);
 	intel_region_ttm_device_fini(dev_priv);
@@ -627,7 +627,6 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
 
 	intel_display_driver_register(dev_priv);
 
-	intel_power_domains_enable(dev_priv);
 	intel_runtime_pm_enable(&dev_priv->runtime_pm);
 
 	intel_register_dsm_handler();
@@ -650,7 +649,6 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)
 	intel_unregister_dsm_handler();
 
 	intel_runtime_pm_disable(&dev_priv->runtime_pm);
-	intel_power_domains_disable(dev_priv);
 
 	intel_display_driver_unregister(dev_priv);
 
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index d5be622f831b..df66e47daca3 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -107,7 +107,7 @@ static void xe_display_fini_nommio(struct drm_device *dev, void *dummy)
 	if (!xe->info.probe_display)
 		return;
 
-	intel_power_domains_cleanup(xe);
+	intel_display_driver_cleanup(xe);
 }
 
 int xe_display_init_nommio(struct xe_device *xe)
@@ -217,7 +217,6 @@ void xe_display_register(struct xe_device *xe)
 		return;
 
 	intel_display_driver_register(xe);
-	intel_power_domains_enable(xe);
 	intel_register_dsm_handler();
 }
 
@@ -227,7 +226,6 @@ void xe_display_unregister(struct xe_device *xe)
 		return;
 
 	intel_unregister_dsm_handler();
-	intel_power_domains_disable(xe);
 	intel_display_driver_unregister(xe);
 }
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 18/31] drm/i915/display: Split resume_noirq calls for now
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (16 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 17/31] drm/{i915, xe}: Move remaining intel_power_domains to intel_display Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 21:29   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 19/31] drm/xe/display: Align display resume sequence with i915 Rodrigo Vivi
                   ` (17 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Some functions are not yet called from Xe. Move them to a
separate function that will be only used in i915 for now.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_driver.c | 10 ++++++++++
 drivers/gpu/drm/i915/display/intel_display_driver.h |  1 +
 drivers/gpu/drm/i915/i915_driver.c                  |  1 +
 3 files changed, 12 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index a64468e3a052..85a51b9d49f8 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -729,6 +729,16 @@ void intel_display_driver_resume_noirq(struct drm_i915_private *i915)
 	intel_dpt_resume(i915);
 
 	intel_dmc_resume(display);
+}
+
+/*
+ * TODO: Current sequences missing from Xe! Check and merge with above function.
+ *       DPT is also a missing case there, but the TODO is recorded as the
+ *       empty stub DPT functions inside Xe.
+ */
+void intel_display_driver_resume_noirq_legacy(struct drm_i915_private *i915)
+{
+	struct intel_display *display = &i915->display;
 
 	intel_vga_redisable(display);
 
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
index 4b2c041667e0..e287574fcd35 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.h
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
@@ -31,6 +31,7 @@ void intel_display_driver_suspend_noirq(struct drm_i915_private *i915);
 void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2idle);
 void intel_display_driver_resume(struct drm_i915_private *i915);
 void intel_display_driver_resume_noirq(struct drm_i915_private *i915);
+void intel_display_driver_resume_noirq_legacy(struct drm_i915_private *i915);
 void intel_display_driver_resume_nogem(struct intel_display *display);
 void intel_display_driver_shutdown(struct drm_i915_private *i915);
 void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 53960326b68d..65f885e03880 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1113,6 +1113,7 @@ static int i915_drm_resume(struct drm_device *dev)
 	i9xx_display_sr_restore(dev_priv);
 
 	intel_display_driver_resume_noirq(dev_priv);
+	intel_display_driver_resume_noirq_legacy(dev_priv);
 
 	/*
 	 * Interrupts have to be enabled before any batches are run. If not the
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 19/31] drm/xe/display: Align display resume sequence with i915
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (17 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 18/31] drm/i915/display: Split resume_noirq calls for now Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 21:37   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 20/31] drm/xe/display: Align suspend " Rodrigo Vivi
                   ` (16 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Resume DMC before resuming IRQ.
Reset mode_config before GT resume.
Use direct intel_display_driver functions for that.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 23 ++++++++++++++++-------
 drivers/gpu/drm/xe/display/xe_display.h |  2 ++
 drivers/gpu/drm/xe/xe_pm.c              |  4 ++++
 3 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index df66e47daca3..959635653cfb 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -419,21 +419,30 @@ void xe_display_pm_resume_early(struct xe_device *xe)
 
 void xe_display_pm_resume(struct xe_device *xe)
 {
-	struct intel_display *display = &xe->display;
-
 	if (!xe->info.probe_display)
 		return;
 
-	intel_dmc_resume(display);
-
-	if (has_display(xe))
-		drm_mode_config_reset(&xe->drm);
-
 	intel_display_driver_init_hw(xe);
 
 	intel_display_driver_resume(xe);
 }
 
+void xe_display_pm_resume_noirq(struct xe_device *xe)
+{
+	if (!xe->info.probe_display)
+		return;
+
+	intel_display_driver_resume_noirq(xe);
+}
+
+void xe_display_pm_resume_noaccel(struct xe_device *xe)
+{
+	if (!xe->info.probe_display)
+		return;
+
+	intel_display_driver_resume_nogem(&xe->display);
+}
+
 void xe_display_pm_runtime_resume(struct xe_device *xe)
 {
 	if (!xe->info.probe_display)
diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
index a801db19b64f..b4ed5b598c2d 100644
--- a/drivers/gpu/drm/xe/display/xe_display.h
+++ b/drivers/gpu/drm/xe/display/xe_display.h
@@ -41,6 +41,8 @@ void xe_display_pm_shutdown_noirq(struct xe_device *xe);
 void xe_display_pm_shutdown_noaccel(struct xe_device *xe);
 void xe_display_pm_resume_early(struct xe_device *xe);
 void xe_display_pm_resume(struct xe_device *xe);
+void xe_display_pm_resume_noirq(struct xe_device *xe);
+void xe_display_pm_resume_noaccel(struct xe_device *xe);
 void xe_display_pm_runtime_suspend(struct xe_device *xe);
 void xe_display_pm_runtime_resume(struct xe_device *xe);
 
diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index 33eb039053e4..f5d89c326d46 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -182,8 +182,12 @@ int xe_pm_resume(struct xe_device *xe)
 	if (err)
 		goto err;
 
+	xe_display_pm_resume_noirq(xe);
+
 	xe_irq_resume(xe);
 
+	xe_display_pm_resume_noaccel(xe);
+
 	for_each_gt(gt, xe, id)
 		xe_gt_resume(gt);
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 20/31] drm/xe/display: Align suspend sequence with i915
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (18 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 19/31] drm/xe/display: Align display resume sequence with i915 Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-07 21:40   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 21/31] drm/{i915, xe}/display: Move dsm registration under intel_driver Rodrigo Vivi
                   ` (15 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Move a few things to after GT has stopped and also
IRQ has been disabled:
 - intel_hpd_cancel_work
 - intel_display_driver_suspend_access
 - intel_encoder_suspend_all

With that, also remove the xe_display_flush_cleanup_work,
which is no longer necessary.

Then, use directly all the intel_display_driver functions for
a full alignment.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 25 ++++++++++++++-----------
 drivers/gpu/drm/xe/display/xe_display.h |  2 ++
 drivers/gpu/drm/xe/xe_pm.c              |  2 ++
 3 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 959635653cfb..44850b6cd382 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -342,26 +342,29 @@ static void xe_display_from_d3cold(struct xe_device *xe)
 
 void xe_display_pm_suspend(struct xe_device *xe)
 {
-	struct intel_display *display = &xe->display;
-	bool s2idle = suspend_to_idle();
-
 	if (!xe->info.probe_display)
 		return;
 
 	intel_display_driver_suspend(xe);
+}
 
-	xe_display_flush_cleanup_work(xe);
+void xe_display_pm_suspend_noirq(struct xe_device *xe)
+{
+	if (!xe->info.probe_display)
+		return;
 
-	intel_hpd_cancel_work(xe);
+	intel_display_driver_suspend_noirq(xe);
+}
 
-	if (has_display(xe)) {
-		intel_display_driver_suspend_access(xe);
-		intel_encoder_suspend_all(&xe->display);
-	}
+void xe_display_pm_suspend_noggtt(struct xe_device *xe)
+{
+	struct intel_display *display = &xe->display;
+	bool s2idle = suspend_to_idle();
 
-	intel_opregion_suspend(display, s2idle ? PCI_D1 : PCI_D3cold);
+	if (!xe->info.probe_display)
+		return;
 
-	intel_dmc_suspend(display);
+	intel_display_driver_suspend_noggtt(display, s2idle);
 }
 
 void xe_display_pm_shutdown(struct xe_device *xe)
diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
index b4ed5b598c2d..256bd2d23964 100644
--- a/drivers/gpu/drm/xe/display/xe_display.h
+++ b/drivers/gpu/drm/xe/display/xe_display.h
@@ -35,6 +35,8 @@ void xe_display_irq_reset(struct xe_device *xe);
 void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt);
 
 void xe_display_pm_suspend(struct xe_device *xe);
+void xe_display_pm_suspend_noirq(struct xe_device *xe);
+void xe_display_pm_suspend_noggtt(struct xe_device *xe);
 void xe_display_pm_suspend_late(struct xe_device *xe);
 void xe_display_pm_shutdown(struct xe_device *xe);
 void xe_display_pm_shutdown_noirq(struct xe_device *xe);
diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index f5d89c326d46..77eb45a641e8 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -140,6 +140,8 @@ int xe_pm_suspend(struct xe_device *xe)
 
 	xe_irq_suspend(xe);
 
+	xe_display_pm_suspend_noirq(xe);
+	xe_display_pm_suspend_noggtt(xe);
 	xe_display_pm_suspend_late(xe);
 
 	drm_dbg(&xe->drm, "Device suspended\n");
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 21/31] drm/{i915, xe}/display: Move dsm registration under intel_driver
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (19 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 20/31] drm/xe/display: Align suspend " Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-08 14:04   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 22/31] drm/i915/display: Move runtime pm related calls under intel_display_driver Rodrigo Vivi
                   ` (14 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Move dsm register/unregister calls from the drivers to under
intel_display_driver register/unregister.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/i915/display/intel_display_driver.c | 4 ++++
 drivers/gpu/drm/i915/i915_driver.c                  | 5 -----
 drivers/gpu/drm/xe/display/xe_display.c             | 3 ---
 3 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index 85a51b9d49f8..f3a586913c6f 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -565,6 +565,8 @@ void intel_display_driver_register(struct drm_i915_private *i915)
 					DISPLAY_RUNTIME_INFO(i915), &p);
 
 	intel_power_domains_enable(i915);
+
+	intel_register_dsm_handler();
 }
 
 void intel_display_driver_cleanup(struct drm_i915_private *i915)
@@ -647,6 +649,8 @@ void intel_display_driver_unregister(struct drm_i915_private *i915)
 	if (!HAS_DISPLAY(i915))
 		return;
 
+	intel_unregister_dsm_handler();
+
 	intel_power_domains_disable(i915);
 
 	drm_client_dev_unregister(&i915->drm);
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 65f885e03880..7fce210d355d 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -45,7 +45,6 @@
 #include <drm/drm_managed.h>
 
 #include "display/i9xx_display_sr.h"
-#include "display/intel_acpi.h"
 #include "display/intel_bw.h"
 #include "display/intel_cdclk.h"
 #include "display/intel_crtc.h"
@@ -629,8 +628,6 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
 
 	intel_runtime_pm_enable(&dev_priv->runtime_pm);
 
-	intel_register_dsm_handler();
-
 	if (i915_switcheroo_register(dev_priv))
 		drm_err(&dev_priv->drm, "Failed to register vga switcheroo!\n");
 }
@@ -646,8 +643,6 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)
 
 	i915_switcheroo_unregister(dev_priv);
 
-	intel_unregister_dsm_handler();
-
 	intel_runtime_pm_disable(&dev_priv->runtime_pm);
 
 	intel_display_driver_unregister(dev_priv);
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 44850b6cd382..6bfad26a3c06 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -14,7 +14,6 @@
 #include <uapi/drm/xe_drm.h>
 
 #include "soc/intel_dram.h"
-#include "intel_acpi.h"
 #include "intel_audio.h"
 #include "intel_bw.h"
 #include "intel_display.h"
@@ -217,7 +216,6 @@ void xe_display_register(struct xe_device *xe)
 		return;
 
 	intel_display_driver_register(xe);
-	intel_register_dsm_handler();
 }
 
 void xe_display_unregister(struct xe_device *xe)
@@ -225,7 +223,6 @@ void xe_display_unregister(struct xe_device *xe)
 	if (!xe->info.probe_display)
 		return;
 
-	intel_unregister_dsm_handler();
 	intel_display_driver_unregister(xe);
 }
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 22/31] drm/i915/display: Move runtime pm related calls under intel_display_driver
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (20 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 21/31] drm/{i915, xe}/display: Move dsm registration under intel_driver Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-08 14:10   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 23/31] drm/xe/display: Prepare runtime pm functions Rodrigo Vivi
                   ` (13 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Continue moving more display stuff from i915_driver to intel_display.
With the end goal of reconciling xe and i915 sequences.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 .../drm/i915/display/intel_display_driver.c   | 58 +++++++++++++++++++
 .../drm/i915/display/intel_display_driver.h   |  4 ++
 drivers/gpu/drm/i915/i915_driver.c            | 46 ++-------------
 3 files changed, 66 insertions(+), 42 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index f3a586913c6f..62a7aa56f0da 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -856,6 +856,64 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
 	intel_power_domains_enable(i915);
 }
 
+void intel_display_driver_runtime_suspend(struct drm_i915_private *i915)
+{
+	intel_display_power_suspend(i915);
+}
+
+void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915)
+{
+	struct intel_display *display = &i915->display;
+
+	/*
+	 * FIXME: We really should find a document that references the arguments
+	 * used below!
+	 */
+	if (IS_BROADWELL(i915)) {
+		/*
+		 * On Broadwell, if we use PCI_D1 the PCH DDI ports will stop
+		 * being detected, and the call we do at intel_runtime_resume()
+		 * won't be able to restore them. Since PCI_D3hot matches the
+		 * actual specification and appears to be working, use it.
+		 */
+		intel_opregion_notify_adapter(display, PCI_D3hot);
+	} else {
+		/*
+		 * current versions of firmware which depend on this opregion
+		 * notification have repurposed the D1 definition to mean
+		 * "runtime suspended" vs. what you would normally expect (D3)
+		 * to distinguish it from notifications that might be sent via
+		 * the suspend path.
+		 */
+		intel_opregion_notify_adapter(display, PCI_D1);
+	}
+
+	if (!IS_VALLEYVIEW(i915) && !IS_CHERRYVIEW(i915))
+		intel_hpd_poll_enable(i915);
+}
+
+void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915)
+{
+	intel_opregion_notify_adapter(&i915->display, PCI_D0);
+
+	intel_display_power_resume(i915);
+}
+
+void intel_display_driver_runtime_resume(struct drm_i915_private *i915)
+{
+	/*
+	 * On VLV/CHV display interrupts are part of the display
+	 * power well, so hpd is reinitialized from there. For
+	 * everyone else do it here.
+	 */
+	if (!IS_VALLEYVIEW(i915) && !IS_CHERRYVIEW(i915)) {
+		intel_hpd_init(i915);
+		intel_hpd_poll_disable(i915);
+	}
+
+	skl_watermark_ipc_update(i915);
+}
+
 void intel_display_driver_shutdown(struct drm_i915_private *i915)
 {
 	intel_power_domains_disable(i915);
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
index e287574fcd35..b1441a55d72d 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.h
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
@@ -33,6 +33,10 @@ void intel_display_driver_resume(struct drm_i915_private *i915);
 void intel_display_driver_resume_noirq(struct drm_i915_private *i915);
 void intel_display_driver_resume_noirq_legacy(struct drm_i915_private *i915);
 void intel_display_driver_resume_nogem(struct intel_display *display);
+void intel_display_driver_runtime_suspend(struct drm_i915_private *i915);
+void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915);
+void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915);
+void intel_display_driver_runtime_resume(struct drm_i915_private *i915);
 void intel_display_driver_shutdown(struct drm_i915_private *i915);
 void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
 void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915);
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index 7fce210d355d..b3eaa55ebacb 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1373,7 +1373,6 @@ static int i915_pm_restore(struct device *kdev)
 static int intel_runtime_suspend(struct device *kdev)
 {
 	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
-	struct intel_display *display = &dev_priv->display;
 	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;
@@ -1403,7 +1402,7 @@ static int intel_runtime_suspend(struct device *kdev)
 	for_each_gt(gt, dev_priv, i)
 		intel_uncore_suspend(gt->uncore);
 
-	intel_display_power_suspend(dev_priv);
+	intel_display_driver_runtime_suspend(dev_priv);
 
 	ret = vlv_suspend_complete(dev_priv);
 	if (ret) {
@@ -1437,34 +1436,10 @@ static int intel_runtime_suspend(struct device *kdev)
 	if (root_pdev)
 		pci_d3cold_disable(root_pdev);
 
-	/*
-	 * FIXME: We really should find a document that references the arguments
-	 * used below!
-	 */
-	if (IS_BROADWELL(dev_priv)) {
-		/*
-		 * On Broadwell, if we use PCI_D1 the PCH DDI ports will stop
-		 * being detected, and the call we do at intel_runtime_resume()
-		 * won't be able to restore them. Since PCI_D3hot matches the
-		 * actual specification and appears to be working, use it.
-		 */
-		intel_opregion_notify_adapter(display, PCI_D3hot);
-	} else {
-		/*
-		 * current versions of firmware which depend on this opregion
-		 * notification have repurposed the D1 definition to mean
-		 * "runtime suspended" vs. what you would normally expect (D3)
-		 * to distinguish it from notifications that might be sent via
-		 * the suspend path.
-		 */
-		intel_opregion_notify_adapter(display, PCI_D1);
-	}
+	intel_display_driver_runtime_suspend_late(dev_priv);
 
 	assert_forcewakes_inactive(&dev_priv->uncore);
 
-	if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
-		intel_hpd_poll_enable(dev_priv);
-
 	drm_dbg(&dev_priv->drm, "Device suspended\n");
 	return 0;
 }
@@ -1472,7 +1447,6 @@ static int intel_runtime_suspend(struct device *kdev)
 static int intel_runtime_resume(struct device *kdev)
 {
 	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
-	struct intel_display *display = &dev_priv->display;
 	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;
@@ -1487,8 +1461,6 @@ static int intel_runtime_resume(struct device *kdev)
 	drm_WARN_ON_ONCE(&dev_priv->drm, atomic_read(&rpm->wakeref_count));
 	disable_rpm_wakeref_asserts(rpm);
 
-	intel_opregion_notify_adapter(display, PCI_D0);
-
 	root_pdev = pcie_find_root_port(pdev);
 	if (root_pdev)
 		pci_d3cold_enable(root_pdev);
@@ -1497,7 +1469,7 @@ static int intel_runtime_resume(struct device *kdev)
 		drm_dbg(&dev_priv->drm,
 			"Unclaimed access during suspend, bios?\n");
 
-	intel_display_power_resume(dev_priv);
+	intel_display_driver_runtime_resume_early(dev_priv);
 
 	ret = vlv_resume_prepare(dev_priv, true);
 
@@ -1515,17 +1487,7 @@ static int intel_runtime_resume(struct device *kdev)
 
 	intel_pxp_runtime_resume(dev_priv->pxp);
 
-	/*
-	 * On VLV/CHV display interrupts are part of the display
-	 * power well, so hpd is reinitialized from there. For
-	 * everyone else do it here.
-	 */
-	if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) {
-		intel_hpd_init(dev_priv);
-		intel_hpd_poll_disable(dev_priv);
-	}
-
-	skl_watermark_ipc_update(dev_priv);
+	intel_display_driver_runtime_resume_early(dev_priv);
 
 	enable_rpm_wakeref_asserts(rpm);
 
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 23/31] drm/xe/display: Prepare runtime pm functions
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (21 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 22/31] drm/i915/display: Move runtime pm related calls under intel_display_driver Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-08 14:31   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume Rodrigo Vivi
                   ` (12 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

No functional change. Just organize the runtime_pm related
functions to allow a later sync with the i915.

Move runtime_suspend down near the runtime_resume.
Create runtime_suspend_late and runtime_suspend_early
stages for a better visualization of the missed i915
sequences.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 41 +++++++++++++++++--------
 drivers/gpu/drm/xe/display/xe_display.h |  2 ++
 drivers/gpu/drm/xe/xe_pm.c              |  7 +++--
 3 files changed, 35 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 6bfad26a3c06..1ab4dd51094f 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -388,17 +388,6 @@ void xe_display_pm_shutdown_noaccel(struct xe_device *xe)
 	intel_display_driver_shutdown_nogem(xe);
 }
 
-void xe_display_pm_runtime_suspend(struct xe_device *xe)
-{
-	if (!xe->info.probe_display)
-		return;
-
-	if (xe->d3cold.allowed)
-		xe_display_to_d3cold(xe);
-
-	intel_hpd_poll_enable(xe);
-}
-
 void xe_display_pm_suspend_late(struct xe_device *xe)
 {
 	bool s2idle = suspend_to_idle();
@@ -443,6 +432,35 @@ void xe_display_pm_resume_noaccel(struct xe_device *xe)
 	intel_display_driver_resume_nogem(&xe->display);
 }
 
+void xe_display_pm_runtime_suspend(struct xe_device *xe)
+{
+	if (!xe->info.probe_display)
+		return;
+
+	if (xe->d3cold.allowed)
+		xe_display_to_d3cold(xe);
+
+	intel_hpd_poll_enable(xe);
+}
+
+void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
+{
+	if (!xe->info.probe_display)
+		return;
+
+	if (xe->d3cold.allowed)
+		intel_display_power_suspend_late(xe, false);
+}
+
+void xe_display_pm_runtime_resume_early(struct xe_device *xe)
+{
+	if (!xe->info.probe_display)
+		return;
+
+	if (xe->d3cold.allowed)
+		intel_display_power_resume_early(xe);
+}
+
 void xe_display_pm_runtime_resume(struct xe_device *xe)
 {
 	if (!xe->info.probe_display)
@@ -454,7 +472,6 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
 		xe_display_from_d3cold(xe);
 }
 
-
 static void display_device_remove(struct drm_device *dev, void *arg)
 {
 	struct xe_device *xe = arg;
diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
index 256bd2d23964..64ff2d2f5270 100644
--- a/drivers/gpu/drm/xe/display/xe_display.h
+++ b/drivers/gpu/drm/xe/display/xe_display.h
@@ -46,6 +46,8 @@ void xe_display_pm_resume(struct xe_device *xe);
 void xe_display_pm_resume_noirq(struct xe_device *xe);
 void xe_display_pm_resume_noaccel(struct xe_device *xe);
 void xe_display_pm_runtime_suspend(struct xe_device *xe);
+void xe_display_pm_runtime_suspend_late(struct xe_device *xe);
+void xe_display_pm_runtime_resume_early(struct xe_device *xe);
 void xe_display_pm_runtime_resume(struct xe_device *xe);
 
 #else
diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index 77eb45a641e8..4cacf4b33d83 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -418,8 +418,7 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
 
 	xe_irq_suspend(xe);
 
-	if (xe->d3cold.allowed)
-		xe_display_pm_suspend_late(xe);
+	xe_display_pm_runtime_suspend_late(xe);
 out:
 	if (err)
 		xe_display_pm_runtime_resume(xe);
@@ -450,9 +449,11 @@ int xe_pm_runtime_resume(struct xe_device *xe)
 		err = xe_pcode_ready(xe, true);
 		if (err)
 			goto out;
+	}
 
-		xe_display_pm_resume_early(xe);
+	xe_display_pm_runtime_resume_early(xe);
 
+	if (xe->d3cold.allowed) {
 		/*
 		 * This only restores pinned memory which is the memory
 		 * required for the GT(s) to resume.
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (22 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 23/31] drm/xe/display: Prepare runtime pm functions Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-03  6:32   ` Govindapillai, Vinod
  2024-10-08 14:32   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 25/31] drm/xe/display: Move hpd_poll calls to later runtime stages Rodrigo Vivi
                   ` (11 subsequent siblings)
  35 siblings, 2 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi, Vinod Govindapillai

We need to ensure this is called on every kind of runtime
resume and not only on d3cold is possible. Aligning with
the hpd sequence from i915.

Cc: Vinod Govindapillai <vinod.govindapillai@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 1ab4dd51094f..4d1dd5294b89 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -330,8 +330,6 @@ static void xe_display_from_d3cold(struct xe_device *xe)
 
 	intel_display_driver_init_hw(xe);
 
-	intel_hpd_init(xe);
-
 	intel_opregion_resume(display);
 
 	intel_power_domains_enable(xe);
@@ -470,6 +468,8 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
 
 	if (xe->d3cold.allowed)
 		xe_display_from_d3cold(xe);
+
+	intel_hpd_init(xe);
 }
 
 static void display_device_remove(struct drm_device *dev, void *arg)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 25/31] drm/xe/display: Move hpd_poll calls to later runtime stages
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (23 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-03 12:22   ` Govindapillai, Vinod
  2024-10-08 14:33   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 26/31] drm/xe/display: Add missing watermark ipc update at runtime resume Rodrigo Vivi
                   ` (10 subsequent siblings)
  35 siblings, 2 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Align placement of HDP poll calls with i915.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 4d1dd5294b89..c758874a9059 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -437,8 +437,6 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
 
 	if (xe->d3cold.allowed)
 		xe_display_to_d3cold(xe);
-
-	intel_hpd_poll_enable(xe);
 }
 
 void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
@@ -448,6 +446,8 @@ void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
 
 	if (xe->d3cold.allowed)
 		intel_display_power_suspend_late(xe, false);
+
+	intel_hpd_poll_enable(xe);
 }
 
 void xe_display_pm_runtime_resume_early(struct xe_device *xe)
@@ -464,12 +464,11 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
 	if (!xe->info.probe_display)
 		return;
 
-	intel_hpd_poll_disable(xe);
-
 	if (xe->d3cold.allowed)
 		xe_display_from_d3cold(xe);
 
 	intel_hpd_init(xe);
+	intel_hpd_poll_disable(xe);
 }
 
 static void display_device_remove(struct drm_device *dev, void *arg)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 26/31] drm/xe/display: Add missing watermark ipc update at runtime resume
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (24 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 25/31] drm/xe/display: Move hpd_poll calls to later runtime stages Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-08 14:35   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 27/31] drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold Rodrigo Vivi
                   ` (9 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Continuing the alignment with i915 runtime pm sequence. Add
this missing call.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index c758874a9059..44cace0237dd 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -27,6 +27,7 @@
 #include "intel_hdcp.h"
 #include "intel_hotplug.h"
 #include "intel_opregion.h"
+#include "skl_watermark.h"
 #include "xe_module.h"
 
 /* Xe device functions */
@@ -469,6 +470,7 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
 
 	intel_hpd_init(xe);
 	intel_hpd_poll_disable(xe);
+	skl_watermark_ipc_update(xe);
 }
 
 static void display_device_remove(struct drm_device *dev, void *arg)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 27/31] drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (25 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 26/31] drm/xe/display: Add missing watermark ipc update at runtime resume Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-08 14:37   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 28/31] drm/xe/display: Move display runtime suspend to a later point Rodrigo Vivi
                   ` (8 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

Opregion needs to be notified about the power transition even when
not going to d3cold. This aligns with i915 sequence.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 44cace0237dd..780c8d7f392d 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -447,6 +447,8 @@ void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
 
 	if (xe->d3cold.allowed)
 		intel_display_power_suspend_late(xe, false);
+	else
+		intel_opregion_notify_adapter(&xe->display, PCI_D1);
 
 	intel_hpd_poll_enable(xe);
 }
@@ -458,6 +460,8 @@ void xe_display_pm_runtime_resume_early(struct xe_device *xe)
 
 	if (xe->d3cold.allowed)
 		intel_display_power_resume_early(xe);
+	else
+		intel_opregion_notify_adapter(&xe->display, PCI_D0);
 }
 
 void xe_display_pm_runtime_resume(struct xe_device *xe)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 28/31] drm/xe/display: Move display runtime suspend to a later point
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (26 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 27/31] drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-08 14:37   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 29/31] drm/xe/display: Kill crtc commit flush Rodrigo Vivi
                   ` (7 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

On runtime suspend (regardless of d3cold), there's no need
to perform the display power sequences before we disable the GT
and IRQ.

In a matter of fact, the i915 runtime suspend needs to
disable power, which asserts that IRQs are disabled.
So, before the runtime_pm sequences can be reconciled, it is needed to
ensure that the Xe's IRQ are disabled before the display.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/xe_pm.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
index 4cacf4b33d83..16854215bea6 100644
--- a/drivers/gpu/drm/xe/xe_pm.c
+++ b/drivers/gpu/drm/xe/xe_pm.c
@@ -402,8 +402,6 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
 		xe_bo_runtime_pm_release_mmap_offset(bo);
 	mutex_unlock(&xe->mem_access.vram_userfault.lock);
 
-	xe_display_pm_runtime_suspend(xe);
-
 	if (xe->d3cold.allowed) {
 		err = xe_bo_evict_all(xe);
 		if (err)
@@ -418,6 +416,7 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
 
 	xe_irq_suspend(xe);
 
+	xe_display_pm_runtime_suspend(xe);
 	xe_display_pm_runtime_suspend_late(xe);
 out:
 	if (err)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 29/31] drm/xe/display: Kill crtc commit flush
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (27 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 28/31] drm/xe/display: Move display runtime suspend to a later point Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-08 14:50   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 30/31] drm/xe/display: Add missing power display handling on non-d3cold rpm Rodrigo Vivi
                   ` (6 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

This flush was needed in regular suspend cases in the past.
After the clean-up and reconciliation with the i915 it was
not needed anymore and removed. However this remained here
in the runtime suspend path.

However, the runtime pm flow ensures that there won't be any
flying or pending crtc commit when the runtime_suspend is
called. So this is not needed here. Clean it up.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 23 -----------------------
 1 file changed, 23 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 780c8d7f392d..23bdd8904c44 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -283,27 +283,6 @@ static bool suspend_to_idle(void)
 	return false;
 }
 
-static void xe_display_flush_cleanup_work(struct xe_device *xe)
-{
-	struct intel_crtc *crtc;
-
-	for_each_intel_crtc(&xe->drm, crtc) {
-		struct drm_crtc_commit *commit;
-
-		spin_lock(&crtc->base.commit_lock);
-		commit = list_first_entry_or_null(&crtc->base.commit_list,
-						  struct drm_crtc_commit, commit_entry);
-		if (commit)
-			drm_crtc_commit_get(commit);
-		spin_unlock(&crtc->base.commit_lock);
-
-		if (commit) {
-			wait_for_completion(&commit->cleanup_done);
-			drm_crtc_commit_put(commit);
-		}
-	}
-}
-
 static void xe_display_to_d3cold(struct xe_device *xe)
 {
 	struct intel_display *display = &xe->display;
@@ -311,8 +290,6 @@ static void xe_display_to_d3cold(struct xe_device *xe)
 	/* We do a lot of poking in a lot of registers, make sure they work properly. */
 	intel_power_domains_disable(xe);
 
-	xe_display_flush_cleanup_work(xe);
-
 	intel_hpd_cancel_work(xe);
 
 	intel_opregion_suspend(display, PCI_D3cold);
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 30/31] drm/xe/display: Add missing power display handling on non-d3cold rpm
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (28 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 29/31] drm/xe/display: Kill crtc commit flush Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-08 14:51   ` Cavitt, Jonathan
  2024-09-24 20:35 ` [PATCH 31/31] drm/{i915, xe}/display: Consolidade entire runtime pm sequence Rodrigo Vivi
                   ` (5 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

On the regular igfx runtime pm sequence where d3cold is not
possible, the proper calls to power display are required.

Align with i915.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 drivers/gpu/drm/xe/display/xe_display.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index 23bdd8904c44..ab85c7fb217a 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -415,6 +415,8 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
 
 	if (xe->d3cold.allowed)
 		xe_display_to_d3cold(xe);
+	else
+		intel_display_power_suspend(xe);
 }
 
 void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
@@ -435,10 +437,12 @@ void xe_display_pm_runtime_resume_early(struct xe_device *xe)
 	if (!xe->info.probe_display)
 		return;
 
-	if (xe->d3cold.allowed)
+	if (xe->d3cold.allowed) {
 		intel_display_power_resume_early(xe);
-	else
+	} else {
 		intel_opregion_notify_adapter(&xe->display, PCI_D0);
+		intel_display_power_resume(xe);
+	}
 }
 
 void xe_display_pm_runtime_resume(struct xe_device *xe)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* [PATCH 31/31] drm/{i915, xe}/display: Consolidade entire runtime pm sequence
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (29 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 30/31] drm/xe/display: Add missing power display handling on non-d3cold rpm Rodrigo Vivi
@ 2024-09-24 20:35 ` Rodrigo Vivi
  2024-10-08 14:57   ` Cavitt, Jonathan
  2024-09-25 10:32 ` [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Jani Nikula
                   ` (4 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-24 20:35 UTC (permalink / raw)
  To: intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

No functional change.

Consolidate the entire runtime pm sequences under
intel_display_driver.

Simplifications and optimizations around the D3cold sequences are
likely still possible. But before that can be done, consolidate
everything at the intel_display_driver side.

Xe display power management functions are now only a wrapper
checking for xe's display probe parameter.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
 .../drm/i915/display/intel_display_driver.c   | 66 ++++++++++++++++---
 .../drm/i915/display/intel_display_driver.h   | 12 ++--
 drivers/gpu/drm/i915/i915_driver.c            |  8 +--
 drivers/gpu/drm/xe/display/xe_display.c       | 56 ++--------------
 4 files changed, 74 insertions(+), 68 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
index 62a7aa56f0da..3861fdbefaff 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.c
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
@@ -856,12 +856,45 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
 	intel_power_domains_enable(i915);
 }
 
-void intel_display_driver_runtime_suspend(struct drm_i915_private *i915)
+static void intel_display_to_d3cold(struct drm_i915_private *i915)
 {
-	intel_display_power_suspend(i915);
+	struct intel_display *display = &i915->display;
+
+	/* We do a lot of poking in a lot of registers, make sure they work properly. */
+	intel_power_domains_disable(i915);
+
+	intel_hpd_cancel_work(i915);
+
+	intel_opregion_suspend(display, PCI_D3cold);
+
+	intel_dmc_suspend(display);
+}
+
+static void intel_display_from_d3cold(struct drm_i915_private *i915)
+{
+	struct intel_display *display = &i915->display;
+
+	intel_dmc_resume(display);
+
+	if (HAS_DISPLAY(i915))
+		drm_mode_config_reset(&i915->drm);
+
+	intel_display_driver_init_hw(i915);
+
+	intel_opregion_resume(display);
+
+	intel_power_domains_enable(i915);
+}
+
+void intel_display_driver_runtime_suspend(struct drm_i915_private *i915, bool d3cold_allowed)
+{
+	if (d3cold_allowed)
+		intel_display_to_d3cold(i915);
+	else
+		intel_display_power_suspend(i915);
 }
 
-void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915)
+static void display_runtime_suspend_notify_opregion(struct drm_i915_private *i915)
 {
 	struct intel_display *display = &i915->display;
 
@@ -887,20 +920,37 @@ void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915)
 		 */
 		intel_opregion_notify_adapter(display, PCI_D1);
 	}
+}
+
+void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915,
+					       bool d3cold_allowed)
+{
+	if (d3cold_allowed)
+		intel_display_power_suspend_late(i915, false);
+	else
+		display_runtime_suspend_notify_opregion(i915);
 
 	if (!IS_VALLEYVIEW(i915) && !IS_CHERRYVIEW(i915))
 		intel_hpd_poll_enable(i915);
 }
 
-void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915)
+void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915,
+					       bool d3cold_allowed)
 {
-	intel_opregion_notify_adapter(&i915->display, PCI_D0);
-
-	intel_display_power_resume(i915);
+	if (d3cold_allowed) {
+		intel_display_power_resume_early(i915);
+	} else {
+		intel_opregion_notify_adapter(&i915->display, PCI_D0);
+		intel_display_power_resume(i915);
+	}
 }
 
-void intel_display_driver_runtime_resume(struct drm_i915_private *i915)
+void intel_display_driver_runtime_resume(struct drm_i915_private *i915,
+					 bool d3cold_allowed)
 {
+	if (d3cold_allowed)
+		intel_display_from_d3cold(i915);
+
 	/*
 	 * On VLV/CHV display interrupts are part of the display
 	 * power well, so hpd is reinitialized from there. For
diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
index b1441a55d72d..21aa0e551898 100644
--- a/drivers/gpu/drm/i915/display/intel_display_driver.h
+++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
@@ -33,10 +33,14 @@ void intel_display_driver_resume(struct drm_i915_private *i915);
 void intel_display_driver_resume_noirq(struct drm_i915_private *i915);
 void intel_display_driver_resume_noirq_legacy(struct drm_i915_private *i915);
 void intel_display_driver_resume_nogem(struct intel_display *display);
-void intel_display_driver_runtime_suspend(struct drm_i915_private *i915);
-void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915);
-void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915);
-void intel_display_driver_runtime_resume(struct drm_i915_private *i915);
+void intel_display_driver_runtime_suspend(struct drm_i915_private *i915,
+					  bool d3cold_allowed);
+void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915,
+					       bool d3cold_allowed);
+void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915,
+					       bool d3cold_allowed);
+void intel_display_driver_runtime_resume(struct drm_i915_private *i915,
+					 bool d3cold_allowed);
 void intel_display_driver_shutdown(struct drm_i915_private *i915);
 void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
 void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915);
diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
index b3eaa55ebacb..719b1c21b695 100644
--- a/drivers/gpu/drm/i915/i915_driver.c
+++ b/drivers/gpu/drm/i915/i915_driver.c
@@ -1402,7 +1402,7 @@ static int intel_runtime_suspend(struct device *kdev)
 	for_each_gt(gt, dev_priv, i)
 		intel_uncore_suspend(gt->uncore);
 
-	intel_display_driver_runtime_suspend(dev_priv);
+	intel_display_driver_runtime_suspend(dev_priv, false);
 
 	ret = vlv_suspend_complete(dev_priv);
 	if (ret) {
@@ -1436,7 +1436,7 @@ static int intel_runtime_suspend(struct device *kdev)
 	if (root_pdev)
 		pci_d3cold_disable(root_pdev);
 
-	intel_display_driver_runtime_suspend_late(dev_priv);
+	intel_display_driver_runtime_suspend_late(dev_priv, false);
 
 	assert_forcewakes_inactive(&dev_priv->uncore);
 
@@ -1469,7 +1469,7 @@ static int intel_runtime_resume(struct device *kdev)
 		drm_dbg(&dev_priv->drm,
 			"Unclaimed access during suspend, bios?\n");
 
-	intel_display_driver_runtime_resume_early(dev_priv);
+	intel_display_driver_runtime_resume_early(dev_priv, false);
 
 	ret = vlv_resume_prepare(dev_priv, true);
 
@@ -1487,7 +1487,7 @@ static int intel_runtime_resume(struct device *kdev)
 
 	intel_pxp_runtime_resume(dev_priv->pxp);
 
-	intel_display_driver_runtime_resume_early(dev_priv);
+	intel_display_driver_runtime_resume_early(dev_priv, false);
 
 	enable_rpm_wakeref_asserts(rpm);
 
diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
index ab85c7fb217a..9a652292d988 100644
--- a/drivers/gpu/drm/xe/display/xe_display.c
+++ b/drivers/gpu/drm/xe/display/xe_display.c
@@ -283,36 +283,6 @@ static bool suspend_to_idle(void)
 	return false;
 }
 
-static void xe_display_to_d3cold(struct xe_device *xe)
-{
-	struct intel_display *display = &xe->display;
-
-	/* We do a lot of poking in a lot of registers, make sure they work properly. */
-	intel_power_domains_disable(xe);
-
-	intel_hpd_cancel_work(xe);
-
-	intel_opregion_suspend(display, PCI_D3cold);
-
-	intel_dmc_suspend(display);
-}
-
-static void xe_display_from_d3cold(struct xe_device *xe)
-{
-	struct intel_display *display = &xe->display;
-
-	intel_dmc_resume(display);
-
-	if (has_display(xe))
-		drm_mode_config_reset(&xe->drm);
-
-	intel_display_driver_init_hw(xe);
-
-	intel_opregion_resume(display);
-
-	intel_power_domains_enable(xe);
-}
-
 void xe_display_pm_suspend(struct xe_device *xe)
 {
 	if (!xe->info.probe_display)
@@ -413,10 +383,7 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
 	if (!xe->info.probe_display)
 		return;
 
-	if (xe->d3cold.allowed)
-		xe_display_to_d3cold(xe);
-	else
-		intel_display_power_suspend(xe);
+	intel_display_driver_runtime_suspend(xe, xe->d3cold.allowed);
 }
 
 void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
@@ -424,12 +391,7 @@ void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
 	if (!xe->info.probe_display)
 		return;
 
-	if (xe->d3cold.allowed)
-		intel_display_power_suspend_late(xe, false);
-	else
-		intel_opregion_notify_adapter(&xe->display, PCI_D1);
-
-	intel_hpd_poll_enable(xe);
+	intel_display_driver_runtime_suspend_late(xe, xe->d3cold.allowed);
 }
 
 void xe_display_pm_runtime_resume_early(struct xe_device *xe)
@@ -437,12 +399,7 @@ void xe_display_pm_runtime_resume_early(struct xe_device *xe)
 	if (!xe->info.probe_display)
 		return;
 
-	if (xe->d3cold.allowed) {
-		intel_display_power_resume_early(xe);
-	} else {
-		intel_opregion_notify_adapter(&xe->display, PCI_D0);
-		intel_display_power_resume(xe);
-	}
+	intel_display_driver_runtime_resume_early(xe, xe->d3cold.allowed);
 }
 
 void xe_display_pm_runtime_resume(struct xe_device *xe)
@@ -450,12 +407,7 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
 	if (!xe->info.probe_display)
 		return;
 
-	if (xe->d3cold.allowed)
-		xe_display_from_d3cold(xe);
-
-	intel_hpd_init(xe);
-	intel_hpd_poll_disable(xe);
-	skl_watermark_ipc_update(xe);
+	intel_display_driver_runtime_resume(xe, xe->d3cold.allowed);
 }
 
 static void display_device_remove(struct drm_device *dev, void *arg)
-- 
2.46.0


^ permalink raw reply related	[flat|nested] 81+ messages in thread

* Re: [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display
  2024-09-24 20:35 ` [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display Rodrigo Vivi
@ 2024-09-25 10:20   ` Jani Nikula
  2024-09-25 20:59     ` Rodrigo Vivi
  2024-10-07 19:15   ` Cavitt, Jonathan
  1 sibling, 1 reply; 81+ messages in thread
From: Jani Nikula @ 2024-09-25 10:20 UTC (permalink / raw)
  To: Rodrigo Vivi, intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

On Tue, 24 Sep 2024, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
> Restrict this function to only save and restore registers
> functionality. Then, that can be moved out later to under
> display with a proper name.
>
> Cc: Jani Nikula <jani.nikula@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_driver.c  | 6 ++++++
>  drivers/gpu/drm/i915/i915_suspend.c | 6 ------
>  2 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 6dc0104a3e36..c5ffcf229f42 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -60,6 +60,7 @@
>  #include "display/intel_pch_refclk.h"
>  #include "display/intel_pps.h"
>  #include "display/intel_sprite_uapi.h"
> +#include "display/intel_vga.h"
>  #include "display/skl_watermark.h"
>  
>  #include "gem/i915_gem_context.h"
> @@ -1167,6 +1168,11 @@ static int i915_drm_resume(struct drm_device *dev)
>  	intel_dmc_resume(display);
>  
>  	i915_restore_display(dev_priv);
> +
> +	intel_vga_redisable(display);
> +
> +	intel_gmbus_reset(dev_priv);
> +

Hate to be nitpicky, but these are now called for !HAS_DISPLAY()
too. Maybe the later patches fix it, but here it's not right.

I agree with the approach though.

>  	intel_pps_unlock_regs_wa(display);
>  
>  	intel_init_pch_refclk(dev_priv);
> diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
> index 9d3d9b983032..fb67b05cd864 100644
> --- a/drivers/gpu/drm/i915/i915_suspend.c
> +++ b/drivers/gpu/drm/i915/i915_suspend.c
> @@ -26,7 +26,6 @@
>  
>  #include "display/intel_de.h"
>  #include "display/intel_gmbus.h"
> -#include "display/intel_vga.h"
>  
>  #include "i915_drv.h"
>  #include "i915_reg.h"
> @@ -118,7 +117,6 @@ void i915_save_display(struct drm_i915_private *dev_priv)
>  
>  void i915_restore_display(struct drm_i915_private *dev_priv)
>  {
> -	struct intel_display *display = &dev_priv->display;
>  	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
>  
>  	if (!HAS_DISPLAY(dev_priv))
> @@ -134,8 +132,4 @@ void i915_restore_display(struct drm_i915_private *dev_priv)
>  	if (GRAPHICS_VER(dev_priv) <= 4)
>  		intel_de_write(dev_priv, DSPARB(dev_priv),
>  			       dev_priv->regfile.saveDSPARB);
> -
> -	intel_vga_redisable(display);
> -
> -	intel_gmbus_reset(dev_priv);
>  }

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (30 preceding siblings ...)
  2024-09-24 20:35 ` [PATCH 31/31] drm/{i915, xe}/display: Consolidade entire runtime pm sequence Rodrigo Vivi
@ 2024-09-25 10:32 ` Jani Nikula
  2024-09-25 21:00   ` Rodrigo Vivi
  2024-09-26  5:29 ` ✓ CI.Patch_applied: success for " Patchwork
                   ` (3 subsequent siblings)
  35 siblings, 1 reply; 81+ messages in thread
From: Jani Nikula @ 2024-09-25 10:32 UTC (permalink / raw)
  To: Rodrigo Vivi, intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi

On Tue, 24 Sep 2024, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
> Reconcile i915's and xe's display power management sequences.
>
> The main goal of this series is to ensure that the display
> power management sequences from both drivers are fully aligned.
> So, it needs to live under i915/display/ and xe_display_pm
> can only be a wrapper to check for the xe's module
> parameter before jumping in the i915/display functions.
>
> During this process, it was clear that the Xe's runtime pm
> sequences for integrated gfx (non d3cold capable) was totally
> misaligned with i915 and prune to more bugs. So, this series ends
> up fixing this and bringing a full alignment there as well.
>
> The one new thing under i915 is the d3cold sequences. Apparently
> that can be reduced, but for now this is what is validated and
> stable on both DG2 and BMG. So, let's move that to the
> i915/display side as well and continue on the improvements with
> the code in the right place.
>
> When I started this work I was hoping that I could run more
> conversions to intel_display struct before moving things from
> i915_driver.c to intel_display_driver, however that was a deeper
> task and this series is already deep enough.

Holy crap this is scary and a PITA to review but exactly what we'll
need! Thanks for doing this. I've been shying away from this too long.

I'll try to put in some review effort, but at the same time just more
eyeballs than mine would be great.

BR,
Jani.


-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display
  2024-09-25 10:20   ` Jani Nikula
@ 2024-09-25 20:59     ` Rodrigo Vivi
  0 siblings, 0 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-25 20:59 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, intel-xe, imre.deak

On Wed, Sep 25, 2024 at 01:20:56PM +0300, Jani Nikula wrote:
> On Tue, 24 Sep 2024, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
> > Restrict this function to only save and restore registers
> > functionality. Then, that can be moved out later to under
> > display with a proper name.
> >
> > Cc: Jani Nikula <jani.nikula@intel.com>
> > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > ---
> >  drivers/gpu/drm/i915/i915_driver.c  | 6 ++++++
> >  drivers/gpu/drm/i915/i915_suspend.c | 6 ------
> >  2 files changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> > index 6dc0104a3e36..c5ffcf229f42 100644
> > --- a/drivers/gpu/drm/i915/i915_driver.c
> > +++ b/drivers/gpu/drm/i915/i915_driver.c
> > @@ -60,6 +60,7 @@
> >  #include "display/intel_pch_refclk.h"
> >  #include "display/intel_pps.h"
> >  #include "display/intel_sprite_uapi.h"
> > +#include "display/intel_vga.h"
> >  #include "display/skl_watermark.h"
> >  
> >  #include "gem/i915_gem_context.h"
> > @@ -1167,6 +1168,11 @@ static int i915_drm_resume(struct drm_device *dev)
> >  	intel_dmc_resume(display);
> >  
> >  	i915_restore_display(dev_priv);
> > +
> > +	intel_vga_redisable(display);
> > +
> > +	intel_gmbus_reset(dev_priv);
> > +
> 
> Hate to be nitpicky, but these are now called for !HAS_DISPLAY()
> too. Maybe the later patches fix it, but here it's not right.

no need for hate, this is what the reviews are for ;)
I totally agree and will fix on the next revision...

> 
> I agree with the approach though.
> 
> >  	intel_pps_unlock_regs_wa(display);
> >  
> >  	intel_init_pch_refclk(dev_priv);
> > diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
> > index 9d3d9b983032..fb67b05cd864 100644
> > --- a/drivers/gpu/drm/i915/i915_suspend.c
> > +++ b/drivers/gpu/drm/i915/i915_suspend.c
> > @@ -26,7 +26,6 @@
> >  
> >  #include "display/intel_de.h"
> >  #include "display/intel_gmbus.h"
> > -#include "display/intel_vga.h"
> >  
> >  #include "i915_drv.h"
> >  #include "i915_reg.h"
> > @@ -118,7 +117,6 @@ void i915_save_display(struct drm_i915_private *dev_priv)
> >  
> >  void i915_restore_display(struct drm_i915_private *dev_priv)
> >  {
> > -	struct intel_display *display = &dev_priv->display;
> >  	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
> >  
> >  	if (!HAS_DISPLAY(dev_priv))
> > @@ -134,8 +132,4 @@ void i915_restore_display(struct drm_i915_private *dev_priv)
> >  	if (GRAPHICS_VER(dev_priv) <= 4)
> >  		intel_de_write(dev_priv, DSPARB(dev_priv),
> >  			       dev_priv->regfile.saveDSPARB);
> > -
> > -	intel_vga_redisable(display);
> > -
> > -	intel_gmbus_reset(dev_priv);
> >  }
> 
> -- 
> Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences
  2024-09-25 10:32 ` [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Jani Nikula
@ 2024-09-25 21:00   ` Rodrigo Vivi
  0 siblings, 0 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-09-25 21:00 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, intel-xe, imre.deak

On Wed, Sep 25, 2024 at 01:32:03PM +0300, Jani Nikula wrote:
> On Tue, 24 Sep 2024, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
> > Reconcile i915's and xe's display power management sequences.
> >
> > The main goal of this series is to ensure that the display
> > power management sequences from both drivers are fully aligned.
> > So, it needs to live under i915/display/ and xe_display_pm
> > can only be a wrapper to check for the xe's module
> > parameter before jumping in the i915/display functions.
> >
> > During this process, it was clear that the Xe's runtime pm
> > sequences for integrated gfx (non d3cold capable) was totally
> > misaligned with i915 and prune to more bugs. So, this series ends
> > up fixing this and bringing a full alignment there as well.
> >
> > The one new thing under i915 is the d3cold sequences. Apparently
> > that can be reduced, but for now this is what is validated and
> > stable on both DG2 and BMG. So, let's move that to the
> > i915/display side as well and continue on the improvements with
> > the code in the right place.
> >
> > When I started this work I was hoping that I could run more
> > conversions to intel_display struct before moving things from
> > i915_driver.c to intel_display_driver, however that was a deeper
> > task and this series is already deep enough.
> 
> Holy crap this is scary and a PITA to review but exactly what we'll
> need! Thanks for doing this. I've been shying away from this too long.

yeap! It was very painful to do this... took me much longer then
I was expecting for a refactor :/

But we need to rip the bandaid off

> 
> I'll try to put in some review effort, but at the same time just more
> eyeballs than mine would be great.

Thank you so much!
Yeap, every help is very much appreciated!

> 
> BR,
> Jani.
> 
> 
> -- 
> Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 81+ messages in thread

* ✓ CI.Patch_applied: success for Reconcile i915's and xe's display power mgt sequences
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (31 preceding siblings ...)
  2024-09-25 10:32 ` [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Jani Nikula
@ 2024-09-26  5:29 ` Patchwork
  2024-09-26  5:30 ` ✗ CI.checkpatch: warning " Patchwork
                   ` (2 subsequent siblings)
  35 siblings, 0 replies; 81+ messages in thread
From: Patchwork @ 2024-09-26  5:29 UTC (permalink / raw)
  To: Rodrigo Vivi; +Cc: intel-xe

== Series Details ==

Series: Reconcile i915's and xe's display power mgt sequences
URL   : https://patchwork.freedesktop.org/series/139061/
State : success

== Summary ==

=== Applying kernel patches on branch 'drm-tip' with base: ===
Base commit: 88d592f72f7b drm-tip: 2024y-09m-25d-19h-23m-21s UTC integration manifest
=== git am output follows ===
Applying: drm/i915: Remove vga and gmbus seq out of i915_restore_display
Applying: drm/i915/display: Convert i915_suspend into i9xx_display_sr
Applying: drm/i915/display: Move regfile registers intel_display.restore
Applying: drm/i915/display: Move shutdown sequences under display driver
Applying: drm/xe: At shutdown disable commit helpers instead of flushing
Applying: drm/xe: Use i915-display shutdown sequence directly
Applying: drm/{i915, xe}/display: Move DP MST calls to display_driver
Applying: drm/i915/display: Move suspend sequences to intel_display_driver
Applying: drm/xe/display: Delay hpd_init resume
Applying: drm/xe/display: Spin-off xe_display runtime/d3cold sequences
Applying: drm/{i915,xe}: Consolidate display resume functions
Applying: drm/i915: Remove lingering pci_save_state
Applying: drm/{i915,xe}: Consolidate display suspend functions
Applying: drm/i915/display: Move resume sequences to intel_display_driver
Applying: drm/xe/display: Delay dsm handler registration
Applying: drm/{i915, xe}: Move power_domains suspend/resume to display_power
Applying: drm/{i915, xe}: Move remaining intel_power_domains to intel_display
Applying: drm/i915/display: Split resume_noirq calls for now
Applying: drm/xe/display: Align display resume sequence with i915
Applying: drm/xe/display: Align suspend sequence with i915
Applying: drm/{i915, xe}/display: Move dsm registration under intel_driver
Applying: drm/i915/display: Move runtime pm related calls under intel_display_driver
Applying: drm/xe/display: Prepare runtime pm functions
Applying: drm/xe/display: Call intel_hpd_init on every runtime resume
Applying: drm/xe/display: Move hpd_poll calls to later runtime stages
Applying: drm/xe/display: Add missing watermark ipc update at runtime resume
Applying: drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold
Applying: drm/xe/display: Move display runtime suspend to a later point
Applying: drm/xe/display: Kill crtc commit flush
Applying: drm/xe/display: Add missing power display handling on non-d3cold rpm
Applying: drm/{i915, xe}/display: Consolidade entire runtime pm sequence



^ permalink raw reply	[flat|nested] 81+ messages in thread

* ✗ CI.checkpatch: warning for Reconcile i915's and xe's display power mgt sequences
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (32 preceding siblings ...)
  2024-09-26  5:29 ` ✓ CI.Patch_applied: success for " Patchwork
@ 2024-09-26  5:30 ` Patchwork
  2024-09-26  5:31 ` ✗ CI.KUnit: failure " Patchwork
  2024-10-08 15:24 ` [PATCH 00/31] " Cavitt, Jonathan
  35 siblings, 0 replies; 81+ messages in thread
From: Patchwork @ 2024-09-26  5:30 UTC (permalink / raw)
  To: Rodrigo Vivi; +Cc: intel-xe

== Series Details ==

Series: Reconcile i915's and xe's display power mgt sequences
URL   : https://patchwork.freedesktop.org/series/139061/
State : warning

== Summary ==

+ KERNEL=/kernel
+ git clone https://gitlab.freedesktop.org/drm/maintainer-tools mt
Cloning into 'mt'...
warning: redirecting to https://gitlab.freedesktop.org/drm/maintainer-tools.git/
+ git -C mt rev-list -n1 origin/master
30ab6715fc09baee6cc14cb3c89ad8858688d474
+ cd /kernel
+ git config --global --add safe.directory /kernel
+ git log -n1
commit ba6e2d9dfcbe47c2f91034f4ccc815b96c6b4970
Author: Rodrigo Vivi <rodrigo.vivi@intel.com>
Date:   Tue Sep 24 16:35:52 2024 -0400

    drm/{i915, xe}/display: Consolidade entire runtime pm sequence
    
    No functional change.
    
    Consolidate the entire runtime pm sequences under
    intel_display_driver.
    
    Simplifications and optimizations around the D3cold sequences are
    likely still possible. But before that can be done, consolidate
    everything at the intel_display_driver side.
    
    Xe display power management functions are now only a wrapper
    checking for xe's display probe parameter.
    
    Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
+ /mt/dim checkpatch 88d592f72f7bc508d6a027b1f96aa2e53f803e1b drm-intel
6dcf9b7988ea drm/i915: Remove vga and gmbus seq out of i915_restore_display
dcc98b447c20 drm/i915/display: Convert i915_suspend into i9xx_display_sr
-:44: WARNING:FILE_PATH_CHANGES: added, moved or deleted file(s), does MAINTAINERS need updating?
#44: 
new file mode 100644

-:68: CHECK:CAMELCASE: Avoid CamelCase: <saveSWF0>
#68: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:20:
+			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));

-:69: CHECK:CAMELCASE: Avoid CamelCase: <saveSWF1>
#69: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:21:
+			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));

-:72: CHECK:CAMELCASE: Avoid CamelCase: <saveSWF3>
#72: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:24:
+			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));

-:120: CHECK:CAMELCASE: Avoid CamelCase: <saveDSPARB>
#120: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:72:
+		i915->regfile.saveDSPARB = intel_de_read(i915, DSPARB(i915));

-:123: CHECK:CAMELCASE: Avoid CamelCase: <saveGCDGMBUS>
#123: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:75:
+		pci_read_config_word(pdev, GCDGMBUS, &i915->regfile.saveGCDGMBUS);

total: 0 errors, 1 warnings, 5 checks, 153 lines checked
6fdf46fe51a6 drm/i915/display: Move regfile registers intel_display.restore
-:29: CHECK:CAMELCASE: Avoid CamelCase: <saveSWF0>
#29: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:21:
+			display->restore.saveSWF0[i] = intel_de_read(display, SWF0(i915, i));

-:30: CHECK:CAMELCASE: Avoid CamelCase: <saveSWF1>
#30: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:22:
+			display->restore.saveSWF1[i] = intel_de_read(display, SWF1(i915, i));

-:34: CHECK:CAMELCASE: Avoid CamelCase: <saveSWF3>
#34: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:25:
+			display->restore.saveSWF3[i] = intel_de_read(display, SWF3(i915, i));

-:96: CHECK:CAMELCASE: Avoid CamelCase: <saveDSPARB>
#96: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:75:
+		display->restore.saveDSPARB = intel_de_read(display, DSPARB(i915));

-:100: CHECK:CAMELCASE: Avoid CamelCase: <saveGCDGMBUS>
#100: FILE: drivers/gpu/drm/i915/display/i9xx_display_sr.c:78:
+		pci_read_config_word(pdev, GCDGMBUS, &display->restore.saveGCDGMBUS);

total: 0 errors, 0 warnings, 5 checks, 135 lines checked
2a136013211e drm/i915/display: Move shutdown sequences under display driver
240890c8a435 drm/xe: At shutdown disable commit helpers instead of flushing
71322c0c3501 drm/xe: Use i915-display shutdown sequence directly
ee2b47c496f3 drm/{i915, xe}/display: Move DP MST calls to display_driver
3ce1d09fbde3 drm/i915/display: Move suspend sequences to intel_display_driver
dd88fa6b51ff drm/xe/display: Delay hpd_init resume
e969e13b4fdf drm/xe/display: Spin-off xe_display runtime/d3cold sequences
305610315138 drm/{i915,xe}: Consolidate display resume functions
5034a35b96c1 drm/i915: Remove lingering pci_save_state
0e6d56d634c9 drm/{i915,xe}: Consolidate display suspend functions
7418edb973ed drm/i915/display: Move resume sequences to intel_display_driver
ac794c821e70 drm/xe/display: Delay dsm handler registration
01363e40e255 drm/{i915, xe}: Move power_domains suspend/resume to display_power
94dabebc8248 drm/{i915, xe}: Move remaining intel_power_domains to intel_display
7b73d94e8368 drm/i915/display: Split resume_noirq calls for now
5df8f96ab07a drm/xe/display: Align display resume sequence with i915
02b9f0b4f20b drm/xe/display: Align suspend sequence with i915
bdac41edb475 drm/{i915, xe}/display: Move dsm registration under intel_driver
827cf45e38a3 drm/i915/display: Move runtime pm related calls under intel_display_driver
e4645abdcafb drm/xe/display: Prepare runtime pm functions
2ebc7a206bea drm/xe/display: Call intel_hpd_init on every runtime resume
e75e8206db81 drm/xe/display: Move hpd_poll calls to later runtime stages
1425ba996ce8 drm/xe/display: Add missing watermark ipc update at runtime resume
86d89c891685 drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold
085f96294b20 drm/xe/display: Move display runtime suspend to a later point
728a3f15330f drm/xe/display: Kill crtc commit flush
07f8dd0683a5 drm/xe/display: Add missing power display handling on non-d3cold rpm
ba6e2d9dfcbe drm/{i915, xe}/display: Consolidade entire runtime pm sequence



^ permalink raw reply	[flat|nested] 81+ messages in thread

* ✗ CI.KUnit: failure for Reconcile i915's and xe's display power mgt sequences
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (33 preceding siblings ...)
  2024-09-26  5:30 ` ✗ CI.checkpatch: warning " Patchwork
@ 2024-09-26  5:31 ` Patchwork
  2024-10-08 15:24 ` [PATCH 00/31] " Cavitt, Jonathan
  35 siblings, 0 replies; 81+ messages in thread
From: Patchwork @ 2024-09-26  5:31 UTC (permalink / raw)
  To: Rodrigo Vivi; +Cc: intel-xe

== Series Details ==

Series: Reconcile i915's and xe's display power mgt sequences
URL   : https://patchwork.freedesktop.org/series/139061/
State : failure

== Summary ==

+ trap cleanup EXIT
+ /kernel/tools/testing/kunit/kunit.py run --kunitconfig /kernel/drivers/gpu/drm/xe/.kunitconfig
ERROR:root:../drivers/gpu/drm/xe/xe_device.c: In function ‘xe_device_shutdown’:
../drivers/gpu/drm/xe/xe_device.c:823:17: error: implicit declaration of function ‘xe_display_pm_shutdown_noirq’; did you mean ‘xe_display_pm_shutdown_late’? [-Werror=implicit-function-declaration]
  823 |                 xe_display_pm_shutdown_noirq(xe);
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                 xe_display_pm_shutdown_late
../drivers/gpu/drm/xe/xe_device.c:828:17: error: implicit declaration of function ‘xe_display_pm_shutdown_noaccel’; did you mean ‘xe_display_pm_shutdown_late’? [-Werror=implicit-function-declaration]
  828 |                 xe_display_pm_shutdown_noaccel(xe);
      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                 xe_display_pm_shutdown_late
cc1: some warnings being treated as errors
make[7]: *** [../scripts/Makefile.build:244: drivers/gpu/drm/xe/xe_device.o] Error 1
make[7]: *** Waiting for unfinished jobs....
make[6]: *** [../scripts/Makefile.build:485: drivers/gpu/drm/xe] Error 2
make[6]: *** Waiting for unfinished jobs....
make[5]: *** [../scripts/Makefile.build:485: drivers/gpu/drm] Error 2
make[4]: *** [../scripts/Makefile.build:485: drivers/gpu] Error 2
make[4]: *** Waiting for unfinished jobs....
make[3]: *** [../scripts/Makefile.build:485: drivers] Error 2
make[3]: *** Waiting for unfinished jobs....
../lib/iomap.c:156:5: warning: no previous prototype for ‘ioread64_lo_hi’ [-Wmissing-prototypes]
  156 | u64 ioread64_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:163:5: warning: no previous prototype for ‘ioread64_hi_lo’ [-Wmissing-prototypes]
  163 | u64 ioread64_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~
../lib/iomap.c:170:5: warning: no previous prototype for ‘ioread64be_lo_hi’ [-Wmissing-prototypes]
  170 | u64 ioread64be_lo_hi(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:178:5: warning: no previous prototype for ‘ioread64be_hi_lo’ [-Wmissing-prototypes]
  178 | u64 ioread64be_hi_lo(const void __iomem *addr)
      |     ^~~~~~~~~~~~~~~~
../lib/iomap.c:264:6: warning: no previous prototype for ‘iowrite64_lo_hi’ [-Wmissing-prototypes]
  264 | void iowrite64_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:272:6: warning: no previous prototype for ‘iowrite64_hi_lo’ [-Wmissing-prototypes]
  272 | void iowrite64_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~
../lib/iomap.c:280:6: warning: no previous prototype for ‘iowrite64be_lo_hi’ [-Wmissing-prototypes]
  280 | void iowrite64be_lo_hi(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
../lib/iomap.c:288:6: warning: no previous prototype for ‘iowrite64be_hi_lo’ [-Wmissing-prototypes]
  288 | void iowrite64be_hi_lo(u64 val, void __iomem *addr)
      |      ^~~~~~~~~~~~~~~~~
make[2]: *** [/kernel/Makefile:1926: .] Error 2
make[1]: *** [/kernel/Makefile:224: __sub-make] Error 2
make: *** [Makefile:224: __sub-make] Error 2

[05:30:50] Configuring KUnit Kernel ...
Generating .config ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
[05:30:54] Building KUnit Kernel ...
Populating config with:
$ make ARCH=um O=.kunit olddefconfig
Building with:
$ make ARCH=um O=.kunit --jobs=48
+ cleanup
++ stat -c %u:%g /kernel
+ chown -R 1003:1003 /kernel



^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 12/31] drm/i915: Remove lingering pci_save_state
  2024-09-24 20:35 ` [PATCH 12/31] drm/i915: Remove lingering pci_save_state Rodrigo Vivi
@ 2024-09-27  8:45   ` Gupta, Anshuman
  2024-10-07 21:10   ` Cavitt, Jonathan
  1 sibling, 0 replies; 81+ messages in thread
From: Gupta, Anshuman @ 2024-09-27  8:45 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Ville Syrjälä



> -----Original Message-----
> From: Vivi, Rodrigo <rodrigo.vivi@intel.com>
> Sent: Wednesday, September 25, 2024 2:06 AM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>;
> Gupta, Anshuman <anshuman.gupta@intel.com>; Ville Syrjälä
> <ville.syrjala@linux.intel.com>
> Subject: [PATCH 12/31] drm/i915: Remove lingering pci_save_state
> 
> The pairing pci_restore_state was removed by commit 'b7e53aba2f0e
> ("drm/i915: remove restore in resume")'
> to fix a hardware hang in resume.
> 
> Furthermore, it looks like PCI subsystem should be taking care of the save and
> restore here.
> 
> Remove the lingering/stand-alone pci_save_state call.
> 
> Cc: Anshuman Gupta <anshuman.gupta@intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_driver.c | 2 --
>  1 file changed, 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_driver.c
> b/drivers/gpu/drm/i915/i915_driver.c
> index ce2dd03136d3..4fc9d8bce1fd 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -1008,8 +1008,6 @@ static int i915_drm_suspend(struct drm_device *dev)
>  		intel_display_driver_disable_user_access(dev_priv);
>  	}
> 
> -	pci_save_state(pdev);
Looks good to me!
Reviewed-by: Anshuman Gupta <anshuman.gupta@intel.com>

> -
>  	intel_display_driver_suspend(dev_priv);
> 
>  	intel_irq_suspend(dev_priv);
> --
> 2.46.0


^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 02/31] drm/i915/display: Convert i915_suspend into i9xx_display_sr
  2024-09-24 20:35 ` [PATCH 02/31] drm/i915/display: Convert i915_suspend into i9xx_display_sr Rodrigo Vivi
@ 2024-10-01 13:21   ` Jani Nikula
  2024-10-07 19:15   ` Cavitt, Jonathan
  1 sibling, 0 replies; 81+ messages in thread
From: Jani Nikula @ 2024-10-01 13:21 UTC (permalink / raw)
  To: Rodrigo Vivi, intel-gfx, intel-xe; +Cc: imre.deak, Rodrigo Vivi, Jesse Barnes

On Tue, 24 Sep 2024, Rodrigo Vivi <rodrigo.vivi@intel.com> wrote:
> These save & restore functions inside i915_suspend are old display
> functions to save and restore a bunch of display related registers.
>
> Move it under display and rename accordantly. Just don't move it
> entirely towards intel_display struct yet because it depends
> on drm_i915_private for the IS_MOBILE.

'git show --color-moved' has made me a huge proponent of completely
separating code movement from any cleanups.

With that, reviewing the movement part takes mere seconds rather than
minutes. And the next patch doing independent cleanups on top is easy to
review as well. Especially the s/dev_priv/i915/ change is easy with 'git
show --color-words' (my MUA does something like that automagically).

Regardless, this is

Reviewed-by: Jani Nikula <jani.nikula@intel.com>


BR,
Jani.


>
> While doing this conversion also update the MIT header using
> the new SPDX ones.
>
> v2: Fix Makefile and include (Jani)
>     Removed vga and gmbus (Jani, Ville)
>
> Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
> Cc: Jani Nikula <jani.nikula@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/i915/Makefile                 |   2 +-
>  .../gpu/drm/i915/display/i9xx_display_sr.c    |  95 ++++++++++++
>  .../gpu/drm/i915/display/i9xx_display_sr.h    |  14 ++
>  drivers/gpu/drm/i915/i915_driver.c            |   6 +-
>  drivers/gpu/drm/i915/i915_suspend.c           | 135 ------------------
>  drivers/gpu/drm/i915/i915_suspend.h           |  14 --
>  6 files changed, 113 insertions(+), 153 deletions(-)
>  create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.c
>  create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.h
>  delete mode 100644 drivers/gpu/drm/i915/i915_suspend.c
>  delete mode 100644 drivers/gpu/drm/i915/i915_suspend.h
>
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index 70771e521b1c..f21c28d471e7 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -30,7 +30,6 @@ i915-y += \
>  	i915_params.o \
>  	i915_pci.o \
>  	i915_scatterlist.o \
> -	i915_suspend.o \
>  	i915_switcheroo.o \
>  	i915_sysfs.o \
>  	i915_utils.o \
> @@ -219,6 +218,7 @@ i915-$(CONFIG_HWMON) += \
>  i915-y += \
>  	display/hsw_ips.o \
>  	display/i9xx_plane.o \
> +	display/i9xx_display_sr.o \
>  	display/i9xx_wm.o \
>  	display/intel_alpm.o \
>  	display/intel_atomic.o \
> diff --git a/drivers/gpu/drm/i915/display/i9xx_display_sr.c b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
> new file mode 100644
> index 000000000000..4dd0ce267994
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
> @@ -0,0 +1,95 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#include "i915_drv.h"
> +#include "i915_reg.h"
> +#include "i9xx_display_sr.h"
> +#include "intel_de.h"
> +#include "intel_gmbus.h"
> +#include "intel_pci_config.h"
> +
> +static void i9xx_display_save_swf(struct drm_i915_private *i915)
> +{
> +	int i;
> +
> +	/* Scratch space */
> +	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
> +		for (i = 0; i < 7; i++) {
> +			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
> +			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
> +		}
> +		for (i = 0; i < 3; i++)
> +			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
> +	} else if (GRAPHICS_VER(i915) == 2) {
> +		for (i = 0; i < 7; i++)
> +			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
> +	} else if (HAS_GMCH(i915)) {
> +		for (i = 0; i < 16; i++) {
> +			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
> +			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
> +		}
> +		for (i = 0; i < 3; i++)
> +			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
> +	}
> +}
> +
> +static void i9xx_display_restore_swf(struct drm_i915_private *i915)
> +{
> +	int i;
> +
> +	/* Scratch space */
> +	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
> +		for (i = 0; i < 7; i++) {
> +			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
> +			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
> +		}
> +		for (i = 0; i < 3; i++)
> +			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
> +	} else if (GRAPHICS_VER(i915) == 2) {
> +		for (i = 0; i < 7; i++)
> +			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
> +	} else if (HAS_GMCH(i915)) {
> +		for (i = 0; i < 16; i++) {
> +			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
> +			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
> +		}
> +		for (i = 0; i < 3; i++)
> +			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
> +	}
> +}
> +
> +void i9xx_display_sr_save(struct drm_i915_private *i915)
> +{
> +	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
> +
> +	if (!HAS_DISPLAY(i915))
> +		return;
> +
> +	/* Display arbitration control */
> +	if (GRAPHICS_VER(i915) <= 4)
> +		i915->regfile.saveDSPARB = intel_de_read(i915, DSPARB(i915));
> +
> +	if (GRAPHICS_VER(i915) == 4)
> +		pci_read_config_word(pdev, GCDGMBUS, &i915->regfile.saveGCDGMBUS);
> +
> +	i9xx_display_save_swf(i915);
> +}
> +
> +void i9xx_display_sr_restore(struct drm_i915_private *i915)
> +{
> +	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
> +
> +	if (!HAS_DISPLAY(i915))
> +		return;
> +
> +	i9xx_display_restore_swf(i915);
> +
> +	if (GRAPHICS_VER(i915) == 4)
> +		pci_write_config_word(pdev, GCDGMBUS, i915->regfile.saveGCDGMBUS);
> +
> +	/* Display arbitration */
> +	if (GRAPHICS_VER(i915) <= 4)
> +		intel_de_write(i915, DSPARB(i915), i915->regfile.saveDSPARB);
> +}
> diff --git a/drivers/gpu/drm/i915/display/i9xx_display_sr.h b/drivers/gpu/drm/i915/display/i9xx_display_sr.h
> new file mode 100644
> index 000000000000..30383758f97e
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/i9xx_display_sr.h
> @@ -0,0 +1,14 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#ifndef __I9XX_DISPLAY_SR_H__
> +#define __I9XX_DISPLAY_SR_H__
> +
> +struct drm_i915_private;
> +
> +void i9xx_display_sr_save(struct drm_i915_private *i915);
> +void i9xx_display_sr_restore(struct drm_i915_private *i915);
> +
> +#endif
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index c5ffcf229f42..ae5906885359 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -45,6 +45,7 @@
>  #include <drm/drm_managed.h>
>  #include <drm/drm_probe_helper.h>
>  
> +#include "display/i9xx_display_sr.h"
>  #include "display/intel_acpi.h"
>  #include "display/intel_bw.h"
>  #include "display/intel_cdclk.h"
> @@ -94,7 +95,6 @@
>  #include "i915_memcpy.h"
>  #include "i915_perf.h"
>  #include "i915_query.h"
> -#include "i915_suspend.h"
>  #include "i915_switcheroo.h"
>  #include "i915_sysfs.h"
>  #include "i915_utils.h"
> @@ -1048,7 +1048,7 @@ static int i915_drm_suspend(struct drm_device *dev)
>  	intel_dpt_suspend(dev_priv);
>  	i915_ggtt_suspend(to_gt(dev_priv)->ggtt);
>  
> -	i915_save_display(dev_priv);
> +	i9xx_display_sr_save(dev_priv);
>  
>  	opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold;
>  	intel_opregion_suspend(display, opregion_target_state);
> @@ -1167,7 +1167,7 @@ static int i915_drm_resume(struct drm_device *dev)
>  
>  	intel_dmc_resume(display);
>  
> -	i915_restore_display(dev_priv);
> +	i9xx_display_sr_restore(dev_priv);
>  
>  	intel_vga_redisable(display);
>  
> diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
> deleted file mode 100644
> index fb67b05cd864..000000000000
> --- a/drivers/gpu/drm/i915/i915_suspend.c
> +++ /dev/null
> @@ -1,135 +0,0 @@
> -/*
> - *
> - * Copyright 2008 (c) Intel Corporation
> - *   Jesse Barnes <jbarnes@virtuousgeek.org>
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a
> - * copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sub license, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice (including the
> - * next paragraph) shall be included in all copies or substantial portions
> - * of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
> - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - */
> -
> -#include "display/intel_de.h"
> -#include "display/intel_gmbus.h"
> -
> -#include "i915_drv.h"
> -#include "i915_reg.h"
> -#include "i915_suspend.h"
> -#include "intel_pci_config.h"
> -
> -static void intel_save_swf(struct drm_i915_private *dev_priv)
> -{
> -	int i;
> -
> -	/* Scratch space */
> -	if (GRAPHICS_VER(dev_priv) == 2 && IS_MOBILE(dev_priv)) {
> -		for (i = 0; i < 7; i++) {
> -			dev_priv->regfile.saveSWF0[i] = intel_de_read(dev_priv,
> -								      SWF0(dev_priv, i));
> -			dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv,
> -								      SWF1(dev_priv, i));
> -		}
> -		for (i = 0; i < 3; i++)
> -			dev_priv->regfile.saveSWF3[i] = intel_de_read(dev_priv,
> -								      SWF3(dev_priv, i));
> -	} else if (GRAPHICS_VER(dev_priv) == 2) {
> -		for (i = 0; i < 7; i++)
> -			dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv,
> -								      SWF1(dev_priv, i));
> -	} else if (HAS_GMCH(dev_priv)) {
> -		for (i = 0; i < 16; i++) {
> -			dev_priv->regfile.saveSWF0[i] = intel_de_read(dev_priv,
> -								      SWF0(dev_priv, i));
> -			dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv,
> -								      SWF1(dev_priv, i));
> -		}
> -		for (i = 0; i < 3; i++)
> -			dev_priv->regfile.saveSWF3[i] = intel_de_read(dev_priv,
> -								      SWF3(dev_priv, i));
> -	}
> -}
> -
> -static void intel_restore_swf(struct drm_i915_private *dev_priv)
> -{
> -	int i;
> -
> -	/* Scratch space */
> -	if (GRAPHICS_VER(dev_priv) == 2 && IS_MOBILE(dev_priv)) {
> -		for (i = 0; i < 7; i++) {
> -			intel_de_write(dev_priv, SWF0(dev_priv, i),
> -				       dev_priv->regfile.saveSWF0[i]);
> -			intel_de_write(dev_priv, SWF1(dev_priv, i),
> -				       dev_priv->regfile.saveSWF1[i]);
> -		}
> -		for (i = 0; i < 3; i++)
> -			intel_de_write(dev_priv, SWF3(dev_priv, i),
> -				       dev_priv->regfile.saveSWF3[i]);
> -	} else if (GRAPHICS_VER(dev_priv) == 2) {
> -		for (i = 0; i < 7; i++)
> -			intel_de_write(dev_priv, SWF1(dev_priv, i),
> -				       dev_priv->regfile.saveSWF1[i]);
> -	} else if (HAS_GMCH(dev_priv)) {
> -		for (i = 0; i < 16; i++) {
> -			intel_de_write(dev_priv, SWF0(dev_priv, i),
> -				       dev_priv->regfile.saveSWF0[i]);
> -			intel_de_write(dev_priv, SWF1(dev_priv, i),
> -				       dev_priv->regfile.saveSWF1[i]);
> -		}
> -		for (i = 0; i < 3; i++)
> -			intel_de_write(dev_priv, SWF3(dev_priv, i),
> -				       dev_priv->regfile.saveSWF3[i]);
> -	}
> -}
> -
> -void i915_save_display(struct drm_i915_private *dev_priv)
> -{
> -	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
> -
> -	if (!HAS_DISPLAY(dev_priv))
> -		return;
> -
> -	/* Display arbitration control */
> -	if (GRAPHICS_VER(dev_priv) <= 4)
> -		dev_priv->regfile.saveDSPARB = intel_de_read(dev_priv,
> -							     DSPARB(dev_priv));
> -
> -	if (GRAPHICS_VER(dev_priv) == 4)
> -		pci_read_config_word(pdev, GCDGMBUS,
> -				     &dev_priv->regfile.saveGCDGMBUS);
> -
> -	intel_save_swf(dev_priv);
> -}
> -
> -void i915_restore_display(struct drm_i915_private *dev_priv)
> -{
> -	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
> -
> -	if (!HAS_DISPLAY(dev_priv))
> -		return;
> -
> -	intel_restore_swf(dev_priv);
> -
> -	if (GRAPHICS_VER(dev_priv) == 4)
> -		pci_write_config_word(pdev, GCDGMBUS,
> -				      dev_priv->regfile.saveGCDGMBUS);
> -
> -	/* Display arbitration */
> -	if (GRAPHICS_VER(dev_priv) <= 4)
> -		intel_de_write(dev_priv, DSPARB(dev_priv),
> -			       dev_priv->regfile.saveDSPARB);
> -}
> diff --git a/drivers/gpu/drm/i915/i915_suspend.h b/drivers/gpu/drm/i915/i915_suspend.h
> deleted file mode 100644
> index e5a611ee3d15..000000000000
> --- a/drivers/gpu/drm/i915/i915_suspend.h
> +++ /dev/null
> @@ -1,14 +0,0 @@
> -/* SPDX-License-Identifier: MIT */
> -/*
> - * Copyright © 2019 Intel Corporation
> - */
> -
> -#ifndef __I915_SUSPEND_H__
> -#define __I915_SUSPEND_H__
> -
> -struct drm_i915_private;
> -
> -void i915_save_display(struct drm_i915_private *i915);
> -void i915_restore_display(struct drm_i915_private *i915);
> -
> -#endif /* __I915_SUSPEND_H__ */

-- 
Jani Nikula, Intel

^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume
  2024-09-24 20:35 ` [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume Rodrigo Vivi
@ 2024-10-03  6:32   ` Govindapillai, Vinod
  2024-10-03 12:24     ` Govindapillai, Vinod
  2024-10-08 14:32   ` Cavitt, Jonathan
  1 sibling, 1 reply; 81+ messages in thread
From: Govindapillai, Vinod @ 2024-10-03  6:32 UTC (permalink / raw)
  To: intel-xe@lists.freedesktop.org, Vivi,  Rodrigo,
	intel-gfx@lists.freedesktop.org
  Cc: Deak, Imre

On Tue, 2024-09-24 at 16:35 -0400, Rodrigo Vivi wrote:
> We need to ensure this is called on every kind of runtime
> resume and not only on d3cold is possible. Aligning with
> the hpd sequence from i915.
> 
> Cc: Vinod Govindapillai <vinod.govindapillai@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 1ab4dd51094f..4d1dd5294b89 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -330,8 +330,6 @@ static void xe_display_from_d3cold(struct xe_device *xe)
>  
>         intel_display_driver_init_hw(xe);
>  
> -       intel_hpd_init(xe);
> -
>         intel_opregion_resume(display);
>  
>         intel_power_domains_enable(xe);
> @@ -470,6 +468,8 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
>  
>         if (xe->d3cold.allowed)
>                 xe_display_from_d3cold(xe);
> +
> +       intel_hpd_init(xe);

I would like to clarify, if the order of calling intel_hpd_init() and intel_hpd_poll_disable(xe)
matter? Should the intel_hpd_init be called before the poll disable?

Otherwise, this was missed in my earlier fix. Thanks for fixing this.

Reviewed-by: Vinod Govindapillai <vinod.govindapillai@intel.com>


>  }
>  
>  static void display_device_remove(struct drm_device *dev, void *arg)


^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 25/31] drm/xe/display: Move hpd_poll calls to later runtime stages
  2024-09-24 20:35 ` [PATCH 25/31] drm/xe/display: Move hpd_poll calls to later runtime stages Rodrigo Vivi
@ 2024-10-03 12:22   ` Govindapillai, Vinod
  2024-10-08 14:33   ` Cavitt, Jonathan
  1 sibling, 0 replies; 81+ messages in thread
From: Govindapillai, Vinod @ 2024-10-03 12:22 UTC (permalink / raw)
  To: intel-xe@lists.freedesktop.org, Vivi,  Rodrigo,
	intel-gfx@lists.freedesktop.org
  Cc: Deak, Imre

On Tue, 2024-09-24 at 16:35 -0400, Rodrigo Vivi wrote:
> Align placement of HDP poll calls with i915.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)

Reviewed-by: Vinod Govindapillai <vinod.govindapillai@intel.com>

> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 4d1dd5294b89..c758874a9059 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -437,8 +437,6 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
>  
>         if (xe->d3cold.allowed)
>                 xe_display_to_d3cold(xe);
> -
> -       intel_hpd_poll_enable(xe);
>  }
>  
>  void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
> @@ -448,6 +446,8 @@ void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
>  
>         if (xe->d3cold.allowed)
>                 intel_display_power_suspend_late(xe, false);
> +
> +       intel_hpd_poll_enable(xe);
>  }
>  
>  void xe_display_pm_runtime_resume_early(struct xe_device *xe)
> @@ -464,12 +464,11 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
>         if (!xe->info.probe_display)
>                 return;
>  
> -       intel_hpd_poll_disable(xe);
> -
>         if (xe->d3cold.allowed)
>                 xe_display_from_d3cold(xe);
>  
>         intel_hpd_init(xe);
> +       intel_hpd_poll_disable(xe);
>  }
>  
>  static void display_device_remove(struct drm_device *dev, void *arg)


^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume
  2024-10-03  6:32   ` Govindapillai, Vinod
@ 2024-10-03 12:24     ` Govindapillai, Vinod
  0 siblings, 0 replies; 81+ messages in thread
From: Govindapillai, Vinod @ 2024-10-03 12:24 UTC (permalink / raw)
  To: intel-xe@lists.freedesktop.org, Vivi,  Rodrigo,
	intel-gfx@lists.freedesktop.org
  Cc: Deak, Imre

On Thu, 2024-10-03 at 09:32 +0300, Govindapillai, Vinod wrote:
> On Tue, 2024-09-24 at 16:35 -0400, Rodrigo Vivi wrote:
> > We need to ensure this is called on every kind of runtime
> > resume and not only on d3cold is possible. Aligning with
> > the hpd sequence from i915.
> > 
> > Cc: Vinod Govindapillai <vinod.govindapillai@intel.com>
> > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > ---
> >  drivers/gpu/drm/xe/display/xe_display.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> > index 1ab4dd51094f..4d1dd5294b89 100644
> > --- a/drivers/gpu/drm/xe/display/xe_display.c
> > +++ b/drivers/gpu/drm/xe/display/xe_display.c
> > @@ -330,8 +330,6 @@ static void xe_display_from_d3cold(struct xe_device *xe)
> >  
> >         intel_display_driver_init_hw(xe);
> >  
> > -       intel_hpd_init(xe);
> > -
> >         intel_opregion_resume(display);
> >  
> >         intel_power_domains_enable(xe);
> > @@ -470,6 +468,8 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
> >  
> >         if (xe->d3cold.allowed)
> >                 xe_display_from_d3cold(xe);
> > +
> > +       intel_hpd_init(xe);
> 
> I would like to clarify, if the order of calling intel_hpd_init() and intel_hpd_poll_disable(xe)
> matter? Should the intel_hpd_init be called before the poll disable?
> 
> Otherwise, this was missed in my earlier fix. Thanks for fixing this.
> 
> Reviewed-by: Vinod Govindapillai <vinod.govindapillai@intel.com>

I see that the next patch in the series move the poll disable after the hpd init. My question is not
relevant any more! 

BR
Vinod

> 
> 
> >  }
> >  
> >  static void display_device_remove(struct drm_device *dev, void *arg)
> 


^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display
  2024-09-24 20:35 ` [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display Rodrigo Vivi
  2024-09-25 10:20   ` Jani Nikula
@ 2024-10-07 19:15   ` Cavitt, Jonathan
  1 sibling, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 19:15 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Nikula, Jani, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:35 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Nikula, Jani <jani.nikula@intel.com>
Subject: [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display
> 
> Restrict this function to only save and restore registers
> functionality. Then, that can be moved out later to under
> display with a proper name.
> 
> Cc: Jani Nikula <jani.nikula@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/i915/i915_driver.c  | 6 ++++++
>  drivers/gpu/drm/i915/i915_suspend.c | 6 ------
>  2 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 6dc0104a3e36..c5ffcf229f42 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -60,6 +60,7 @@
>  #include "display/intel_pch_refclk.h"
>  #include "display/intel_pps.h"
>  #include "display/intel_sprite_uapi.h"
> +#include "display/intel_vga.h"
>  #include "display/skl_watermark.h"
>  
>  #include "gem/i915_gem_context.h"
> @@ -1167,6 +1168,11 @@ static int i915_drm_resume(struct drm_device *dev)
>  	intel_dmc_resume(display);
>  
>  	i915_restore_display(dev_priv);
> +
> +	intel_vga_redisable(display);
> +
> +	intel_gmbus_reset(dev_priv);
> +
>  	intel_pps_unlock_regs_wa(display);
>  
>  	intel_init_pch_refclk(dev_priv);
> diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
> index 9d3d9b983032..fb67b05cd864 100644
> --- a/drivers/gpu/drm/i915/i915_suspend.c
> +++ b/drivers/gpu/drm/i915/i915_suspend.c
> @@ -26,7 +26,6 @@
>  
>  #include "display/intel_de.h"
>  #include "display/intel_gmbus.h"
> -#include "display/intel_vga.h"
>  
>  #include "i915_drv.h"
>  #include "i915_reg.h"
> @@ -118,7 +117,6 @@ void i915_save_display(struct drm_i915_private *dev_priv)
>  
>  void i915_restore_display(struct drm_i915_private *dev_priv)
>  {
> -	struct intel_display *display = &dev_priv->display;
>  	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
>  
>  	if (!HAS_DISPLAY(dev_priv))
> @@ -134,8 +132,4 @@ void i915_restore_display(struct drm_i915_private *dev_priv)
>  	if (GRAPHICS_VER(dev_priv) <= 4)
>  		intel_de_write(dev_priv, DSPARB(dev_priv),
>  			       dev_priv->regfile.saveDSPARB);
> -
> -	intel_vga_redisable(display);
> -
> -	intel_gmbus_reset(dev_priv);
>  }
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 02/31] drm/i915/display: Convert i915_suspend into i9xx_display_sr
  2024-09-24 20:35 ` [PATCH 02/31] drm/i915/display: Convert i915_suspend into i9xx_display_sr Rodrigo Vivi
  2024-10-01 13:21   ` Jani Nikula
@ 2024-10-07 19:15   ` Cavitt, Jonathan
  1 sibling, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 19:15 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Jesse Barnes, Nikula, Jani,
	Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:35 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Jesse Barnes <jbarnes@virtuousgeek.org>; Nikula, Jani <jani.nikula@intel.com>
Subject: [PATCH 02/31] drm/i915/display: Convert i915_suspend into i9xx_display_sr
> 
> These save & restore functions inside i915_suspend are old display
> functions to save and restore a bunch of display related registers.
> 
> Move it under display and rename accordantly. Just don't move it
> entirely towards intel_display struct yet because it depends
> on drm_i915_private for the IS_MOBILE.
> 
> While doing this conversion also update the MIT header using
> the new SPDX ones.
> 
> v2: Fix Makefile and include (Jani)
>     Removed vga and gmbus (Jani, Ville)
> 
> Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
> Cc: Jani Nikula <jani.nikula@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/i915/Makefile                 |   2 +-
>  .../gpu/drm/i915/display/i9xx_display_sr.c    |  95 ++++++++++++
>  .../gpu/drm/i915/display/i9xx_display_sr.h    |  14 ++
>  drivers/gpu/drm/i915/i915_driver.c            |   6 +-
>  drivers/gpu/drm/i915/i915_suspend.c           | 135 ------------------
>  drivers/gpu/drm/i915/i915_suspend.h           |  14 --
>  6 files changed, 113 insertions(+), 153 deletions(-)
>  create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.c
>  create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.h
>  delete mode 100644 drivers/gpu/drm/i915/i915_suspend.c
>  delete mode 100644 drivers/gpu/drm/i915/i915_suspend.h
> 
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index 70771e521b1c..f21c28d471e7 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -30,7 +30,6 @@ i915-y += \
>  	i915_params.o \
>  	i915_pci.o \
>  	i915_scatterlist.o \
> -	i915_suspend.o \
>  	i915_switcheroo.o \
>  	i915_sysfs.o \
>  	i915_utils.o \
> @@ -219,6 +218,7 @@ i915-$(CONFIG_HWMON) += \
>  i915-y += \
>  	display/hsw_ips.o \
>  	display/i9xx_plane.o \
> +	display/i9xx_display_sr.o \
>  	display/i9xx_wm.o \
>  	display/intel_alpm.o \
>  	display/intel_atomic.o \
> diff --git a/drivers/gpu/drm/i915/display/i9xx_display_sr.c b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
> new file mode 100644
> index 000000000000..4dd0ce267994
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
> @@ -0,0 +1,95 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#include "i915_drv.h"
> +#include "i915_reg.h"
> +#include "i9xx_display_sr.h"
> +#include "intel_de.h"
> +#include "intel_gmbus.h"
> +#include "intel_pci_config.h"
> +
> +static void i9xx_display_save_swf(struct drm_i915_private *i915)
> +{
> +	int i;
> +
> +	/* Scratch space */
> +	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
> +		for (i = 0; i < 7; i++) {
> +			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
> +			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
> +		}
> +		for (i = 0; i < 3; i++)
> +			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
> +	} else if (GRAPHICS_VER(i915) == 2) {
> +		for (i = 0; i < 7; i++)
> +			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
> +	} else if (HAS_GMCH(i915)) {
> +		for (i = 0; i < 16; i++) {
> +			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
> +			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
> +		}
> +		for (i = 0; i < 3; i++)
> +			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
> +	}
> +}
> +
> +static void i9xx_display_restore_swf(struct drm_i915_private *i915)
> +{
> +	int i;
> +
> +	/* Scratch space */
> +	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
> +		for (i = 0; i < 7; i++) {
> +			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
> +			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
> +		}
> +		for (i = 0; i < 3; i++)
> +			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
> +	} else if (GRAPHICS_VER(i915) == 2) {
> +		for (i = 0; i < 7; i++)
> +			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
> +	} else if (HAS_GMCH(i915)) {
> +		for (i = 0; i < 16; i++) {
> +			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
> +			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
> +		}
> +		for (i = 0; i < 3; i++)
> +			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
> +	}
> +}
> +
> +void i9xx_display_sr_save(struct drm_i915_private *i915)
> +{
> +	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
> +
> +	if (!HAS_DISPLAY(i915))
> +		return;
> +
> +	/* Display arbitration control */
> +	if (GRAPHICS_VER(i915) <= 4)
> +		i915->regfile.saveDSPARB = intel_de_read(i915, DSPARB(i915));
> +
> +	if (GRAPHICS_VER(i915) == 4)
> +		pci_read_config_word(pdev, GCDGMBUS, &i915->regfile.saveGCDGMBUS);
> +
> +	i9xx_display_save_swf(i915);
> +}
> +
> +void i9xx_display_sr_restore(struct drm_i915_private *i915)
> +{
> +	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
> +
> +	if (!HAS_DISPLAY(i915))
> +		return;
> +
> +	i9xx_display_restore_swf(i915);
> +
> +	if (GRAPHICS_VER(i915) == 4)
> +		pci_write_config_word(pdev, GCDGMBUS, i915->regfile.saveGCDGMBUS);
> +
> +	/* Display arbitration */
> +	if (GRAPHICS_VER(i915) <= 4)
> +		intel_de_write(i915, DSPARB(i915), i915->regfile.saveDSPARB);
> +}
> diff --git a/drivers/gpu/drm/i915/display/i9xx_display_sr.h b/drivers/gpu/drm/i915/display/i9xx_display_sr.h
> new file mode 100644
> index 000000000000..30383758f97e
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/display/i9xx_display_sr.h
> @@ -0,0 +1,14 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright © 2024 Intel Corporation
> + */
> +
> +#ifndef __I9XX_DISPLAY_SR_H__
> +#define __I9XX_DISPLAY_SR_H__
> +
> +struct drm_i915_private;
> +
> +void i9xx_display_sr_save(struct drm_i915_private *i915);
> +void i9xx_display_sr_restore(struct drm_i915_private *i915);
> +
> +#endif
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index c5ffcf229f42..ae5906885359 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -45,6 +45,7 @@
>  #include <drm/drm_managed.h>
>  #include <drm/drm_probe_helper.h>
>  
> +#include "display/i9xx_display_sr.h"
>  #include "display/intel_acpi.h"
>  #include "display/intel_bw.h"
>  #include "display/intel_cdclk.h"
> @@ -94,7 +95,6 @@
>  #include "i915_memcpy.h"
>  #include "i915_perf.h"
>  #include "i915_query.h"
> -#include "i915_suspend.h"
>  #include "i915_switcheroo.h"
>  #include "i915_sysfs.h"
>  #include "i915_utils.h"
> @@ -1048,7 +1048,7 @@ static int i915_drm_suspend(struct drm_device *dev)
>  	intel_dpt_suspend(dev_priv);
>  	i915_ggtt_suspend(to_gt(dev_priv)->ggtt);
>  
> -	i915_save_display(dev_priv);
> +	i9xx_display_sr_save(dev_priv);
>  
>  	opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold;
>  	intel_opregion_suspend(display, opregion_target_state);
> @@ -1167,7 +1167,7 @@ static int i915_drm_resume(struct drm_device *dev)
>  
>  	intel_dmc_resume(display);
>  
> -	i915_restore_display(dev_priv);
> +	i9xx_display_sr_restore(dev_priv);
>  
>  	intel_vga_redisable(display);
>  
> diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c
> deleted file mode 100644
> index fb67b05cd864..000000000000
> --- a/drivers/gpu/drm/i915/i915_suspend.c
> +++ /dev/null
> @@ -1,135 +0,0 @@
> -/*
> - *
> - * Copyright 2008 (c) Intel Corporation
> - *   Jesse Barnes <jbarnes@virtuousgeek.org>
> - *
> - * Permission is hereby granted, free of charge, to any person obtaining a
> - * copy of this software and associated documentation files (the
> - * "Software"), to deal in the Software without restriction, including
> - * without limitation the rights to use, copy, modify, merge, publish,
> - * distribute, sub license, and/or sell copies of the Software, and to
> - * permit persons to whom the Software is furnished to do so, subject to
> - * the following conditions:
> - *
> - * The above copyright notice and this permission notice (including the
> - * next paragraph) shall be included in all copies or substantial portions
> - * of the Software.
> - *
> - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
> - * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> - */
> -
> -#include "display/intel_de.h"
> -#include "display/intel_gmbus.h"
> -
> -#include "i915_drv.h"
> -#include "i915_reg.h"
> -#include "i915_suspend.h"
> -#include "intel_pci_config.h"
> -
> -static void intel_save_swf(struct drm_i915_private *dev_priv)
> -{
> -	int i;
> -
> -	/* Scratch space */
> -	if (GRAPHICS_VER(dev_priv) == 2 && IS_MOBILE(dev_priv)) {
> -		for (i = 0; i < 7; i++) {
> -			dev_priv->regfile.saveSWF0[i] = intel_de_read(dev_priv,
> -								      SWF0(dev_priv, i));
> -			dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv,
> -								      SWF1(dev_priv, i));
> -		}
> -		for (i = 0; i < 3; i++)
> -			dev_priv->regfile.saveSWF3[i] = intel_de_read(dev_priv,
> -								      SWF3(dev_priv, i));
> -	} else if (GRAPHICS_VER(dev_priv) == 2) {
> -		for (i = 0; i < 7; i++)
> -			dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv,
> -								      SWF1(dev_priv, i));
> -	} else if (HAS_GMCH(dev_priv)) {
> -		for (i = 0; i < 16; i++) {
> -			dev_priv->regfile.saveSWF0[i] = intel_de_read(dev_priv,
> -								      SWF0(dev_priv, i));
> -			dev_priv->regfile.saveSWF1[i] = intel_de_read(dev_priv,
> -								      SWF1(dev_priv, i));
> -		}
> -		for (i = 0; i < 3; i++)
> -			dev_priv->regfile.saveSWF3[i] = intel_de_read(dev_priv,
> -								      SWF3(dev_priv, i));
> -	}
> -}
> -
> -static void intel_restore_swf(struct drm_i915_private *dev_priv)
> -{
> -	int i;
> -
> -	/* Scratch space */
> -	if (GRAPHICS_VER(dev_priv) == 2 && IS_MOBILE(dev_priv)) {
> -		for (i = 0; i < 7; i++) {
> -			intel_de_write(dev_priv, SWF0(dev_priv, i),
> -				       dev_priv->regfile.saveSWF0[i]);
> -			intel_de_write(dev_priv, SWF1(dev_priv, i),
> -				       dev_priv->regfile.saveSWF1[i]);
> -		}
> -		for (i = 0; i < 3; i++)
> -			intel_de_write(dev_priv, SWF3(dev_priv, i),
> -				       dev_priv->regfile.saveSWF3[i]);
> -	} else if (GRAPHICS_VER(dev_priv) == 2) {
> -		for (i = 0; i < 7; i++)
> -			intel_de_write(dev_priv, SWF1(dev_priv, i),
> -				       dev_priv->regfile.saveSWF1[i]);
> -	} else if (HAS_GMCH(dev_priv)) {
> -		for (i = 0; i < 16; i++) {
> -			intel_de_write(dev_priv, SWF0(dev_priv, i),
> -				       dev_priv->regfile.saveSWF0[i]);
> -			intel_de_write(dev_priv, SWF1(dev_priv, i),
> -				       dev_priv->regfile.saveSWF1[i]);
> -		}
> -		for (i = 0; i < 3; i++)
> -			intel_de_write(dev_priv, SWF3(dev_priv, i),
> -				       dev_priv->regfile.saveSWF3[i]);
> -	}
> -}
> -
> -void i915_save_display(struct drm_i915_private *dev_priv)
> -{
> -	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
> -
> -	if (!HAS_DISPLAY(dev_priv))
> -		return;
> -
> -	/* Display arbitration control */
> -	if (GRAPHICS_VER(dev_priv) <= 4)
> -		dev_priv->regfile.saveDSPARB = intel_de_read(dev_priv,
> -							     DSPARB(dev_priv));
> -
> -	if (GRAPHICS_VER(dev_priv) == 4)
> -		pci_read_config_word(pdev, GCDGMBUS,
> -				     &dev_priv->regfile.saveGCDGMBUS);
> -
> -	intel_save_swf(dev_priv);
> -}
> -
> -void i915_restore_display(struct drm_i915_private *dev_priv)
> -{
> -	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
> -
> -	if (!HAS_DISPLAY(dev_priv))
> -		return;
> -
> -	intel_restore_swf(dev_priv);
> -
> -	if (GRAPHICS_VER(dev_priv) == 4)
> -		pci_write_config_word(pdev, GCDGMBUS,
> -				      dev_priv->regfile.saveGCDGMBUS);
> -
> -	/* Display arbitration */
> -	if (GRAPHICS_VER(dev_priv) <= 4)
> -		intel_de_write(dev_priv, DSPARB(dev_priv),
> -			       dev_priv->regfile.saveDSPARB);
> -}
> diff --git a/drivers/gpu/drm/i915/i915_suspend.h b/drivers/gpu/drm/i915/i915_suspend.h
> deleted file mode 100644
> index e5a611ee3d15..000000000000
> --- a/drivers/gpu/drm/i915/i915_suspend.h
> +++ /dev/null
> @@ -1,14 +0,0 @@
> -/* SPDX-License-Identifier: MIT */
> -/*
> - * Copyright © 2019 Intel Corporation
> - */
> -
> -#ifndef __I915_SUSPEND_H__
> -#define __I915_SUSPEND_H__
> -
> -struct drm_i915_private;
> -
> -void i915_save_display(struct drm_i915_private *i915);
> -void i915_restore_display(struct drm_i915_private *i915);
> -
> -#endif /* __I915_SUSPEND_H__ */
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 03/31] drm/i915/display: Move regfile registers intel_display.restore
  2024-09-24 20:35 ` [PATCH 03/31] drm/i915/display: Move regfile registers intel_display.restore Rodrigo Vivi
@ 2024-10-07 19:17   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 19:17 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:35 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 03/31] drm/i915/display: Move regfile registers intel_display.restore
> 
> The intel_display struct already has a place for save/restore
> stuff. Move the i915's regfile there since they are only
> related to display.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

There's probably an argument to be made that this patch and the previous
one should've been squashed together, but I think this separation is fine, as
this patch does do something distinct from the prior one (component
relocation vs. suspend depreciation).

LGTM.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  .../gpu/drm/i915/display/i9xx_display_sr.c    | 40 ++++++++++---------
>  .../gpu/drm/i915/display/intel_display_core.h |  5 +++
>  drivers/gpu/drm/i915/i915_drv.h               |  9 -----
>  3 files changed, 27 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/i9xx_display_sr.c b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
> index 4dd0ce267994..4c78b7165831 100644
> --- a/drivers/gpu/drm/i915/display/i9xx_display_sr.c
> +++ b/drivers/gpu/drm/i915/display/i9xx_display_sr.c
> @@ -12,56 +12,59 @@
>  
>  static void i9xx_display_save_swf(struct drm_i915_private *i915)
>  {
> +	struct intel_display *display = &i915->display;
>  	int i;
>  
>  	/* Scratch space */
>  	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
>  		for (i = 0; i < 7; i++) {
> -			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
> -			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
> +			display->restore.saveSWF0[i] = intel_de_read(display, SWF0(i915, i));
> +			display->restore.saveSWF1[i] = intel_de_read(display, SWF1(i915, i));
>  		}
>  		for (i = 0; i < 3; i++)
> -			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
> +			display->restore.saveSWF3[i] = intel_de_read(display, SWF3(i915, i));
>  	} else if (GRAPHICS_VER(i915) == 2) {
>  		for (i = 0; i < 7; i++)
> -			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
> +			display->restore.saveSWF1[i] = intel_de_read(display, SWF1(i915, i));
>  	} else if (HAS_GMCH(i915)) {
>  		for (i = 0; i < 16; i++) {
> -			i915->regfile.saveSWF0[i] = intel_de_read(i915, SWF0(i915, i));
> -			i915->regfile.saveSWF1[i] = intel_de_read(i915, SWF1(i915, i));
> +			display->restore.saveSWF0[i] = intel_de_read(display, SWF0(i915, i));
> +			display->restore.saveSWF1[i] = intel_de_read(display, SWF1(i915, i));
>  		}
>  		for (i = 0; i < 3; i++)
> -			i915->regfile.saveSWF3[i] = intel_de_read(i915, SWF3(i915, i));
> +			display->restore.saveSWF3[i] = intel_de_read(display, SWF3(i915, i));
>  	}
>  }
>  
>  static void i9xx_display_restore_swf(struct drm_i915_private *i915)
>  {
> +	struct intel_display *display = &i915->display;
>  	int i;
>  
>  	/* Scratch space */
>  	if (GRAPHICS_VER(i915) == 2 && IS_MOBILE(i915)) {
>  		for (i = 0; i < 7; i++) {
> -			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
> -			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
> +			intel_de_write(display, SWF0(i915, i), display->restore.saveSWF0[i]);
> +			intel_de_write(display, SWF1(i915, i), display->restore.saveSWF1[i]);
>  		}
>  		for (i = 0; i < 3; i++)
> -			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
> +			intel_de_write(display, SWF3(i915, i), display->restore.saveSWF3[i]);
>  	} else if (GRAPHICS_VER(i915) == 2) {
>  		for (i = 0; i < 7; i++)
> -			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
> +			intel_de_write(display, SWF1(i915, i), display->restore.saveSWF1[i]);
>  	} else if (HAS_GMCH(i915)) {
>  		for (i = 0; i < 16; i++) {
> -			intel_de_write(i915, SWF0(i915, i), i915->regfile.saveSWF0[i]);
> -			intel_de_write(i915, SWF1(i915, i), i915->regfile.saveSWF1[i]);
> +			intel_de_write(display, SWF0(i915, i), display->restore.saveSWF0[i]);
> +			intel_de_write(display, SWF1(i915, i), display->restore.saveSWF1[i]);
>  		}
>  		for (i = 0; i < 3; i++)
> -			intel_de_write(i915, SWF3(i915, i), i915->regfile.saveSWF3[i]);
> +			intel_de_write(display, SWF3(i915, i), display->restore.saveSWF3[i]);
>  	}
>  }
>  
>  void i9xx_display_sr_save(struct drm_i915_private *i915)
>  {
> +	struct intel_display *display = &i915->display;
>  	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
>  
>  	if (!HAS_DISPLAY(i915))
> @@ -69,16 +72,17 @@ void i9xx_display_sr_save(struct drm_i915_private *i915)
>  
>  	/* Display arbitration control */
>  	if (GRAPHICS_VER(i915) <= 4)
> -		i915->regfile.saveDSPARB = intel_de_read(i915, DSPARB(i915));
> +		display->restore.saveDSPARB = intel_de_read(display, DSPARB(i915));
>  
>  	if (GRAPHICS_VER(i915) == 4)
> -		pci_read_config_word(pdev, GCDGMBUS, &i915->regfile.saveGCDGMBUS);
> +		pci_read_config_word(pdev, GCDGMBUS, &display->restore.saveGCDGMBUS);
>  
>  	i9xx_display_save_swf(i915);
>  }
>  
>  void i9xx_display_sr_restore(struct drm_i915_private *i915)
>  {
> +	struct intel_display *display = &i915->display;
>  	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
>  
>  	if (!HAS_DISPLAY(i915))
> @@ -87,9 +91,9 @@ void i9xx_display_sr_restore(struct drm_i915_private *i915)
>  	i9xx_display_restore_swf(i915);
>  
>  	if (GRAPHICS_VER(i915) == 4)
> -		pci_write_config_word(pdev, GCDGMBUS, i915->regfile.saveGCDGMBUS);
> +		pci_write_config_word(pdev, GCDGMBUS, display->restore.saveGCDGMBUS);
>  
>  	/* Display arbitration */
>  	if (GRAPHICS_VER(i915) <= 4)
> -		intel_de_write(i915, DSPARB(i915), i915->regfile.saveDSPARB);
> +		intel_de_write(display, DSPARB(i915), display->restore.saveDSPARB);
>  }
> diff --git a/drivers/gpu/drm/i915/display/intel_display_core.h b/drivers/gpu/drm/i915/display/intel_display_core.h
> index 982dd9469195..2f4dfc8dbedc 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_core.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_core.h
> @@ -500,6 +500,11 @@ struct intel_display {
>  		/* restore state for suspend/resume and display reset */
>  		struct drm_atomic_state *modeset_state;
>  		struct drm_modeset_acquire_ctx reset_ctx;
> +		u32 saveDSPARB;
> +		u32 saveSWF0[16];
> +		u32 saveSWF1[16];
> +		u32 saveSWF3[3];
> +		u16 saveGCDGMBUS;
>  	} restore;
>  
>  	struct {
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index def3ca135406..9030ea7d54b1 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -101,14 +101,6 @@ struct i915_dsm {
>  	resource_size_t usable_size;
>  };
>  
> -struct i915_suspend_saved_registers {
> -	u32 saveDSPARB;
> -	u32 saveSWF0[16];
> -	u32 saveSWF1[16];
> -	u32 saveSWF3[3];
> -	u16 saveGCDGMBUS;
> -};
> -
>  #define MAX_L3_SLICES 2
>  struct intel_l3_parity {
>  	u32 *remap_info[MAX_L3_SLICES];
> @@ -291,7 +283,6 @@ struct drm_i915_private {
>  	struct i915_gpu_error gpu_error;
>  
>  	u32 suspend_count;
> -	struct i915_suspend_saved_registers regfile;
>  	struct vlv_s0ix_state *vlv_s0ix_state;
>  
>  	struct dram_info {
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 04/31] drm/i915/display: Move shutdown sequences under display driver
  2024-09-24 20:35 ` [PATCH 04/31] drm/i915/display: Move shutdown sequences under display driver Rodrigo Vivi
@ 2024-10-07 19:18   ` Cavitt, Jonathan
  2024-10-08 15:57   ` Imre Deak
  1 sibling, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 19:18 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:35 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 04/31] drm/i915/display: Move shutdown sequences under display driver
> 
> Move display related shutdown sequences from i915_driver to
> intel_display_driver.
> 
> No functional change. Just taking the right ownership and
> start some reconciliation of them between i915 and Xe.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  .../drm/i915/display/intel_display_driver.c   | 40 +++++++++++++++++++
>  .../drm/i915/display/intel_display_driver.h   |  3 ++
>  drivers/gpu/drm/i915/i915_driver.c            | 29 ++------------
>  3 files changed, 47 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index c106fb2dd20b..e40b1105168e 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -39,6 +39,7 @@
>  #include "intel_dp_tunnel.h"
>  #include "intel_dpll.h"
>  #include "intel_dpll_mgr.h"
> +#include "intel_encoder.h"
>  #include "intel_fb.h"
>  #include "intel_fbc.h"
>  #include "intel_fbdev.h"
> @@ -755,3 +756,42 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
>  	if (state)
>  		drm_atomic_state_put(state);
>  }
> +
> +void intel_display_driver_shutdown(struct drm_i915_private *i915)
> +{
> +	intel_power_domains_disable(i915);
> +
> +	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
> +	if (HAS_DISPLAY(i915)) {
> +		drm_kms_helper_poll_disable(&i915->drm);
> +		intel_display_driver_disable_user_access(i915);
> +
> +		drm_atomic_helper_shutdown(&i915->drm);
> +	}
> +
> +	intel_dp_mst_suspend(i915);
> +}
> +
> +void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915)
> +{
> +	intel_hpd_cancel_work(i915);
> +
> +	if (HAS_DISPLAY(i915))
> +		intel_display_driver_suspend_access(i915);
> +
> +	intel_encoder_suspend_all(&i915->display);
> +	intel_encoder_shutdown_all(&i915->display);
> +
> +	intel_dmc_suspend(&i915->display);
> +}
> +
> +void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915)
> +{
> +	/*
> +	 * The only requirement is to reboot with display DC states disabled,
> +	 * for now leaving all display power wells in the INIT power domain
> +	 * enabled.
> +	 */
> +
> +	intel_power_domains_driver_remove(i915);
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
> index 42cc4af6d3fd..1ee37fb58d38 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
> @@ -26,6 +26,9 @@ void intel_display_driver_remove_nogem(struct drm_i915_private *i915);
>  void intel_display_driver_unregister(struct drm_i915_private *i915);
>  int intel_display_driver_suspend(struct drm_i915_private *i915);
>  void intel_display_driver_resume(struct drm_i915_private *i915);
> +void intel_display_driver_shutdown(struct drm_i915_private *i915);
> +void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
> +void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915);
>  
>  /* interface for intel_display_reset.c */
>  int __intel_display_driver_resume(struct drm_i915_private *i915,
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index ae5906885359..38c845ad86e5 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -939,43 +939,22 @@ void i915_driver_shutdown(struct drm_i915_private *i915)
>  {
>  	disable_rpm_wakeref_asserts(&i915->runtime_pm);
>  	intel_runtime_pm_disable(&i915->runtime_pm);
> -	intel_power_domains_disable(i915);
>  
> -	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
> -	if (HAS_DISPLAY(i915)) {
> -		drm_kms_helper_poll_disable(&i915->drm);
> -		intel_display_driver_disable_user_access(i915);
> -
> -		drm_atomic_helper_shutdown(&i915->drm);
> -	}
> -
> -	intel_dp_mst_suspend(i915);
> +	intel_display_driver_shutdown(i915);
>  
>  	intel_irq_suspend(i915);
> -	intel_hpd_cancel_work(i915);
> -
> -	if (HAS_DISPLAY(i915))
> -		intel_display_driver_suspend_access(i915);
>  
> -	intel_encoder_suspend_all(&i915->display);
> -	intel_encoder_shutdown_all(&i915->display);
> -
> -	intel_dmc_suspend(&i915->display);
> +	intel_display_driver_shutdown_noirq(i915);
>  
>  	i915_gem_suspend(i915);
>  
> -	/*
> -	 * The only requirement is to reboot with display DC states disabled,
> -	 * for now leaving all display power wells in the INIT power domain
> -	 * enabled.
> -	 *
> -	 * TODO:
> +	/* TODO:

I think it's supposed to be:

"""
	/*
	 * TODO:
"""
But otherwise:
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

>  	 * - unify the pci_driver::shutdown sequence here with the
>  	 *   pci_driver.driver.pm.poweroff,poweroff_late sequence.
>  	 * - unify the driver remove and system/runtime suspend sequences with
>  	 *   the above unified shutdown/poweroff sequence.
>  	 */
> -	intel_power_domains_driver_remove(i915);
> +
>  	enable_rpm_wakeref_asserts(&i915->runtime_pm);
>  
>  	intel_runtime_pm_driver_last_release(&i915->runtime_pm);
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 05/31] drm/xe: At shutdown disable commit helpers instead of flushing
  2024-09-24 20:35 ` [PATCH 05/31] drm/xe: At shutdown disable commit helpers instead of flushing Rodrigo Vivi
@ 2024-10-07 19:42   ` Cavitt, Jonathan
  2024-11-14 20:20     ` Rodrigo Vivi
  0 siblings, 1 reply; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 19:42 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Maarten Lankhort, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:35 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Maarten Lankhort <maarten.lankhorst@linux.intel.com>
Subject: [PATCH 05/31] drm/xe: At shutdown disable commit helpers instead of flushing
> 
> This aligns with the current i915 display sequence.
> 
> Cc: Maarten Lankhort <maarten.lankhorst@linux.intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 5cbee5040e91..0237d458078b 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -10,6 +10,7 @@
>  
>  #include <drm/drm_drv.h>
>  #include <drm/drm_managed.h>
> +#include <drm/drm_atomic_helper.h>
>  #include <drm/drm_probe_helper.h>
>  #include <uapi/drm/xe_drm.h>
>  
> @@ -364,10 +365,10 @@ void xe_display_pm_shutdown(struct xe_device *xe)
>  	if (has_display(xe)) {
>  		drm_kms_helper_poll_disable(&xe->drm);
>  		intel_display_driver_disable_user_access(xe);
> -		intel_display_driver_suspend(xe);
> +
> +		drm_atomic_helper_shutdown(&xe->drm);

Isn't this functionally equivalent?  The only difference AFAICT is that previously we
set the display.restore.modeset_state = state, where the state was the
return value for drm_atomic_helper_shutdown.

>  	}
>  
> -	xe_display_flush_cleanup_work(xe);

And I'm guessing we're removing this line because it's a duplicate in the new
execution path now?

I won't block on it.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

>  	intel_dp_mst_suspend(xe);
>  	intel_hpd_cancel_work(xe);
>  
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 06/31] drm/xe: Use i915-display shutdown sequence directly
  2024-09-24 20:35 ` [PATCH 06/31] drm/xe: Use i915-display shutdown sequence directly Rodrigo Vivi
@ 2024-10-07 19:44   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 19:44 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:35 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 06/31] drm/xe: Use i915-display shutdown sequence directly
> 
> Start the xe-i915-display reconciliation by using the same
> shutdown sequences.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 46 +++++++------------------
>  drivers/gpu/drm/xe/display/xe_display.h |  5 +--
>  drivers/gpu/drm/xe/xe_device.c          |  4 ++-
>  3 files changed, 19 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 0237d458078b..b5a2a09e7a71 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -10,7 +10,6 @@
>  
>  #include <drm/drm_drv.h>
>  #include <drm/drm_managed.h>
> -#include <drm/drm_atomic_helper.h>
>  #include <drm/drm_probe_helper.h>
>  #include <uapi/drm/xe_drm.h>
>  
> @@ -355,32 +354,26 @@ void xe_display_pm_suspend(struct xe_device *xe)
>  
>  void xe_display_pm_shutdown(struct xe_device *xe)
>  {
> -	struct intel_display *display = &xe->display;
> -
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	intel_power_domains_disable(xe);
> -	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
> -	if (has_display(xe)) {
> -		drm_kms_helper_poll_disable(&xe->drm);
> -		intel_display_driver_disable_user_access(xe);
> -
> -		drm_atomic_helper_shutdown(&xe->drm);
> -	}
> -
> -	intel_dp_mst_suspend(xe);
> -	intel_hpd_cancel_work(xe);
> +	intel_display_driver_shutdown(xe);
> +}
>  
> -	if (has_display(xe))
> -		intel_display_driver_suspend_access(xe);
> +void xe_display_pm_shutdown_noirq(struct xe_device *xe)
> +{
> +	if (!xe->info.probe_display)
> +		return;
>  
> -	intel_encoder_suspend_all(display);
> -	intel_encoder_shutdown_all(display);
> +	intel_display_driver_shutdown_noirq(xe);
> +}
>  
> -	intel_opregion_suspend(display, PCI_D3cold);
> +void xe_display_pm_shutdown_noaccel(struct xe_device *xe)
> +{
> +	if (!xe->info.probe_display)
> +		return;
>  
> -	intel_dmc_suspend(display);
> +	intel_display_driver_shutdown_nogem(xe);
>  }
>  
>  void xe_display_pm_runtime_suspend(struct xe_device *xe)
> @@ -405,19 +398,6 @@ void xe_display_pm_suspend_late(struct xe_device *xe)
>  	intel_display_power_suspend_late(xe);
>  }
>  
> -void xe_display_pm_shutdown_late(struct xe_device *xe)
> -{
> -	if (!xe->info.probe_display)
> -		return;
> -
> -	/*
> -	 * The only requirement is to reboot with display DC states disabled,
> -	 * for now leaving all display power wells in the INIT power domain
> -	 * enabled.
> -	 */
> -	intel_power_domains_driver_remove(xe);
> -}
> -
>  void xe_display_pm_resume_early(struct xe_device *xe)
>  {
>  	if (!xe->info.probe_display)
> diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
> index 17afa537aee5..a801db19b64f 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.h
> +++ b/drivers/gpu/drm/xe/display/xe_display.h
> @@ -35,9 +35,10 @@ void xe_display_irq_reset(struct xe_device *xe);
>  void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt);
>  
>  void xe_display_pm_suspend(struct xe_device *xe);
> -void xe_display_pm_shutdown(struct xe_device *xe);
>  void xe_display_pm_suspend_late(struct xe_device *xe);
> -void xe_display_pm_shutdown_late(struct xe_device *xe);
> +void xe_display_pm_shutdown(struct xe_device *xe);
> +void xe_display_pm_shutdown_noirq(struct xe_device *xe);
> +void xe_display_pm_shutdown_noaccel(struct xe_device *xe);
>  void xe_display_pm_resume_early(struct xe_device *xe);
>  void xe_display_pm_resume(struct xe_device *xe);
>  void xe_display_pm_runtime_suspend(struct xe_device *xe);
> diff --git a/drivers/gpu/drm/xe/xe_device.c b/drivers/gpu/drm/xe/xe_device.c
> index cb5a9fd820cf..7c698b4b265b 100644
> --- a/drivers/gpu/drm/xe/xe_device.c
> +++ b/drivers/gpu/drm/xe/xe_device.c
> @@ -822,10 +822,12 @@ void xe_device_shutdown(struct xe_device *xe)
>  
>  		xe_irq_suspend(xe);
>  
> +		xe_display_pm_shutdown_noirq(xe);
> +
>  		for_each_gt(gt, xe, id)
>  			xe_gt_shutdown(gt);
>  
> -		xe_display_pm_shutdown_late(xe);
> +		xe_display_pm_shutdown_noaccel(xe);
>  	} else {
>  		/* BOOM! */
>  		__xe_driver_flr(xe);
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 07/31] drm/{i915, xe}/display: Move DP MST calls to display_driver
  2024-09-24 20:35 ` [PATCH 07/31] drm/{i915, xe}/display: Move DP MST calls to display_driver Rodrigo Vivi
@ 2024-10-07 19:46   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 19:46 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:35 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 07/31] drm/{i915, xe}/display: Move DP MST calls to display_driver
> 
> Move dp_mst suspend/resume functions from the drivers towards
> intel_display_driver to continue with the unification.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

There's probably an argument to be made that this should be two patches,
one for each platform, but I think it's fine.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/i915/display/intel_display_driver.c | 6 ++++++
>  drivers/gpu/drm/i915/i915_driver.c                  | 4 ----
>  drivers/gpu/drm/xe/display/xe_display.c             | 7 -------
>  3 files changed, 6 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index e40b1105168e..51fc1c148283 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -676,6 +676,9 @@ int intel_display_driver_suspend(struct drm_i915_private *i915)
>  			ret);
>  	else
>  		i915->display.restore.modeset_state = state;
> +
> +	intel_dp_mst_suspend(i915);
> +
>  	return ret;
>  }
>  
> @@ -729,6 +732,9 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
>  	if (!HAS_DISPLAY(i915))
>  		return;
>  
> +	/* MST sideband requires HPD interrupts enabled */
> +	intel_dp_mst_resume(i915);
> +
>  	i915->display.restore.modeset_state = NULL;
>  	if (state)
>  		state->acquire_ctx = &ctx;
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 38c845ad86e5..d166a8164b42 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -1013,8 +1013,6 @@ static int i915_drm_suspend(struct drm_device *dev)
>  
>  	intel_display_driver_suspend(dev_priv);
>  
> -	intel_dp_mst_suspend(dev_priv);
> -
>  	intel_irq_suspend(dev_priv);
>  	intel_hpd_cancel_work(dev_priv);
>  
> @@ -1182,8 +1180,6 @@ static int i915_drm_resume(struct drm_device *dev)
>  
>  	intel_hpd_init(dev_priv);
>  
> -	/* MST sideband requires HPD interrupts enabled */
> -	intel_dp_mst_resume(dev_priv);
>  	intel_display_driver_resume(dev_priv);
>  
>  	if (HAS_DISPLAY(dev_priv)) {
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index b5a2a09e7a71..bc5c00437ab3 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -332,9 +332,6 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
>  
>  	xe_display_flush_cleanup_work(xe);
>  
> -	if (!runtime)
> -		intel_dp_mst_suspend(xe);
> -
>  	intel_hpd_cancel_work(xe);
>  
>  	if (!runtime && has_display(xe)) {
> @@ -426,10 +423,6 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
>  	if (!runtime && has_display(xe))
>  		intel_display_driver_resume_access(xe);
>  
> -	/* MST sideband requires HPD interrupts enabled */
> -	if (!runtime)
> -		intel_dp_mst_resume(xe);
> -
>  	if (!runtime && has_display(xe)) {
>  		intel_display_driver_resume(xe);
>  		drm_kms_helper_poll_enable(&xe->drm);
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 08/31] drm/i915/display: Move suspend sequences to intel_display_driver
  2024-09-24 20:35 ` [PATCH 08/31] drm/i915/display: Move suspend sequences to intel_display_driver Rodrigo Vivi
@ 2024-10-07 20:28   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 20:28 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:35 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 08/31] drm/i915/display: Move suspend sequences to intel_display_driver
> 
> The goal is to reconcile the Xe and i915 PM functions.
> Start by moving the display sequences from i915_drv towards
> intel_display_driver.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  .../drm/i915/display/intel_display_driver.c   | 20 +++++++++++++++++++
>  .../drm/i915/display/intel_display_driver.h   |  3 +++
>  drivers/gpu/drm/i915/i915_driver.c            | 14 ++-----------
>  drivers/gpu/drm/xe/display/xe_fb_pin.c        |  4 ++++
>  4 files changed, 29 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index 51fc1c148283..42624bf80f91 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -36,6 +36,7 @@
>  #include "intel_dkl_phy.h"
>  #include "intel_dmc.h"
>  #include "intel_dp.h"
> +#include "intel_dpt.h"
>  #include "intel_dp_tunnel.h"
>  #include "intel_dpll.h"
>  #include "intel_dpll_mgr.h"
> @@ -682,6 +683,25 @@ int intel_display_driver_suspend(struct drm_i915_private *i915)
>  	return ret;
>  }
>  
> +void intel_display_driver_suspend_noirq(struct drm_i915_private *i915)
> +{
> +	intel_hpd_cancel_work(i915);
> +
> +	if (HAS_DISPLAY(i915))
> +		intel_display_driver_suspend_access(i915);
> +
> +	intel_encoder_suspend_all(&i915->display);
> +
> +	/* Must be called before GGTT is suspended. */
> +	intel_dpt_suspend(i915);
> +}
> +
> +void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2idle)
> +{
> +	intel_opregion_suspend(display, s2idle ? PCI_D1 : PCI_D3cold);
> +	intel_dmc_suspend(display);
> +}
> +
>  int
>  __intel_display_driver_resume(struct drm_i915_private *i915,
>  			      struct drm_atomic_state *state,
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
> index 1ee37fb58d38..179fbb86923a 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
> @@ -12,6 +12,7 @@ struct drm_atomic_state;
>  struct drm_i915_private;
>  struct drm_modeset_acquire_ctx;
>  struct pci_dev;
> +struct intel_display;
>  
>  bool intel_display_driver_probe_defer(struct pci_dev *pdev);
>  void intel_display_driver_init_hw(struct drm_i915_private *i915);
> @@ -25,6 +26,8 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915);
>  void intel_display_driver_remove_nogem(struct drm_i915_private *i915);
>  void intel_display_driver_unregister(struct drm_i915_private *i915);
>  int intel_display_driver_suspend(struct drm_i915_private *i915);
> +void intel_display_driver_suspend_noirq(struct drm_i915_private *i915);
> +void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2idle);
>  void intel_display_driver_resume(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index d166a8164b42..ac8bf00458b5 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -996,7 +996,6 @@ static int i915_drm_suspend(struct drm_device *dev)
>  	struct drm_i915_private *dev_priv = to_i915(dev);
>  	struct intel_display *display = &dev_priv->display;
>  	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
> -	pci_power_t opregion_target_state;
>  
>  	disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
>  
> @@ -1014,26 +1013,17 @@ static int i915_drm_suspend(struct drm_device *dev)
>  	intel_display_driver_suspend(dev_priv);
>  
>  	intel_irq_suspend(dev_priv);
> -	intel_hpd_cancel_work(dev_priv);
>  
> -	if (HAS_DISPLAY(dev_priv))
> -		intel_display_driver_suspend_access(dev_priv);
> -
> -	intel_encoder_suspend_all(&dev_priv->display);
> +	intel_display_driver_suspend_noirq(dev_priv);
>  
> -	/* Must be called before GGTT is suspended. */
> -	intel_dpt_suspend(dev_priv);
>  	i915_ggtt_suspend(to_gt(dev_priv)->ggtt);
>  
>  	i9xx_display_sr_save(dev_priv);
>  
> -	opregion_target_state = suspend_to_idle(dev_priv) ? PCI_D1 : PCI_D3cold;
> -	intel_opregion_suspend(display, opregion_target_state);
> +	intel_display_driver_suspend_noggtt(display, suspend_to_idle(dev_priv));
>  
>  	dev_priv->suspend_count++;
>  
> -	intel_dmc_suspend(display);
> -
>  	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
>  
>  	i915_gem_drain_freed_objects(dev_priv);
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index 79dbbbe03c7f..49dc91bdbcb0 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -408,3 +408,7 @@ u64 intel_dpt_offset(struct i915_vma *dpt_vma)
>  {
>  	return 0;
>  }
> +
> +void intel_dpt_suspend(struct xe_device *xe)
> +{
> +}

I can't really tell why this is being disabled here.  Maybe this can be broken
into a separate patch with an explanation for why this is being done?

Something similar is done in patch 14 with intel_dpt_resume, so perhaps
both changes can be collected together in the same patch?

I won't block on it, but I am curious.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 09/31] drm/xe/display: Delay hpd_init resume
  2024-09-24 20:35 ` [PATCH 09/31] drm/xe/display: Delay hpd_init resume Rodrigo Vivi
@ 2024-10-07 20:29   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 20:29 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 09/31] drm/xe/display: Delay hpd_init resume
> 
> Align with i915 and only initialize hotplugs after the display driver
> access has been resumed.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index bc5c00437ab3..be431d9907df 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -418,11 +418,12 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
>  		drm_mode_config_reset(&xe->drm);
>  
>  	intel_display_driver_init_hw(xe);
> -	intel_hpd_init(xe);
>  
>  	if (!runtime && has_display(xe))
>  		intel_display_driver_resume_access(xe);
>  
> +	intel_hpd_init(xe);
> +
>  	if (!runtime && has_display(xe)) {
>  		intel_display_driver_resume(xe);
>  		drm_kms_helper_poll_enable(&xe->drm);
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 10/31] drm/xe/display: Spin-off xe_display runtime/d3cold sequences
  2024-09-24 20:35 ` [PATCH 10/31] drm/xe/display: Spin-off xe_display runtime/d3cold sequences Rodrigo Vivi
@ 2024-10-07 20:43   ` Cavitt, Jonathan
  2024-10-08 16:27   ` Imre Deak
  1 sibling, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 20:43 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 10/31] drm/xe/display: Spin-off xe_display runtime/d3cold sequences
> 
> No functional change. This patch only splits the xe_display_pm
> suspend/resume functions in the regular suspend/resume from the
> runtime/d3cold ones.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 68 ++++++++++++++++---------
>  1 file changed, 45 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index be431d9907df..a4705a452adb 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -308,8 +308,41 @@ static void xe_display_flush_cleanup_work(struct xe_device *xe)
>  	}
>  }
>  
> -/* TODO: System and runtime suspend/resume sequences will be sanitized as a follow-up. */
> -static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
> +static void xe_display_to_d3cold(struct xe_device *xe)
> +{
> +	struct intel_display *display = &xe->display;
> +
> +	/* We do a lot of poking in a lot of registers, make sure they work properly. */
> +	intel_power_domains_disable(xe);
> +
> +	xe_display_flush_cleanup_work(xe);
> +
> +	intel_hpd_cancel_work(xe);
> +
> +	intel_opregion_suspend(display, PCI_D3cold);
> +
> +	intel_dmc_suspend(display);
> +}
> +
> +static void xe_display_from_d3cold(struct xe_device *xe)
> +{
> +	struct intel_display *display = &xe->display;
> +
> +	intel_dmc_resume(display);
> +
> +	if (has_display(xe))
> +		drm_mode_config_reset(&xe->drm);
> +
> +	intel_display_driver_init_hw(xe);
> +
> +	intel_hpd_init(xe);
> +
> +	intel_opregion_resume(display);
> +
> +	intel_power_domains_enable(xe);
> +}

xe_display_to_d3cold and xe_display_from_d3cold sound like conversion functions
that take an xe_display and return a d3cold, and vice versa, respectively.  Perhaps 
we should consider a different naming scheme?  Something like:

xe_display_enable_d3cold
xe_display_disable_d3cold

Also, we're going to need to move these functions in patch 31 later, so perhaps it
would be for the best to put these functions in the correct place from the start?

I won't block on this, but do consider renaming these functions.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> +
> +void xe_display_pm_suspend(struct xe_device *xe)
>  {
>  	struct intel_display *display = &xe->display;
>  	bool s2idle = suspend_to_idle();
> @@ -321,10 +354,10 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
>  	 * properly.
>  	 */
>  	intel_power_domains_disable(xe);
> -	if (!runtime)
> -		intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
>  
> -	if (!runtime && has_display(xe)) {
> +	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
> +
> +	if (has_display(xe)) {
>  		drm_kms_helper_poll_disable(&xe->drm);
>  		intel_display_driver_disable_user_access(xe);
>  		intel_display_driver_suspend(xe);
> @@ -334,7 +367,7 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
>  
>  	intel_hpd_cancel_work(xe);
>  
> -	if (!runtime && has_display(xe)) {
> +	if (has_display(xe)) {
>  		intel_display_driver_suspend_access(xe);
>  		intel_encoder_suspend_all(&xe->display);
>  	}
> @@ -344,11 +377,6 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
>  	intel_dmc_suspend(display);
>  }
>  
> -void xe_display_pm_suspend(struct xe_device *xe)
> -{
> -	__xe_display_pm_suspend(xe, false);
> -}
> -
>  void xe_display_pm_shutdown(struct xe_device *xe)
>  {
>  	if (!xe->info.probe_display)
> @@ -379,7 +407,7 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
>  		return;
>  
>  	if (xe->d3cold.allowed)
> -		__xe_display_pm_suspend(xe, true);
> +		xe_display_to_d3cold(xe);
>  
>  	intel_hpd_poll_enable(xe);
>  }
> @@ -405,7 +433,7 @@ void xe_display_pm_resume_early(struct xe_device *xe)
>  	intel_power_domains_resume(xe);
>  }
>  
> -static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
> +void xe_display_pm_resume(struct xe_device *xe)
>  {
>  	struct intel_display *display = &xe->display;
>  
> @@ -419,12 +447,12 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
>  
>  	intel_display_driver_init_hw(xe);
>  
> -	if (!runtime && has_display(xe))
> +	if (has_display(xe))
>  		intel_display_driver_resume_access(xe);
>  
>  	intel_hpd_init(xe);
>  
> -	if (!runtime && has_display(xe)) {
> +	if (has_display(xe)) {
>  		intel_display_driver_resume(xe);
>  		drm_kms_helper_poll_enable(&xe->drm);
>  		intel_display_driver_enable_user_access(xe);
> @@ -433,17 +461,11 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
>  
>  	intel_opregion_resume(display);
>  
> -	if (!runtime)
> -		intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_RUNNING, false);
> +	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_RUNNING, false);
>  
>  	intel_power_domains_enable(xe);
>  }
>  
> -void xe_display_pm_resume(struct xe_device *xe)
> -{
> -	__xe_display_pm_resume(xe, false);
> -}
> -
>  void xe_display_pm_runtime_resume(struct xe_device *xe)
>  {
>  	if (!xe->info.probe_display)
> @@ -452,7 +474,7 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
>  	intel_hpd_poll_disable(xe);
>  
>  	if (xe->d3cold.allowed)
> -		__xe_display_pm_resume(xe, true);
> +		xe_display_from_d3cold(xe);
>  }
>  
>  
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 11/31] drm/{i915, xe}: Consolidate display resume functions
  2024-09-24 20:35 ` [PATCH 11/31] drm/{i915,xe}: Consolidate display resume functions Rodrigo Vivi
@ 2024-10-07 21:02   ` Cavitt, Jonathan
  2024-11-14 22:15     ` Rodrigo Vivi
  0 siblings, 1 reply; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:02 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 11/31] drm/{i915,xe}: Consolidate display resume functions
> 
> Same sequences are currently executed by i915 and xe during
> system resume. Consolidate them in the intel_display_driver
> side.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  .../drm/i915/display/intel_display_driver.c    | 16 ++++++++++++++++
>  drivers/gpu/drm/i915/i915_driver.c             | 17 -----------------
>  drivers/gpu/drm/xe/display/xe_display.c        | 18 +-----------------
>  3 files changed, 17 insertions(+), 34 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index 42624bf80f91..86d6ebf0c82f 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -752,6 +752,10 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
>  	if (!HAS_DISPLAY(i915))
>  		return;
>  
> +	intel_display_driver_resume_access(i915);
> +
> +	intel_hpd_init(i915);
> +
>  	/* MST sideband requires HPD interrupts enabled */
>  	intel_dp_mst_resume(i915);
>  
> @@ -781,6 +785,18 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
>  			"Restoring old state failed with %i\n", ret);
>  	if (state)
>  		drm_atomic_state_put(state);
> +
> +	intel_display_driver_enable_user_access(i915);
> +
> +	drm_kms_helper_poll_enable(&i915->drm);
> +
> +	intel_hpd_poll_disable(i915);
> +
> +	intel_opregion_resume(&i915->display);
> +
> +	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_RUNNING, false);
> +
> +	intel_power_domains_enable(i915);

Hmm... It looks like everything here is being gated by HAS_DISPLAY, when
it wasn't before in i915_drm_resume or xe_display_pm_resume.  Is this
correct behavior?

I'll trust your judgement on this.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

>  }
>  
>  void intel_display_driver_shutdown(struct drm_i915_private *i915)
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index ac8bf00458b5..ce2dd03136d3 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -1165,25 +1165,8 @@ static int i915_drm_resume(struct drm_device *dev)
>  
>  	intel_clock_gating_init(dev_priv);
>  
> -	if (HAS_DISPLAY(dev_priv))
> -		intel_display_driver_resume_access(dev_priv);
> -
> -	intel_hpd_init(dev_priv);
> -
>  	intel_display_driver_resume(dev_priv);
>  
> -	if (HAS_DISPLAY(dev_priv)) {
> -		intel_display_driver_enable_user_access(dev_priv);
> -		drm_kms_helper_poll_enable(dev);
> -	}
> -	intel_hpd_poll_disable(dev_priv);
> -
> -	intel_opregion_resume(display);
> -
> -	intel_fbdev_set_suspend(dev, FBINFO_STATE_RUNNING, false);
> -
> -	intel_power_domains_enable(dev_priv);
> -
>  	intel_gvt_resume(dev_priv);
>  
>  	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index a4705a452adb..98ff603a1f84 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -447,23 +447,7 @@ void xe_display_pm_resume(struct xe_device *xe)
>  
>  	intel_display_driver_init_hw(xe);
>  
> -	if (has_display(xe))
> -		intel_display_driver_resume_access(xe);
> -
> -	intel_hpd_init(xe);
> -
> -	if (has_display(xe)) {
> -		intel_display_driver_resume(xe);
> -		drm_kms_helper_poll_enable(&xe->drm);
> -		intel_display_driver_enable_user_access(xe);
> -		intel_hpd_poll_disable(xe);
> -	}
> -
> -	intel_opregion_resume(display);
> -
> -	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_RUNNING, false);
> -
> -	intel_power_domains_enable(xe);
> +	intel_display_driver_resume(xe);
>  }
>  
>  void xe_display_pm_runtime_resume(struct xe_device *xe)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 12/31] drm/i915: Remove lingering pci_save_state
  2024-09-24 20:35 ` [PATCH 12/31] drm/i915: Remove lingering pci_save_state Rodrigo Vivi
  2024-09-27  8:45   ` Gupta, Anshuman
@ 2024-10-07 21:10   ` Cavitt, Jonathan
  1 sibling, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:10 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Gupta, Anshuman,
	Ville Syrjälä, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Gupta, Anshuman <anshuman.gupta@intel.com>; Ville Syrjälä <ville.syrjala@linux.intel.com>
Subject: [PATCH 12/31] drm/i915: Remove lingering pci_save_state
> 
> The pairing pci_restore_state was removed by commit
> 'b7e53aba2f0e ("drm/i915: remove restore in resume")'
> to fix a hardware hang in resume.
> 
> Furthermore, it looks like PCI subsystem should be taking care
> of the save and restore here.
> 
> Remove the lingering/stand-alone pci_save_state call.
> 
> Cc: Anshuman Gupta <anshuman.gupta@intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.  Though the wording of the commit message may
initially confuse some people (me) into thinking
pci_save_state is now unused and can have its definition
removed, which is not the case.  I can't think of any
better alternatives, though, so I won't block on it.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_driver.c | 2 --
>  1 file changed, 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index ce2dd03136d3..4fc9d8bce1fd 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -1008,8 +1008,6 @@ static int i915_drm_suspend(struct drm_device *dev)
>  		intel_display_driver_disable_user_access(dev_priv);
>  	}
>  
> -	pci_save_state(pdev);
> -
>  	intel_display_driver_suspend(dev_priv);
>  
>  	intel_irq_suspend(dev_priv);
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 13/31] drm/{i915,xe}: Consolidate display suspend functions
  2024-09-24 20:35 ` [PATCH 13/31] drm/{i915,xe}: Consolidate display suspend functions Rodrigo Vivi
@ 2024-10-07 21:14   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:14 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 13/31] drm/{i915,xe}: Consolidate display suspend functions
> 
> Same sequences are currently executed by i915 and xe during
> system suspend. Consolidate them in the intel_display_driver
> side.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

This is the third patch that could or perhaps should be split into
two patches (I forgot to note it in patch 11) by i915 and xe.

I won't block on it, though.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  .../gpu/drm/i915/display/intel_display_driver.c   |  9 +++++++++
>  drivers/gpu/drm/i915/i915_driver.c                | 12 ------------
>  drivers/gpu/drm/xe/display/xe_display.c           | 15 ++-------------
>  3 files changed, 11 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index 86d6ebf0c82f..f509ed1503c1 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -670,6 +670,15 @@ int intel_display_driver_suspend(struct drm_i915_private *i915)
>  	if (!HAS_DISPLAY(i915))
>  		return 0;
>  
> +	/* We do a lot of poking in a lot of registers, make sure they work properly. */
> +	intel_power_domains_disable(i915);
> +
> +	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
> +
> +	drm_kms_helper_poll_disable(&i915->drm);
> +
> +	intel_display_driver_disable_user_access(i915);
> +
>  	state = drm_atomic_helper_suspend(&i915->drm);
>  	ret = PTR_ERR_OR_ZERO(state);
>  	if (ret)
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 4fc9d8bce1fd..12639fa232b3 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -43,7 +43,6 @@
>  #include <drm/drm_atomic_helper.h>
>  #include <drm/drm_ioctl.h>
>  #include <drm/drm_managed.h>
> -#include <drm/drm_probe_helper.h>
>  
>  #include "display/i9xx_display_sr.h"
>  #include "display/intel_acpi.h"
> @@ -55,7 +54,6 @@
>  #include "display/intel_dp.h"
>  #include "display/intel_dpt.h"
>  #include "display/intel_encoder.h"
> -#include "display/intel_fbdev.h"
>  #include "display/intel_hotplug.h"
>  #include "display/intel_overlay.h"
>  #include "display/intel_pch_refclk.h"
> @@ -995,19 +993,9 @@ static int i915_drm_suspend(struct drm_device *dev)
>  {
>  	struct drm_i915_private *dev_priv = to_i915(dev);
>  	struct intel_display *display = &dev_priv->display;
> -	struct pci_dev *pdev = to_pci_dev(dev_priv->drm.dev);
>  
>  	disable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
>  
> -	/* We do a lot of poking in a lot of registers, make sure they work
> -	 * properly. */
> -	intel_power_domains_disable(dev_priv);
> -	intel_fbdev_set_suspend(dev, FBINFO_STATE_SUSPENDED, true);
> -	if (HAS_DISPLAY(dev_priv)) {
> -		drm_kms_helper_poll_disable(dev);
> -		intel_display_driver_disable_user_access(dev_priv);
> -	}
> -
>  	intel_display_driver_suspend(dev_priv);
>  
>  	intel_irq_suspend(dev_priv);
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 98ff603a1f84..45949b095d7e 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -346,22 +346,11 @@ void xe_display_pm_suspend(struct xe_device *xe)
>  {
>  	struct intel_display *display = &xe->display;
>  	bool s2idle = suspend_to_idle();
> +
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	/*
> -	 * We do a lot of poking in a lot of registers, make sure they work
> -	 * properly.
> -	 */
> -	intel_power_domains_disable(xe);
> -
> -	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
> -
> -	if (has_display(xe)) {
> -		drm_kms_helper_poll_disable(&xe->drm);
> -		intel_display_driver_disable_user_access(xe);
> -		intel_display_driver_suspend(xe);
> -	}
> +	intel_display_driver_suspend(xe);
>  
>  	xe_display_flush_cleanup_work(xe);
>  
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 14/31] drm/i915/display: Move resume sequences to intel_display_driver
  2024-09-24 20:35 ` [PATCH 14/31] drm/i915/display: Move resume sequences to intel_display_driver Rodrigo Vivi
@ 2024-10-07 21:16   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:16 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 14/31] drm/i915/display: Move resume sequences to intel_display_driver
> 
> The goal is to reconcile the Xe and i915 PM functions.
> Continue by moving the display sequences related to system
> resume from i915_drv towards intel_display_driver.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  .../drm/i915/display/intel_display_driver.c   | 25 +++++++++++++++++++
>  .../drm/i915/display/intel_display_driver.h   |  2 ++
>  drivers/gpu/drm/i915/i915_driver.c            | 17 ++-----------
>  drivers/gpu/drm/xe/display/xe_fb_pin.c        |  4 +++
>  4 files changed, 33 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index f509ed1503c1..2a171cb2613a 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -53,6 +53,7 @@
>  #include "intel_modeset_setup.h"
>  #include "intel_opregion.h"
>  #include "intel_overlay.h"
> +#include "intel_pch_refclk.h"
>  #include "intel_plane_initial.h"
>  #include "intel_pmdemand.h"
>  #include "intel_pps.h"
> @@ -711,6 +712,30 @@ void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2i
>  	intel_dmc_suspend(display);
>  }
>  
> +void intel_display_driver_resume_noirq(struct drm_i915_private *i915)
> +{
> +	struct intel_display *display = &i915->display;
> +
> +	/* Must be called after GGTT is resumed. */
> +	intel_dpt_resume(i915);
> +
> +	intel_dmc_resume(display);
> +
> +	intel_vga_redisable(display);
> +
> +	intel_gmbus_reset(i915);
> +
> +	intel_pps_unlock_regs_wa(display);
> +
> +	intel_init_pch_refclk(i915);
> +}
> +
> +void intel_display_driver_resume_nogem(struct intel_display *display)
> +{
> +	if (HAS_DISPLAY(display))
> +		drm_mode_config_reset(display->drm);
> +}
> +
>  int
>  __intel_display_driver_resume(struct drm_i915_private *i915,
>  			      struct drm_atomic_state *state,
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
> index 179fbb86923a..dec93f2f37c6 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
> @@ -29,6 +29,8 @@ int intel_display_driver_suspend(struct drm_i915_private *i915);
>  void intel_display_driver_suspend_noirq(struct drm_i915_private *i915);
>  void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2idle);
>  void intel_display_driver_resume(struct drm_i915_private *i915);
> +void intel_display_driver_resume_noirq(struct drm_i915_private *i915);
> +void intel_display_driver_resume_nogem(struct intel_display *display);
>  void intel_display_driver_shutdown(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915);
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 12639fa232b3..c9df361f898f 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -56,7 +56,6 @@
>  #include "display/intel_encoder.h"
>  #include "display/intel_hotplug.h"
>  #include "display/intel_overlay.h"
> -#include "display/intel_pch_refclk.h"
>  #include "display/intel_pps.h"
>  #include "display/intel_sprite_uapi.h"
>  #include "display/intel_vga.h"
> @@ -1115,20 +1114,9 @@ static int i915_drm_resume(struct drm_device *dev)
>  		if (GRAPHICS_VER(gt->i915) >= 8)
>  			setup_private_pat(gt);
>  
> -	/* Must be called after GGTT is resumed. */
> -	intel_dpt_resume(dev_priv);
> -
> -	intel_dmc_resume(display);
> -
>  	i9xx_display_sr_restore(dev_priv);
>  
> -	intel_vga_redisable(display);
> -
> -	intel_gmbus_reset(dev_priv);
> -
> -	intel_pps_unlock_regs_wa(display);
> -
> -	intel_init_pch_refclk(dev_priv);
> +	intel_display_driver_resume_noirq(dev_priv);
>  
>  	/*
>  	 * Interrupts have to be enabled before any batches are run. If not the
> @@ -1142,8 +1130,7 @@ static int i915_drm_resume(struct drm_device *dev)
>  	 */
>  	intel_irq_resume(dev_priv);
>  
> -	if (HAS_DISPLAY(dev_priv))
> -		drm_mode_config_reset(dev);
> +	intel_display_driver_resume_nogem(display);
>  
>  	i915_gem_resume(dev_priv);
>  
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index 49dc91bdbcb0..c26a47dac332 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -412,3 +412,7 @@ u64 intel_dpt_offset(struct i915_vma *dpt_vma)
>  void intel_dpt_suspend(struct xe_device *xe)
>  {
>  }
> +
> +void intel_dpt_resume(struct xe_device *xe)
> +{
> +}

See my note on patch 8.  Otherwise:

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 15/31] drm/xe/display: Delay dsm handler registration
  2024-09-24 20:35 ` [PATCH 15/31] drm/xe/display: Delay dsm handler registration Rodrigo Vivi
@ 2024-10-07 21:17   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:17 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 15/31] drm/xe/display: Delay dsm handler registration
> 
> Bring some consistency to register/unregister order at the
> same time it aligns with i915 sequence order.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 45949b095d7e..e5df50221a04 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -217,8 +217,8 @@ void xe_display_register(struct xe_device *xe)
>  		return;
>  
>  	intel_display_driver_register(xe);
> -	intel_register_dsm_handler();
>  	intel_power_domains_enable(xe);
> +	intel_register_dsm_handler();
>  }
>  
>  void xe_display_unregister(struct xe_device *xe)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 16/31] drm/{i915, xe}: Move power_domains suspend/resume to display_power
  2024-09-24 20:35 ` [PATCH 16/31] drm/{i915, xe}: Move power_domains suspend/resume to display_power Rodrigo Vivi
@ 2024-10-07 21:25   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:25 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 16/31] drm/{i915, xe}: Move power_domains suspend/resume to display_power
> 
> Move intel_power_domains_{suspend,resume} to inside
> intel_display_power_{suspend_late, resume_early}.
> 
> With this also change the VLV suspend failure to call
> the intel_display_power_resume_early. In the end, the only
> function executed there for VLV is the intel_power_domains_resume.
> Besides make the code more consistency give the call that was
> immediately before: intel_display_power_suspend_late.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

Debatably, this should be done the other way around: Instead of
putting intel_power_domains_resume as the last part of running
intel_display_power_resume_early, we should be making
intel_display_power_resume_early the first part of running
intel_power_domains_resume.  Same with
intel_power_domains_suspend and its relation to
intel_display_power_suspend_late.

Also, this patch may want to be split in two (for i915 and xe).

But I'll trust your judgement here.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/i915/display/intel_display_power.c | 6 +++++-
>  drivers/gpu/drm/i915/display/intel_display_power.h | 2 +-
>  drivers/gpu/drm/i915/i915_driver.c                 | 8 ++------
>  drivers/gpu/drm/xe/display/xe_display.c            | 7 ++-----
>  4 files changed, 10 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.c b/drivers/gpu/drm/i915/display/intel_display_power.c
> index ecabb674644b..923178a4ffe5 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.c
> @@ -2231,10 +2231,12 @@ static void intel_power_domains_verify_state(struct drm_i915_private *i915)
>  
>  #endif
>  
> -void intel_display_power_suspend_late(struct drm_i915_private *i915)
> +void intel_display_power_suspend_late(struct drm_i915_private *i915, bool s2idle)
>  {
>  	struct intel_display *display = &i915->display;
>  
> +	intel_power_domains_suspend(i915, s2idle);
> +
>  	if (DISPLAY_VER(i915) >= 11 || IS_GEMINILAKE(i915) ||
>  	    IS_BROXTON(i915)) {
>  		bxt_enable_dc9(display);
> @@ -2262,6 +2264,8 @@ void intel_display_power_resume_early(struct drm_i915_private *i915)
>  	/* Tweaked Wa_14010685332:cnp,icp,jsp,mcc,tgp,adp */
>  	if (INTEL_PCH_TYPE(i915) >= PCH_CNP && INTEL_PCH_TYPE(i915) < PCH_DG1)
>  		intel_de_rmw(i915, SOUTH_CHICKEN1, SBCLK_RUN_REFCLK_DIS, 0);
> +
> +	intel_power_domains_resume(i915);
>  }
>  
>  void intel_display_power_suspend(struct drm_i915_private *i915)
> diff --git a/drivers/gpu/drm/i915/display/intel_display_power.h b/drivers/gpu/drm/i915/display/intel_display_power.h
> index 425452c5a469..ccac3c06b2f7 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_power.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_power.h
> @@ -176,7 +176,7 @@ void intel_power_domains_suspend(struct drm_i915_private *dev_priv, bool s2idle)
>  void intel_power_domains_resume(struct drm_i915_private *dev_priv);
>  void intel_power_domains_sanitize_state(struct drm_i915_private *dev_priv);
>  
> -void intel_display_power_suspend_late(struct drm_i915_private *i915);
> +void intel_display_power_suspend_late(struct drm_i915_private *i915, bool s2idle);
>  void intel_display_power_resume_early(struct drm_i915_private *i915);
>  void intel_display_power_suspend(struct drm_i915_private *i915);
>  void intel_display_power_resume(struct drm_i915_private *i915);
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index c9df361f898f..9e788e1c178e 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -1034,14 +1034,12 @@ static int i915_drm_suspend_late(struct drm_device *dev, bool hibernation)
>  	for_each_gt(gt, dev_priv, i)
>  		intel_uncore_suspend(gt->uncore);
>  
> -	intel_power_domains_suspend(dev_priv, s2idle);
> -
> -	intel_display_power_suspend_late(dev_priv);
> +	intel_display_power_suspend_late(dev_priv, s2idle);
>  
>  	ret = vlv_suspend_complete(dev_priv);
>  	if (ret) {
>  		drm_err(&dev_priv->drm, "Suspend complete failed: %d\n", ret);
> -		intel_power_domains_resume(dev_priv);
> +		intel_display_power_resume_early(dev_priv);
>  
>  		goto out;
>  	}
> @@ -1211,8 +1209,6 @@ static int i915_drm_resume_early(struct drm_device *dev)
>  
>  	intel_display_power_resume_early(dev_priv);
>  
> -	intel_power_domains_resume(dev_priv);
> -
>  	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
>  
>  	return ret;
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index e5df50221a04..d5be622f831b 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -404,12 +404,11 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
>  void xe_display_pm_suspend_late(struct xe_device *xe)
>  {
>  	bool s2idle = suspend_to_idle();
> +
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	intel_power_domains_suspend(xe, s2idle);
> -
> -	intel_display_power_suspend_late(xe);
> +	intel_display_power_suspend_late(xe, s2idle);
>  }
>  
>  void xe_display_pm_resume_early(struct xe_device *xe)
> @@ -418,8 +417,6 @@ void xe_display_pm_resume_early(struct xe_device *xe)
>  		return;
>  
>  	intel_display_power_resume_early(xe);
> -
> -	intel_power_domains_resume(xe);
>  }
>  
>  void xe_display_pm_resume(struct xe_device *xe)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 17/31] drm/{i915, xe}: Move remaining intel_power_domains to intel_display
  2024-09-24 20:35 ` [PATCH 17/31] drm/{i915, xe}: Move remaining intel_power_domains to intel_display Rodrigo Vivi
@ 2024-10-07 21:27   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:27 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 17/31] drm/{i915, xe}: Move remaining intel_power_domains to intel_display
> 
> Consolidate the intel_power_domains calls under
> intel_display_driver.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.  I'd suggest splitting this patch into i915 and xe parts,
but for this patch in particular it might be a bit difficult.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/i915/display/intel_display_driver.c | 9 +++++++++
>  drivers/gpu/drm/i915/display/intel_display_driver.h | 1 +
>  drivers/gpu/drm/i915/i915_driver.c                  | 4 +---
>  drivers/gpu/drm/xe/display/xe_display.c             | 4 +---
>  4 files changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index 2a171cb2613a..a64468e3a052 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -563,6 +563,13 @@ void intel_display_driver_register(struct drm_i915_private *i915)
>  
>  	intel_display_device_info_print(DISPLAY_INFO(i915),
>  					DISPLAY_RUNTIME_INFO(i915), &p);
> +
> +	intel_power_domains_enable(i915);
> +}
> +
> +void intel_display_driver_cleanup(struct drm_i915_private *i915)
> +{
> +	intel_power_domains_cleanup(i915);
>  }
>  
>  /* part #1: call before irq uninstall */
> @@ -640,6 +647,8 @@ void intel_display_driver_unregister(struct drm_i915_private *i915)
>  	if (!HAS_DISPLAY(i915))
>  		return;
>  
> +	intel_power_domains_disable(i915);
> +
>  	drm_client_dev_unregister(&i915->drm);
>  
>  	/*
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
> index dec93f2f37c6..4b2c041667e0 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
> @@ -21,6 +21,7 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915);
>  int intel_display_driver_probe_nogem(struct drm_i915_private *i915);
>  int intel_display_driver_probe(struct drm_i915_private *i915);
>  void intel_display_driver_register(struct drm_i915_private *i915);
> +void intel_display_driver_cleanup(struct drm_i915_private *i915);
>  void intel_display_driver_remove(struct drm_i915_private *i915);
>  void intel_display_driver_remove_noirq(struct drm_i915_private *i915);
>  void intel_display_driver_remove_nogem(struct drm_i915_private *i915);
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 9e788e1c178e..53960326b68d 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -281,7 +281,7 @@ static int i915_driver_early_probe(struct drm_i915_private *dev_priv)
>  static void i915_driver_late_release(struct drm_i915_private *dev_priv)
>  {
>  	intel_irq_fini(dev_priv);
> -	intel_power_domains_cleanup(dev_priv);
> +	intel_display_driver_cleanup(dev_priv);
>  	i915_gem_cleanup_early(dev_priv);
>  	intel_gt_driver_late_release_all(dev_priv);
>  	intel_region_ttm_device_fini(dev_priv);
> @@ -627,7 +627,6 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
>  
>  	intel_display_driver_register(dev_priv);
>  
> -	intel_power_domains_enable(dev_priv);
>  	intel_runtime_pm_enable(&dev_priv->runtime_pm);
>  
>  	intel_register_dsm_handler();
> @@ -650,7 +649,6 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)
>  	intel_unregister_dsm_handler();
>  
>  	intel_runtime_pm_disable(&dev_priv->runtime_pm);
> -	intel_power_domains_disable(dev_priv);
>  
>  	intel_display_driver_unregister(dev_priv);
>  
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index d5be622f831b..df66e47daca3 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -107,7 +107,7 @@ static void xe_display_fini_nommio(struct drm_device *dev, void *dummy)
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	intel_power_domains_cleanup(xe);
> +	intel_display_driver_cleanup(xe);
>  }
>  
>  int xe_display_init_nommio(struct xe_device *xe)
> @@ -217,7 +217,6 @@ void xe_display_register(struct xe_device *xe)
>  		return;
>  
>  	intel_display_driver_register(xe);
> -	intel_power_domains_enable(xe);
>  	intel_register_dsm_handler();
>  }
>  
> @@ -227,7 +226,6 @@ void xe_display_unregister(struct xe_device *xe)
>  		return;
>  
>  	intel_unregister_dsm_handler();
> -	intel_power_domains_disable(xe);
>  	intel_display_driver_unregister(xe);
>  }
>  
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 18/31] drm/i915/display: Split resume_noirq calls for now
  2024-09-24 20:35 ` [PATCH 18/31] drm/i915/display: Split resume_noirq calls for now Rodrigo Vivi
@ 2024-10-07 21:29   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:29 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 18/31] drm/i915/display: Split resume_noirq calls for now
> 
> Some functions are not yet called from Xe. Move them to a
> separate function that will be only used in i915 for now.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

s/be only/only be
But otherwise:

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/i915/display/intel_display_driver.c | 10 ++++++++++
>  drivers/gpu/drm/i915/display/intel_display_driver.h |  1 +
>  drivers/gpu/drm/i915/i915_driver.c                  |  1 +
>  3 files changed, 12 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index a64468e3a052..85a51b9d49f8 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -729,6 +729,16 @@ void intel_display_driver_resume_noirq(struct drm_i915_private *i915)
>  	intel_dpt_resume(i915);
>  
>  	intel_dmc_resume(display);
> +}
> +
> +/*
> + * TODO: Current sequences missing from Xe! Check and merge with above function.
> + *       DPT is also a missing case there, but the TODO is recorded as the
> + *       empty stub DPT functions inside Xe.
> + */
> +void intel_display_driver_resume_noirq_legacy(struct drm_i915_private *i915)
> +{
> +	struct intel_display *display = &i915->display;
>  
>  	intel_vga_redisable(display);
>  
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
> index 4b2c041667e0..e287574fcd35 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
> @@ -31,6 +31,7 @@ void intel_display_driver_suspend_noirq(struct drm_i915_private *i915);
>  void intel_display_driver_suspend_noggtt(struct intel_display *display, bool s2idle);
>  void intel_display_driver_resume(struct drm_i915_private *i915);
>  void intel_display_driver_resume_noirq(struct drm_i915_private *i915);
> +void intel_display_driver_resume_noirq_legacy(struct drm_i915_private *i915);
>  void intel_display_driver_resume_nogem(struct intel_display *display);
>  void intel_display_driver_shutdown(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 53960326b68d..65f885e03880 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -1113,6 +1113,7 @@ static int i915_drm_resume(struct drm_device *dev)
>  	i9xx_display_sr_restore(dev_priv);
>  
>  	intel_display_driver_resume_noirq(dev_priv);
> +	intel_display_driver_resume_noirq_legacy(dev_priv);
>  
>  	/*
>  	 * Interrupts have to be enabled before any batches are run. If not the
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 19/31] drm/xe/display: Align display resume sequence with i915
  2024-09-24 20:35 ` [PATCH 19/31] drm/xe/display: Align display resume sequence with i915 Rodrigo Vivi
@ 2024-10-07 21:37   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:37 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 19/31] drm/xe/display: Align display resume sequence with i915
> 
> Resume DMC before resuming IRQ.
> Reset mode_config before GT resume.
> Use direct intel_display_driver functions for that.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

This looks fine, though it also looks like two different changes:
1. The change to xe_display_pm_resume
2. The addition and use of xe_display_pm_resume_noirq and
xe_display_pm_resume_noaccel

I won't say these changes need to be separated, but it might
be worth considering.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 23 ++++++++++++++++-------
>  drivers/gpu/drm/xe/display/xe_display.h |  2 ++
>  drivers/gpu/drm/xe/xe_pm.c              |  4 ++++
>  3 files changed, 22 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index df66e47daca3..959635653cfb 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -419,21 +419,30 @@ void xe_display_pm_resume_early(struct xe_device *xe)
>  
>  void xe_display_pm_resume(struct xe_device *xe)
>  {
> -	struct intel_display *display = &xe->display;
> -
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	intel_dmc_resume(display);
> -
> -	if (has_display(xe))
> -		drm_mode_config_reset(&xe->drm);
> -
>  	intel_display_driver_init_hw(xe);
>  
>  	intel_display_driver_resume(xe);
>  }
>  
> +void xe_display_pm_resume_noirq(struct xe_device *xe)
> +{
> +	if (!xe->info.probe_display)
> +		return;
> +
> +	intel_display_driver_resume_noirq(xe);
> +}
> +
> +void xe_display_pm_resume_noaccel(struct xe_device *xe)
> +{
> +	if (!xe->info.probe_display)
> +		return;
> +
> +	intel_display_driver_resume_nogem(&xe->display);
> +}
> +
>  void xe_display_pm_runtime_resume(struct xe_device *xe)
>  {
>  	if (!xe->info.probe_display)
> diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
> index a801db19b64f..b4ed5b598c2d 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.h
> +++ b/drivers/gpu/drm/xe/display/xe_display.h
> @@ -41,6 +41,8 @@ void xe_display_pm_shutdown_noirq(struct xe_device *xe);
>  void xe_display_pm_shutdown_noaccel(struct xe_device *xe);
>  void xe_display_pm_resume_early(struct xe_device *xe);
>  void xe_display_pm_resume(struct xe_device *xe);
> +void xe_display_pm_resume_noirq(struct xe_device *xe);
> +void xe_display_pm_resume_noaccel(struct xe_device *xe);
>  void xe_display_pm_runtime_suspend(struct xe_device *xe);
>  void xe_display_pm_runtime_resume(struct xe_device *xe);
>  
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> index 33eb039053e4..f5d89c326d46 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -182,8 +182,12 @@ int xe_pm_resume(struct xe_device *xe)
>  	if (err)
>  		goto err;
>  
> +	xe_display_pm_resume_noirq(xe);
> +
>  	xe_irq_resume(xe);
>  
> +	xe_display_pm_resume_noaccel(xe);
> +
>  	for_each_gt(gt, xe, id)
>  		xe_gt_resume(gt);
>  
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 20/31] drm/xe/display: Align suspend sequence with i915
  2024-09-24 20:35 ` [PATCH 20/31] drm/xe/display: Align suspend " Rodrigo Vivi
@ 2024-10-07 21:40   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-07 21:40 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 20/31] drm/xe/display: Align suspend sequence with i915
> 
> Move a few things to after GT has stopped and also
> IRQ has been disabled:
>  - intel_hpd_cancel_work
>  - intel_display_driver_suspend_access
>  - intel_encoder_suspend_all
> 
> With that, also remove the xe_display_flush_cleanup_work,
> which is no longer necessary.
> 
> Then, use directly all the intel_display_driver functions for
> a full alignment.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.
Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 25 ++++++++++++++-----------
>  drivers/gpu/drm/xe/display/xe_display.h |  2 ++
>  drivers/gpu/drm/xe/xe_pm.c              |  2 ++
>  3 files changed, 18 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 959635653cfb..44850b6cd382 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -342,26 +342,29 @@ static void xe_display_from_d3cold(struct xe_device *xe)
>  
>  void xe_display_pm_suspend(struct xe_device *xe)
>  {
> -	struct intel_display *display = &xe->display;
> -	bool s2idle = suspend_to_idle();
> -
>  	if (!xe->info.probe_display)
>  		return;
>  
>  	intel_display_driver_suspend(xe);
> +}
>  
> -	xe_display_flush_cleanup_work(xe);
> +void xe_display_pm_suspend_noirq(struct xe_device *xe)
> +{
> +	if (!xe->info.probe_display)
> +		return;
>  
> -	intel_hpd_cancel_work(xe);
> +	intel_display_driver_suspend_noirq(xe);
> +}
>  
> -	if (has_display(xe)) {
> -		intel_display_driver_suspend_access(xe);
> -		intel_encoder_suspend_all(&xe->display);
> -	}
> +void xe_display_pm_suspend_noggtt(struct xe_device *xe)
> +{
> +	struct intel_display *display = &xe->display;
> +	bool s2idle = suspend_to_idle();
>  
> -	intel_opregion_suspend(display, s2idle ? PCI_D1 : PCI_D3cold);
> +	if (!xe->info.probe_display)
> +		return;
>  
> -	intel_dmc_suspend(display);
> +	intel_display_driver_suspend_noggtt(display, s2idle);
>  }
>  
>  void xe_display_pm_shutdown(struct xe_device *xe)
> diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
> index b4ed5b598c2d..256bd2d23964 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.h
> +++ b/drivers/gpu/drm/xe/display/xe_display.h
> @@ -35,6 +35,8 @@ void xe_display_irq_reset(struct xe_device *xe);
>  void xe_display_irq_postinstall(struct xe_device *xe, struct xe_gt *gt);
>  
>  void xe_display_pm_suspend(struct xe_device *xe);
> +void xe_display_pm_suspend_noirq(struct xe_device *xe);
> +void xe_display_pm_suspend_noggtt(struct xe_device *xe);
>  void xe_display_pm_suspend_late(struct xe_device *xe);
>  void xe_display_pm_shutdown(struct xe_device *xe);
>  void xe_display_pm_shutdown_noirq(struct xe_device *xe);
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> index f5d89c326d46..77eb45a641e8 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -140,6 +140,8 @@ int xe_pm_suspend(struct xe_device *xe)
>  
>  	xe_irq_suspend(xe);
>  
> +	xe_display_pm_suspend_noirq(xe);
> +	xe_display_pm_suspend_noggtt(xe);
>  	xe_display_pm_suspend_late(xe);
>  
>  	drm_dbg(&xe->drm, "Device suspended\n");
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 21/31] drm/{i915, xe}/display: Move dsm registration under intel_driver
  2024-09-24 20:35 ` [PATCH 21/31] drm/{i915, xe}/display: Move dsm registration under intel_driver Rodrigo Vivi
@ 2024-10-08 14:04   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:04 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 21/31] drm/{i915, xe}/display: Move dsm registration under intel_driver
> 
> Move dsm register/unregister calls from the drivers to under
> intel_display_driver register/unregister.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/i915/display/intel_display_driver.c | 4 ++++
>  drivers/gpu/drm/i915/i915_driver.c                  | 5 -----
>  drivers/gpu/drm/xe/display/xe_display.c             | 3 ---
>  3 files changed, 4 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index 85a51b9d49f8..f3a586913c6f 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -565,6 +565,8 @@ void intel_display_driver_register(struct drm_i915_private *i915)
>  					DISPLAY_RUNTIME_INFO(i915), &p);
>  
>  	intel_power_domains_enable(i915);
> +
> +	intel_register_dsm_handler();
>  }
>  
>  void intel_display_driver_cleanup(struct drm_i915_private *i915)
> @@ -647,6 +649,8 @@ void intel_display_driver_unregister(struct drm_i915_private *i915)
>  	if (!HAS_DISPLAY(i915))
>  		return;
>  
> +	intel_unregister_dsm_handler();
> +
>  	intel_power_domains_disable(i915);
>  
>  	drm_client_dev_unregister(&i915->drm);
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 65f885e03880..7fce210d355d 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -45,7 +45,6 @@
>  #include <drm/drm_managed.h>
>  
>  #include "display/i9xx_display_sr.h"
> -#include "display/intel_acpi.h"
>  #include "display/intel_bw.h"
>  #include "display/intel_cdclk.h"
>  #include "display/intel_crtc.h"
> @@ -629,8 +628,6 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
>  
>  	intel_runtime_pm_enable(&dev_priv->runtime_pm);
>  
> -	intel_register_dsm_handler();
> -
>  	if (i915_switcheroo_register(dev_priv))
>  		drm_err(&dev_priv->drm, "Failed to register vga switcheroo!\n");
>  }
> @@ -646,8 +643,6 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)
>  
>  	i915_switcheroo_unregister(dev_priv);
>  
> -	intel_unregister_dsm_handler();
> -
>  	intel_runtime_pm_disable(&dev_priv->runtime_pm);
>  
>  	intel_display_driver_unregister(dev_priv);
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 44850b6cd382..6bfad26a3c06 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -14,7 +14,6 @@
>  #include <uapi/drm/xe_drm.h>
>  
>  #include "soc/intel_dram.h"
> -#include "intel_acpi.h"
>  #include "intel_audio.h"
>  #include "intel_bw.h"
>  #include "intel_display.h"
> @@ -217,7 +216,6 @@ void xe_display_register(struct xe_device *xe)
>  		return;
>  
>  	intel_display_driver_register(xe);
> -	intel_register_dsm_handler();
>  }
>  
>  void xe_display_unregister(struct xe_device *xe)
> @@ -225,7 +223,6 @@ void xe_display_unregister(struct xe_device *xe)
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	intel_unregister_dsm_handler();
>  	intel_display_driver_unregister(xe);
>  }
>  
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 22/31] drm/i915/display: Move runtime pm related calls under intel_display_driver
  2024-09-24 20:35 ` [PATCH 22/31] drm/i915/display: Move runtime pm related calls under intel_display_driver Rodrigo Vivi
@ 2024-10-08 14:10   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:10 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 22/31] drm/i915/display: Move runtime pm related calls under intel_display_driver
> 
> Continue moving more display stuff from i915_driver to intel_display.
> With the end goal of reconciling xe and i915 sequences.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  .../drm/i915/display/intel_display_driver.c   | 58 +++++++++++++++++++
>  .../drm/i915/display/intel_display_driver.h   |  4 ++
>  drivers/gpu/drm/i915/i915_driver.c            | 46 ++-------------
>  3 files changed, 66 insertions(+), 42 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index f3a586913c6f..62a7aa56f0da 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -856,6 +856,64 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
>  	intel_power_domains_enable(i915);
>  }
>  
> +void intel_display_driver_runtime_suspend(struct drm_i915_private *i915)
> +{
> +	intel_display_power_suspend(i915);
> +}
> +
> +void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915)
> +{
> +	struct intel_display *display = &i915->display;
> +
> +	/*
> +	 * FIXME: We really should find a document that references the arguments
> +	 * used below!
> +	 */
> +	if (IS_BROADWELL(i915)) {
> +		/*
> +		 * On Broadwell, if we use PCI_D1 the PCH DDI ports will stop
> +		 * being detected, and the call we do at intel_runtime_resume()
> +		 * won't be able to restore them. Since PCI_D3hot matches the
> +		 * actual specification and appears to be working, use it.
> +		 */
> +		intel_opregion_notify_adapter(display, PCI_D3hot);
> +	} else {
> +		/*
> +		 * current versions of firmware which depend on this opregion
> +		 * notification have repurposed the D1 definition to mean
> +		 * "runtime suspended" vs. what you would normally expect (D3)
> +		 * to distinguish it from notifications that might be sent via
> +		 * the suspend path.
> +		 */
> +		intel_opregion_notify_adapter(display, PCI_D1);
> +	}
> +
> +	if (!IS_VALLEYVIEW(i915) && !IS_CHERRYVIEW(i915))
> +		intel_hpd_poll_enable(i915);
> +}
> +
> +void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915)
> +{
> +	intel_opregion_notify_adapter(&i915->display, PCI_D0);
> +
> +	intel_display_power_resume(i915);
> +}
> +
> +void intel_display_driver_runtime_resume(struct drm_i915_private *i915)
> +{
> +	/*
> +	 * On VLV/CHV display interrupts are part of the display
> +	 * power well, so hpd is reinitialized from there. For
> +	 * everyone else do it here.
> +	 */
> +	if (!IS_VALLEYVIEW(i915) && !IS_CHERRYVIEW(i915)) {
> +		intel_hpd_init(i915);
> +		intel_hpd_poll_disable(i915);
> +	}
> +
> +	skl_watermark_ipc_update(i915);
> +}
> +
>  void intel_display_driver_shutdown(struct drm_i915_private *i915)
>  {
>  	intel_power_domains_disable(i915);
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
> index e287574fcd35..b1441a55d72d 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
> @@ -33,6 +33,10 @@ void intel_display_driver_resume(struct drm_i915_private *i915);
>  void intel_display_driver_resume_noirq(struct drm_i915_private *i915);
>  void intel_display_driver_resume_noirq_legacy(struct drm_i915_private *i915);
>  void intel_display_driver_resume_nogem(struct intel_display *display);
> +void intel_display_driver_runtime_suspend(struct drm_i915_private *i915);
> +void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915);
> +void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915);
> +void intel_display_driver_runtime_resume(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915);
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index 7fce210d355d..b3eaa55ebacb 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -1373,7 +1373,6 @@ static int i915_pm_restore(struct device *kdev)
>  static int intel_runtime_suspend(struct device *kdev)
>  {
>  	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
> -	struct intel_display *display = &dev_priv->display;
>  	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;
> @@ -1403,7 +1402,7 @@ static int intel_runtime_suspend(struct device *kdev)
>  	for_each_gt(gt, dev_priv, i)
>  		intel_uncore_suspend(gt->uncore);
>  
> -	intel_display_power_suspend(dev_priv);
> +	intel_display_driver_runtime_suspend(dev_priv);
>  
>  	ret = vlv_suspend_complete(dev_priv);
>  	if (ret) {
> @@ -1437,34 +1436,10 @@ static int intel_runtime_suspend(struct device *kdev)
>  	if (root_pdev)
>  		pci_d3cold_disable(root_pdev);
>  
> -	/*
> -	 * FIXME: We really should find a document that references the arguments
> -	 * used below!
> -	 */
> -	if (IS_BROADWELL(dev_priv)) {
> -		/*
> -		 * On Broadwell, if we use PCI_D1 the PCH DDI ports will stop
> -		 * being detected, and the call we do at intel_runtime_resume()
> -		 * won't be able to restore them. Since PCI_D3hot matches the
> -		 * actual specification and appears to be working, use it.
> -		 */
> -		intel_opregion_notify_adapter(display, PCI_D3hot);
> -	} else {
> -		/*
> -		 * current versions of firmware which depend on this opregion
> -		 * notification have repurposed the D1 definition to mean
> -		 * "runtime suspended" vs. what you would normally expect (D3)
> -		 * to distinguish it from notifications that might be sent via
> -		 * the suspend path.
> -		 */
> -		intel_opregion_notify_adapter(display, PCI_D1);
> -	}
> +	intel_display_driver_runtime_suspend_late(dev_priv);
>  
>  	assert_forcewakes_inactive(&dev_priv->uncore);
>  
> -	if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv))
> -		intel_hpd_poll_enable(dev_priv);
> -
>  	drm_dbg(&dev_priv->drm, "Device suspended\n");
>  	return 0;
>  }
> @@ -1472,7 +1447,6 @@ static int intel_runtime_suspend(struct device *kdev)
>  static int intel_runtime_resume(struct device *kdev)
>  {
>  	struct drm_i915_private *dev_priv = kdev_to_i915(kdev);
> -	struct intel_display *display = &dev_priv->display;
>  	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;
> @@ -1487,8 +1461,6 @@ static int intel_runtime_resume(struct device *kdev)
>  	drm_WARN_ON_ONCE(&dev_priv->drm, atomic_read(&rpm->wakeref_count));
>  	disable_rpm_wakeref_asserts(rpm);
>  
> -	intel_opregion_notify_adapter(display, PCI_D0);
> -
>  	root_pdev = pcie_find_root_port(pdev);
>  	if (root_pdev)
>  		pci_d3cold_enable(root_pdev);
> @@ -1497,7 +1469,7 @@ static int intel_runtime_resume(struct device *kdev)
>  		drm_dbg(&dev_priv->drm,
>  			"Unclaimed access during suspend, bios?\n");
>  
> -	intel_display_power_resume(dev_priv);
> +	intel_display_driver_runtime_resume_early(dev_priv);
>  
>  	ret = vlv_resume_prepare(dev_priv, true);
>  
> @@ -1515,17 +1487,7 @@ static int intel_runtime_resume(struct device *kdev)
>  
>  	intel_pxp_runtime_resume(dev_priv->pxp);
>  
> -	/*
> -	 * On VLV/CHV display interrupts are part of the display
> -	 * power well, so hpd is reinitialized from there. For
> -	 * everyone else do it here.
> -	 */
> -	if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) {
> -		intel_hpd_init(dev_priv);
> -		intel_hpd_poll_disable(dev_priv);
> -	}
> -
> -	skl_watermark_ipc_update(dev_priv);
> +	intel_display_driver_runtime_resume_early(dev_priv);
>  
>  	enable_rpm_wakeref_asserts(rpm);
>  
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 23/31] drm/xe/display: Prepare runtime pm functions
  2024-09-24 20:35 ` [PATCH 23/31] drm/xe/display: Prepare runtime pm functions Rodrigo Vivi
@ 2024-10-08 14:31   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:31 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 23/31] drm/xe/display: Prepare runtime pm functions
> 
> No functional change. Just organize the runtime_pm related
> functions to allow a later sync with the i915.
> 
> Move runtime_suspend down near the runtime_resume.
> Create runtime_suspend_late and runtime_suspend_early
> stages for a better visualization of the missed i915
> sequences.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 41 +++++++++++++++++--------
>  drivers/gpu/drm/xe/display/xe_display.h |  2 ++
>  drivers/gpu/drm/xe/xe_pm.c              |  7 +++--
>  3 files changed, 35 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 6bfad26a3c06..1ab4dd51094f 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -388,17 +388,6 @@ void xe_display_pm_shutdown_noaccel(struct xe_device *xe)
>  	intel_display_driver_shutdown_nogem(xe);
>  }
>  
> -void xe_display_pm_runtime_suspend(struct xe_device *xe)
> -{
> -	if (!xe->info.probe_display)
> -		return;
> -
> -	if (xe->d3cold.allowed)
> -		xe_display_to_d3cold(xe);
> -
> -	intel_hpd_poll_enable(xe);
> -}
> -
>  void xe_display_pm_suspend_late(struct xe_device *xe)
>  {
>  	bool s2idle = suspend_to_idle();
> @@ -443,6 +432,35 @@ void xe_display_pm_resume_noaccel(struct xe_device *xe)
>  	intel_display_driver_resume_nogem(&xe->display);
>  }
>  
> +void xe_display_pm_runtime_suspend(struct xe_device *xe)
> +{
> +	if (!xe->info.probe_display)
> +		return;
> +
> +	if (xe->d3cold.allowed)
> +		xe_display_to_d3cold(xe);
> +
> +	intel_hpd_poll_enable(xe);
> +}
> +
> +void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
> +{
> +	if (!xe->info.probe_display)
> +		return;
> +
> +	if (xe->d3cold.allowed)
> +		intel_display_power_suspend_late(xe, false);
> +}
> +
> +void xe_display_pm_runtime_resume_early(struct xe_device *xe)
> +{
> +	if (!xe->info.probe_display)
> +		return;
> +
> +	if (xe->d3cold.allowed)
> +		intel_display_power_resume_early(xe);
> +}
> +
>  void xe_display_pm_runtime_resume(struct xe_device *xe)
>  {
>  	if (!xe->info.probe_display)
> @@ -454,7 +472,6 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
>  		xe_display_from_d3cold(xe);
>  }
>  
> -
>  static void display_device_remove(struct drm_device *dev, void *arg)
>  {
>  	struct xe_device *xe = arg;
> diff --git a/drivers/gpu/drm/xe/display/xe_display.h b/drivers/gpu/drm/xe/display/xe_display.h
> index 256bd2d23964..64ff2d2f5270 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.h
> +++ b/drivers/gpu/drm/xe/display/xe_display.h
> @@ -46,6 +46,8 @@ void xe_display_pm_resume(struct xe_device *xe);
>  void xe_display_pm_resume_noirq(struct xe_device *xe);
>  void xe_display_pm_resume_noaccel(struct xe_device *xe);
>  void xe_display_pm_runtime_suspend(struct xe_device *xe);
> +void xe_display_pm_runtime_suspend_late(struct xe_device *xe);
> +void xe_display_pm_runtime_resume_early(struct xe_device *xe);
>  void xe_display_pm_runtime_resume(struct xe_device *xe);
>  
>  #else
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> index 77eb45a641e8..4cacf4b33d83 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -418,8 +418,7 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
>  
>  	xe_irq_suspend(xe);
>  
> -	if (xe->d3cold.allowed)
> -		xe_display_pm_suspend_late(xe);
> +	xe_display_pm_runtime_suspend_late(xe);
>  out:
>  	if (err)
>  		xe_display_pm_runtime_resume(xe);
> @@ -450,9 +449,11 @@ int xe_pm_runtime_resume(struct xe_device *xe)
>  		err = xe_pcode_ready(xe, true);
>  		if (err)
>  			goto out;
> +	}
>  
> -		xe_display_pm_resume_early(xe);
> +	xe_display_pm_runtime_resume_early(xe);

Putting a split here makes us check the above and below xe->d3cold.allowed status
twice.  I think it's mandatory for us to do so, but I can't help but wonder if we can't
streamline it a bit.  Maybe breaking the above and below checks into their own
functions?  Something like:

"""
static int xe_pcode_ready_on_d3cold(struct xe_device *xe)
{
	if (xe->d3cold.allowed)
		return xe_pcode_ready(xe, true);
	return 0;
}

static int xe_bo_restore_on_d3cold(struct xe_device *xe)
{
	if (xe->d3cold.allowed)
		return xe_bo_restore_kernel(xe);
	return 0;
}
...
int xe_pm_runtime_resume(struct xe_device *xe)
{
	struct xe_gt *gt;
	u8 id;
	int err = 0;

	trace_xe_pm_runtime_resume(xe, __builtin_return_address(0));
	/* Disable access_ongoing asserts and prevent recursive pm calls */
	xe_pm_write_callback_task(xe, current);

	xe_rpm_lockmap_acquire(xe);

	err = xe_pcode_ready_on_d3cold(xe);
	if (err)
		goto out;
	
	xe_display_pm_runtime_resume_early(xe);

	err = xe_bo_restore_on_d3cold(xe);
	if (err)
		goto out;
"""

Or perhaps it'd work better as an inline function?

"""
	err = xe->d3cold.allowed ?
		xe_pcode_ready(xe, true) : 0;
	if (err)
		goto out;

	xe_display_pm_runtime_resume_early(xe);

	err = xe->d3cold.allowed ?
		xe_bo_restore_kernel(xe) : 0;
	if (err)
		goto out;
"""

IMO I don't think either of these new options are particular upgrades to
the current implementation.  If anything, they're probably just side-grades.
So I won't force the issue.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt
	         
>  
> +	if (xe->d3cold.allowed) {
>  		/*
>  		 * This only restores pinned memory which is the memory
>  		 * required for the GT(s) to resume.
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume
  2024-09-24 20:35 ` [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume Rodrigo Vivi
  2024-10-03  6:32   ` Govindapillai, Vinod
@ 2024-10-08 14:32   ` Cavitt, Jonathan
  1 sibling, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:32 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Govindapillai, Vinod, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Govindapillai, Vinod <vinod.govindapillai@intel.com>
Subject: [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume
> 
> We need to ensure this is called on every kind of runtime
> resume and not only on d3cold is possible. Aligning with
> the hpd sequence from i915.
> 
> Cc: Vinod Govindapillai <vinod.govindapillai@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 1ab4dd51094f..4d1dd5294b89 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -330,8 +330,6 @@ static void xe_display_from_d3cold(struct xe_device *xe)
>  
>  	intel_display_driver_init_hw(xe);
>  
> -	intel_hpd_init(xe);
> -
>  	intel_opregion_resume(display);
>  
>  	intel_power_domains_enable(xe);
> @@ -470,6 +468,8 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
>  
>  	if (xe->d3cold.allowed)
>  		xe_display_from_d3cold(xe);
> +
> +	intel_hpd_init(xe);
>  }
>  
>  static void display_device_remove(struct drm_device *dev, void *arg)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 25/31] drm/xe/display: Move hpd_poll calls to later runtime stages
  2024-09-24 20:35 ` [PATCH 25/31] drm/xe/display: Move hpd_poll calls to later runtime stages Rodrigo Vivi
  2024-10-03 12:22   ` Govindapillai, Vinod
@ 2024-10-08 14:33   ` Cavitt, Jonathan
  1 sibling, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:33 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 25/31] drm/xe/display: Move hpd_poll calls to later runtime stages
> 
> Align placement of HDP poll calls with i915.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 7 +++----
>  1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 4d1dd5294b89..c758874a9059 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -437,8 +437,6 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
>  
>  	if (xe->d3cold.allowed)
>  		xe_display_to_d3cold(xe);
> -
> -	intel_hpd_poll_enable(xe);
>  }
>  
>  void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
> @@ -448,6 +446,8 @@ void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
>  
>  	if (xe->d3cold.allowed)
>  		intel_display_power_suspend_late(xe, false);
> +
> +	intel_hpd_poll_enable(xe);
>  }
>  
>  void xe_display_pm_runtime_resume_early(struct xe_device *xe)
> @@ -464,12 +464,11 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	intel_hpd_poll_disable(xe);
> -
>  	if (xe->d3cold.allowed)
>  		xe_display_from_d3cold(xe);
>  
>  	intel_hpd_init(xe);
> +	intel_hpd_poll_disable(xe);
>  }
>  
>  static void display_device_remove(struct drm_device *dev, void *arg)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 26/31] drm/xe/display: Add missing watermark ipc update at runtime resume
  2024-09-24 20:35 ` [PATCH 26/31] drm/xe/display: Add missing watermark ipc update at runtime resume Rodrigo Vivi
@ 2024-10-08 14:35   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:35 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 26/31] drm/xe/display: Add missing watermark ipc update at runtime resume
> 
> Continuing the alignment with i915 runtime pm sequence. Add
> this missing call.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index c758874a9059..44cace0237dd 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -27,6 +27,7 @@
>  #include "intel_hdcp.h"
>  #include "intel_hotplug.h"
>  #include "intel_opregion.h"
> +#include "skl_watermark.h"
>  #include "xe_module.h"
>  
>  /* Xe device functions */
> @@ -469,6 +470,7 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
>  
>  	intel_hpd_init(xe);
>  	intel_hpd_poll_disable(xe);
> +	skl_watermark_ipc_update(xe);
>  }
>  
>  static void display_device_remove(struct drm_device *dev, void *arg)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 27/31] drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold
  2024-09-24 20:35 ` [PATCH 27/31] drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold Rodrigo Vivi
@ 2024-10-08 14:37   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:37 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 27/31] drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold
> 
> Opregion needs to be notified about the power transition even when
> not going to d3cold. This aligns with i915 sequence.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 44cace0237dd..780c8d7f392d 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -447,6 +447,8 @@ void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
>  
>  	if (xe->d3cold.allowed)
>  		intel_display_power_suspend_late(xe, false);
> +	else
> +		intel_opregion_notify_adapter(&xe->display, PCI_D1);
>  
>  	intel_hpd_poll_enable(xe);
>  }
> @@ -458,6 +460,8 @@ void xe_display_pm_runtime_resume_early(struct xe_device *xe)
>  
>  	if (xe->d3cold.allowed)
>  		intel_display_power_resume_early(xe);
> +	else
> +		intel_opregion_notify_adapter(&xe->display, PCI_D0);
>  }
>  
>  void xe_display_pm_runtime_resume(struct xe_device *xe)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 28/31] drm/xe/display: Move display runtime suspend to a later point
  2024-09-24 20:35 ` [PATCH 28/31] drm/xe/display: Move display runtime suspend to a later point Rodrigo Vivi
@ 2024-10-08 14:37   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:37 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 28/31] drm/xe/display: Move display runtime suspend to a later point
> 
> On runtime suspend (regardless of d3cold), there's no need
> to perform the display power sequences before we disable the GT
> and IRQ.
> 
> In a matter of fact, the i915 runtime suspend needs to
> disable power, which asserts that IRQs are disabled.
> So, before the runtime_pm sequences can be reconciled, it is needed to
> ensure that the Xe's IRQ are disabled before the display.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/xe_pm.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_pm.c b/drivers/gpu/drm/xe/xe_pm.c
> index 4cacf4b33d83..16854215bea6 100644
> --- a/drivers/gpu/drm/xe/xe_pm.c
> +++ b/drivers/gpu/drm/xe/xe_pm.c
> @@ -402,8 +402,6 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
>  		xe_bo_runtime_pm_release_mmap_offset(bo);
>  	mutex_unlock(&xe->mem_access.vram_userfault.lock);
>  
> -	xe_display_pm_runtime_suspend(xe);
> -
>  	if (xe->d3cold.allowed) {
>  		err = xe_bo_evict_all(xe);
>  		if (err)
> @@ -418,6 +416,7 @@ int xe_pm_runtime_suspend(struct xe_device *xe)
>  
>  	xe_irq_suspend(xe);
>  
> +	xe_display_pm_runtime_suspend(xe);
>  	xe_display_pm_runtime_suspend_late(xe);
>  out:
>  	if (err)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 29/31] drm/xe/display: Kill crtc commit flush
  2024-09-24 20:35 ` [PATCH 29/31] drm/xe/display: Kill crtc commit flush Rodrigo Vivi
@ 2024-10-08 14:50   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:50 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 29/31] drm/xe/display: Kill crtc commit flush
> 
> This flush was needed in regular suspend cases in the past.
> After the clean-up and reconciliation with the i915 it was
> not needed anymore and removed. However this remained here
> in the runtime suspend path.
> 
> However, the runtime pm flow ensures that there won't be any
> flying or pending crtc commit when the runtime_suspend is
> called. So this is not needed here. Clean it up.
> 

LGTM, though maybe the commit message could use some
refactoring.  Something like:

"""
xe_display_flush_cleanup_work was originally needed for
regular suspend cases.  After the clean-up and reconciliation
with the i915, however, it was no longer needed and removed.
Despite this, the function remained as a part of the runtime
suspend path.

Since the runtime pm flow ensures that there won't be any
flying or pending crtc commits when the runtime_suspend
is called, calling xe_display_flush_cleanup_work here is no
longer necessary.  With no other use cases, this function
can safely be removed.
"""

Just a suggestion.  Not blocking.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 23 -----------------------
>  1 file changed, 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 780c8d7f392d..23bdd8904c44 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -283,27 +283,6 @@ static bool suspend_to_idle(void)
>  	return false;
>  }
>  
> -static void xe_display_flush_cleanup_work(struct xe_device *xe)
> -{
> -	struct intel_crtc *crtc;
> -
> -	for_each_intel_crtc(&xe->drm, crtc) {
> -		struct drm_crtc_commit *commit;
> -
> -		spin_lock(&crtc->base.commit_lock);
> -		commit = list_first_entry_or_null(&crtc->base.commit_list,
> -						  struct drm_crtc_commit, commit_entry);
> -		if (commit)
> -			drm_crtc_commit_get(commit);
> -		spin_unlock(&crtc->base.commit_lock);
> -
> -		if (commit) {
> -			wait_for_completion(&commit->cleanup_done);
> -			drm_crtc_commit_put(commit);
> -		}
> -	}
> -}
> -
>  static void xe_display_to_d3cold(struct xe_device *xe)
>  {
>  	struct intel_display *display = &xe->display;
> @@ -311,8 +290,6 @@ static void xe_display_to_d3cold(struct xe_device *xe)
>  	/* We do a lot of poking in a lot of registers, make sure they work properly. */
>  	intel_power_domains_disable(xe);
>  
> -	xe_display_flush_cleanup_work(xe);
> -
>  	intel_hpd_cancel_work(xe);
>  
>  	intel_opregion_suspend(display, PCI_D3cold);
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 30/31] drm/xe/display: Add missing power display handling on non-d3cold rpm
  2024-09-24 20:35 ` [PATCH 30/31] drm/xe/display: Add missing power display handling on non-d3cold rpm Rodrigo Vivi
@ 2024-10-08 14:51   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:51 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 30/31] drm/xe/display: Add missing power display handling on non-d3cold rpm
> 
> On the regular igfx runtime pm sequence where d3cold is not
> possible, the proper calls to power display are required.
> 
> Align with i915.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 8 ++++++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index 23bdd8904c44..ab85c7fb217a 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -415,6 +415,8 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
>  
>  	if (xe->d3cold.allowed)
>  		xe_display_to_d3cold(xe);
> +	else
> +		intel_display_power_suspend(xe);
>  }
>  
>  void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
> @@ -435,10 +437,12 @@ void xe_display_pm_runtime_resume_early(struct xe_device *xe)
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	if (xe->d3cold.allowed)
> +	if (xe->d3cold.allowed) {
>  		intel_display_power_resume_early(xe);
> -	else
> +	} else {
>  		intel_opregion_notify_adapter(&xe->display, PCI_D0);
> +		intel_display_power_resume(xe);
> +	}
>  }
>  
>  void xe_display_pm_runtime_resume(struct xe_device *xe)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 31/31] drm/{i915, xe}/display: Consolidade entire runtime pm sequence
  2024-09-24 20:35 ` [PATCH 31/31] drm/{i915, xe}/display: Consolidade entire runtime pm sequence Rodrigo Vivi
@ 2024-10-08 14:57   ` Cavitt, Jonathan
  0 siblings, 0 replies; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 14:57 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:36 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 31/31] drm/{i915, xe}/display: Consolidade entire runtime pm sequence
> 
> No functional change.
> 
> Consolidate the entire runtime pm sequences under
> intel_display_driver.
> 
> Simplifications and optimizations around the D3cold sequences are
> likely still possible. But before that can be done, consolidate
> everything at the intel_display_driver side.
> 
> Xe display power management functions are now only a wrapper
> checking for xe's display probe parameter.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

LGTM.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> ---
>  .../drm/i915/display/intel_display_driver.c   | 66 ++++++++++++++++---
>  .../drm/i915/display/intel_display_driver.h   | 12 ++--
>  drivers/gpu/drm/i915/i915_driver.c            |  8 +--
>  drivers/gpu/drm/xe/display/xe_display.c       | 56 ++--------------
>  4 files changed, 74 insertions(+), 68 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index 62a7aa56f0da..3861fdbefaff 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -856,12 +856,45 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
>  	intel_power_domains_enable(i915);
>  }
>  
> -void intel_display_driver_runtime_suspend(struct drm_i915_private *i915)
> +static void intel_display_to_d3cold(struct drm_i915_private *i915)
>  {
> -	intel_display_power_suspend(i915);
> +	struct intel_display *display = &i915->display;
> +
> +	/* We do a lot of poking in a lot of registers, make sure they work properly. */
> +	intel_power_domains_disable(i915);
> +
> +	intel_hpd_cancel_work(i915);
> +
> +	intel_opregion_suspend(display, PCI_D3cold);
> +
> +	intel_dmc_suspend(display);
> +}
> +
> +static void intel_display_from_d3cold(struct drm_i915_private *i915)
> +{
> +	struct intel_display *display = &i915->display;
> +
> +	intel_dmc_resume(display);
> +
> +	if (HAS_DISPLAY(i915))
> +		drm_mode_config_reset(&i915->drm);
> +
> +	intel_display_driver_init_hw(i915);
> +
> +	intel_opregion_resume(display);
> +
> +	intel_power_domains_enable(i915);
> +}
> +
> +void intel_display_driver_runtime_suspend(struct drm_i915_private *i915, bool d3cold_allowed)
> +{
> +	if (d3cold_allowed)
> +		intel_display_to_d3cold(i915);
> +	else
> +		intel_display_power_suspend(i915);
>  }
>  
> -void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915)
> +static void display_runtime_suspend_notify_opregion(struct drm_i915_private *i915)
>  {
>  	struct intel_display *display = &i915->display;
>  
> @@ -887,20 +920,37 @@ void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915)
>  		 */
>  		intel_opregion_notify_adapter(display, PCI_D1);
>  	}
> +}
> +
> +void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915,
> +					       bool d3cold_allowed)
> +{
> +	if (d3cold_allowed)
> +		intel_display_power_suspend_late(i915, false);
> +	else
> +		display_runtime_suspend_notify_opregion(i915);
>  
>  	if (!IS_VALLEYVIEW(i915) && !IS_CHERRYVIEW(i915))
>  		intel_hpd_poll_enable(i915);
>  }
>  
> -void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915)
> +void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915,
> +					       bool d3cold_allowed)
>  {
> -	intel_opregion_notify_adapter(&i915->display, PCI_D0);
> -
> -	intel_display_power_resume(i915);
> +	if (d3cold_allowed) {
> +		intel_display_power_resume_early(i915);
> +	} else {
> +		intel_opregion_notify_adapter(&i915->display, PCI_D0);
> +		intel_display_power_resume(i915);
> +	}
>  }
>  
> -void intel_display_driver_runtime_resume(struct drm_i915_private *i915)
> +void intel_display_driver_runtime_resume(struct drm_i915_private *i915,
> +					 bool d3cold_allowed)
>  {
> +	if (d3cold_allowed)
> +		intel_display_from_d3cold(i915);
> +
>  	/*
>  	 * On VLV/CHV display interrupts are part of the display
>  	 * power well, so hpd is reinitialized from there. For
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
> index b1441a55d72d..21aa0e551898 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
> @@ -33,10 +33,14 @@ void intel_display_driver_resume(struct drm_i915_private *i915);
>  void intel_display_driver_resume_noirq(struct drm_i915_private *i915);
>  void intel_display_driver_resume_noirq_legacy(struct drm_i915_private *i915);
>  void intel_display_driver_resume_nogem(struct intel_display *display);
> -void intel_display_driver_runtime_suspend(struct drm_i915_private *i915);
> -void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915);
> -void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915);
> -void intel_display_driver_runtime_resume(struct drm_i915_private *i915);
> +void intel_display_driver_runtime_suspend(struct drm_i915_private *i915,
> +					  bool d3cold_allowed);
> +void intel_display_driver_runtime_suspend_late(struct drm_i915_private *i915,
> +					       bool d3cold_allowed);
> +void intel_display_driver_runtime_resume_early(struct drm_i915_private *i915,
> +					       bool d3cold_allowed);
> +void intel_display_driver_runtime_resume(struct drm_i915_private *i915,
> +					 bool d3cold_allowed);
>  void intel_display_driver_shutdown(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
>  void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915);
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index b3eaa55ebacb..719b1c21b695 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -1402,7 +1402,7 @@ static int intel_runtime_suspend(struct device *kdev)
>  	for_each_gt(gt, dev_priv, i)
>  		intel_uncore_suspend(gt->uncore);
>  
> -	intel_display_driver_runtime_suspend(dev_priv);
> +	intel_display_driver_runtime_suspend(dev_priv, false);
>  
>  	ret = vlv_suspend_complete(dev_priv);
>  	if (ret) {
> @@ -1436,7 +1436,7 @@ static int intel_runtime_suspend(struct device *kdev)
>  	if (root_pdev)
>  		pci_d3cold_disable(root_pdev);
>  
> -	intel_display_driver_runtime_suspend_late(dev_priv);
> +	intel_display_driver_runtime_suspend_late(dev_priv, false);
>  
>  	assert_forcewakes_inactive(&dev_priv->uncore);
>  
> @@ -1469,7 +1469,7 @@ static int intel_runtime_resume(struct device *kdev)
>  		drm_dbg(&dev_priv->drm,
>  			"Unclaimed access during suspend, bios?\n");
>  
> -	intel_display_driver_runtime_resume_early(dev_priv);
> +	intel_display_driver_runtime_resume_early(dev_priv, false);
>  
>  	ret = vlv_resume_prepare(dev_priv, true);
>  
> @@ -1487,7 +1487,7 @@ static int intel_runtime_resume(struct device *kdev)
>  
>  	intel_pxp_runtime_resume(dev_priv->pxp);
>  
> -	intel_display_driver_runtime_resume_early(dev_priv);
> +	intel_display_driver_runtime_resume_early(dev_priv, false);
>  
>  	enable_rpm_wakeref_asserts(rpm);
>  
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index ab85c7fb217a..9a652292d988 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -283,36 +283,6 @@ static bool suspend_to_idle(void)
>  	return false;
>  }
>  
> -static void xe_display_to_d3cold(struct xe_device *xe)
> -{
> -	struct intel_display *display = &xe->display;
> -
> -	/* We do a lot of poking in a lot of registers, make sure they work properly. */
> -	intel_power_domains_disable(xe);
> -
> -	intel_hpd_cancel_work(xe);
> -
> -	intel_opregion_suspend(display, PCI_D3cold);
> -
> -	intel_dmc_suspend(display);
> -}
> -
> -static void xe_display_from_d3cold(struct xe_device *xe)
> -{
> -	struct intel_display *display = &xe->display;
> -
> -	intel_dmc_resume(display);
> -
> -	if (has_display(xe))
> -		drm_mode_config_reset(&xe->drm);
> -
> -	intel_display_driver_init_hw(xe);
> -
> -	intel_opregion_resume(display);
> -
> -	intel_power_domains_enable(xe);
> -}
> -
>  void xe_display_pm_suspend(struct xe_device *xe)
>  {
>  	if (!xe->info.probe_display)
> @@ -413,10 +383,7 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	if (xe->d3cold.allowed)
> -		xe_display_to_d3cold(xe);
> -	else
> -		intel_display_power_suspend(xe);
> +	intel_display_driver_runtime_suspend(xe, xe->d3cold.allowed);
>  }
>  
>  void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
> @@ -424,12 +391,7 @@ void xe_display_pm_runtime_suspend_late(struct xe_device *xe)
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	if (xe->d3cold.allowed)
> -		intel_display_power_suspend_late(xe, false);
> -	else
> -		intel_opregion_notify_adapter(&xe->display, PCI_D1);
> -
> -	intel_hpd_poll_enable(xe);
> +	intel_display_driver_runtime_suspend_late(xe, xe->d3cold.allowed);
>  }
>  
>  void xe_display_pm_runtime_resume_early(struct xe_device *xe)
> @@ -437,12 +399,7 @@ void xe_display_pm_runtime_resume_early(struct xe_device *xe)
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	if (xe->d3cold.allowed) {
> -		intel_display_power_resume_early(xe);
> -	} else {
> -		intel_opregion_notify_adapter(&xe->display, PCI_D0);
> -		intel_display_power_resume(xe);
> -	}
> +	intel_display_driver_runtime_resume_early(xe, xe->d3cold.allowed);
>  }
>  
>  void xe_display_pm_runtime_resume(struct xe_device *xe)
> @@ -450,12 +407,7 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
>  	if (!xe->info.probe_display)
>  		return;
>  
> -	if (xe->d3cold.allowed)
> -		xe_display_from_d3cold(xe);
> -
> -	intel_hpd_init(xe);
> -	intel_hpd_poll_disable(xe);
> -	skl_watermark_ipc_update(xe);
> +	intel_display_driver_runtime_resume(xe, xe->d3cold.allowed);
>  }
>  
>  static void display_device_remove(struct drm_device *dev, void *arg)
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* RE: [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences
  2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
                   ` (34 preceding siblings ...)
  2024-09-26  5:31 ` ✗ CI.KUnit: failure " Patchwork
@ 2024-10-08 15:24 ` Cavitt, Jonathan
  2024-11-11 19:23   ` Rodrigo Vivi
  35 siblings, 1 reply; 81+ messages in thread
From: Cavitt, Jonathan @ 2024-10-08 15:24 UTC (permalink / raw)
  To: Vivi, Rodrigo, intel-gfx@lists.freedesktop.org,
	intel-xe@lists.freedesktop.org
  Cc: Deak, Imre, Vivi, Rodrigo, Cavitt, Jonathan

-----Original Message-----
From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
Sent: Tuesday, September 24, 2024 1:35 PM
To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
Subject: [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences
> 
> Reconcile i915's and xe's display power management sequences.
> 
> The main goal of this series is to ensure that the display
> power management sequences from both drivers are fully aligned.
> So, it needs to live under i915/display/ and xe_display_pm
> can only be a wrapper to check for the xe's module
> parameter before jumping in the i915/display functions.
> 
> During this process, it was clear that the Xe's runtime pm
> sequences for integrated gfx (non d3cold capable) was totally
> misaligned with i915 and prune to more bugs. So, this series ends
> up fixing this and bringing a full alignment there as well.
> 
> The one new thing under i915 is the d3cold sequences. Apparently
> that can be reduced, but for now this is what is validated and
> stable on both DG2 and BMG. So, let's move that to the
> i915/display side as well and continue on the improvements with
> the code in the right place.
> 
> When I started this work I was hoping that I could run more
> conversions to intel_display struct before moving things from
> i915_driver.c to intel_display_driver, however that was a deeper
> task and this series is already deep enough.
> 
> Cc: Imre Deak <imre.deak@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>

I did individual reviews of all 31 patches in the series, and I gave my
RB to all of them with some notes.  However, there were just a few
things that I felt I needed to say before we called this series closed.

Don't worry: none of this is blocking.


1. Are we sure that aligning i915 and Xe like this is the correct
course of action?  I've been reprimanded in the past for creating
patches whose overall conceit is "we do 'X' thing in 'Y' way on
i915, so we should also be doing 'X' thing in 'Y' way on Xe".  So, I
figured I should at least point this out.


2. Several patches in the series operate on both i915 and Xe at the
same time.  I don't think there's any strict rule stating that we can't
do something like that, but IMO we should consider splitting those
patches into i915 and Xe components where possible/logical.


3. When all is said and done, this series eventually puts all of the
driver management code into intel_display_driver.c.  So any
changes made to xe_display.c, for example, seem superfluous
given we're intending on centralizing the display code outside of
xe_display.c in the end.  It'd be a lot of work to reorder the patch
series, especially at this point, but if we needed to start again from
scratch for any reason, it might be worth ordering the changes as such:

	- Create all necessary helper functions in intel_display_driver
	   for i915 and Xe, using them in the i915 execution path.

	- Use the new helper functions in the xe execution path.

	- Create and use all necessary helper functions for the xe
	   execution path.


Again, none of this is blocking, so there's no need to upend everything
and start over.  I just felt I needed to state some of these things as a
part of due diligence.

Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
-Jonathan Cavitt

> 
> 
> Rodrigo Vivi (31):
>   drm/i915: Remove vga and gmbus seq out of i915_restore_display
>   drm/i915/display: Convert i915_suspend into i9xx_display_sr
>   drm/i915/display: Move regfile registers intel_display.restore
>   drm/i915/display: Move shutdown sequences under display driver
>   drm/xe: At shutdown disable commit helpers instead of flushing
>   drm/xe: Use i915-display shutdown sequence directly
>   drm/{i915,xe}/display: Move DP MST calls to display_driver
>   drm/i915/display: Move suspend sequences to intel_display_driver
>   drm/xe/display: Delay hpd_init resume
>   drm/xe/display: Spin-off xe_display runtime/d3cold sequences
>   drm/{i915,xe}: Consolidate display resume functions
>   drm/i915: Remove lingering pci_save_state
>   drm/{i915,xe}: Consolidate display suspend functions
>   drm/i915/display: Move resume sequences to intel_display_driver
>   drm/xe/display: Delay dsm handler registration
>   drm/{i915,xe}: Move power_domains suspend/resume to display_power
>   drm/{i915,xe}: Move remaining intel_power_domains to intel_display
>   drm/i915/display: Split resume_noirq calls for now
>   drm/xe/display: Align display resume sequence with i915
>   drm/xe/display: Align suspend sequence with i915
>   drm/{i915,xe}/display: Move dsm registration under intel_driver
>   drm/i915/display: Move runtime pm related calls under
>     intel_display_driver
>   drm/xe/display: Prepare runtime pm functions
>   drm/xe/display: Call intel_hpd_init on every runtime resume
>   drm/xe/display: Move hpd_poll calls to later runtime stages
>   drm/xe/display: Add missing watermark ipc update at runtime resume
>   drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold
>   drm/xe/display: Move display runtime suspend to a later point
>   drm/xe/display: Kill crtc commit flush
>   drm/xe/display: Add missing power display handling on non-d3cold rpm
>   drm/{i915,xe}/display: Consolidade entire runtime pm sequence
> 
>  drivers/gpu/drm/i915/Makefile                 |   2 +-
>  .../gpu/drm/i915/display/i9xx_display_sr.c    |  99 +++++++
>  .../gpu/drm/i915/display/i9xx_display_sr.h    |  14 +
>  .../gpu/drm/i915/display/intel_display_core.h |   5 +
>  .../drm/i915/display/intel_display_driver.c   | 247 ++++++++++++++++++
>  .../drm/i915/display/intel_display_driver.h   |  18 ++
>  .../drm/i915/display/intel_display_power.c    |   6 +-
>  .../drm/i915/display/intel_display_power.h    |   2 +-
>  drivers/gpu/drm/i915/i915_driver.c            | 161 ++----------
>  drivers/gpu/drm/i915/i915_drv.h               |   9 -
>  drivers/gpu/drm/i915/i915_suspend.c           | 141 ----------
>  drivers/gpu/drm/i915/i915_suspend.h           |  14 -
>  drivers/gpu/drm/xe/display/xe_display.c       | 185 ++++---------
>  drivers/gpu/drm/xe/display/xe_display.h       |  11 +-
>  drivers/gpu/drm/xe/display/xe_fb_pin.c        |   8 +
>  drivers/gpu/drm/xe/xe_device.c                |   4 +-
>  drivers/gpu/drm/xe/xe_pm.c                    |  16 +-
>  17 files changed, 498 insertions(+), 444 deletions(-)
>  create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.c
>  create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.h
>  delete mode 100644 drivers/gpu/drm/i915/i915_suspend.c
>  delete mode 100644 drivers/gpu/drm/i915/i915_suspend.h
> 
> -- 
> 2.46.0
> 
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 04/31] drm/i915/display: Move shutdown sequences under display driver
  2024-09-24 20:35 ` [PATCH 04/31] drm/i915/display: Move shutdown sequences under display driver Rodrigo Vivi
  2024-10-07 19:18   ` Cavitt, Jonathan
@ 2024-10-08 15:57   ` Imre Deak
  1 sibling, 0 replies; 81+ messages in thread
From: Imre Deak @ 2024-10-08 15:57 UTC (permalink / raw)
  To: Rodrigo Vivi; +Cc: intel-gfx, intel-xe

On Tue, Sep 24, 2024 at 04:35:25PM -0400, Rodrigo Vivi wrote:
> Move display related shutdown sequences from i915_driver to
> intel_display_driver.
> 
> No functional change. Just taking the right ownership and
> start some reconciliation of them between i915 and Xe.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  .../drm/i915/display/intel_display_driver.c   | 40 +++++++++++++++++++
>  .../drm/i915/display/intel_display_driver.h   |  3 ++
>  drivers/gpu/drm/i915/i915_driver.c            | 29 ++------------
>  3 files changed, 47 insertions(+), 25 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> index c106fb2dd20b..e40b1105168e 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> @@ -39,6 +39,7 @@
>  #include "intel_dp_tunnel.h"
>  #include "intel_dpll.h"
>  #include "intel_dpll_mgr.h"
> +#include "intel_encoder.h"
>  #include "intel_fb.h"
>  #include "intel_fbc.h"
>  #include "intel_fbdev.h"
> @@ -755,3 +756,42 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
>  	if (state)
>  		drm_atomic_state_put(state);
>  }
> +
> +void intel_display_driver_shutdown(struct drm_i915_private *i915)
> +{
> +	intel_power_domains_disable(i915);
> +
> +	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
> +	if (HAS_DISPLAY(i915)) {
> +		drm_kms_helper_poll_disable(&i915->drm);
> +		intel_display_driver_disable_user_access(i915);
> +
> +		drm_atomic_helper_shutdown(&i915->drm);
> +	}
> +
> +	intel_dp_mst_suspend(i915);
> +}
> +
> +void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915)
> +{
> +	intel_hpd_cancel_work(i915);
> +
> +	if (HAS_DISPLAY(i915))
> +		intel_display_driver_suspend_access(i915);
> +
> +	intel_encoder_suspend_all(&i915->display);
> +	intel_encoder_shutdown_all(&i915->display);
> +
> +	intel_dmc_suspend(&i915->display);
> +}
> +
> +void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915)
> +{
> +	/*
> +	 * The only requirement is to reboot with display DC states disabled,
> +	 * for now leaving all display power wells in the INIT power domain
> +	 * enabled.
> +	 */
> +
> +	intel_power_domains_driver_remove(i915);
> +}
> diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.h b/drivers/gpu/drm/i915/display/intel_display_driver.h
> index 42cc4af6d3fd..1ee37fb58d38 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_driver.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_driver.h
> @@ -26,6 +26,9 @@ void intel_display_driver_remove_nogem(struct drm_i915_private *i915);
>  void intel_display_driver_unregister(struct drm_i915_private *i915);
>  int intel_display_driver_suspend(struct drm_i915_private *i915);
>  void intel_display_driver_resume(struct drm_i915_private *i915);
> +void intel_display_driver_shutdown(struct drm_i915_private *i915);
> +void intel_display_driver_shutdown_noirq(struct drm_i915_private *i915);
> +void intel_display_driver_shutdown_nogem(struct drm_i915_private *i915);
>  
>  /* interface for intel_display_reset.c */
>  int __intel_display_driver_resume(struct drm_i915_private *i915,
> diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> index ae5906885359..38c845ad86e5 100644
> --- a/drivers/gpu/drm/i915/i915_driver.c
> +++ b/drivers/gpu/drm/i915/i915_driver.c
> @@ -939,43 +939,22 @@ void i915_driver_shutdown(struct drm_i915_private *i915)
>  {
>  	disable_rpm_wakeref_asserts(&i915->runtime_pm);
>  	intel_runtime_pm_disable(&i915->runtime_pm);
> -	intel_power_domains_disable(i915);
>  
> -	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_SUSPENDED, true);
> -	if (HAS_DISPLAY(i915)) {
> -		drm_kms_helper_poll_disable(&i915->drm);
> -		intel_display_driver_disable_user_access(i915);
> -
> -		drm_atomic_helper_shutdown(&i915->drm);
> -	}
> -
> -	intel_dp_mst_suspend(i915);
> +	intel_display_driver_shutdown(i915);
>  
>  	intel_irq_suspend(i915);
> -	intel_hpd_cancel_work(i915);
> -
> -	if (HAS_DISPLAY(i915))
> -		intel_display_driver_suspend_access(i915);
>  
> -	intel_encoder_suspend_all(&i915->display);
> -	intel_encoder_shutdown_all(&i915->display);
> -
> -	intel_dmc_suspend(&i915->display);
> +	intel_display_driver_shutdown_noirq(i915);
>  
>  	i915_gem_suspend(i915);
>  
> -	/*
> -	 * The only requirement is to reboot with display DC states disabled,
> -	 * for now leaving all display power wells in the INIT power domain
> -	 * enabled.
> -	 *
> -	 * TODO:
> +	/* TODO:
>  	 * - unify the pci_driver::shutdown sequence here with the
>  	 *   pci_driver.driver.pm.poweroff,poweroff_late sequence.
>  	 * - unify the driver remove and system/runtime suspend sequences with
>  	 *   the above unified shutdown/poweroff sequence.
>  	 */
> -	intel_power_domains_driver_remove(i915);
> +

Should intel_display_driver_shutdown_nogem() be called here?

>  	enable_rpm_wakeref_asserts(&i915->runtime_pm);
>  
>  	intel_runtime_pm_driver_last_release(&i915->runtime_pm);
> -- 
> 2.46.0
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 10/31] drm/xe/display: Spin-off xe_display runtime/d3cold sequences
  2024-09-24 20:35 ` [PATCH 10/31] drm/xe/display: Spin-off xe_display runtime/d3cold sequences Rodrigo Vivi
  2024-10-07 20:43   ` Cavitt, Jonathan
@ 2024-10-08 16:27   ` Imre Deak
  1 sibling, 0 replies; 81+ messages in thread
From: Imre Deak @ 2024-10-08 16:27 UTC (permalink / raw)
  To: Rodrigo Vivi; +Cc: intel-gfx, intel-xe

On Tue, Sep 24, 2024 at 04:35:31PM -0400, Rodrigo Vivi wrote:
> No functional change. This patch only splits the xe_display_pm
> suspend/resume functions in the regular suspend/resume from the
> runtime/d3cold ones.
> 
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> ---
>  drivers/gpu/drm/xe/display/xe_display.c | 68 ++++++++++++++++---------
>  1 file changed, 45 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> index be431d9907df..a4705a452adb 100644
> --- a/drivers/gpu/drm/xe/display/xe_display.c
> +++ b/drivers/gpu/drm/xe/display/xe_display.c
> @@ -308,8 +308,41 @@ static void xe_display_flush_cleanup_work(struct xe_device *xe)
>  	}
>  }
>  
> -/* TODO: System and runtime suspend/resume sequences will be sanitized as a follow-up. */
> -static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
> +static void xe_display_to_d3cold(struct xe_device *xe)
> +{
> +	struct intel_display *display = &xe->display;
> +
> +	/* We do a lot of poking in a lot of registers, make sure they work properly. */
> +	intel_power_domains_disable(xe);
> +
> +	xe_display_flush_cleanup_work(xe);
> +
> +	intel_hpd_cancel_work(xe);

This cancels a work synchronously that takes a runtime PM reference, so
it could dead-lock. I know that xe adds a way to get an RPM reference in
the runtime suspend/resume handlers, not sure if that's a good approach
in general. Also, not sure if it's ok to to drop all interrupts - in
intel_hpd_cancel_work() - here that got raised before runtime suspend,
instead of handling them as expected. So I think intel_hpd_cancel_work()
shouldn't be called here.

> +
> +	intel_opregion_suspend(display, PCI_D3cold);
> +
> +	intel_dmc_suspend(display);
> +}
> +
> +static void xe_display_from_d3cold(struct xe_device *xe)
> +{
> +	struct intel_display *display = &xe->display;
> +
> +	intel_dmc_resume(display);
> +
> +	if (has_display(xe))
> +		drm_mode_config_reset(&xe->drm);

The above is the counterpart of intel_encoder_suspend_all() which is
only called during system suspend.

> +
> +	intel_display_driver_init_hw(xe);
> +
> +	intel_hpd_init(xe);
> +
> +	intel_opregion_resume(display);
> +
> +	intel_power_domains_enable(xe);
> +}
> +
> +void xe_display_pm_suspend(struct xe_device *xe)
>  {
>  	struct intel_display *display = &xe->display;
>  	bool s2idle = suspend_to_idle();
> @@ -321,10 +354,10 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
>  	 * properly.
>  	 */
>  	intel_power_domains_disable(xe);
> -	if (!runtime)
> -		intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
>  
> -	if (!runtime && has_display(xe)) {
> +	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_SUSPENDED, true);
> +
> +	if (has_display(xe)) {
>  		drm_kms_helper_poll_disable(&xe->drm);
>  		intel_display_driver_disable_user_access(xe);
>  		intel_display_driver_suspend(xe);
> @@ -334,7 +367,7 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
>  
>  	intel_hpd_cancel_work(xe);
>  
> -	if (!runtime && has_display(xe)) {
> +	if (has_display(xe)) {
>  		intel_display_driver_suspend_access(xe);
>  		intel_encoder_suspend_all(&xe->display);
>  	}
> @@ -344,11 +377,6 @@ static void __xe_display_pm_suspend(struct xe_device *xe, bool runtime)
>  	intel_dmc_suspend(display);
>  }
>  
> -void xe_display_pm_suspend(struct xe_device *xe)
> -{
> -	__xe_display_pm_suspend(xe, false);
> -}
> -
>  void xe_display_pm_shutdown(struct xe_device *xe)
>  {
>  	if (!xe->info.probe_display)
> @@ -379,7 +407,7 @@ void xe_display_pm_runtime_suspend(struct xe_device *xe)
>  		return;
>  
>  	if (xe->d3cold.allowed)
> -		__xe_display_pm_suspend(xe, true);
> +		xe_display_to_d3cold(xe);
>  
>  	intel_hpd_poll_enable(xe);
>  }
> @@ -405,7 +433,7 @@ void xe_display_pm_resume_early(struct xe_device *xe)
>  	intel_power_domains_resume(xe);
>  }
>  
> -static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
> +void xe_display_pm_resume(struct xe_device *xe)
>  {
>  	struct intel_display *display = &xe->display;
>  
> @@ -419,12 +447,12 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
>  
>  	intel_display_driver_init_hw(xe);
>  
> -	if (!runtime && has_display(xe))
> +	if (has_display(xe))
>  		intel_display_driver_resume_access(xe);
>  
>  	intel_hpd_init(xe);
>  
> -	if (!runtime && has_display(xe)) {
> +	if (has_display(xe)) {
>  		intel_display_driver_resume(xe);
>  		drm_kms_helper_poll_enable(&xe->drm);
>  		intel_display_driver_enable_user_access(xe);
> @@ -433,17 +461,11 @@ static void __xe_display_pm_resume(struct xe_device *xe, bool runtime)
>  
>  	intel_opregion_resume(display);
>  
> -	if (!runtime)
> -		intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_RUNNING, false);
> +	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_RUNNING, false);
>  
>  	intel_power_domains_enable(xe);
>  }
>  
> -void xe_display_pm_resume(struct xe_device *xe)
> -{
> -	__xe_display_pm_resume(xe, false);
> -}
> -
>  void xe_display_pm_runtime_resume(struct xe_device *xe)
>  {
>  	if (!xe->info.probe_display)
> @@ -452,7 +474,7 @@ void xe_display_pm_runtime_resume(struct xe_device *xe)
>  	intel_hpd_poll_disable(xe);
>  
>  	if (xe->d3cold.allowed)
> -		__xe_display_pm_resume(xe, true);
> +		xe_display_from_d3cold(xe);
>  }
>  
>  
> -- 
> 2.46.0
> 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences
  2024-10-08 15:24 ` [PATCH 00/31] " Cavitt, Jonathan
@ 2024-11-11 19:23   ` Rodrigo Vivi
  0 siblings, 0 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-11-11 19:23 UTC (permalink / raw)
  To: Cavitt, Jonathan
  Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
	Deak, Imre

On Tue, Oct 08, 2024 at 11:24:42AM -0400, Cavitt, Jonathan wrote:
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
> Sent: Tuesday, September 24, 2024 1:35 PM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
> Subject: [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences
> > 
> > Reconcile i915's and xe's display power management sequences.
> > 
> > The main goal of this series is to ensure that the display
> > power management sequences from both drivers are fully aligned.
> > So, it needs to live under i915/display/ and xe_display_pm
> > can only be a wrapper to check for the xe's module
> > parameter before jumping in the i915/display functions.
> > 
> > During this process, it was clear that the Xe's runtime pm
> > sequences for integrated gfx (non d3cold capable) was totally
> > misaligned with i915 and prune to more bugs. So, this series ends
> > up fixing this and bringing a full alignment there as well.
> > 
> > The one new thing under i915 is the d3cold sequences. Apparently
> > that can be reduced, but for now this is what is validated and
> > stable on both DG2 and BMG. So, let's move that to the
> > i915/display side as well and continue on the improvements with
> > the code in the right place.
> > 
> > When I started this work I was hoping that I could run more
> > conversions to intel_display struct before moving things from
> > i915_driver.c to intel_display_driver, however that was a deeper
> > task and this series is already deep enough.
> > 
> > Cc: Imre Deak <imre.deak@intel.com>
> > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> 
> I did individual reviews of all 31 patches in the series, and I gave my
> RB to all of them with some notes.  However, there were just a few
> things that I felt I needed to say before we called this series closed.

First of all, thank you so much for the detailed and careful review of
every patch.
Also, I'm sorry for taking so long to come back here.

> 
> Don't worry: none of this is blocking.

No worries. In my first step now I'm only getting the likely
non-controversial ones so we can already merge them and then
iterate on the ones where you and others might have questions
and concerns.

> 
> 
> 1. Are we sure that aligning i915 and Xe like this is the correct
> course of action?  I've been reprimanded in the past for creating
> patches whose overall conceit is "we do 'X' thing in 'Y' way on
> i915, so we should also be doing 'X' thing in 'Y' way on Xe".  So, I
> figured I should at least point this out.

Yes, we are sure on this. Our overall goal is to have a independent
display driver. So every display functionality, including the PM flows
should be identical and living in i915/display side.

> 
> 
> 2. Several patches in the series operate on both i915 and Xe at the
> same time.  I don't think there's any strict rule stating that we can't
> do something like that, but IMO we should consider splitting those
> patches into i915 and Xe components where possible/logical.

yeap, indeed. But in every case here, if we need separated patches we
would need to create some temporary stub. So, better to do them together.
And the goal is to get them through drm-intel-next since they are all
display related in the end of the day.

> 
> 
> 3. When all is said and done, this series eventually puts all of the
> driver management code into intel_display_driver.c.  So any
> changes made to xe_display.c, for example, seem superfluous
> given we're intending on centralizing the display code outside of
> xe_display.c in the end.  It'd be a lot of work to reorder the patch
> series, especially at this point, but if we needed to start again from
> scratch for any reason, it might be worth ordering the changes as such:
> 
> 	- Create all necessary helper functions in intel_display_driver
> 	   for i915 and Xe, using them in the i915 execution path.
> 
> 	- Use the new helper functions in the xe execution path.
> 
> 	- Create and use all necessary helper functions for the xe
> 	   execution path.

In xe we decided to have an extra way to disable display. So  we need
this intermediate stub. Otherwise this is the goal, to have everything
under i915/display/

> 
> 
> Again, none of this is blocking, so there's no need to upend everything
> and start over.  I just felt I needed to state some of these things as a
> part of due diligence.
> 
> Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> -Jonathan Cavitt

Thank you so much,
Rodrigo.

> 
> > 
> > 
> > Rodrigo Vivi (31):
> >   drm/i915: Remove vga and gmbus seq out of i915_restore_display
> >   drm/i915/display: Convert i915_suspend into i9xx_display_sr
> >   drm/i915/display: Move regfile registers intel_display.restore
> >   drm/i915/display: Move shutdown sequences under display driver
> >   drm/xe: At shutdown disable commit helpers instead of flushing
> >   drm/xe: Use i915-display shutdown sequence directly
> >   drm/{i915,xe}/display: Move DP MST calls to display_driver
> >   drm/i915/display: Move suspend sequences to intel_display_driver
> >   drm/xe/display: Delay hpd_init resume
> >   drm/xe/display: Spin-off xe_display runtime/d3cold sequences
> >   drm/{i915,xe}: Consolidate display resume functions
> >   drm/i915: Remove lingering pci_save_state
> >   drm/{i915,xe}: Consolidate display suspend functions
> >   drm/i915/display: Move resume sequences to intel_display_driver
> >   drm/xe/display: Delay dsm handler registration
> >   drm/{i915,xe}: Move power_domains suspend/resume to display_power
> >   drm/{i915,xe}: Move remaining intel_power_domains to intel_display
> >   drm/i915/display: Split resume_noirq calls for now
> >   drm/xe/display: Align display resume sequence with i915
> >   drm/xe/display: Align suspend sequence with i915
> >   drm/{i915,xe}/display: Move dsm registration under intel_driver
> >   drm/i915/display: Move runtime pm related calls under
> >     intel_display_driver
> >   drm/xe/display: Prepare runtime pm functions
> >   drm/xe/display: Call intel_hpd_init on every runtime resume
> >   drm/xe/display: Move hpd_poll calls to later runtime stages
> >   drm/xe/display: Add missing watermark ipc update at runtime resume
> >   drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold
> >   drm/xe/display: Move display runtime suspend to a later point
> >   drm/xe/display: Kill crtc commit flush
> >   drm/xe/display: Add missing power display handling on non-d3cold rpm
> >   drm/{i915,xe}/display: Consolidade entire runtime pm sequence
> > 
> >  drivers/gpu/drm/i915/Makefile                 |   2 +-
> >  .../gpu/drm/i915/display/i9xx_display_sr.c    |  99 +++++++
> >  .../gpu/drm/i915/display/i9xx_display_sr.h    |  14 +
> >  .../gpu/drm/i915/display/intel_display_core.h |   5 +
> >  .../drm/i915/display/intel_display_driver.c   | 247 ++++++++++++++++++
> >  .../drm/i915/display/intel_display_driver.h   |  18 ++
> >  .../drm/i915/display/intel_display_power.c    |   6 +-
> >  .../drm/i915/display/intel_display_power.h    |   2 +-
> >  drivers/gpu/drm/i915/i915_driver.c            | 161 ++----------
> >  drivers/gpu/drm/i915/i915_drv.h               |   9 -
> >  drivers/gpu/drm/i915/i915_suspend.c           | 141 ----------
> >  drivers/gpu/drm/i915/i915_suspend.h           |  14 -
> >  drivers/gpu/drm/xe/display/xe_display.c       | 185 ++++---------
> >  drivers/gpu/drm/xe/display/xe_display.h       |  11 +-
> >  drivers/gpu/drm/xe/display/xe_fb_pin.c        |   8 +
> >  drivers/gpu/drm/xe/xe_device.c                |   4 +-
> >  drivers/gpu/drm/xe/xe_pm.c                    |  16 +-
> >  17 files changed, 498 insertions(+), 444 deletions(-)
> >  create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.c
> >  create mode 100644 drivers/gpu/drm/i915/display/i9xx_display_sr.h
> >  delete mode 100644 drivers/gpu/drm/i915/i915_suspend.c
> >  delete mode 100644 drivers/gpu/drm/i915/i915_suspend.h
> > 
> > -- 
> > 2.46.0
> > 
> > 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 05/31] drm/xe: At shutdown disable commit helpers instead of flushing
  2024-10-07 19:42   ` Cavitt, Jonathan
@ 2024-11-14 20:20     ` Rodrigo Vivi
  0 siblings, 0 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-11-14 20:20 UTC (permalink / raw)
  To: Cavitt, Jonathan
  Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
	Deak, Imre, Maarten Lankhort

On Mon, Oct 07, 2024 at 03:42:34PM -0400, Cavitt, Jonathan wrote:
> -----Original Message-----
> From: Intel-xe <intel-xe-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
> Sent: Tuesday, September 24, 2024 1:35 PM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>; Maarten Lankhort <maarten.lankhorst@linux.intel.com>
> Subject: [PATCH 05/31] drm/xe: At shutdown disable commit helpers instead of flushing
> > 
> > This aligns with the current i915 display sequence.
> > 
> > Cc: Maarten Lankhort <maarten.lankhorst@linux.intel.com>
> > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > ---
> >  drivers/gpu/drm/xe/display/xe_display.c | 5 +++--
> >  1 file changed, 3 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> > index 5cbee5040e91..0237d458078b 100644
> > --- a/drivers/gpu/drm/xe/display/xe_display.c
> > +++ b/drivers/gpu/drm/xe/display/xe_display.c
> > @@ -10,6 +10,7 @@
> >  
> >  #include <drm/drm_drv.h>
> >  #include <drm/drm_managed.h>
> > +#include <drm/drm_atomic_helper.h>
> >  #include <drm/drm_probe_helper.h>
> >  #include <uapi/drm/xe_drm.h>
> >  
> > @@ -364,10 +365,10 @@ void xe_display_pm_shutdown(struct xe_device *xe)
> >  	if (has_display(xe)) {
> >  		drm_kms_helper_poll_disable(&xe->drm);
> >  		intel_display_driver_disable_user_access(xe);
> > -		intel_display_driver_suspend(xe);
> > +
> > +		drm_atomic_helper_shutdown(&xe->drm);
> 
> Isn't this functionally equivalent?  The only difference AFAICT is that previously we
> set the display.restore.modeset_state = state, where the state was the
> return value for drm_atomic_helper_shutdown.

well, both ends up in disabling all crtc, but with the current
suspend there's unecessary duplication of the current atomic state.
It is a shutdown so we don't need to restore anything later.

> 
> >  	}
> >  
> > -	xe_display_flush_cleanup_work(xe);
> 
> And I'm guessing we're removing this line because it's a duplicate in the new
> execution path now?

all the CRTCs are disabled at this point. This is not doing anything...

> 
> I won't block on it.
> Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> -Jonathan Cavitt
> 
> >  	intel_dp_mst_suspend(xe);
> >  	intel_hpd_cancel_work(xe);
> >  
> > -- 
> > 2.46.0
> > 
> > 

^ permalink raw reply	[flat|nested] 81+ messages in thread

* Re: [PATCH 11/31] drm/{i915, xe}: Consolidate display resume functions
  2024-10-07 21:02   ` [PATCH 11/31] drm/{i915, xe}: " Cavitt, Jonathan
@ 2024-11-14 22:15     ` Rodrigo Vivi
  0 siblings, 0 replies; 81+ messages in thread
From: Rodrigo Vivi @ 2024-11-14 22:15 UTC (permalink / raw)
  To: Cavitt, Jonathan
  Cc: intel-gfx@lists.freedesktop.org, intel-xe@lists.freedesktop.org,
	Deak, Imre

On Mon, Oct 07, 2024 at 05:02:04PM -0400, Cavitt, Jonathan wrote:
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Rodrigo Vivi
> Sent: Tuesday, September 24, 2024 1:36 PM
> To: intel-gfx@lists.freedesktop.org; intel-xe@lists.freedesktop.org
> Cc: Deak, Imre <imre.deak@intel.com>; Vivi, Rodrigo <rodrigo.vivi@intel.com>
> Subject: [PATCH 11/31] drm/{i915,xe}: Consolidate display resume functions
> > 
> > Same sequences are currently executed by i915 and xe during
> > system resume. Consolidate them in the intel_display_driver
> > side.
> > 
> > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > ---
> >  .../drm/i915/display/intel_display_driver.c    | 16 ++++++++++++++++
> >  drivers/gpu/drm/i915/i915_driver.c             | 17 -----------------
> >  drivers/gpu/drm/xe/display/xe_display.c        | 18 +-----------------
> >  3 files changed, 17 insertions(+), 34 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/display/intel_display_driver.c b/drivers/gpu/drm/i915/display/intel_display_driver.c
> > index 42624bf80f91..86d6ebf0c82f 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display_driver.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display_driver.c
> > @@ -752,6 +752,10 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
> >  	if (!HAS_DISPLAY(i915))
> >  		return;
> >  
> > +	intel_display_driver_resume_access(i915);
> > +
> > +	intel_hpd_init(i915);
> > +
> >  	/* MST sideband requires HPD interrupts enabled */
> >  	intel_dp_mst_resume(i915);
> >  
> > @@ -781,6 +785,18 @@ void intel_display_driver_resume(struct drm_i915_private *i915)
> >  			"Restoring old state failed with %i\n", ret);
> >  	if (state)
> >  		drm_atomic_state_put(state);
> > +
> > +	intel_display_driver_enable_user_access(i915);
> > +
> > +	drm_kms_helper_poll_enable(&i915->drm);
> > +
> > +	intel_hpd_poll_disable(i915);
> > +
> > +	intel_opregion_resume(&i915->display);
> > +
> > +	intel_fbdev_set_suspend(&i915->drm, FBINFO_STATE_RUNNING, false);
> > +
> > +	intel_power_domains_enable(i915);
> 
> Hmm... It looks like everything here is being gated by HAS_DISPLAY, when
> it wasn't before in i915_drm_resume or xe_display_pm_resume.  Is this
> correct behavior?

This is a very good question. I really dislike the sprinkled if HAS_DISPLAY s,
and I hope this is okay...

> 
> I'll trust your judgement on this.
> Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com>
> -Jonathan Cavitt
> 
> >  }
> >  
> >  void intel_display_driver_shutdown(struct drm_i915_private *i915)
> > diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c
> > index ac8bf00458b5..ce2dd03136d3 100644
> > --- a/drivers/gpu/drm/i915/i915_driver.c
> > +++ b/drivers/gpu/drm/i915/i915_driver.c
> > @@ -1165,25 +1165,8 @@ static int i915_drm_resume(struct drm_device *dev)
> >  
> >  	intel_clock_gating_init(dev_priv);
> >  
> > -	if (HAS_DISPLAY(dev_priv))
> > -		intel_display_driver_resume_access(dev_priv);
> > -
> > -	intel_hpd_init(dev_priv);
> > -
> >  	intel_display_driver_resume(dev_priv);
> >  
> > -	if (HAS_DISPLAY(dev_priv)) {
> > -		intel_display_driver_enable_user_access(dev_priv);
> > -		drm_kms_helper_poll_enable(dev);
> > -	}
> > -	intel_hpd_poll_disable(dev_priv);
> > -
> > -	intel_opregion_resume(display);
> > -
> > -	intel_fbdev_set_suspend(dev, FBINFO_STATE_RUNNING, false);
> > -
> > -	intel_power_domains_enable(dev_priv);
> > -
> >  	intel_gvt_resume(dev_priv);
> >  
> >  	enable_rpm_wakeref_asserts(&dev_priv->runtime_pm);
> > diff --git a/drivers/gpu/drm/xe/display/xe_display.c b/drivers/gpu/drm/xe/display/xe_display.c
> > index a4705a452adb..98ff603a1f84 100644
> > --- a/drivers/gpu/drm/xe/display/xe_display.c
> > +++ b/drivers/gpu/drm/xe/display/xe_display.c
> > @@ -447,23 +447,7 @@ void xe_display_pm_resume(struct xe_device *xe)
> >  
> >  	intel_display_driver_init_hw(xe);
> >  
> > -	if (has_display(xe))
> > -		intel_display_driver_resume_access(xe);
> > -
> > -	intel_hpd_init(xe);
> > -
> > -	if (has_display(xe)) {
> > -		intel_display_driver_resume(xe);
> > -		drm_kms_helper_poll_enable(&xe->drm);
> > -		intel_display_driver_enable_user_access(xe);
> > -		intel_hpd_poll_disable(xe);
> > -	}
> > -
> > -	intel_opregion_resume(display);
> > -
> > -	intel_fbdev_set_suspend(&xe->drm, FBINFO_STATE_RUNNING, false);
> > -
> > -	intel_power_domains_enable(xe);
> > +	intel_display_driver_resume(xe);
> >  }
> >  
> >  void xe_display_pm_runtime_resume(struct xe_device *xe)
> > -- 
> > 2.46.0
> > 
> > 

^ permalink raw reply	[flat|nested] 81+ messages in thread

end of thread, other threads:[~2024-11-15  6:39 UTC | newest]

Thread overview: 81+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-24 20:35 [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Rodrigo Vivi
2024-09-24 20:35 ` [PATCH 01/31] drm/i915: Remove vga and gmbus seq out of i915_restore_display Rodrigo Vivi
2024-09-25 10:20   ` Jani Nikula
2024-09-25 20:59     ` Rodrigo Vivi
2024-10-07 19:15   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 02/31] drm/i915/display: Convert i915_suspend into i9xx_display_sr Rodrigo Vivi
2024-10-01 13:21   ` Jani Nikula
2024-10-07 19:15   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 03/31] drm/i915/display: Move regfile registers intel_display.restore Rodrigo Vivi
2024-10-07 19:17   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 04/31] drm/i915/display: Move shutdown sequences under display driver Rodrigo Vivi
2024-10-07 19:18   ` Cavitt, Jonathan
2024-10-08 15:57   ` Imre Deak
2024-09-24 20:35 ` [PATCH 05/31] drm/xe: At shutdown disable commit helpers instead of flushing Rodrigo Vivi
2024-10-07 19:42   ` Cavitt, Jonathan
2024-11-14 20:20     ` Rodrigo Vivi
2024-09-24 20:35 ` [PATCH 06/31] drm/xe: Use i915-display shutdown sequence directly Rodrigo Vivi
2024-10-07 19:44   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 07/31] drm/{i915, xe}/display: Move DP MST calls to display_driver Rodrigo Vivi
2024-10-07 19:46   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 08/31] drm/i915/display: Move suspend sequences to intel_display_driver Rodrigo Vivi
2024-10-07 20:28   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 09/31] drm/xe/display: Delay hpd_init resume Rodrigo Vivi
2024-10-07 20:29   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 10/31] drm/xe/display: Spin-off xe_display runtime/d3cold sequences Rodrigo Vivi
2024-10-07 20:43   ` Cavitt, Jonathan
2024-10-08 16:27   ` Imre Deak
2024-09-24 20:35 ` [PATCH 11/31] drm/{i915,xe}: Consolidate display resume functions Rodrigo Vivi
2024-10-07 21:02   ` [PATCH 11/31] drm/{i915, xe}: " Cavitt, Jonathan
2024-11-14 22:15     ` Rodrigo Vivi
2024-09-24 20:35 ` [PATCH 12/31] drm/i915: Remove lingering pci_save_state Rodrigo Vivi
2024-09-27  8:45   ` Gupta, Anshuman
2024-10-07 21:10   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 13/31] drm/{i915,xe}: Consolidate display suspend functions Rodrigo Vivi
2024-10-07 21:14   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 14/31] drm/i915/display: Move resume sequences to intel_display_driver Rodrigo Vivi
2024-10-07 21:16   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 15/31] drm/xe/display: Delay dsm handler registration Rodrigo Vivi
2024-10-07 21:17   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 16/31] drm/{i915, xe}: Move power_domains suspend/resume to display_power Rodrigo Vivi
2024-10-07 21:25   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 17/31] drm/{i915, xe}: Move remaining intel_power_domains to intel_display Rodrigo Vivi
2024-10-07 21:27   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 18/31] drm/i915/display: Split resume_noirq calls for now Rodrigo Vivi
2024-10-07 21:29   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 19/31] drm/xe/display: Align display resume sequence with i915 Rodrigo Vivi
2024-10-07 21:37   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 20/31] drm/xe/display: Align suspend " Rodrigo Vivi
2024-10-07 21:40   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 21/31] drm/{i915, xe}/display: Move dsm registration under intel_driver Rodrigo Vivi
2024-10-08 14:04   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 22/31] drm/i915/display: Move runtime pm related calls under intel_display_driver Rodrigo Vivi
2024-10-08 14:10   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 23/31] drm/xe/display: Prepare runtime pm functions Rodrigo Vivi
2024-10-08 14:31   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 24/31] drm/xe/display: Call intel_hpd_init on every runtime resume Rodrigo Vivi
2024-10-03  6:32   ` Govindapillai, Vinod
2024-10-03 12:24     ` Govindapillai, Vinod
2024-10-08 14:32   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 25/31] drm/xe/display: Move hpd_poll calls to later runtime stages Rodrigo Vivi
2024-10-03 12:22   ` Govindapillai, Vinod
2024-10-08 14:33   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 26/31] drm/xe/display: Add missing watermark ipc update at runtime resume Rodrigo Vivi
2024-10-08 14:35   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 27/31] drm/xe/display: Notify opregion upon runtime suspend/resume non-d3cold Rodrigo Vivi
2024-10-08 14:37   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 28/31] drm/xe/display: Move display runtime suspend to a later point Rodrigo Vivi
2024-10-08 14:37   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 29/31] drm/xe/display: Kill crtc commit flush Rodrigo Vivi
2024-10-08 14:50   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 30/31] drm/xe/display: Add missing power display handling on non-d3cold rpm Rodrigo Vivi
2024-10-08 14:51   ` Cavitt, Jonathan
2024-09-24 20:35 ` [PATCH 31/31] drm/{i915, xe}/display: Consolidade entire runtime pm sequence Rodrigo Vivi
2024-10-08 14:57   ` Cavitt, Jonathan
2024-09-25 10:32 ` [PATCH 00/31] Reconcile i915's and xe's display power mgt sequences Jani Nikula
2024-09-25 21:00   ` Rodrigo Vivi
2024-09-26  5:29 ` ✓ CI.Patch_applied: success for " Patchwork
2024-09-26  5:30 ` ✗ CI.checkpatch: warning " Patchwork
2024-09-26  5:31 ` ✗ CI.KUnit: failure " Patchwork
2024-10-08 15:24 ` [PATCH 00/31] " Cavitt, Jonathan
2024-11-11 19:23   ` Rodrigo Vivi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).