input->cea_total_length = total_length;
        memcpy(input->payload, data, length);
 
-       res = dc_dmub_srv_cmd_with_reply_data(dm->dc->ctx->dmub_srv, &cmd);
+       res = dm_execute_dmub_cmd(dm->dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY);
        if (!res) {
                DRM_ERROR("EDID CEA parser failed\n");
                return false;
 
        return false;
 }
+
+bool dm_execute_dmub_cmd(const struct dc_context *ctx, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type)
+{
+       return dc_dmub_srv_cmd_run(ctx->dmub_srv, cmd, wait_type);
+}
+
+bool dm_execute_dmub_cmd_list(const struct dc_context *ctx, unsigned int count, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type)
+{
+       return dc_dmub_srv_cmd_run_list(ctx->dmub_srv, count, cmd, wait_type);
+}
 
                sizeof(cmd.digx_encoder_control.header);
        cmd.digx_encoder_control.encoder_control.dig.stream_param = *dig;
 
-       dc_dmub_srv_cmd_queue(dmcub, &cmd);
-       dc_dmub_srv_cmd_execute(dmcub);
-       dc_dmub_srv_wait_idle(dmcub);
+       dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static enum bp_result encoder_control_digx_v1_5(
                sizeof(cmd.dig1_transmitter_control.header);
        cmd.dig1_transmitter_control.transmitter_control.dig = *dig;
 
-       dc_dmub_srv_cmd_queue(dmcub, &cmd);
-       dc_dmub_srv_cmd_execute(dmcub);
-       dc_dmub_srv_wait_idle(dmcub);
+       dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static enum bp_result transmitter_control_v1_6(
                sizeof(cmd.dig1_transmitter_control.header);
        cmd.dig1_transmitter_control.transmitter_control.dig_v1_7 = *dig;
 
-       dc_dmub_srv_cmd_queue(dmcub, &cmd);
-       dc_dmub_srv_cmd_execute(dmcub);
-       dc_dmub_srv_wait_idle(dmcub);
+       dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static enum bp_result transmitter_control_v1_7(
                sizeof(cmd.set_pixel_clock.header);
        cmd.set_pixel_clock.pixel_clock.clk = *clk;
 
-       dc_dmub_srv_cmd_queue(dmcub, &cmd);
-       dc_dmub_srv_cmd_execute(dmcub);
-       dc_dmub_srv_wait_idle(dmcub);
+       dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static enum bp_result set_pixel_clock_v7(
                sizeof(cmd.enable_disp_power_gating.header);
        cmd.enable_disp_power_gating.power_gating.pwr = *pwr;
 
-       dc_dmub_srv_cmd_queue(dmcub, &cmd);
-       dc_dmub_srv_cmd_execute(dmcub);
-       dc_dmub_srv_wait_idle(dmcub);
+       dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static enum bp_result enable_disp_power_gating_v2_1(
                        panel_instance;
        cmd.lvtma_control.data.bypass_panel_control_wait =
                        bypass_panel_control_wait;
-       dc_dmub_srv_cmd_queue(dmcub, &cmd);
-       dc_dmub_srv_cmd_execute(dmcub);
-       dc_dmub_srv_wait_idle(dmcub);
-
+       dm_execute_dmub_cmd(dmcub->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static enum bp_result enable_lvtma_control(
 
        cmd.notify_clocks.clocks.dispclk_khz = clk_mgr_base->clks.dispclk_khz;
        cmd.notify_clocks.clocks.dppclk_khz = clk_mgr_base->clks.dppclk_khz;
 
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static int get_vco_frequency_from_reg(struct clk_mgr_internal *clk_mgr)
 
        cmd.notify_clocks.clocks.dispclk_khz = clk_mgr_base->clks.dispclk_khz;
        cmd.notify_clocks.clocks.dppclk_khz = clk_mgr_base->clks.dppclk_khz;
 
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static int get_vco_frequency_from_reg(struct clk_mgr_internal *clk_mgr)
 
        cmd.notify_clocks.clocks.dispclk_khz = clk_mgr_base->clks.dispclk_khz;
        cmd.notify_clocks.clocks.dppclk_khz = clk_mgr_base->clks.dppclk_khz;
 
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static void dcn315_dump_clk_registers(struct clk_state_registers_and_bypass *regs_and_bypass,
 
        cmd.notify_clocks.clocks.dispclk_khz = clk_mgr_base->clks.dispclk_khz;
        cmd.notify_clocks.clocks.dppclk_khz = clk_mgr_base->clks.dppclk_khz;
 
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static void dcn316_dump_clk_registers(struct clk_state_registers_and_bypass *regs_and_bypass,
 
                cmd.secure_display.roi_info.y_end = rect->y + rect->height;
        }
 
-       dc_dmub_srv_cmd_queue(dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dmub_srv);
+       dm_execute_dmub_cmd(dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);
 }
 
 static inline void
                               struct dc_state *context)
 {
        union dmub_rb_cmd cmd;
-       struct dc_context *dc_ctx = dc->ctx;
        struct dmub_cmd_update_dirty_rect_data *update_dirty_rect;
        unsigned int i, j;
        unsigned int panel_inst = 0;
 
                        update_dirty_rect->panel_inst = panel_inst;
                        update_dirty_rect->pipe_idx = j;
-                       dc_dmub_srv_cmd_queue(dc_ctx->dmub_srv, &cmd);
-                       dc_dmub_srv_cmd_execute(dc_ctx->dmub_srv);
+                       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);
                }
        }
 }
 {
        uint8_t action;
        union dmub_rb_cmd cmd = {0};
-       struct dc_dmub_srv *dmub_srv = dc->ctx->dmub_srv;
 
        ASSERT(payload->length <= 16);
 
                        );
        }
 
-       dc_dmub_srv_cmd_queue(dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dmub_srv);
-       dc_dmub_srv_wait_idle(dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
                                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.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)) {
+       if (!dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY)) {
                /* command is not processed by dmub */
                notify->sc_status = SET_CONFIG_UNKNOWN_ERROR;
                return is_cmd_complete;
                                uint8_t *mst_slots_in_use)
 {
        union dmub_rb_cmd cmd = {0};
-       struct dc_dmub_srv *dmub_srv = dc->ctx->dmub_srv;
 
        /* prepare MST_ALLOC_SLOTS command */
        cmd.set_mst_alloc_slots.header.type = DMUB_CMD__DPIA;
        cmd.set_mst_alloc_slots.mst_slots_control.instance = dc->links[link_index]->ddc_hw_inst;
        cmd.set_mst_alloc_slots.mst_slots_control.mst_alloc_slots = mst_alloc_slots;
 
-       if (!dc_dmub_srv_cmd_with_reply_data(dmub_srv, &cmd))
+       if (!dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
                /* command is not processed by dmub */
                return DC_ERROR_UNEXPECTED;
 
                                uint32_t hpd_int_enable)
 {
        union dmub_rb_cmd cmd = {0};
-       struct dc_dmub_srv *dmub_srv = dc->ctx->dmub_srv;
 
        cmd.dpia_hpd_int_enable.header.type = DMUB_CMD__DPIA_HPD_INT_ENABLE;
        cmd.dpia_hpd_int_enable.enable = hpd_int_enable;
 
-       dc_dmub_srv_cmd_queue(dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dmub_srv);
-       dc_dmub_srv_wait_idle(dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        DC_LOG_DEBUG("%s: hpd_int_enable(%d)\n", __func__, hpd_int_enable);
 }
 
        }
 }
 
-void dc_dmub_srv_cmd_queue(struct dc_dmub_srv *dc_dmub_srv,
-                          union dmub_rb_cmd *cmd)
-{
-       struct dmub_srv *dmub = dc_dmub_srv->dmub;
-       struct dc_context *dc_ctx = dc_dmub_srv->ctx;
-       enum dmub_status status;
-
-       status = dmub_srv_cmd_queue(dmub, cmd);
-       if (status == DMUB_STATUS_OK)
-               return;
-
-       if (status != DMUB_STATUS_QUEUE_FULL)
-               goto error;
-
-       /* Execute and wait for queue to become empty again. */
-       dc_dmub_srv_cmd_execute(dc_dmub_srv);
-       dc_dmub_srv_wait_idle(dc_dmub_srv);
-
-       /* Requeue the command. */
-       status = dmub_srv_cmd_queue(dmub, cmd);
-       if (status == DMUB_STATUS_OK)
-               return;
-
-error:
-       DC_ERROR("Error queuing DMUB command: status=%d\n", status);
-       dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
-}
-
-void dc_dmub_srv_cmd_execute(struct dc_dmub_srv *dc_dmub_srv)
-{
-       struct dmub_srv *dmub = dc_dmub_srv->dmub;
-       struct dc_context *dc_ctx = dc_dmub_srv->ctx;
-       enum dmub_status status;
-
-       status = dmub_srv_cmd_execute(dmub);
-       if (status != DMUB_STATUS_OK) {
-               DC_ERROR("Error starting DMUB execution: status=%d\n", status);
-               dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
-       }
-}
-
 void dc_dmub_srv_wait_idle(struct dc_dmub_srv *dc_dmub_srv)
 {
        struct dmub_srv *dmub = dc_dmub_srv->dmub;
        }
 }
 
-bool dc_dmub_srv_cmd_with_reply_data(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd)
+bool dc_dmub_srv_cmd_run(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type)
 {
+       return dc_dmub_srv_cmd_run_list(dc_dmub_srv, 1, cmd, wait_type);
+}
+
+bool dc_dmub_srv_cmd_run_list(struct dc_dmub_srv *dc_dmub_srv, unsigned int count, union dmub_rb_cmd *cmd_list, enum dm_dmub_wait_type wait_type)
+{
+       struct dc_context *dc_ctx = dc_dmub_srv->ctx;
        struct dmub_srv *dmub;
        enum dmub_status status;
+       int i;
 
        if (!dc_dmub_srv || !dc_dmub_srv->dmub)
                return false;
 
        dmub = dc_dmub_srv->dmub;
 
-       status = dmub_srv_cmd_with_reply_data(dmub, cmd);
+       for (i = 0 ; i < count; i++) {
+               // Queue command
+               status = dmub_srv_cmd_queue(dmub, &cmd_list[i]);
+
+               if (status != DMUB_STATUS_OK) {
+                       DC_ERROR("Error queueing DMUB command: status=%d\n", status);
+                       dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
+                       return false;
+               }
+       }
+
+       status = dmub_srv_cmd_execute(dmub);
        if (status != DMUB_STATUS_OK) {
-               DC_LOG_DEBUG("No reply for DMUB command: status=%d\n", status);
+               DC_ERROR("Error starting DMUB execution: status=%d\n", status);
+               dc_dmub_srv_log_diagnostic_data(dc_dmub_srv);
                return false;
        }
 
+       // Wait for DMUB to process command
+       if (wait_type != DM_DMUB_WAIT_TYPE_NO_WAIT) {
+               status = dmub_srv_wait_for_idle(dmub, 100000);
+
+               if (status != DMUB_STATUS_OK) {
+                       DC_LOG_DEBUG("No reply for DMUB command: status=%d\n", status);
+                       return false;
+               }
+
+               // Copy data back from ring buffer into command
+               if (wait_type == DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY)
+                       dmub_rb_get_return_data(&dmub->inbox1_rb, cmd_list);
+       }
+
        return true;
 }
 
        cmd.drr_update.header.payload_bytes = sizeof(cmd.drr_update) - sizeof(cmd.drr_update.header);
 
        // Send the command to the DMCUB.
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 void dc_dmub_srv_set_drr_manual_trigger_cmd(struct dc *dc, uint32_t tg_inst)
        cmd.drr_update.header.payload_bytes = sizeof(cmd.drr_update) - sizeof(cmd.drr_update.header);
 
        // Send the command to the DMCUB.
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 static uint8_t dc_dmub_srv_get_pipes_for_stream(struct dc *dc, struct dc_stream_state *stream)
                sizeof(cmd.fw_assisted_mclk_switch) - sizeof(cmd.fw_assisted_mclk_switch.header);
 
        // Send the command to the DMCUB.
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
 
-void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub)
+void dc_dmub_srv_query_caps_cmd(struct dc_dmub_srv *dc_dmub_srv)
 {
        union dmub_rb_cmd cmd = { 0 };
-       enum dmub_status status;
-
-       if (!dmub) {
-               return;
-       }
 
        memset(&cmd, 0, sizeof(cmd));
 
        cmd.query_feature_caps.header.ret_status = 1;
        cmd.query_feature_caps.header.payload_bytes = sizeof(struct dmub_cmd_query_feature_caps_data);
 
-       /* Send command to fw */
-       status = dmub_srv_cmd_with_reply_data(dmub, &cmd);
-
-       ASSERT(status == DMUB_STATUS_OK);
-
        /* If command was processed, copy feature caps to dmub srv */
-       if (status == DMUB_STATUS_OK &&
+       if (dm_execute_dmub_cmd(dc_dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY) &&
            cmd.query_feature_caps.header.ret_status == 0) {
-               memcpy(&dmub->feature_caps,
+               memcpy(&dc_dmub_srv->dmub->feature_caps,
                       &cmd.query_feature_caps.query_feature_caps_data,
                       sizeof(struct dmub_feature_caps));
        }
 void dc_dmub_srv_get_visual_confirm_color_cmd(struct dc *dc, struct pipe_ctx *pipe_ctx)
 {
        union dmub_rb_cmd cmd = { 0 };
-       enum dmub_status status;
        unsigned int panel_inst = 0;
 
        dc_get_edp_link_panel_inst(dc, pipe_ctx->stream->link, &panel_inst);
        cmd.visual_confirm_color.header.payload_bytes = sizeof(struct dmub_cmd_visual_confirm_color_data);
        cmd.visual_confirm_color.visual_confirm_color_data.visual_confirm_color.panel_inst = panel_inst;
 
-       // Send command to fw
-       status = dmub_srv_cmd_with_reply_data(dc->ctx->dmub_srv->dmub, &cmd);
-
-       ASSERT(status == DMUB_STATUS_OK);
-
        // If command was processed, copy feature caps to dmub srv
-       if (status == DMUB_STATUS_OK &&
+       if (dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY) &&
                cmd.visual_confirm_color.header.ret_status == 0) {
                memcpy(&dc->ctx->dmub_srv->dmub->visual_confirm_color,
                        &cmd.visual_confirm_color.visual_confirm_color_data,
 
                cmd.fw_assisted_mclk_switch_v2.config_data.watermark_a_cache = wm_val_refclk < 0xFFFF ? wm_val_refclk : 0xFFFF;
        }
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 bool dc_dmub_srv_get_diagnostic_data(struct dc_dmub_srv *dc_dmub_srv, struct dmub_diagnostic_data *diag_data)
        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)
 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;
+       union dmub_rb_cmd cmd[2];
+       union dmub_cmd_update_cursor_info_data *update_cursor_info_0 =
+                                       &cmd[0].update_cursor_info.update_cursor_info_data;
+
+       memset(cmd, 0, sizeof(cmd));
 
        if (!dc_dmub_should_update_cursor_data(pCtx))
                return;
 
        {
                /* 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 */
+               cmd[0].update_cursor_info.header.type = DMUB_CMD__UPDATE_CURSOR_INFO;
+               cmd[0].update_cursor_info.header.payload_bytes =
+                               sizeof(cmd[0].update_cursor_info.update_cursor_info_data);
+               cmd[0].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_update_payload0(pCtx, pipe_idx, &update_cursor_info_0->payload0);
 
-               dc_build_cursor_position_update_payload0(&update_cursor_info->payload0, pipe_idx,
+               dc_build_cursor_position_update_payload0(&update_cursor_info_0->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. */
+               cmd[1].update_cursor_info.header.type = DMUB_CMD__UPDATE_CURSOR_INFO;
+               cmd[1].update_cursor_info.header.payload_bytes = sizeof(struct cursor_attributes_cfg);
+               cmd[1].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,
+                               &cmd[1].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);
+               dm_execute_dmub_cmd_list(pCtx->stream->ctx, 2, cmd, DM_DMUB_WAIT_TYPE_WAIT);
        }
 }
 
 #ifndef _DMUB_DC_SRV_H_
 #define _DMUB_DC_SRV_H_
 
-#include "os_types.h"
+#include "dm_services_types.h"
 #include "dmub/dmub_srv.h"
 
 struct dmub_srv;
        void *dm;
 };
 
-void dc_dmub_srv_cmd_queue(struct dc_dmub_srv *dc_dmub_srv,
-                          union dmub_rb_cmd *cmd);
-
-void dc_dmub_srv_cmd_execute(struct dc_dmub_srv *dc_dmub_srv);
-
 void dc_dmub_srv_wait_idle(struct dc_dmub_srv *dc_dmub_srv);
 
 void dc_dmub_srv_wait_phy_init(struct dc_dmub_srv *dc_dmub_srv);
 
-bool dc_dmub_srv_cmd_with_reply_data(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd);
+bool dc_dmub_srv_cmd_run(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type);
+
+bool dc_dmub_srv_cmd_run_list(struct dc_dmub_srv *dc_dmub_srv, unsigned int count, union dmub_rb_cmd *cmd_list, enum dm_dmub_wait_type wait_type);
 
 bool dc_dmub_srv_notify_stream_mask(struct dc_dmub_srv *dc_dmub_srv,
                                    unsigned int stream_mask);
 void dc_dmub_srv_set_drr_manual_trigger_cmd(struct dc *dc, uint32_t tg_inst);
 bool dc_dmub_srv_p_state_delegate(struct dc *dc, bool enable_pstate, struct dc_state *context);
 
-void dc_dmub_srv_query_caps_cmd(struct dmub_srv *dmub);
+void dc_dmub_srv_query_caps_cmd(struct dc_dmub_srv *dc_dmub_srv);
 void dc_dmub_srv_get_visual_confirm_color_cmd(struct dc *dc, struct pipe_ctx *pipe_ctx);
 void dc_dmub_srv_clear_inbox0_ack(struct dc_dmub_srv *dmub_srv);
 void dc_dmub_srv_wait_for_inbox0_ack(struct dc_dmub_srv *dmub_srv);
 
        const struct dc_context *ctx)
 {
        struct dmub_rb_cmd_read_modify_write *cmd_buf = &offload->cmd_data.read_modify_write;
-       bool gather = false;
 
        offload->should_burst_write =
                        (offload->same_addr_count == (DMUB_READ_MODIFY_WRITE_SEQ__MAX - 1));
        cmd_buf->header.payload_bytes =
                        sizeof(struct dmub_cmd_read_modify_write_sequence) * offload->reg_seq_count;
 
-       gather = ctx->dmub_srv->reg_helper_offload.gather_in_progress;
-       ctx->dmub_srv->reg_helper_offload.gather_in_progress = false;
-
-       dc_dmub_srv_cmd_queue(ctx->dmub_srv, &offload->cmd_data);
-
-       ctx->dmub_srv->reg_helper_offload.gather_in_progress = gather;
+       dm_execute_dmub_cmd(ctx, &offload->cmd_data, DM_DMUB_WAIT_TYPE_NO_WAIT);
 
        memset(cmd_buf, 0, sizeof(*cmd_buf));
 
        const struct dc_context *ctx)
 {
        struct dmub_rb_cmd_burst_write *cmd_buf = &offload->cmd_data.burst_write;
-       bool gather = false;
 
        cmd_buf->header.payload_bytes =
                        sizeof(uint32_t) * offload->reg_seq_count;
 
-       gather = ctx->dmub_srv->reg_helper_offload.gather_in_progress;
-       ctx->dmub_srv->reg_helper_offload.gather_in_progress = false;
-
-       dc_dmub_srv_cmd_queue(ctx->dmub_srv, &offload->cmd_data);
-
-       ctx->dmub_srv->reg_helper_offload.gather_in_progress = gather;
+       dm_execute_dmub_cmd(ctx, &offload->cmd_data, DM_DMUB_WAIT_TYPE_NO_WAIT);
 
        memset(cmd_buf, 0, sizeof(*cmd_buf));
 
                const struct dc_context *ctx)
 {
        struct dmub_rb_cmd_reg_wait *cmd_buf = &offload->cmd_data.reg_wait;
-       bool gather = false;
 
-       gather = ctx->dmub_srv->reg_helper_offload.gather_in_progress;
-       ctx->dmub_srv->reg_helper_offload.gather_in_progress = false;
-
-       dc_dmub_srv_cmd_queue(ctx->dmub_srv, &offload->cmd_data);
+       dm_execute_dmub_cmd(ctx, &offload->cmd_data, DM_DMUB_WAIT_TYPE_NO_WAIT);
 
        memset(cmd_buf, 0, sizeof(*cmd_buf));
        offload->reg_seq_count = 0;
-
-       ctx->dmub_srv->reg_helper_offload.gather_in_progress = gather;
 }
 
 struct dc_reg_value_masks {
                const struct dc_context *ctx)
 {
        submit_dmub_read_modify_write(offload, ctx);
-       dc_dmub_srv_cmd_execute(ctx->dmub_srv);
 }
 
 static void dmub_flush_burst_write_buffer_execute(
                const struct dc_context *ctx)
 {
        submit_dmub_burst_write(offload, ctx);
-       dc_dmub_srv_cmd_execute(ctx->dmub_srv);
 }
 
 static bool dmub_reg_value_burst_set_pack(const struct dc_context *ctx, uint32_t addr,
                default:
                        return;
                }
-
-               dc_dmub_srv_cmd_execute(ctx->dmub_srv);
        }
 }
 
 
        cmd.abm_set_pwm_frac.abm_set_pwm_frac_data.panel_mask = panel_mask;
        cmd.abm_set_pwm_frac.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_pwm_frac_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 void dmub_abm_init(struct abm *abm, uint32_t backlight)
        cmd.abm_set_level.abm_set_level_data.panel_mask = panel_mask;
        cmd.abm_set_level.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_level_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
        cmd.abm_set_ambient_level.abm_set_ambient_level_data.panel_mask = panel_mask;
        cmd.abm_set_ambient_level.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_ambient_level_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 #endif
 
 
        cmd.abm_init_config.header.payload_bytes = sizeof(struct dmub_cmd_abm_init_config_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
 }
 
        cmd.abm_pause.abm_pause_data.panel_mask = panel_mask;
        cmd.abm_set_level.header.payload_bytes = sizeof(struct dmub_cmd_abm_pause_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
        cmd.abm_set_pipe.abm_set_pipe_data.ramping_boundary = ramping_boundary;
        cmd.abm_set_pipe.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_pipe_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
        cmd.abm_set_backlight.abm_set_backlight_data.panel_mask = (0x01 << panel_inst);
        cmd.abm_set_backlight.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_backlight_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
 
        if (!lock)
                cmd.lock_hw.lock_hw_data.should_release = 1;
 
-       dc_dmub_srv_cmd_queue(dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dmub_srv);
-       dc_dmub_srv_wait_idle(dmub_srv);
+       dm_execute_dmub_cmd(dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv,
 
                sizeof(cmd.outbox1_enable.header);
        cmd.outbox1_enable.enable = true;
 
-       dc_dmub_srv_cmd_queue(dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dmub_srv);
-       dc_dmub_srv_wait_idle(dmub_srv);
+       dm_execute_dmub_cmd(dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
        cmd.psr_set_version.psr_set_version_data.panel_inst = panel_inst;
        cmd.psr_set_version.header.payload_bytes = sizeof(struct dmub_cmd_psr_set_version_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
 
        cmd.psr_enable.header.payload_bytes = 0; // Send header only
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc->dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        /* Below loops 1000 x 500us = 500 ms.
         *  Exit PSR may need to wait 1-2 frames to power up. Timeout after at
        cmd.psr_set_level.psr_set_level_data.psr_level = psr_level;
        cmd.psr_set_level.psr_set_level_data.cmd_version = DMUB_CMD_PSR_CONTROL_VERSION_1;
        cmd.psr_set_level.psr_set_level_data.panel_inst = panel_inst;
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 /*
        cmd.psr_set_vtotal.psr_set_vtotal_data.psr_vtotal_idle = psr_vtotal_idle;
        cmd.psr_set_vtotal.psr_set_vtotal_data.psr_vtotal_su = psr_vtotal_su;
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 /*
        cmd.psr_set_power_opt.psr_set_power_opt_data.power_opt = power_opt;
        cmd.psr_set_power_opt.psr_set_power_opt_data.panel_inst = panel_inst;
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 /*
                copy_settings_data->relock_delay_frame_cnt = 2;
        copy_settings_data->dsc_slice_height = psr_context->dsc_slice_height;
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
        cmd.psr_force_static.header.sub_type = DMUB_CMD__PSR_FORCE_STATIC;
        cmd.psr_enable.header.payload_bytes = 0;
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 /*
 
 static void dmcub_PLAT_54186_wa(struct hubp *hubp,
                                struct surface_flip_registers *flip_regs)
 {
-       struct dc_dmub_srv *dmcub = hubp->ctx->dmub_srv;
        struct dcn21_hubp *hubp21 = TO_DCN21_HUBP(hubp);
        union dmub_rb_cmd cmd;
 
        cmd.PLAT_54186_wa.flip.flip_params.vmid = flip_regs->vmid;
 
        PERF_TRACE();  // TODO: remove after performance is stable.
-       dc_dmub_srv_cmd_queue(dmcub, &cmd);
-       PERF_TRACE();  // TODO: remove after performance is stable.
-       dc_dmub_srv_cmd_execute(dmcub);
-       PERF_TRACE();  // TODO: remove after performance is stable.
-       dc_dmub_srv_wait_idle(dmcub);
+       dm_execute_dmub_cmd(hubp->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
        PERF_TRACE();  // TODO: remove after performance is stable.
 }
 
 
        cmd.abm_set_pipe.abm_set_pipe_data.ramping_boundary = ramping_boundary;
        cmd.abm_set_pipe.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_pipe_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
        cmd.abm_set_backlight.abm_set_backlight_data.panel_mask = (0x01 << panel_inst);
        cmd.abm_set_backlight.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_backlight_data);
 
-       dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->dmub_srv);
+       dm_execute_dmub_cmd(dc, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 void dcn21_set_abm_immediate_disable(struct pipe_ctx *pipe_ctx)
 
                dc->res_pool->hubbub->funcs->init_crb(dc->res_pool->hubbub);
 
        // Get DMCUB capabilities
-       dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv->dmub);
+       dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv);
        dc->caps.dmub_caps.psr = dc->ctx->dmub_srv->dmub->feature_caps.psr;
        dc->caps.dmub_caps.mclk_sw = dc->ctx->dmub_srv->dmub->feature_caps.fw_assisted_mclk_switch;
 }
                                cmd.mall.header.sub_type = DMUB_CMD__MALL_ACTION_NO_DF_REQ;
                                cmd.mall.header.payload_bytes = sizeof(cmd.mall) - sizeof(cmd.mall.header);
 
-                               dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-                               dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
+                               dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);
 
                                return true;
                        }
                                        cmd.mall.cursor_height = cursor_attr.height;
                                        cmd.mall.cursor_pitch = cursor_attr.pitch;
 
-                                       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-                                       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-                                       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+                                       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
                                        /* Use copied cursor, and it's okay to not switch back */
                                        cursor_attr.address.quad_part = cmd.mall.cursor_copy_dst.quad_part;
                                cmd.mall.tmr_scale = tmr_scale;
                                cmd.mall.debug_bits = dc->debug.mall_error_as_fatal;
 
-                               dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-                               dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
+                               dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);
 
                                return true;
                        }
        cmd.mall.header.payload_bytes =
                sizeof(cmd.mall) - sizeof(cmd.mall.header);
 
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
 
                                   union dmub_rb_cmd *cmd)
 {
        struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
-       struct dc_dmub_srv *dc_dmub_srv = enc->ctx->dmub_srv;
 
        memset(cmd, 0, sizeof(*cmd));
        cmd->query_dp_alt.header.type = DMUB_CMD__VBIOS;
        cmd->query_dp_alt.header.payload_bytes = sizeof(cmd->query_dp_alt.data);
        cmd->query_dp_alt.data.phy_id = phy_id_from_transmitter(enc10->base.transmitter);
 
-       if (!dc_dmub_srv_cmd_with_reply_data(dc_dmub_srv, cmd))
+       if (!dm_execute_dmub_cmd(enc->ctx, cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
                return false;
 
        return true;
        struct dmub_cmd_dig_dpia_control_data *dpia_control)
 {
        union dmub_rb_cmd cmd;
-       struct dc_dmub_srv *dmub = dc_ctx->dmub_srv;
 
        memset(&cmd, 0, sizeof(cmd));
 
 
        cmd.dig1_dpia_control.dpia_control = *dpia_control;
 
-       dc_dmub_srv_cmd_queue(dmub, &cmd);
-       dc_dmub_srv_cmd_execute(dmub);
-       dc_dmub_srv_wait_idle(dmub);
+       dm_execute_dmub_cmd(dc_ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
 
 #endif
 
        // Get DMCUB capabilities
-       dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv->dmub);
+       dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv);
        dc->caps.dmub_caps.psr = dc->ctx->dmub_srv->dmub->feature_caps.psr;
 }
 
        cmd.dcn_restore.header.type = DMUB_CMD__IDLE_OPT;
        cmd.dcn_restore.header.sub_type = DMUB_CMD__IDLE_OPT_DCN_SAVE_INIT;
 
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 void dcn31_z10_restore(const struct dc *dc)
        cmd.dcn_restore.header.type = DMUB_CMD__IDLE_OPT;
        cmd.dcn_restore.header.sub_type = DMUB_CMD__IDLE_OPT_DCN_RESTORE;
 
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 }
 
 void dcn31_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on)
 
        cmd->panel_cntl.header.payload_bytes = sizeof(cmd->panel_cntl.data);
        cmd->panel_cntl.data.inst = dcn31_panel_cntl->base.inst;
 
-       return dc_dmub_srv_cmd_with_reply_data(dc_dmub_srv, cmd);
+       return dm_execute_dmub_cmd(dc_dmub_srv->ctx, cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY);
 }
 
 static uint32_t dcn31_get_16_bit_backlight_from_pwm(struct panel_cntl *panel_cntl)
                panel_cntl->stored_backlight_registers.LVTMA_PWRSEQ_REF_DIV_BL_PWM_REF_DIV;
        cmd.panel_cntl.data.bl_pwm_ref_div2 =
                panel_cntl->stored_backlight_registers.PANEL_PWRSEQ_REF_DIV2;
-       if (!dc_dmub_srv_cmd_with_reply_data(dc_dmub_srv, &cmd))
+       if (!dm_execute_dmub_cmd(dc_dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY))
                return 0;
 
        panel_cntl->stored_backlight_registers.BL_PWM_CNTL = cmd.panel_cntl.data.bl_pwm_cntl;
 
        cmd.domain_control.data.inst = hubp_inst;
        cmd.domain_control.data.power_gate = !power_on;
 
-       dc_dmub_srv_cmd_queue(ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(ctx->dmub_srv);
+       dm_execute_dmub_cmd(ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        PERF_TRACE();
 }
 
                                cmd.cab.header.sub_type = DMUB_CMD__CAB_NO_DCN_REQ;
                                cmd.cab.header.payload_bytes = sizeof(cmd.cab) - sizeof(cmd.cab.header);
 
-                               dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-                               dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
+                               dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);
 
                                return true;
                        }
                                cmd.cab.header.payload_bytes = sizeof(cmd.cab) - sizeof(cmd.cab.header);
                                cmd.cab.cab_alloc_ways = ways;
 
-                               dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-                               dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
+                               dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_NO_WAIT);
 
                                return true;
                        }
        cmd.cab.header.payload_bytes =
                        sizeof(cmd.cab) - sizeof(cmd.cab.header);
 
-       dc_dmub_srv_cmd_queue(dc->ctx->dmub_srv, &cmd);
-       dc_dmub_srv_cmd_execute(dc->ctx->dmub_srv);
-       dc_dmub_srv_wait_idle(dc->ctx->dmub_srv);
+       dm_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
        return true;
 }
 
        // Get DMCUB capabilities
        if (dc->ctx->dmub_srv) {
-               dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv->dmub);
+               dc_dmub_srv_query_caps_cmd(dc->ctx->dmub_srv);
                dc->caps.dmub_caps.psr = dc->ctx->dmub_srv->dmub->feature_caps.psr;
                dc->caps.dmub_caps.mclk_sw = dc->ctx->dmub_srv->dmub->feature_caps.fw_assisted_mclk_switch;
        }
 
 
 struct dmub_srv;
 struct dc_dmub_srv;
+union dmub_rb_cmd;
 
 irq_handler_idx dm_register_interrupt(
        struct dc_context *ctx,
 #define PERF_TRACE()   dm_perf_trace_timestamp(__func__, __LINE__, CTX)
 #define PERF_TRACE_CTX(__CTX)  dm_perf_trace_timestamp(__func__, __LINE__, __CTX)
 
+/*
+ * DMUB Interfaces
+ */
+bool dm_execute_dmub_cmd(const struct dc_context *ctx, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type);
+bool dm_execute_dmub_cmd_list(const struct dc_context *ctx, unsigned int count, union dmub_rb_cmd *cmd, enum dm_dmub_wait_type wait_type);
+
 /*
  * Debug and verification hooks
  */
 
        uint32_t min_memory_clock_khz;
 };
 
+enum dm_dmub_wait_type {
+       DM_DMUB_WAIT_TYPE_NO_WAIT,
+       DM_DMUB_WAIT_TYPE_WAIT,
+       DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY,
+};
+
 #endif
 
        cmd.cable_id.header.payload_bytes = sizeof(cmd.cable_id.data);
        cmd.cable_id.data.input.phy_inst = resource_transmitter_to_phy_idx(
                        link->dc, link->link_enc->transmitter);
-       if (dc_dmub_srv_cmd_with_reply_data(link->ctx->dmub_srv, &cmd) &&
+       if (dm_execute_dmub_cmd(link->dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY) &&
                        cmd.cable_id.header.ret_status == 1) {
                cable_id->raw = cmd.cable_id.data.output_raw;
                DC_LOG_DC("usbc_cable_id = %d.\n", cable_id->raw);
 
        cmd.query_hpd.data.ch_type = AUX_CHANNEL_DPIA;
 
        /* Return HPD status reported by DMUB if query successfully executed. */
-       if (dc_dmub_srv_cmd_with_reply_data(dmub_srv, &cmd) && cmd.query_hpd.data.status == AUX_RET_SUCCESS)
+       if (dm_execute_dmub_cmd(dmub_srv->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY) && cmd.query_hpd.data.status == AUX_RET_SUCCESS)
                is_hpd_high = cmd.query_hpd.data.result;
 
        DC_LOG_DEBUG("%s: link(%d) dpia(%d) cmd_status(%d) result(%d)\n",