mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-06 07:34:03 -04:00
drm/amd/display: Support for DMUB HPD and HPD RX interrupt handling
[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>
This commit is contained in:
committed by
Alex Deucher
parent
9fa0fb7713
commit
892b74a646
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
******************************************************************************/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -76,6 +76,17 @@ enum dmub_status dmub_srv_stat_get_notification(struct dmub_srv *dmub,
|
||||
dmub_memcpy((void *)¬ify->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;
|
||||
|
||||
Reference in New Issue
Block a user