drm/msm/disp/dpu1: turn off vblank irqs aggressively in dpu driver
[linux-2.6-microblaze.git] / drivers / gpu / drm / msm / disp / dpu1 / dpu_encoder_phys_vid.c
index 9a69fad..0e06b7e 100644 (file)
@@ -658,6 +658,31 @@ static int dpu_encoder_phys_vid_get_line_count(
        return phys_enc->hw_intf->ops.get_line_count(phys_enc->hw_intf);
 }
 
+static int dpu_encoder_phys_vid_get_frame_count(
+               struct dpu_encoder_phys *phys_enc)
+{
+       struct intf_status s = {0};
+       u32 fetch_start = 0;
+       struct drm_display_mode mode = phys_enc->cached_mode;
+
+       if (!dpu_encoder_phys_vid_is_master(phys_enc))
+               return -EINVAL;
+
+       if (!phys_enc->hw_intf || !phys_enc->hw_intf->ops.get_status)
+               return -EINVAL;
+
+       phys_enc->hw_intf->ops.get_status(phys_enc->hw_intf, &s);
+
+       if (s.is_prog_fetch_en && s.is_en) {
+               fetch_start = mode.vtotal - (mode.vsync_start - mode.vdisplay);
+               if ((s.line_count > fetch_start) &&
+                       (s.line_count <= mode.vtotal))
+                       return s.frame_count + 1;
+       }
+
+       return s.frame_count;
+}
+
 static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
 {
        ops->is_master = dpu_encoder_phys_vid_is_master;
@@ -676,6 +701,7 @@ static void dpu_encoder_phys_vid_init_ops(struct dpu_encoder_phys_ops *ops)
        ops->handle_post_kickoff = dpu_encoder_phys_vid_handle_post_kickoff;
        ops->needs_single_flush = dpu_encoder_phys_vid_needs_single_flush;
        ops->get_line_count = dpu_encoder_phys_vid_get_line_count;
+       ops->get_frame_count = dpu_encoder_phys_vid_get_frame_count;
 }
 
 struct dpu_encoder_phys *dpu_encoder_phys_vid_init(