#include "resource.h"
 #include "ipp.h"
 #include "timing_generator.h"
+#include "dcn10/dcn10_hw_sequencer.h"
 
 #define DC_LOGGER dc->ctx->logger
 
        return dc_stream_get_status_from_state(dc->current_state, stream);
 }
 
+static void delay_cursor_until_vupdate(struct pipe_ctx *pipe_ctx, struct dc *dc)
+{
+       unsigned int vupdate_line;
+       unsigned int lines_to_vupdate, us_to_vupdate, vpos, nvpos;
+       struct dc_stream_state *stream = pipe_ctx->stream;
+       unsigned int us_per_line;
+
+       if (stream->ctx->asic_id.chip_family == FAMILY_RV &&
+                       ASIC_REV_IS_RAVEN(stream->ctx->asic_id.hw_internal_rev)) {
+
+               vupdate_line = get_vupdate_offset_from_vsync(pipe_ctx);
+               dc_stream_get_crtc_position(dc, &stream, 1, &vpos, &nvpos);
+
+               if (vpos >= vupdate_line)
+                       return;
+
+               us_per_line = stream->timing.h_total * 10000 / stream->timing.pix_clk_100hz;
+               lines_to_vupdate = vupdate_line - vpos;
+               us_to_vupdate = lines_to_vupdate * us_per_line;
+
+               /* 70 us is a conservative estimate of cursor update time*/
+               if (us_to_vupdate < 70)
+                       udelay(us_to_vupdate);
+       }
+}
+
 /**
  * dc_stream_set_cursor_attributes() - Update cursor attributes and set cursor surface address
  */
 
                if (!pipe_to_program) {
                        pipe_to_program = pipe_ctx;
+
+                       delay_cursor_until_vupdate(pipe_ctx, core_dc);
                        core_dc->hwss.pipe_control_lock(core_dc, pipe_to_program, true);
                }
 
 
                if (!pipe_to_program) {
                        pipe_to_program = pipe_ctx;
+
+                       delay_cursor_until_vupdate(pipe_ctx, core_dc);
                        core_dc->hwss.pipe_control_lock(core_dc, pipe_to_program, true);
                }