}
 
                dc->hwss.set_cursor_attribute(pipe_ctx);
+
+               dc_send_update_cursor_info_to_dmu(pipe_ctx, i);
                if (dc->hwss.set_cursor_sdr_white_level)
                        dc->hwss.set_cursor_sdr_white_level(pipe_ctx);
        }
                }
 
                dc->hwss.set_cursor_position(pipe_ctx);
+
+               dc_send_update_cursor_info_to_dmu(pipe_ctx, i);
        }
 
        if (pipe_to_program)
 
 #include "dc_hw_types.h"
 #include "core_types.h"
 #include "../basics/conversion.h"
+#include "cursor_reg_cache.h"
 
 #define CTX dc_dmub_srv->ctx
 #define DC_LOGGER CTX->logger
                diag_data.is_cw0_enabled,
                diag_data.is_cw6_enabled);
 }
+
+static bool dc_dmub_should_update_cursor_data(struct pipe_ctx *pipe_ctx)
+{
+       if (pipe_ctx->plane_state != NULL) {
+               if (pipe_ctx->plane_state->address.type == PLN_ADDR_TYPE_VIDEO_PROGRESSIVE)
+                       return false;
+       }
+
+       if ((pipe_ctx->stream->link->psr_settings.psr_version == DC_PSR_VERSION_SU_1 ||
+               pipe_ctx->stream->link->psr_settings.psr_version == DC_PSR_VERSION_1) &&
+               pipe_ctx->stream->ctx->dce_version >= DCN_VERSION_3_1)
+               return true;
+
+       return false;
+}
+
+static void dc_build_cursor_update_payload0(
+               struct pipe_ctx *pipe_ctx, uint8_t p_idx,
+               struct dmub_cmd_update_cursor_payload0 *payload)
+{
+       struct hubp *hubp = pipe_ctx->plane_res.hubp;
+       unsigned int panel_inst = 0;
+
+       if (!dc_get_edp_link_panel_inst(hubp->ctx->dc,
+               pipe_ctx->stream->link, &panel_inst))
+               return;
+
+       /* Payload: Cursor Rect is built from position & attribute
+        * x & y are obtained from postion
+        */
+       payload->cursor_rect.x = hubp->cur_rect.x;
+       payload->cursor_rect.y = hubp->cur_rect.y;
+       /* w & h are obtained from attribute */
+       payload->cursor_rect.width  = hubp->cur_rect.w;
+       payload->cursor_rect.height = hubp->cur_rect.h;
+
+       payload->enable      = hubp->pos.cur_ctl.bits.cur_enable;
+       payload->pipe_idx    = p_idx;
+       payload->cmd_version = DMUB_CMD_PSR_CONTROL_VERSION_1;
+       payload->panel_inst  = panel_inst;
+}
+
+static void dc_send_cmd_to_dmu(struct dc_dmub_srv *dmub_srv,
+               union dmub_rb_cmd *cmd)
+{
+       dc_dmub_srv_cmd_queue(dmub_srv, cmd);
+       dc_dmub_srv_cmd_execute(dmub_srv);
+       dc_dmub_srv_wait_idle(dmub_srv);
+}
+
+static void dc_build_cursor_position_update_payload0(
+               struct dmub_cmd_update_cursor_payload0 *pl, const uint8_t p_idx,
+               const struct hubp *hubp, const struct dpp *dpp)
+{
+       /* Hubp */
+       pl->position_cfg.pHubp.cur_ctl.raw  = hubp->pos.cur_ctl.raw;
+       pl->position_cfg.pHubp.position.raw = hubp->pos.position.raw;
+       pl->position_cfg.pHubp.hot_spot.raw = hubp->pos.hot_spot.raw;
+       pl->position_cfg.pHubp.dst_offset.raw = hubp->pos.dst_offset.raw;
+
+       /* dpp */
+       pl->position_cfg.pDpp.cur0_ctl.raw = dpp->pos.cur0_ctl.raw;
+       pl->position_cfg.pipe_idx = p_idx;
+}
+
+static void dc_build_cursor_attribute_update_payload1(
+               struct dmub_cursor_attributes_cfg *pl_A, const uint8_t p_idx,
+               const struct hubp *hubp, const struct dpp *dpp)
+{
+       /* Hubp */
+       pl_A->aHubp.SURFACE_ADDR_HIGH = hubp->att.SURFACE_ADDR_HIGH;
+       pl_A->aHubp.SURFACE_ADDR = hubp->att.SURFACE_ADDR;
+       pl_A->aHubp.cur_ctl.raw  = hubp->att.cur_ctl.raw;
+       pl_A->aHubp.size.raw     = hubp->att.size.raw;
+       pl_A->aHubp.settings.raw = hubp->att.settings.raw;
+
+       /* dpp */
+       pl_A->aDpp.cur0_ctl.raw = dpp->att.cur0_ctl.raw;
+}
+
+/**
+ * ***************************************************************************************
+ * dc_send_update_cursor_info_to_dmu: Populate the DMCUB Cursor update info command
+ *
+ * This function would store the cursor related information and pass it into dmub
+ *
+ * @param [in] pCtx: pipe context
+ * @param [in] pipe_idx: pipe index
+ *
+ * @return: void
+ *
+ * ***************************************************************************************
+ */
+
+void dc_send_update_cursor_info_to_dmu(
+               struct pipe_ctx *pCtx, uint8_t pipe_idx)
+{
+       union dmub_rb_cmd cmd = { 0 };
+       union dmub_cmd_update_cursor_info_data *update_cursor_info =
+                                       &cmd.update_cursor_info.update_cursor_info_data;
+
+       if (!dc_dmub_should_update_cursor_data(pCtx))
+               return;
+       /*
+        * Since we use multi_cmd_pending for dmub command, the 2nd command is
+        * only assigned to store cursor attributes info.
+        * 1st command can view as 2 parts, 1st is for PSR/Replay data, the other
+        * is to store cursor position info.
+        *
+        * Command heaer type must be the same type if using  multi_cmd_pending.
+        * Besides, while process 2nd command in DMU, the sub type is useless.
+        * So it's meanless to pass the sub type header with different type.
+        */
+
+       {
+               /* Build Payload#0 Header */
+               cmd.update_cursor_info.header.type = DMUB_CMD__UPDATE_CURSOR_INFO;
+               cmd.update_cursor_info.header.payload_bytes =
+                               sizeof(cmd.update_cursor_info.update_cursor_info_data);
+               cmd.update_cursor_info.header.multi_cmd_pending = 1; /* To combine multi dmu cmd, 1st cmd */
+
+               /* Prepare Payload */
+               dc_build_cursor_update_payload0(pCtx, pipe_idx, &update_cursor_info->payload0);
+
+               dc_build_cursor_position_update_payload0(&update_cursor_info->payload0, pipe_idx,
+                               pCtx->plane_res.hubp, pCtx->plane_res.dpp);
+               /* Send update_curosr_info to queue */
+               dc_dmub_srv_cmd_queue(pCtx->stream->ctx->dmub_srv, &cmd);
+       }
+       {
+               /* Build Payload#1 Header */
+               memset(update_cursor_info, 0, sizeof(union dmub_cmd_update_cursor_info_data));
+               cmd.update_cursor_info.header.type = DMUB_CMD__UPDATE_CURSOR_INFO;
+               cmd.update_cursor_info.header.payload_bytes = sizeof(struct cursor_attributes_cfg);
+               cmd.update_cursor_info.header.multi_cmd_pending = 0; /* Indicate it's the last command. */
+
+               dc_build_cursor_attribute_update_payload1(
+                               &cmd.update_cursor_info.update_cursor_info_data.payload1.attribute_cfg,
+                               pipe_idx, pCtx->plane_res.hubp, pCtx->plane_res.dpp);
+
+               /* Combine 2nd cmds update_curosr_info to DMU */
+               dc_send_cmd_to_dmu(pCtx->stream->ctx->dmub_srv, &cmd);
+       }
+}
 
 void dc_dmub_setup_subvp_dmub_command(struct dc *dc, struct dc_state *context, bool enable);
 void dc_dmub_srv_log_diagnostic_data(struct dc_dmub_srv *dc_dmub_srv);
 
+void dc_send_update_cursor_info_to_dmu(struct pipe_ctx *pCtx, uint8_t pipe_idx);
 #endif /* _DMUB_DC_SRV_H_ */
 
        REG_UPDATE(CURSOR0_CONTROL,
                        CUR0_ENABLE, cur_en);
 
+       dpp_base->pos.cur0_ctl.bits.cur0_enable = cur_en;
 }
 
 void dpp1_cnv_set_optional_cursor_attributes(
 
        return false;
 }
 
-static bool dcn10_dmub_should_update_cursor_data(
-               struct pipe_ctx *pipe_ctx,
-               struct dc_debug_options *debug)
-{
-       if (pipe_ctx->plane_state->address.type == PLN_ADDR_TYPE_VIDEO_PROGRESSIVE)
-               return false;
-
-       if (dcn10_can_pipe_disable_cursor(pipe_ctx))
-               return false;
-
-       if ((pipe_ctx->stream->link->psr_settings.psr_version == DC_PSR_VERSION_SU_1 || pipe_ctx->stream->link->psr_settings.psr_version == DC_PSR_VERSION_1)
-                       && pipe_ctx->stream->ctx->dce_version >= DCN_VERSION_3_1)
-               return true;
-
-       return false;
-}
-
-static void dcn10_dmub_update_cursor_data(
-               struct pipe_ctx *pipe_ctx,
-               struct hubp *hubp,
-               const struct dc_cursor_mi_param *param,
-               const struct dc_cursor_position *cur_pos,
-               const struct dc_cursor_attributes *cur_attr)
-{
-       union dmub_rb_cmd cmd;
-       struct dmub_cmd_update_cursor_info_data *update_cursor_info;
-       const struct dc_cursor_position *pos;
-       const struct dc_cursor_attributes *attr;
-       int src_x_offset = 0;
-       int src_y_offset = 0;
-       int x_hotspot = 0;
-       int cursor_height = 0;
-       int cursor_width = 0;
-       uint32_t cur_en = 0;
-       unsigned int panel_inst = 0;
-
-       struct dc_debug_options *debug = &hubp->ctx->dc->debug;
-
-       if (!dcn10_dmub_should_update_cursor_data(pipe_ctx, debug))
-               return;
-       /**
-        * if cur_pos == NULL means the caller is from cursor_set_attribute
-        * then driver use previous cursor position data
-        * if cur_attr == NULL means the caller is from cursor_set_position
-        * then driver use previous cursor attribute
-        * if cur_pos or cur_attr is not NULL then update it
-        */
-       if (cur_pos != NULL)
-               pos = cur_pos;
-       else
-               pos = &hubp->curs_pos;
-
-       if (cur_attr != NULL)
-               attr = cur_attr;
-       else
-               attr = &hubp->curs_attr;
-
-       if (!dc_get_edp_link_panel_inst(hubp->ctx->dc, pipe_ctx->stream->link, &panel_inst))
-               return;
-
-       src_x_offset = pos->x - pos->x_hotspot - param->viewport.x;
-       src_y_offset = pos->y - pos->y_hotspot - param->viewport.y;
-       x_hotspot = pos->x_hotspot;
-       cursor_height = (int)attr->height;
-       cursor_width = (int)attr->width;
-       cur_en = pos->enable ? 1:0;
-
-       // Rotated cursor width/height and hotspots tweaks for offset calculation
-       if (param->rotation == ROTATION_ANGLE_90 || param->rotation == ROTATION_ANGLE_270) {
-               swap(cursor_height, cursor_width);
-               if (param->rotation == ROTATION_ANGLE_90) {
-                       src_x_offset = pos->x - pos->y_hotspot - param->viewport.x;
-                       src_y_offset = pos->y - pos->x_hotspot - param->viewport.y;
-               }
-       } else if (param->rotation == ROTATION_ANGLE_180) {
-               src_x_offset = pos->x - param->viewport.x;
-               src_y_offset = pos->y - param->viewport.y;
-       }
-
-       if (param->mirror) {
-               x_hotspot = param->viewport.width - x_hotspot;
-               src_x_offset = param->viewport.x + param->viewport.width - src_x_offset;
-       }
-
-       if (src_x_offset >= (int)param->viewport.width)
-               cur_en = 0;  /* not visible beyond right edge*/
-
-       if (src_x_offset + cursor_width <= 0)
-               cur_en = 0;  /* not visible beyond left edge*/
-
-       if (src_y_offset >= (int)param->viewport.height)
-               cur_en = 0;  /* not visible beyond bottom edge*/
-
-       if (src_y_offset + cursor_height <= 0)
-               cur_en = 0;  /* not visible beyond top edge*/
-
-       // Cursor bitmaps have different hotspot values
-       // There's a possibility that the above logic returns a negative value, so we clamp them to 0
-       if (src_x_offset < 0)
-               src_x_offset = 0;
-       if (src_y_offset < 0)
-               src_y_offset = 0;
-
-       memset(&cmd, 0x0, sizeof(cmd));
-       cmd.update_cursor_info.header.type = DMUB_CMD__UPDATE_CURSOR_INFO;
-       cmd.update_cursor_info.header.payload_bytes =
-                       sizeof(cmd.update_cursor_info.update_cursor_info_data);
-       update_cursor_info = &cmd.update_cursor_info.update_cursor_info_data;
-       update_cursor_info->cursor_rect.x = src_x_offset + param->viewport.x;
-       update_cursor_info->cursor_rect.y = src_y_offset + param->viewport.y;
-       update_cursor_info->cursor_rect.width = attr->width;
-       update_cursor_info->cursor_rect.height = attr->height;
-       update_cursor_info->enable = cur_en;
-       update_cursor_info->pipe_idx = pipe_ctx->pipe_idx;
-       update_cursor_info->cmd_version = DMUB_CMD_PSR_CONTROL_VERSION_1;
-       update_cursor_info->panel_inst = panel_inst;
-       dc_dmub_srv_cmd_queue(pipe_ctx->stream->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(pipe_ctx->stream->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(pipe_ctx->stream->ctx->dmub_srv);
-}
-
 void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)
 {
        struct dc_cursor_position pos_cpy = pipe_ctx->stream->cursor_position;
                        pipe_ctx->plane_res.scl_data.viewport.height - pos_cpy.y;
        }
 
-       dcn10_dmub_update_cursor_data(pipe_ctx, hubp, ¶m, &pos_cpy, NULL);
        hubp->funcs->set_cursor_position(hubp, &pos_cpy, ¶m);
        dpp->funcs->set_cursor_position(dpp, &pos_cpy, ¶m, hubp->curs_attr.width, hubp->curs_attr.height);
 }
 void dcn10_set_cursor_attribute(struct pipe_ctx *pipe_ctx)
 {
        struct dc_cursor_attributes *attributes = &pipe_ctx->stream->cursor_attributes;
-       struct dc_cursor_mi_param param = { 0 };
-
-       /**
-        * If enter PSR without cursor attribute update
-        * the cursor attribute of dmub_restore_plane
-        * are initial value. call dmub to exit PSR and
-        * restore plane then update cursor attribute to
-        * avoid override with initial value
-        */
-       if (pipe_ctx->plane_state != NULL) {
-               param.pixel_clk_khz = pipe_ctx->stream->timing.pix_clk_100hz / 10;
-               param.ref_clk_khz = pipe_ctx->stream->ctx->dc->res_pool->ref_clocks.dchub_ref_clock_inKhz;
-               param.viewport = pipe_ctx->plane_res.scl_data.viewport;
-               param.h_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.horz;
-               param.v_scale_ratio = pipe_ctx->plane_res.scl_data.ratios.vert;
-               param.rotation = pipe_ctx->plane_state->rotation;
-               param.mirror = pipe_ctx->plane_state->horizontal_mirror;
-               dcn10_dmub_update_cursor_data(pipe_ctx, pipe_ctx->plane_res.hubp, ¶m, NULL, attributes);
-       }
 
        pipe_ctx->plane_res.hubp->funcs->set_cursor_attributes(
                        pipe_ctx->plane_res.hubp, attributes);
 
                        CURSOR0_DST_Y_OFFSET, 0,
                         /* used to shift the cursor chunk request deadline */
                        CURSOR0_CHUNK_HDL_ADJUST, 3);
+
+       hubp->att.SURFACE_ADDR_HIGH  = attr->address.high_part;
+       hubp->att.SURFACE_ADDR       = attr->address.low_part;
+       hubp->att.size.bits.width    = attr->width;
+       hubp->att.size.bits.height   = attr->height;
+       hubp->att.cur_ctl.bits.mode  = attr->color_format;
+       hubp->att.cur_ctl.bits.pitch = hw_pitch;
+       hubp->att.cur_ctl.bits.line_per_chunk = lpc;
+       hubp->att.cur_ctl.bits.cur_2x_magnify = attr->attribute_flags.bits.ENABLE_MAGNIFICATION;
+       hubp->att.settings.bits.dst_y_offset  = 0;
+       hubp->att.settings.bits.chunk_hdl_adjust = 3;
 }
 
 void hubp2_dmdata_set_attributes(
        REG_SET(CURSOR_DST_OFFSET, 0,
                        CURSOR_DST_X_OFFSET, dst_x_offset);
        /* TODO Handle surface pixel formats other than 4:4:4 */
+       /* Cursor Position Register Config */
+       hubp->pos.cur_ctl.bits.cur_enable = cur_en;
+       hubp->pos.position.bits.x_pos = pos->x;
+       hubp->pos.position.bits.y_pos = pos->y;
+       hubp->pos.hot_spot.bits.x_hot = x_hotspot;
+       hubp->pos.hot_spot.bits.y_hot = y_hotspot;
+       hubp->pos.dst_offset.bits.dst_x_offset = dst_x_offset;
+       /* Cursor Rectangle Cache
+        * Cursor bitmaps have different hotspot values
+        * There's a possibility that the above logic returns a negative value,
+        * so we clamp them to 0
+        */
+       if (src_x_offset < 0)
+               src_x_offset = 0;
+       if (src_y_offset < 0)
+               src_y_offset = 0;
+       /* Save necessary cursor info x, y position. w, h is saved in attribute func. */
+       hubp->cur_rect.x = src_x_offset + param->viewport.x;
+       hubp->cur_rect.y = src_y_offset + param->viewport.y;
 }
 
 void hubp2_clk_cntl(struct hubp *hubp, bool enable)
 
                REG_UPDATE(CURSOR0_COLOR1,
                                CUR0_COLOR1, 0xFFFFFFFF);
        }
+
+       dpp_base->att.cur0_ctl.bits.expansion_mode = 0;
+       dpp_base->att.cur0_ctl.bits.cur0_rom_en = cur_rom_en;
+       dpp_base->att.cur0_ctl.bits.mode = color_format;
 }
 
 
 
--- /dev/null
+/* Copyright © 2022 Advanced Micro Devices, Inc. All rights reserved. */
+
+#ifndef __DAL_CURSOR_CACHE_H__
+#define __DAL_CURSOR_CACHE_H__
+
+union reg_cursor_control_cfg {
+       struct {
+               uint32_t     cur_enable: 1;
+               uint32_t         reser0: 3;
+               uint32_t cur_2x_magnify: 1;
+               uint32_t         reser1: 3;
+               uint32_t           mode: 3;
+               uint32_t         reser2: 5;
+               uint32_t          pitch: 2;
+               uint32_t         reser3: 6;
+               uint32_t line_per_chunk: 5;
+               uint32_t         reser4: 3;
+       } bits;
+       uint32_t raw;
+};
+struct cursor_position_cache_hubp {
+       union reg_cursor_control_cfg cur_ctl;
+       union reg_position_cfg {
+               struct {
+                       uint32_t x_pos: 16;
+                       uint32_t y_pos: 16;
+               } bits;
+               uint32_t raw;
+       } position;
+       union reg_hot_spot_cfg {
+               struct {
+                       uint32_t x_hot: 16;
+                       uint32_t y_hot: 16;
+               } bits;
+               uint32_t raw;
+       } hot_spot;
+       union reg_dst_offset_cfg {
+               struct {
+                       uint32_t dst_x_offset: 13;
+                       uint32_t     reserved: 19;
+               } bits;
+               uint32_t raw;
+       } dst_offset;
+};
+
+struct cursor_attribute_cache_hubp {
+       uint32_t SURFACE_ADDR_HIGH;
+       uint32_t SURFACE_ADDR;
+       union    reg_cursor_control_cfg  cur_ctl;
+       union    reg_cursor_size_cfg {
+               struct {
+                       uint32_t  width: 16;
+                       uint32_t height: 16;
+               } bits;
+               uint32_t raw;
+       } size;
+       union    reg_cursor_settings_cfg {
+               struct {
+                       uint32_t     dst_y_offset: 8;
+                       uint32_t chunk_hdl_adjust: 2;
+                       uint32_t         reserved: 22;
+               } bits;
+               uint32_t raw;
+       } settings;
+};
+
+struct cursor_rect {
+       uint32_t x;
+       uint32_t y;
+       uint32_t w;
+       uint32_t h;
+};
+
+union reg_cur0_control_cfg {
+       struct {
+               uint32_t     cur0_enable: 1;
+               uint32_t  expansion_mode: 1;
+               uint32_t          reser0: 1;
+               uint32_t     cur0_rom_en: 1;
+               uint32_t            mode: 3;
+               uint32_t        reserved: 25;
+       } bits;
+       uint32_t raw;
+};
+struct cursor_position_cache_dpp {
+       union reg_cur0_control_cfg cur0_ctl;
+};
+
+struct cursor_attribute_cache_dpp {
+       union reg_cur0_control_cfg cur0_ctl;
+};
+
+struct cursor_attributes_cfg {
+       struct  cursor_attribute_cache_hubp aHubp;
+       struct  cursor_attribute_cache_dpp  aDpp;
+};
+
+#endif
 
 #define __DAL_DPP_H__
 
 #include "transform.h"
+#include "cursor_reg_cache.h"
 
 union defer_reg_writes {
        struct {
 
        struct pwl_params shaper_params;
        bool cm_bypass_mode;
+
+       struct cursor_position_cache_dpp  pos;
+       struct cursor_attribute_cache_dpp att;
 };
 
 struct dpp_input_csc_matrix {
 
 #define __DAL_HUBP_H__
 
 #include "mem_input.h"
+#include "cursor_reg_cache.h"
 
 #define OPP_ID_INVALID 0xf
 #define MAX_TTU 0xffffff
        struct dc_cursor_attributes curs_attr;
        struct dc_cursor_position curs_pos;
        bool power_gated;
+
+       struct cursor_position_cache_hubp  pos;
+       struct cursor_attribute_cache_hubp att;
+       struct cursor_rect cur_rect;
 };
 
 struct surface_flip_registers {
 
        DMUB_CMD__DPIA_MST_ALLOC_SLOTS = 2,
 };
 
-enum dmub_cmd_header_sub_type {
-       DMUB_CMD__SUB_TYPE_GENERAL         = 0,
-       DMUB_CMD__SUB_TYPE_CURSOR_POSITION = 1
-};
-
 #pragma pack(push, 1)
 
 /**
 /**
  * Data passed from driver to FW in a DMUB_CMD__UPDATE_CURSOR_INFO command.
  */
-struct dmub_cmd_update_cursor_info_data {
+union dmub_reg_cursor_control_cfg {
+       struct {
+               uint32_t     cur_enable: 1;
+               uint32_t         reser0: 3;
+               uint32_t cur_2x_magnify: 1;
+               uint32_t         reser1: 3;
+               uint32_t           mode: 3;
+               uint32_t         reser2: 5;
+               uint32_t          pitch: 2;
+               uint32_t         reser3: 6;
+               uint32_t line_per_chunk: 5;
+               uint32_t         reser4: 3;
+       } bits;
+       uint32_t raw;
+};
+struct dmub_cursor_position_cache_hubp {
+       union dmub_reg_cursor_control_cfg cur_ctl;
+       union dmub_reg_position_cfg {
+               struct {
+                       uint32_t cur_x_pos: 16;
+                       uint32_t cur_y_pos: 16;
+               } bits;
+               uint32_t raw;
+       } position;
+       union dmub_reg_hot_spot_cfg {
+               struct {
+                       uint32_t hot_x: 16;
+                       uint32_t hot_y: 16;
+               } bits;
+               uint32_t raw;
+       } hot_spot;
+       union dmub_reg_dst_offset_cfg {
+               struct {
+                       uint32_t dst_x_offset: 13;
+                       uint32_t reserved: 19;
+               } bits;
+               uint32_t raw;
+       } dst_offset;
+};
+
+union dmub_reg_cur0_control_cfg {
+       struct {
+               uint32_t     cur0_enable: 1;
+               uint32_t  expansion_mode: 1;
+               uint32_t          reser0: 1;
+               uint32_t     cur0_rom_en: 1;
+               uint32_t            mode: 3;
+               uint32_t        reserved: 25;
+       } bits;
+       uint32_t raw;
+};
+struct dmub_cursor_position_cache_dpp {
+       union dmub_reg_cur0_control_cfg cur0_ctl;
+};
+struct dmub_cursor_position_cfg {
+       struct  dmub_cursor_position_cache_hubp pHubp;
+       struct  dmub_cursor_position_cache_dpp  pDpp;
+       uint8_t pipe_idx;
+       /*
+        * Padding is required. To be 4 Bytes Aligned.
+        */
+       uint8_t padding[3];
+};
+
+struct dmub_cursor_attribute_cache_hubp {
+       uint32_t SURFACE_ADDR_HIGH;
+       uint32_t SURFACE_ADDR;
+       union    dmub_reg_cursor_control_cfg  cur_ctl;
+       union    dmub_reg_cursor_size_cfg {
+               struct {
+                       uint32_t width: 16;
+                       uint32_t height: 16;
+               } bits;
+               uint32_t raw;
+       } size;
+       union    dmub_reg_cursor_settings_cfg {
+               struct {
+                       uint32_t     dst_y_offset: 8;
+                       uint32_t chunk_hdl_adjust: 2;
+                       uint32_t         reserved: 22;
+               } bits;
+               uint32_t raw;
+       } settings;
+};
+struct dmub_cursor_attribute_cache_dpp {
+       union dmub_reg_cur0_control_cfg cur0_ctl;
+};
+struct dmub_cursor_attributes_cfg {
+       struct  dmub_cursor_attribute_cache_hubp aHubp;
+       struct  dmub_cursor_attribute_cache_dpp  aDpp;
+};
+
+struct dmub_cmd_update_cursor_payload0 {
        /**
         * Cursor dirty rects.
         */
         * Currently the support is only for 0 or 1
         */
        uint8_t panel_inst;
+       /**
+        * Cursor Position Register.
+        * Registers contains Hubp & Dpp modules
+        */
+       struct dmub_cursor_position_cfg position_cfg;
+};
+
+struct dmub_cmd_update_cursor_payload1 {
+       struct dmub_cursor_attributes_cfg attribute_cfg;
+};
+
+union dmub_cmd_update_cursor_info_data {
+       struct dmub_cmd_update_cursor_payload0 payload0;
+       struct dmub_cmd_update_cursor_payload1 payload1;
 };
 /**
  * Definition of a DMUB_CMD__UPDATE_CURSOR_INFO command.
        /**
         * Data passed from driver to FW in a DMUB_CMD__UPDATE_CURSOR_INFO command.
         */
-       struct dmub_cmd_update_cursor_info_data update_cursor_info_data;
+       union dmub_cmd_update_cursor_info_data update_cursor_info_data;
 };
 
 /**