hubbub->funcs->update_dchub(hubbub, dh_data);
 }
 
+static bool dcn10_can_pipe_disable_cursor(struct pipe_ctx *pipe_ctx)
+{
+       struct pipe_ctx *test_pipe;
+       const struct rect *r1 = &pipe_ctx->plane_res.scl_data.recout, *r2;
+       int r1_r = r1->x + r1->width, r1_b = r1->y + r1->height, r2_r, r2_b;
+
+       /**
+        * Disable the cursor if there's another pipe above this with a
+        * plane that contains this pipe's viewport to prevent double cursor
+        * and incorrect scaling artifacts.
+        */
+       for (test_pipe = pipe_ctx->top_pipe; test_pipe;
+            test_pipe = test_pipe->top_pipe) {
+               if (!test_pipe->plane_state->visible)
+                       continue;
+
+               r2 = &test_pipe->plane_res.scl_data.recout;
+               r2_r = r2->x + r2->width;
+               r2_b = r2->y + r2->height;
+
+               if (r1->x >= r2->x && r1->y >= r2->y && r1_r <= r2_r && r1_b <= r2_b)
+                       return true;
+       }
+
+       return false;
+}
+
 void dcn10_set_cursor_position(struct pipe_ctx *pipe_ctx)
 {
        struct dc_cursor_position pos_cpy = pipe_ctx->stream->cursor_position;
                        == PLN_ADDR_TYPE_VIDEO_PROGRESSIVE)
                pos_cpy.enable = false;
 
+       if (pos_cpy.enable && dcn10_can_pipe_disable_cursor(pipe_ctx))
+               pos_cpy.enable = false;
+
        // Swap axis and mirror horizontally
        if (param.rotation == ROTATION_ANGLE_90) {
                uint32_t temp_x = pos_cpy.x;