All of lore.kernel.org
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH v2 0/3] Disable connector polling for a headless sku
@ 2022-06-10  7:17 Jouni Högander
  2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 1/3] drm/i915/opregion: add function to check if " Jouni Högander
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Jouni Högander @ 2022-06-10  7:17 UTC (permalink / raw)
  To: intel-gfx; +Cc: Jani Nikula

This patch set disables connector polling when entering runtime
suspend for headless sku to prevent waking it up again when poll
is performed.

v2:
 - integrate headless check into INTEL_DISPLAY_ENABLED

Cc: Jani Nikula <jani.nikula@intel.com>
Cc: José Roberto de Souza <jose.souza@intel.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Anshuman Gupta <anshuman.gupta@intel.com>

Jouni Högander (3):
  drm/i915/opregion: add function to check if headless sku
  drm/i915: Do not start connector polling if display is disabled
  drm/i915: Do not start connector polling on headless sku

 drivers/gpu/drm/i915/display/intel_hotplug.c  |  3 ++-
 drivers/gpu/drm/i915/display/intel_opregion.c | 14 ++++++++++++++
 drivers/gpu/drm/i915/display/intel_opregion.h |  7 +++++++
 drivers/gpu/drm/i915/i915_drv.h               |  4 +++-
 4 files changed, 26 insertions(+), 2 deletions(-)

-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 1/3] drm/i915/opregion: add function to check if headless sku
  2022-06-10  7:17 [Intel-gfx] [PATCH v2 0/3] Disable connector polling for a headless sku Jouni Högander
@ 2022-06-10  7:17 ` Jouni Högander
  2022-06-10  8:02   ` Jani Nikula
  2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 2/3] drm/i915: Do not start connector polling if display is disabled Jouni Högander
  2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 3/3] drm/i915: Do not start connector polling on headless sku Jouni Högander
  2 siblings, 1 reply; 5+ messages in thread
From: Jouni Högander @ 2022-06-10  7:17 UTC (permalink / raw)
  To: intel-gfx

Export headless sku bit (bit 13) from opregion->header->pcon as an
interface to check if our device is headless configuration.

This is mainly targeted for hybrid gfx systems. E.g. when display
is not supposed to be connected discrete graphics card it's
opregion can inform this is headless graphics card.

v2: Check also opregion version

Bspec: 53441
Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
 drivers/gpu/drm/i915/display/intel_opregion.c | 14 ++++++++++++++
 drivers/gpu/drm/i915/display/intel_opregion.h |  7 +++++++
 2 files changed, 21 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_opregion.c b/drivers/gpu/drm/i915/display/intel_opregion.c
index f31e8c3f8ce0..6876ba30d5a9 100644
--- a/drivers/gpu/drm/i915/display/intel_opregion.c
+++ b/drivers/gpu/drm/i915/display/intel_opregion.c
@@ -53,6 +53,8 @@
 #define MBOX_ASLE_EXT		BIT(4)	/* Mailbox #5 */
 #define MBOX_BACKLIGHT		BIT(5)	/* Mailbox #2 (valid from v3.x) */
 
+#define PCON_HEADLESS_SKU	BIT(13)
+
 struct opregion_header {
 	u8 signature[16];
 	u32 size;
@@ -1135,6 +1137,18 @@ struct edid *intel_opregion_get_edid(struct intel_connector *intel_connector)
 	return new_edid;
 }
 
+bool intel_opregion_headless_sku(struct drm_i915_private *i915)
+{
+	struct intel_opregion *opregion = &i915->opregion;
+	struct opregion_header *header = opregion->header;
+
+	if (!header || header->over.major < 2 ||
+	    (header->over.major == 2 && header->over.minor < 3))
+		return false;
+
+	return opregion->header->pcon & PCON_HEADLESS_SKU;
+}
+
 void intel_opregion_register(struct drm_i915_private *i915)
 {
 	struct intel_opregion *opregion = &i915->opregion;
diff --git a/drivers/gpu/drm/i915/display/intel_opregion.h b/drivers/gpu/drm/i915/display/intel_opregion.h
index 82cc0ba34af7..5ad96e1d8278 100644
--- a/drivers/gpu/drm/i915/display/intel_opregion.h
+++ b/drivers/gpu/drm/i915/display/intel_opregion.h
@@ -76,6 +76,8 @@ int intel_opregion_notify_adapter(struct drm_i915_private *dev_priv,
 int intel_opregion_get_panel_type(struct drm_i915_private *dev_priv);
 struct edid *intel_opregion_get_edid(struct intel_connector *connector);
 
+bool intel_opregion_headless_sku(struct drm_i915_private *i915);
+
 #else /* CONFIG_ACPI*/
 
 static inline int intel_opregion_setup(struct drm_i915_private *dev_priv)
@@ -127,6 +129,11 @@ intel_opregion_get_edid(struct intel_connector *connector)
 	return NULL;
 }
 
+bool intel_opregion_headless_sku(struct drm_i915_private *i915)
+{
+	return false;
+}
+
 #endif /* CONFIG_ACPI */
 
 #endif
-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 2/3] drm/i915: Do not start connector polling if display is disabled
  2022-06-10  7:17 [Intel-gfx] [PATCH v2 0/3] Disable connector polling for a headless sku Jouni Högander
  2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 1/3] drm/i915/opregion: add function to check if " Jouni Högander
@ 2022-06-10  7:17 ` Jouni Högander
  2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 3/3] drm/i915: Do not start connector polling on headless sku Jouni Högander
  2 siblings, 0 replies; 5+ messages in thread
From: Jouni Högander @ 2022-06-10  7:17 UTC (permalink / raw)
  To: intel-gfx

Currently we are starting connector polling if display is disabled
using disable_display module parameter. Polling is just returning
always "not connected" state. This can be optimized by not starting
polling at all.

Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
 drivers/gpu/drm/i915/display/intel_hotplug.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_hotplug.c b/drivers/gpu/drm/i915/display/intel_hotplug.c
index 8204126d17f9..5f8b4f481cff 100644
--- a/drivers/gpu/drm/i915/display/intel_hotplug.c
+++ b/drivers/gpu/drm/i915/display/intel_hotplug.c
@@ -668,7 +668,8 @@ static void i915_hpd_poll_init_work(struct work_struct *work)
  */
 void intel_hpd_poll_enable(struct drm_i915_private *dev_priv)
 {
-	if (!HAS_DISPLAY(dev_priv))
+	if (!HAS_DISPLAY(dev_priv) ||
+	    !INTEL_DISPLAY_ENABLED(dev_priv))
 		return;
 
 	WRITE_ONCE(dev_priv->hotplug.poll_enabled, true);
-- 
2.25.1


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

* [Intel-gfx] [PATCH v2 3/3] drm/i915: Do not start connector polling on headless sku
  2022-06-10  7:17 [Intel-gfx] [PATCH v2 0/3] Disable connector polling for a headless sku Jouni Högander
  2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 1/3] drm/i915/opregion: add function to check if " Jouni Högander
  2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 2/3] drm/i915: Do not start connector polling if display is disabled Jouni Högander
@ 2022-06-10  7:17 ` Jouni Högander
  2 siblings, 0 replies; 5+ messages in thread
From: Jouni Högander @ 2022-06-10  7:17 UTC (permalink / raw)
  To: intel-gfx

Connector polling is waking up the polled device. Polling
is unnecessary if our device is known to not have display.

Fix this and save some power by disabling starting connector
polling when we are having headless sku. Use information from
opregion.

v2: Move headless sku check into INTEL_DISPLAY_ENABLED macro

Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index eba94fa76b18..db37806967cc 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1343,7 +1343,9 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
 
 /* Only valid when HAS_DISPLAY() is true */
 #define INTEL_DISPLAY_ENABLED(dev_priv) \
-	(drm_WARN_ON(&(dev_priv)->drm, !HAS_DISPLAY(dev_priv)), !(dev_priv)->params.disable_display)
+	(drm_WARN_ON(&(dev_priv)->drm, !HAS_DISPLAY(dev_priv)),		\
+	 !(dev_priv)->params.disable_display &&				\
+	 !intel_opregion_headless_sku(dev_priv))
 
 #define HAS_GUC_DEPRIVILEGE(dev_priv) \
 	(INTEL_INFO(dev_priv)->has_guc_deprivilege)
-- 
2.25.1


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

* Re: [Intel-gfx] [PATCH v2 1/3] drm/i915/opregion: add function to check if headless sku
  2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 1/3] drm/i915/opregion: add function to check if " Jouni Högander
@ 2022-06-10  8:02   ` Jani Nikula
  0 siblings, 0 replies; 5+ messages in thread
From: Jani Nikula @ 2022-06-10  8:02 UTC (permalink / raw)
  To: Jouni Högander, intel-gfx

On Fri, 10 Jun 2022, Jouni Högander <jouni.hogander@intel.com> wrote:
> Export headless sku bit (bit 13) from opregion->header->pcon as an
> interface to check if our device is headless configuration.
>
> This is mainly targeted for hybrid gfx systems. E.g. when display
> is not supposed to be connected discrete graphics card it's
> opregion can inform this is headless graphics card.
>
> v2: Check also opregion version
>
> Bspec: 53441
> Signed-off-by: Jouni Högander <jouni.hogander@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_opregion.c | 14 ++++++++++++++
>  drivers/gpu/drm/i915/display/intel_opregion.h |  7 +++++++
>  2 files changed, 21 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_opregion.c b/drivers/gpu/drm/i915/display/intel_opregion.c
> index f31e8c3f8ce0..6876ba30d5a9 100644
> --- a/drivers/gpu/drm/i915/display/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/display/intel_opregion.c
> @@ -53,6 +53,8 @@
>  #define MBOX_ASLE_EXT		BIT(4)	/* Mailbox #5 */
>  #define MBOX_BACKLIGHT		BIT(5)	/* Mailbox #2 (valid from v3.x) */
>  
> +#define PCON_HEADLESS_SKU	BIT(13)
> +
>  struct opregion_header {
>  	u8 signature[16];
>  	u32 size;
> @@ -1135,6 +1137,18 @@ struct edid *intel_opregion_get_edid(struct intel_connector *intel_connector)
>  	return new_edid;
>  }
>  
> +bool intel_opregion_headless_sku(struct drm_i915_private *i915)
> +{
> +	struct intel_opregion *opregion = &i915->opregion;
> +	struct opregion_header *header = opregion->header;
> +
> +	if (!header || header->over.major < 2 ||
> +	    (header->over.major == 2 && header->over.minor < 3))
> +		return false;
> +
> +	return opregion->header->pcon & PCON_HEADLESS_SKU;
> +}
> +
>  void intel_opregion_register(struct drm_i915_private *i915)
>  {
>  	struct intel_opregion *opregion = &i915->opregion;
> diff --git a/drivers/gpu/drm/i915/display/intel_opregion.h b/drivers/gpu/drm/i915/display/intel_opregion.h
> index 82cc0ba34af7..5ad96e1d8278 100644
> --- a/drivers/gpu/drm/i915/display/intel_opregion.h
> +++ b/drivers/gpu/drm/i915/display/intel_opregion.h
> @@ -76,6 +76,8 @@ int intel_opregion_notify_adapter(struct drm_i915_private *dev_priv,
>  int intel_opregion_get_panel_type(struct drm_i915_private *dev_priv);
>  struct edid *intel_opregion_get_edid(struct intel_connector *connector);
>  
> +bool intel_opregion_headless_sku(struct drm_i915_private *i915);
> +
>  #else /* CONFIG_ACPI*/
>  
>  static inline int intel_opregion_setup(struct drm_i915_private *dev_priv)
> @@ -127,6 +129,11 @@ intel_opregion_get_edid(struct intel_connector *connector)
>  	return NULL;
>  }
>  
> +bool intel_opregion_headless_sku(struct drm_i915_private *i915)

This needs to be static inline.

With that fixed, the series is

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


> +{
> +	return false;
> +}
> +
>  #endif /* CONFIG_ACPI */
>  
>  #endif

-- 
Jani Nikula, Intel Open Source Graphics Center

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

end of thread, other threads:[~2022-06-10  8:03 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-10  7:17 [Intel-gfx] [PATCH v2 0/3] Disable connector polling for a headless sku Jouni Högander
2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 1/3] drm/i915/opregion: add function to check if " Jouni Högander
2022-06-10  8:02   ` Jani Nikula
2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 2/3] drm/i915: Do not start connector polling if display is disabled Jouni Högander
2022-06-10  7:17 ` [Intel-gfx] [PATCH v2 3/3] drm/i915: Do not start connector polling on headless sku Jouni Högander

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.