OSDN Git Service

drm/amd/display: Support for SET_CONFIG processing with DMUB
authorMeenakshikumar Somasundaram <meenakshikumar.somasundaram@amd.com>
Fri, 30 Apr 2021 23:02:33 +0000 (19:02 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 6 Oct 2021 19:52:11 +0000 (15:52 -0400)
[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: 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_link_dpia.c
drivers/gpu/drm/amd/display/dc/core/dc_stat.c
drivers/gpu/drm/amd/display/dc/dc.h
drivers/gpu/drm/amd/display/dc/dm_helpers.h
drivers/gpu/drm/amd/display/dmub/dmub_srv.h
drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
drivers/gpu/drm/amd/display/dmub/src/dmub_srv_stat.c

index 2bbb68c..da942e9 100644 (file)
@@ -3677,6 +3677,56 @@ uint8_t get_link_index_from_dpia_port_index(const struct dc *dc,
 }
 
 /**
+ *****************************************************************************
+ *  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: dc structure
  */
index 15dbea3..6d0ddc8 100644 (file)
@@ -32,6 +32,8 @@
 #include "dpcd_defs.h"
 #include "link_hwss.h"
 #include "inc/link_dpcd.h"
+#include "dm_helpers.h"
+#include "dmub/inc/dmub_cmd.h"
 
 #define DC_LOGGER \
        link->ctx->logger
@@ -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,
-               uint8_t msg_type, uint8_t msg_data)
+       uint8_t msg_type,
+       uint8_t msg_data)
 {
-       /** @todo Implement */
-       return DC_OK;
+       struct set_config_cmd_payload payload;
+       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. */
index 7d4a5dc..4b372aa 100644 (file)
@@ -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 */
        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 =
                        get_link_index_from_dpia_port_index(dc, notify->link_index);
        }
index 8ae369a..dfda896 100644 (file)
@@ -44,6 +44,8 @@
 
 /* forward declaration */
 struct aux_payload;
+struct set_config_cmd_payload;
+struct dmub_notification;
 
 #define DC_VER "3.2.156"
 
@@ -1397,6 +1399,11 @@ bool dc_process_dmub_aux_transfer_async(struct dc *dc,
 /* 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);
+
+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
  ******************************************************************************/
index 3a905fb..0fe66b0 100644 (file)
@@ -179,4 +179,9 @@ int dm_helper_dmub_aux_transfer_sync(
                const struct dc_link *link,
                struct aux_payload *payload,
                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__ */
index efb667c..7a86c97 100644 (file)
@@ -119,6 +119,7 @@ enum dmub_notification_type {
        DMUB_NOTIFICATION_AUX_REPLY,
        DMUB_NOTIFICATION_HPD,
        DMUB_NOTIFICATION_HPD_IRQ,
+       DMUB_NOTIFICATION_SET_CONFIG_REPLY,
        DMUB_NOTIFICATION_MAX
 };
 
@@ -440,6 +441,7 @@ struct dmub_notification {
        union {
                struct aux_reply_data aux_reply;
                enum dp_hpd_status hpd_status;
+               enum set_config_status sc_status;
        };
 };
 
index c5584ed..bf71bec 100644 (file)
@@ -683,11 +683,16 @@ enum dmub_out_cmd_type {
         * Command type used for DP HPD event notification
         */
        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. */
 enum dmub_cmd_dpia_type {
        DMUB_CMD__DPIA_DIG1_DPIA_CONTROL = 0,
+       DMUB_CMD__DPIA_SET_CONFIG_ACCESS = 1,
 };
 
 #pragma pack(push, 1)
@@ -1038,6 +1043,31 @@ struct dmub_rb_cmd_dig1_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 {
@@ -1284,6 +1314,33 @@ struct dmub_rb_cmd_dp_hpd_notify {
        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.
  * Do not reuse or modify IDs.
@@ -2483,6 +2540,10 @@ union dmub_rb_cmd {
         */
        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.
         */
        struct dmub_rb_cmd_edid_cea edid_cea;
@@ -2504,6 +2565,10 @@ union dmub_rb_out_cmd {
         * HPD notify command.
         */
        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)
 
index d7f66e5..44502ec 100644 (file)
@@ -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->result = AUX_RET_SUCCESS;
                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:
                notify->type = DMUB_NOTIFICATION_NO_DATA;
                break;