drm/amd/display: Support for DMUB HPD and HPD RX interrupt handling
authorMeenakshikumar Somasundaram <meenakshikumar.somasundaram@amd.com>
Wed, 27 Jan 2021 06:05:28 +0000 (01:05 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 6 Oct 2021 19:51:03 +0000 (15:51 -0400)
[WHY]
To add support for HPD & HPD RX interrupt handling for USB4 DPIA in
YELLOW_CARP_B0. USB4 DPIA HPD & HPD RX interrupts are issued from DMUB to
driver as a outbox1 message.

[HOW]
1) Created get_link_index_from_dpia_port_index() to retrieve link index
   from dpia port index for HPD & HPD RX dmub notifications.
2) Added DMUB HPD & HPD RX handling in dmub_srv_stat_get_notification().

Reviewed-by: Jun Lei <Jun.Lei@amd.com>
Acked-by: Wayne Lin <Wayne.Lin@amd.com>
Acked-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Meenakshikumar Somasundaram <meenakshikumar.somasundaram@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/core/dc_stat.c
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
drivers/gpu/drm/amd/display/dmub/src/dmub_srv_stat.c

index 1a523f3e071b549c551c350a5519831cfd6794f4..2bbb68c55daf0458f7f09e5176e93da18022f53f 100644 (file)
@@ -3656,6 +3656,26 @@ bool dc_process_dmub_aux_transfer_async(struct dc *dc,
        return true;
 }
 
+uint8_t get_link_index_from_dpia_port_index(const struct dc *dc,
+                                           uint8_t dpia_port_index)
+{
+       uint8_t index, link_index = 0xFF;
+
+       for (index = 0; index < dc->link_count; index++) {
+               /* ddc_hw_inst has dpia port index for dpia links
+                * and ddc instance for legacy links
+                */
+               if (!dc->links[index]->ddc->ddc_pin) {
+                       if (dc->links[index]->ddc_hw_inst == dpia_port_index) {
+                               link_index = index;
+                               break;
+                       }
+               }
+       }
+       ASSERT(link_index != 0xFF);
+       return link_index;
+}
+
 /**
  * dc_disable_accelerated_mode - disable accelerated mode
  * @dc: dc structure
index 28ef9760fa34c56184a2f5b55ff3120acf52269a..7d4a5dc8fc91041e1cd09bb0bb1612689ab93060 100644 (file)
@@ -61,6 +61,13 @@ void dc_stat_get_dmub_notification(const struct dc *dc, struct dmub_notification
 
        status = dmub_srv_stat_get_notification(dmub, notify);
        ASSERT(status == DMUB_STATUS_OK);
+
+       /* For HPD/HPD RX, convert dpia port index into link index */
+       if (notify->type == DMUB_NOTIFICATION_HPD ||
+           notify->type == DMUB_NOTIFICATION_HPD_IRQ) {
+               notify->link_index =
+                       get_link_index_from_dpia_port_index(dc, notify->link_index);
+       }
 }
 
 /**
index 5c348fdc377ae0b9e7dcd24c0f531d197de17bb1..8ae369a1eac6ae726d8aee8bf32c116242900871 100644 (file)
@@ -1394,6 +1394,9 @@ bool dc_process_dmub_aux_transfer_async(struct dc *dc,
                                uint32_t link_index,
                                struct aux_payload *payload);
 
+/* Get dc link index from dpia port index */
+uint8_t get_link_index_from_dpia_port_index(const struct dc *dc,
+                               uint8_t dpia_port_index);
 /*******************************************************************************
  * DSC Interfaces
  ******************************************************************************/
index f4e3589d60678adad2a04021c8b79d2eb2c56314..81326f399eec2d1dc82900bb004009657f2b776d 100644 (file)
@@ -675,6 +675,10 @@ enum dmub_out_cmd_type {
         * Command type used for DP AUX Reply data notification
         */
        DMUB_OUT_CMD__DP_AUX_REPLY = 1,
+       /**
+        * Command type used for DP HPD event notification
+        */
+       DMUB_OUT_CMD__DP_HPD_NOTIFY = 2,
 };
 
 #pragma pack(push, 1)
index 70766d534c9c83928a0409c0bdde9c79f43c68e3..d7f66e5285c06a45fa7ed1082d624c9fb34fdb8d 100644 (file)
@@ -76,6 +76,17 @@ enum dmub_status dmub_srv_stat_get_notification(struct dmub_srv *dmub,
                dmub_memcpy((void *)&notify->aux_reply,
                        (void *)&cmd.dp_aux_reply.reply_data, sizeof(struct aux_reply_data));
                break;
+       case DMUB_OUT_CMD__DP_HPD_NOTIFY:
+               if (cmd.dp_hpd_notify.hpd_data.hpd_type == DP_HPD) {
+                       notify->type = DMUB_NOTIFICATION_HPD;
+                       notify->hpd_status = cmd.dp_hpd_notify.hpd_data.hpd_status;
+               } else {
+                       notify->type = DMUB_NOTIFICATION_HPD_IRQ;
+               }
+
+               notify->link_index = cmd.dp_hpd_notify.hpd_data.instance;
+               notify->result = AUX_RET_SUCCESS;
+               break;
        default:
                notify->type = DMUB_NOTIFICATION_NO_DATA;
                break;