Commit 71af9d46 authored by Meenakshikumar Somasundaram's avatar Meenakshikumar Somasundaram Committed by Alex Deucher

drm/amd/display: Support for SET_CONFIG processing with DMUB

[Why]
To process SET_CONFIG transactions with DMUB using inbox1 and
outbox1 mail boxes.

[How]
1) Added inbox1 DPIA command subtype DMUB_CMD__DPIA_SET_CONFIG_ACCESS to
   issue SET_CONFIG command to DMUB in dc_process_dmub_set_config_async().
   DMUB processes the command with DPIA sends reply back immediately or
   in an outbox1 message triggering an outbox1 interrupt to driver.
2) DMUB posts SET_CONFIG reply as an Outbox1 message of type
   DMUB_OUT_CMD__SET_CONFIG_REPLY.
3) The dmub async to sync mechanism for AUX is modified to accommodate
   SET_CONFIG commands for both command issue and reply code paths.
Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Acked-by: default avatarWayne Lin <Wayne.Lin@amd.com>
Acked-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarMeenakshikumar Somasundaram <meenakshikumar.somasundaram@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 80789bcf
...@@ -3676,6 +3676,56 @@ uint8_t get_link_index_from_dpia_port_index(const struct dc *dc, ...@@ -3676,6 +3676,56 @@ uint8_t get_link_index_from_dpia_port_index(const struct dc *dc,
return link_index; return link_index;
} }
/**
*****************************************************************************
* Function: dc_process_dmub_set_config_async
*
* @brief
* Submits set_config command to dmub via inbox message
*
* @param
* [in] dc: dc structure
* [in] link_index: link index
* [in] payload: aux payload
* [out] notify: set_config immediate reply
*
* @return
* True if successful, False if failure
*****************************************************************************
*/
bool dc_process_dmub_set_config_async(struct dc *dc,
uint32_t link_index,
struct set_config_cmd_payload *payload,
struct dmub_notification *notify)
{
union dmub_rb_cmd cmd = {0};
struct dc_dmub_srv *dmub_srv = dc->ctx->dmub_srv;
bool is_cmd_complete = true;
/* prepare SET_CONFIG command */
cmd.set_config_access.header.type = DMUB_CMD__DPIA;
cmd.set_config_access.header.sub_type = DMUB_CMD__DPIA_SET_CONFIG_ACCESS;
cmd.set_config_access.set_config_control.instance = dc->links[link_index]->ddc_hw_inst;
cmd.set_config_access.set_config_control.cmd_pkt.msg_type = payload->msg_type;
cmd.set_config_access.set_config_control.cmd_pkt.msg_data = payload->msg_data;
if (!dc_dmub_srv_cmd_with_reply_data(dmub_srv, &cmd)) {
/* command is not processed by dmub */
notify->sc_status = SET_CONFIG_UNKNOWN_ERROR;
return is_cmd_complete;
}
/* command processed by dmub, if ret_status is 1, it is completed instantly */
if (cmd.set_config_access.header.ret_status == 1)
notify->sc_status = cmd.set_config_access.set_config_control.immed_status;
else
/* cmd pending, will receive notification via outbox */
is_cmd_complete = false;
return is_cmd_complete;
}
/** /**
* dc_disable_accelerated_mode - disable accelerated mode * dc_disable_accelerated_mode - disable accelerated mode
* @dc: dc structure * @dc: dc structure
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
#include "dpcd_defs.h" #include "dpcd_defs.h"
#include "link_hwss.h" #include "link_hwss.h"
#include "inc/link_dpcd.h" #include "inc/link_dpcd.h"
#include "dm_helpers.h"
#include "dmub/inc/dmub_cmd.h"
#define DC_LOGGER \ #define DC_LOGGER \
link->ctx->logger link->ctx->logger
...@@ -92,10 +94,18 @@ static enum link_training_result dpia_configure_link(struct dc_link *link, ...@@ -92,10 +94,18 @@ static enum link_training_result dpia_configure_link(struct dc_link *link,
} }
static enum dc_status core_link_send_set_config(struct dc_link *link, static enum dc_status core_link_send_set_config(struct dc_link *link,
uint8_t msg_type, uint8_t msg_data) uint8_t msg_type,
uint8_t msg_data)
{ {
/** @todo Implement */ struct set_config_cmd_payload payload;
return DC_OK; enum set_config_status set_config_result = SET_CONFIG_PENDING;
/* prepare set_config payload */
payload.msg_type = msg_type;
payload.msg_data = msg_data;
/* set_config should return ACK if successful */
return (set_config_result == SET_CONFIG_ACK_RECEIVED) ? DC_OK : DC_ERROR_UNEXPECTED;
} }
/* Build SET_CONFIG message data payload for specified message type. */ /* Build SET_CONFIG message data payload for specified message type. */
......
...@@ -64,7 +64,8 @@ void dc_stat_get_dmub_notification(const struct dc *dc, struct dmub_notification ...@@ -64,7 +64,8 @@ void dc_stat_get_dmub_notification(const struct dc *dc, struct dmub_notification
/* For HPD/HPD RX, convert dpia port index into link index */ /* For HPD/HPD RX, convert dpia port index into link index */
if (notify->type == DMUB_NOTIFICATION_HPD || if (notify->type == DMUB_NOTIFICATION_HPD ||
notify->type == DMUB_NOTIFICATION_HPD_IRQ) { notify->type == DMUB_NOTIFICATION_HPD_IRQ ||
notify->type == DMUB_NOTIFICATION_SET_CONFIG_REPLY) {
notify->link_index = notify->link_index =
get_link_index_from_dpia_port_index(dc, notify->link_index); get_link_index_from_dpia_port_index(dc, notify->link_index);
} }
......
...@@ -44,6 +44,8 @@ ...@@ -44,6 +44,8 @@
/* forward declaration */ /* forward declaration */
struct aux_payload; struct aux_payload;
struct set_config_cmd_payload;
struct dmub_notification;
#define DC_VER "3.2.156" #define DC_VER "3.2.156"
...@@ -1397,6 +1399,11 @@ bool dc_process_dmub_aux_transfer_async(struct dc *dc, ...@@ -1397,6 +1399,11 @@ bool dc_process_dmub_aux_transfer_async(struct dc *dc,
/* Get dc link index from dpia port index */ /* Get dc link index from dpia port index */
uint8_t get_link_index_from_dpia_port_index(const struct dc *dc, uint8_t get_link_index_from_dpia_port_index(const struct dc *dc,
uint8_t dpia_port_index); uint8_t dpia_port_index);
bool dc_process_dmub_set_config_async(struct dc *dc,
uint32_t link_index,
struct set_config_cmd_payload *payload,
struct dmub_notification *notify);
/******************************************************************************* /*******************************************************************************
* DSC Interfaces * DSC Interfaces
******************************************************************************/ ******************************************************************************/
......
...@@ -179,4 +179,9 @@ int dm_helper_dmub_aux_transfer_sync( ...@@ -179,4 +179,9 @@ int dm_helper_dmub_aux_transfer_sync(
const struct dc_link *link, const struct dc_link *link,
struct aux_payload *payload, struct aux_payload *payload,
enum aux_return_code_type *operation_result); enum aux_return_code_type *operation_result);
enum set_config_status;
int dm_helpers_dmub_set_config_sync(struct dc_context *ctx,
const struct dc_link *link,
struct set_config_cmd_payload *payload,
enum set_config_status *operation_result);
#endif /* __DM_HELPERS__ */ #endif /* __DM_HELPERS__ */
...@@ -119,6 +119,7 @@ enum dmub_notification_type { ...@@ -119,6 +119,7 @@ enum dmub_notification_type {
DMUB_NOTIFICATION_AUX_REPLY, DMUB_NOTIFICATION_AUX_REPLY,
DMUB_NOTIFICATION_HPD, DMUB_NOTIFICATION_HPD,
DMUB_NOTIFICATION_HPD_IRQ, DMUB_NOTIFICATION_HPD_IRQ,
DMUB_NOTIFICATION_SET_CONFIG_REPLY,
DMUB_NOTIFICATION_MAX DMUB_NOTIFICATION_MAX
}; };
...@@ -440,6 +441,7 @@ struct dmub_notification { ...@@ -440,6 +441,7 @@ struct dmub_notification {
union { union {
struct aux_reply_data aux_reply; struct aux_reply_data aux_reply;
enum dp_hpd_status hpd_status; enum dp_hpd_status hpd_status;
enum set_config_status sc_status;
}; };
}; };
......
...@@ -683,11 +683,16 @@ enum dmub_out_cmd_type { ...@@ -683,11 +683,16 @@ enum dmub_out_cmd_type {
* Command type used for DP HPD event notification * Command type used for DP HPD event notification
*/ */
DMUB_OUT_CMD__DP_HPD_NOTIFY = 2, DMUB_OUT_CMD__DP_HPD_NOTIFY = 2,
/**
* Command type used for SET_CONFIG Reply notification
*/
DMUB_OUT_CMD__SET_CONFIG_REPLY = 3,
}; };
/* DMUB_CMD__DPIA command sub-types. */ /* DMUB_CMD__DPIA command sub-types. */
enum dmub_cmd_dpia_type { enum dmub_cmd_dpia_type {
DMUB_CMD__DPIA_DIG1_DPIA_CONTROL = 0, DMUB_CMD__DPIA_DIG1_DPIA_CONTROL = 0,
DMUB_CMD__DPIA_SET_CONFIG_ACCESS = 1,
}; };
#pragma pack(push, 1) #pragma pack(push, 1)
...@@ -1037,6 +1042,31 @@ struct dmub_rb_cmd_dig1_dpia_control { ...@@ -1037,6 +1042,31 @@ struct dmub_rb_cmd_dig1_dpia_control {
struct dmub_cmd_dig_dpia_control_data dpia_control; struct dmub_cmd_dig_dpia_control_data dpia_control;
}; };
/**
* SET_CONFIG Command Payload
*/
struct set_config_cmd_payload {
uint8_t msg_type; /* set config message type */
uint8_t msg_data; /* set config message data */
};
/**
* Data passed from driver to FW in a DMUB_CMD__DPIA_SET_CONFIG_ACCESS command.
*/
struct dmub_cmd_set_config_control_data {
struct set_config_cmd_payload cmd_pkt;
uint8_t instance; /* DPIA instance */
uint8_t immed_status; /* Immediate status returned in case of error */
};
/**
* DMUB command structure for SET_CONFIG command.
*/
struct dmub_rb_cmd_set_config_access {
struct dmub_cmd_header header; /* header */
struct dmub_cmd_set_config_control_data set_config_control; /* set config data */
};
/** /**
* struct dmub_rb_cmd_dpphy_init - DPPHY init. * struct dmub_rb_cmd_dpphy_init - DPPHY init.
*/ */
...@@ -1284,6 +1314,33 @@ struct dmub_rb_cmd_dp_hpd_notify { ...@@ -1284,6 +1314,33 @@ struct dmub_rb_cmd_dp_hpd_notify {
struct dp_hpd_data hpd_data; struct dp_hpd_data hpd_data;
}; };
/**
* Definition of a SET_CONFIG reply from DPOA.
*/
enum set_config_status {
SET_CONFIG_PENDING = 0,
SET_CONFIG_ACK_RECEIVED,
SET_CONFIG_RX_TIMEOUT,
SET_CONFIG_UNKNOWN_ERROR,
};
/**
* Definition of a set_config reply
*/
struct set_config_reply_control_data {
uint8_t instance; /* DPIA Instance */
uint8_t status; /* Set Config reply */
uint16_t pad; /* Alignment */
};
/**
* Definition of a DMUB_OUT_CMD__SET_CONFIG_REPLY command.
*/
struct dmub_rb_cmd_dp_set_config_reply {
struct dmub_cmd_header header;
struct set_config_reply_control_data set_config_reply_control;
};
/* /*
* Command IDs should be treated as stable ABI. * Command IDs should be treated as stable ABI.
* Do not reuse or modify IDs. * Do not reuse or modify IDs.
...@@ -2482,6 +2539,10 @@ union dmub_rb_cmd { ...@@ -2482,6 +2539,10 @@ union dmub_rb_cmd {
* Definition of a DMUB_CMD__DPIA_DIG1_CONTROL command. * Definition of a DMUB_CMD__DPIA_DIG1_CONTROL command.
*/ */
struct dmub_rb_cmd_dig1_dpia_control dig1_dpia_control; struct dmub_rb_cmd_dig1_dpia_control dig1_dpia_control;
/**
* Definition of a DMUB_CMD__DPIA_SET_CONFIG_ACCESS command.
*/
struct dmub_rb_cmd_set_config_access set_config_access;
/** /**
* Definition of a DMUB_CMD__EDID_CEA command. * Definition of a DMUB_CMD__EDID_CEA command.
*/ */
...@@ -2504,6 +2565,10 @@ union dmub_rb_out_cmd { ...@@ -2504,6 +2565,10 @@ union dmub_rb_out_cmd {
* HPD notify command. * HPD notify command.
*/ */
struct dmub_rb_cmd_dp_hpd_notify dp_hpd_notify; struct dmub_rb_cmd_dp_hpd_notify dp_hpd_notify;
/**
* SET_CONFIG reply command.
*/
struct dmub_rb_cmd_dp_set_config_reply set_config_reply;
}; };
#pragma pack(pop) #pragma pack(pop)
......
...@@ -87,6 +87,11 @@ enum dmub_status dmub_srv_stat_get_notification(struct dmub_srv *dmub, ...@@ -87,6 +87,11 @@ enum dmub_status dmub_srv_stat_get_notification(struct dmub_srv *dmub,
notify->link_index = cmd.dp_hpd_notify.hpd_data.instance; notify->link_index = cmd.dp_hpd_notify.hpd_data.instance;
notify->result = AUX_RET_SUCCESS; notify->result = AUX_RET_SUCCESS;
break; break;
case DMUB_OUT_CMD__SET_CONFIG_REPLY:
notify->type = DMUB_NOTIFICATION_SET_CONFIG_REPLY;
notify->link_index = cmd.set_config_reply.set_config_reply_control.instance;
notify->sc_status = cmd.set_config_reply.set_config_reply_control.status;
break;
default: default:
notify->type = DMUB_NOTIFICATION_NO_DATA; notify->type = DMUB_NOTIFICATION_NO_DATA;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment