drm/amd/display: [FW Promotion] Release 0.0.35
authorAnthony Koo <Anthony.Koo@amd.com>
Fri, 25 Sep 2020 14:54:54 +0000 (10:54 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 29 Sep 2020 20:11:04 +0000 (16:11 -0400)
[Header Changes]
   - Definition for retaining ABM settings during disable
   - Addition of some new AUX interface definitions
   - Addition of some outbox definitions

Signed-off-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h

index 0051b10..d103ec1 100644 (file)
 
 /* Firmware versioning. */
 #ifdef DMUB_EXPOSE_VERSION
-#define DMUB_FW_VERSION_GIT_HASH 0xf547f0b9d
+#define DMUB_FW_VERSION_GIT_HASH 0x9cf8f05fe
 #define DMUB_FW_VERSION_MAJOR 0
 #define DMUB_FW_VERSION_MINOR 0
-#define DMUB_FW_VERSION_REVISION 34
+#define DMUB_FW_VERSION_REVISION 35
 #define DMUB_FW_VERSION_TEST 0
 #define DMUB_FW_VERSION_VBIOS 0
 #define DMUB_FW_VERSION_HOTFIX 0
@@ -57,6 +57,7 @@
 
 #define SET_ABM_PIPE_GRADUALLY_DISABLE           0
 #define SET_ABM_PIPE_IMMEDIATELY_DISABLE         255
+#define SET_ABM_PIPE_IMMEDIATE_KEEP_GAIN_DISABLE 254
 #define SET_ABM_PIPE_NORMAL                      1
 
 /* Maximum number of streams on any ASIC. */
 #define PHYSICAL_ADDRESS_LOC union large_integer
 #endif
 
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
 #ifndef dmub_memcpy
 #define dmub_memcpy(dest, source, bytes) memcpy((dest), (source), (bytes))
 #endif
@@ -81,6 +78,10 @@ extern "C" {
 #define dmub_memset(dest, val, bytes) memset((dest), (val), (bytes))
 #endif
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 #ifndef dmub_udelay
 #define dmub_udelay(microseconds) udelay(microseconds)
 #endif
@@ -299,11 +300,15 @@ enum dmub_cmd_type {
        DMUB_CMD__PSR = 64,
        DMUB_CMD__ABM = 66,
        DMUB_CMD__HW_LOCK = 69,
+       DMUB_CMD__DP_AUX_ACCESS = 70,
+       DMUB_CMD__OUTBOX1_ENABLE = 71,
        DMUB_CMD__VBIOS = 128,
 };
 
 enum dmub_out_cmd_type {
        DMUB_OUT_CMD__NULL = 0,
+       DMUB_OUT_CMD__DP_AUX_REPLY = 1,
+       DMUB_OUT_CMD__DP_HPD_NOTIFY = 2,
 };
 
 #pragma pack(push, 1)
@@ -461,6 +466,78 @@ struct dmub_rb_cmd_dpphy_init {
        uint8_t reserved[60];
 };
 
+enum dp_aux_request_action {
+       DP_AUX_REQ_ACTION_I2C_WRITE             = 0x00,
+       DP_AUX_REQ_ACTION_I2C_READ              = 0x10,
+       DP_AUX_REQ_ACTION_I2C_STATUS_REQ        = 0x20,
+       DP_AUX_REQ_ACTION_I2C_WRITE_MOT         = 0x40,
+       DP_AUX_REQ_ACTION_I2C_READ_MOT          = 0x50,
+       DP_AUX_REQ_ACTION_I2C_STATUS_REQ_MOT    = 0x60,
+       DP_AUX_REQ_ACTION_DPCD_WRITE            = 0x80,
+       DP_AUX_REQ_ACTION_DPCD_READ             = 0x90
+};
+
+/* DP AUX command */
+struct aux_transaction_parameters {
+       uint8_t is_i2c_over_aux;
+       uint8_t action;
+       uint8_t length;
+       uint8_t pad;
+       uint32_t address;
+       uint8_t data[16];
+};
+
+struct dmub_cmd_dp_aux_control_data {
+       uint32_t handle;
+       uint8_t port_index;
+       uint8_t sw_crc_enabled;
+       uint16_t timeout;
+       struct aux_transaction_parameters dpaux;
+};
+
+struct dmub_rb_cmd_dp_aux_access {
+       struct dmub_cmd_header header;
+       struct dmub_cmd_dp_aux_control_data aux_control;
+};
+
+struct dmub_rb_cmd_outbox1_enable {
+       struct dmub_cmd_header header;
+       uint32_t enable;
+};
+
+/* DP AUX Reply command - OutBox Cmd */
+struct aux_reply_data {
+       uint8_t command;
+       uint8_t length;
+       uint8_t pad[2];
+       uint8_t data[16];
+};
+
+struct aux_reply_control_data {
+       uint32_t handle;
+       uint8_t phy_port_index;
+       uint8_t result;
+       uint16_t pad;
+};
+
+struct dmub_rb_cmd_dp_aux_reply {
+       struct dmub_cmd_header header;
+       struct aux_reply_control_data control;
+       struct aux_reply_data reply_data;
+};
+
+struct dp_hpd_data {
+       uint8_t phy_port_index;
+       uint8_t hpd_type;
+       uint8_t hpd_status;
+       uint8_t pad;
+};
+
+struct dmub_rb_cmd_dp_hpd_notify {
+       struct dmub_cmd_header header;
+       struct dp_hpd_data hpd_data;
+};
+
 /*
  * Command IDs should be treated as stable ABI.
  * Do not reuse or modify IDs.
@@ -690,8 +767,15 @@ union dmub_rb_cmd {
        struct dmub_rb_cmd_abm_set_ambient_level abm_set_ambient_level;
        struct dmub_rb_cmd_abm_set_pwm_frac abm_set_pwm_frac;
        struct dmub_rb_cmd_abm_init_config abm_init_config;
+       struct dmub_rb_cmd_dp_aux_access dp_aux_access;
+       struct dmub_rb_cmd_outbox1_enable outbox1_enable;
 };
 
+union dmub_rb_out_cmd {
+       struct dmub_rb_cmd_common cmd_common;
+       struct dmub_rb_cmd_dp_aux_reply dp_aux_reply;
+       struct dmub_rb_cmd_dp_hpd_notify dp_hpd_notify;
+};
 #pragma pack(pop)
 
 
@@ -764,6 +848,25 @@ static inline bool dmub_rb_push_front(struct dmub_rb *rb,
        return true;
 }
 
+static inline bool dmub_rb_out_push_front(struct dmub_rb *rb,
+                                     const union dmub_rb_out_cmd *cmd)
+{
+       uint8_t *dst = (uint8_t *)(rb->base_address) + rb->wrpt;
+       const uint8_t *src = (uint8_t *)cmd;
+
+       if (dmub_rb_full(rb))
+               return false;
+
+       dmub_memcpy(dst, src, DMUB_RB_CMD_SIZE);
+
+       rb->wrpt += DMUB_RB_CMD_SIZE;
+
+       if (rb->wrpt >= rb->capacity)
+               rb->wrpt %= rb->capacity;
+
+       return true;
+}
+
 static inline bool dmub_rb_front(struct dmub_rb *rb,
                                 union dmub_rb_cmd  *cmd)
 {
@@ -777,6 +880,23 @@ static inline bool dmub_rb_front(struct dmub_rb *rb,
        return true;
 }
 
+static inline bool dmub_rb_out_front(struct dmub_rb *rb,
+                                union dmub_rb_out_cmd  *cmd)
+{
+       const uint64_t volatile *src = (const uint64_t volatile *)(rb->base_address) + rb->rptr / sizeof(uint64_t);
+       uint64_t *dst = (uint64_t *)cmd;
+       int i;
+
+       if (dmub_rb_empty(rb))
+               return false;
+
+       // copying data
+       for (i = 0; i < DMUB_RB_CMD_SIZE / sizeof(uint64_t); i++)
+               *dst++ = *src++;
+
+       return true;
+}
+
 static inline bool dmub_rb_pop_front(struct dmub_rb *rb)
 {
        if (dmub_rb_empty(rb))