From: Nicholas Kazlauskas <[email protected]>

[Why]
HPD sense changes can occur during low power states and need to be
notified from firmware to driver. Upon notification the hotplug
redetection routines should execute.

[How]
Add Support in DMUB srv and DMUB srv stat for receiving these
notifications. DM can hook them up and process the HPD redetection
once received.

Reviewed-by: Duncan Ma <[email protected]>
Acked-by: Zaeem Mohamed <[email protected]>
Signed-off-by: Nicholas Kazlauskas <[email protected]>
---
 drivers/gpu/drm/amd/display/dmub/dmub_srv.h   |  2 ++
 .../gpu/drm/amd/display/dmub/inc/dmub_cmd.h   | 24 +++++++++++++++++++
 .../drm/amd/display/dmub/src/dmub_srv_stat.c  |  6 +++++
 3 files changed, 32 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h 
b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h
index cd51c91a822b..85dcf6b4fe92 100644
--- a/drivers/gpu/drm/amd/display/dmub/dmub_srv.h
+++ b/drivers/gpu/drm/amd/display/dmub/dmub_srv.h
@@ -137,6 +137,7 @@ enum dmub_notification_type {
        DMUB_NOTIFICATION_HPD_IRQ,
        DMUB_NOTIFICATION_SET_CONFIG_REPLY,
        DMUB_NOTIFICATION_DPIA_NOTIFICATION,
+       DMUB_NOTIFICATION_HPD_SENSE_NOTIFY,
        DMUB_NOTIFICATION_MAX
 };
 
@@ -560,6 +561,7 @@ struct dmub_notification {
                 * DPIA notification command.
                 */
                struct dmub_rb_cmd_dpia_notification dpia_notification;
+               struct dmub_rb_cmd_hpd_sense_notify_data hpd_sense_notify;
        };
 };
 
diff --git a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h 
b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
index 4db4c5ad5169..7f08e95140ef 100644
--- a/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
+++ b/drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
@@ -1285,6 +1285,10 @@ enum dmub_out_cmd_type {
         * Command type used for USB4 DPIA notification
         */
        DMUB_OUT_CMD__DPIA_NOTIFICATION = 5,
+       /**
+        * Command type used for HPD redetect notification
+        */
+       DMUB_OUT_CMD__HPD_SENSE_NOTIFY = 6,
 };
 
 /* DMUB_CMD__DPIA command sub-types. */
@@ -2468,6 +2472,22 @@ struct dmub_rb_cmd_query_hpd_state {
        struct dmub_cmd_hpd_state_query_data data;
 };
 
+/**
+ * struct dmub_rb_cmd_hpd_sense_notify - HPD sense notification data.
+ */
+struct dmub_rb_cmd_hpd_sense_notify_data {
+       uint32_t old_hpd_sense_mask; /**< Old HPD sense mask */
+       uint32_t new_hpd_sense_mask; /**< New HPD sense mask */
+};
+
+/**
+ * struct dmub_rb_cmd_hpd_sense_notify - DMUB_OUT_CMD__HPD_SENSE_NOTIFY 
command.
+ */
+struct dmub_rb_cmd_hpd_sense_notify {
+       struct dmub_cmd_header header; /**< header */
+       struct dmub_rb_cmd_hpd_sense_notify_data data; /**< payload */
+};
+
 /*
  * Command IDs should be treated as stable ABI.
  * Do not reuse or modify IDs.
@@ -5204,6 +5224,10 @@ union dmub_rb_out_cmd {
         * DPIA notification command.
         */
        struct dmub_rb_cmd_dpia_notification dpia_notification;
+       /**
+        * HPD sense notification command.
+        */
+       struct dmub_rb_cmd_hpd_sense_notify hpd_sense_notify;
 };
 #pragma pack(pop)
 
diff --git a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv_stat.c 
b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv_stat.c
index 74189102eaec..cce887cefc01 100644
--- a/drivers/gpu/drm/amd/display/dmub/src/dmub_srv_stat.c
+++ b/drivers/gpu/drm/amd/display/dmub/src/dmub_srv_stat.c
@@ -113,6 +113,12 @@ enum dmub_status dmub_srv_stat_get_notification(struct 
dmub_srv *dmub,
                                notify->result = DPIA_BW_ALLOC_CAPS_CHANGED;
                }
                break;
+       case DMUB_OUT_CMD__HPD_SENSE_NOTIFY:
+               notify->type = DMUB_NOTIFICATION_HPD_SENSE_NOTIFY;
+               dmub_memcpy(&notify->hpd_sense_notify,
+                           &cmd.hpd_sense_notify.data,
+                           sizeof(cmd.hpd_sense_notify.data));
+               break;
        default:
                notify->type = DMUB_NOTIFICATION_NO_DATA;
                break;
-- 
2.34.1

Reply via email to