]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drm/i915: Consolidate top-level .update_plane() handlers
authorMatt Roper <matthew.d.roper@intel.com>
Mon, 1 Dec 2014 23:40:16 +0000 (15:40 -0800)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Sat, 6 Dec 2014 00:46:25 +0000 (01:46 +0100)
Our .update_plane() handlers do the same check/prepare/commit/cleanup
steps regardless of plane type.  Consolidate them all into a single
function that calls check/commit through a vtable.

Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_sprite.c

index 0488700b10f75de22d5f2b39356ec7b8eda889d0..f6334e6b378a0953a4d57259abf8d4a6b860c7e9 100644 (file)
@@ -11782,12 +11782,23 @@ intel_check_primary_plane(struct drm_plane *plane,
        struct drm_rect *dest = &state->dst;
        struct drm_rect *src = &state->src;
        const struct drm_rect *clip = &state->clip;
+       int ret;
+
+       ret = drm_plane_helper_check_update(plane, crtc, fb,
+                                           src, dest, clip,
+                                           DRM_PLANE_HELPER_NO_SCALING,
+                                           DRM_PLANE_HELPER_NO_SCALING,
+                                           false, true, &state->visible);
+       if (ret)
+               return ret;
 
-       return drm_plane_helper_check_update(plane, crtc, fb,
-                                            src, dest, clip,
-                                            DRM_PLANE_HELPER_NO_SCALING,
-                                            DRM_PLANE_HELPER_NO_SCALING,
-                                            false, true, &state->visible);
+       intel_crtc_wait_for_pending_flips(crtc);
+       if (intel_crtc_has_pending_flip(crtc)) {
+               DRM_ERROR("pipe is still busy with an old pageflip\n");
+               return -EBUSY;
+       }
+
+       return 0;
 }
 
 static void
@@ -11873,16 +11884,17 @@ intel_commit_primary_plane(struct drm_plane *plane,
        }
 }
 
-static int
-intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc,
-                            struct drm_framebuffer *fb, int crtc_x, int crtc_y,
-                            unsigned int crtc_w, unsigned int crtc_h,
-                            uint32_t src_x, uint32_t src_y,
-                            uint32_t src_w, uint32_t src_h)
+int
+intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
+                  struct drm_framebuffer *fb, int crtc_x, int crtc_y,
+                  unsigned int crtc_w, unsigned int crtc_h,
+                  uint32_t src_x, uint32_t src_y,
+                  uint32_t src_w, uint32_t src_h)
 {
        struct drm_device *dev = plane->dev;
        struct drm_framebuffer *old_fb = plane->fb;
        struct intel_plane_state state;
+       struct intel_plane *intel_plane = to_intel_plane(plane);
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int ret;
 
@@ -11909,24 +11921,17 @@ intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc,
        state.orig_src = state.src;
        state.orig_dst = state.dst;
 
-       ret = intel_check_primary_plane(plane, &state);
+       ret = intel_plane->check_plane(plane, &state);
        if (ret)
                return ret;
 
-       intel_crtc_wait_for_pending_flips(crtc);
-
-       if (intel_crtc_has_pending_flip(crtc)) {
-               DRM_ERROR("pipe is still busy with an old pageflip\n");
-               return -EBUSY;
-       }
-
        if (fb != old_fb && fb) {
                ret = intel_prepare_plane_fb(plane, fb);
                if (ret)
                        return ret;
        }
 
-       intel_commit_primary_plane(plane, &state);
+       intel_plane->commit_plane(plane, &state);
 
        if (fb != old_fb && old_fb) {
                if (intel_crtc->active)
@@ -11934,6 +11939,8 @@ intel_primary_plane_setplane(struct drm_plane *plane, struct drm_crtc *crtc,
                intel_cleanup_plane_fb(plane, old_fb);
        }
 
+       plane->fb = fb;
+
        return 0;
 }
 
@@ -11946,7 +11953,7 @@ static void intel_plane_destroy(struct drm_plane *plane)
 }
 
 static const struct drm_plane_funcs intel_primary_plane_funcs = {
-       .update_plane = intel_primary_plane_setplane,
+       .update_plane = intel_update_plane,
        .disable_plane = intel_primary_plane_disable,
        .destroy = intel_plane_destroy,
        .set_property = intel_plane_set_property
@@ -11968,6 +11975,8 @@ static struct drm_plane *intel_primary_plane_create(struct drm_device *dev,
        primary->pipe = pipe;
        primary->plane = pipe;
        primary->rotation = BIT(DRM_ROTATE_0);
+       primary->check_plane = intel_check_primary_plane;
+       primary->commit_plane = intel_commit_primary_plane;
        if (HAS_FBC(dev) && INTEL_INFO(dev)->gen < 4)
                primary->plane = !pipe;
 
@@ -12133,65 +12142,8 @@ update:
        }
 }
 
-static int
-intel_cursor_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
-                         struct drm_framebuffer *fb, int crtc_x, int crtc_y,
-                         unsigned int crtc_w, unsigned int crtc_h,
-                         uint32_t src_x, uint32_t src_y,
-                         uint32_t src_w, uint32_t src_h)
-{
-       struct drm_device *dev = plane->dev;
-       struct drm_framebuffer *old_fb = plane->fb;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       struct intel_plane_state state;
-       int ret;
-
-       state.base.crtc = crtc;
-       state.base.fb = fb;
-
-       /* sample coordinates in 16.16 fixed point */
-       state.src.x1 = src_x;
-       state.src.x2 = src_x + src_w;
-       state.src.y1 = src_y;
-       state.src.y2 = src_y + src_h;
-
-       /* integer pixels */
-       state.dst.x1 = crtc_x;
-       state.dst.x2 = crtc_x + crtc_w;
-       state.dst.y1 = crtc_y;
-       state.dst.y2 = crtc_y + crtc_h;
-
-       state.clip.x1 = 0;
-       state.clip.y1 = 0;
-       state.clip.x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0;
-       state.clip.y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0;
-
-       state.orig_src = state.src;
-       state.orig_dst = state.dst;
-
-       ret = intel_check_cursor_plane(plane, &state);
-       if (ret)
-               return ret;
-
-       if (fb != old_fb && fb) {
-               ret = intel_prepare_plane_fb(plane, fb);
-               if (ret)
-                       return ret;
-       }
-
-       intel_commit_cursor_plane(plane, &state);
-
-       if (fb != old_fb && old_fb) {
-               if (intel_crtc->active)
-                       intel_wait_for_vblank(dev, intel_crtc->pipe);
-               intel_cleanup_plane_fb(plane, old_fb);
-       }
-
-       return 0;
-}
-
 static const struct drm_plane_funcs intel_cursor_plane_funcs = {
-       .update_plane = intel_cursor_plane_update,
+       .update_plane = intel_update_plane,
        .disable_plane = intel_cursor_plane_disable,
        .destroy = intel_plane_destroy,
        .set_property = intel_plane_set_property,
@@ -12211,6 +12163,8 @@ static struct drm_plane *intel_cursor_plane_create(struct drm_device *dev,
        cursor->pipe = pipe;
        cursor->plane = pipe;
        cursor->rotation = BIT(DRM_ROTATE_0);
+       cursor->check_plane = intel_check_cursor_plane;
+       cursor->commit_plane = intel_commit_cursor_plane;
 
        drm_universal_plane_init(dev, &cursor->base, 0,
                                 &intel_cursor_plane_funcs,
index 38cb5535cd391e99ac4ad050c685a2027a596c9e..f7b661969ad09043d14676998dc5c19aeb1156f3 100644 (file)
@@ -508,6 +508,10 @@ struct intel_plane {
                             uint32_t src_w, uint32_t src_h);
        void (*disable_plane)(struct drm_plane *plane,
                              struct drm_crtc *crtc);
+       int (*check_plane)(struct drm_plane *plane,
+                          struct intel_plane_state *state);
+       void (*commit_plane)(struct drm_plane *plane,
+                            struct intel_plane_state *state);
        int (*update_colorkey)(struct drm_plane *plane,
                               struct drm_intel_sprite_colorkey *key);
        void (*get_colorkey)(struct drm_plane *plane,
@@ -1011,6 +1015,11 @@ void intel_dp_hot_plug(struct intel_encoder *intel_encoder);
 void vlv_power_sequencer_reset(struct drm_i915_private *dev_priv);
 uint32_t intel_dp_pack_aux(const uint8_t *src, int src_bytes);
 void intel_dp_unpack_aux(uint32_t src, uint8_t *dst, int dst_bytes);
+int intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
+                      struct drm_framebuffer *fb, int crtc_x, int crtc_y,
+                      unsigned int crtc_w, unsigned int crtc_h,
+                      uint32_t src_x, uint32_t src_y,
+                      uint32_t src_w, uint32_t src_h);
 
 /* intel_dp_mst.c */
 int intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_id);
index 031f95e259fb0f560af7ed09dff3c33d3615c58c..bfd5270bdbd5ffed8da7214e92c108c6e15feb19 100644 (file)
@@ -1327,62 +1327,6 @@ intel_commit_sprite_plane(struct drm_plane *plane,
        }
 }
 
-static int
-intel_update_plane(struct drm_plane *plane, struct drm_crtc *crtc,
-                  struct drm_framebuffer *fb, int crtc_x, int crtc_y,
-                  unsigned int crtc_w, unsigned int crtc_h,
-                  uint32_t src_x, uint32_t src_y,
-                  uint32_t src_w, uint32_t src_h)
-{
-       struct drm_device *dev = plane->dev;
-       struct drm_framebuffer *old_fb = plane->fb;
-       struct intel_plane_state state;
-       struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
-       int ret;
-
-       state.base.crtc = crtc;
-       state.base.fb = fb;
-
-       /* sample coordinates in 16.16 fixed point */
-       state.src.x1 = src_x;
-       state.src.x2 = src_x + src_w;
-       state.src.y1 = src_y;
-       state.src.y2 = src_y + src_h;
-
-       /* integer pixels */
-       state.dst.x1 = crtc_x;
-       state.dst.x2 = crtc_x + crtc_w;
-       state.dst.y1 = crtc_y;
-       state.dst.y2 = crtc_y + crtc_h;
-
-       state.clip.x1 = 0;
-       state.clip.y1 = 0;
-       state.clip.x2 = intel_crtc->active ? intel_crtc->config.pipe_src_w : 0;
-       state.clip.y2 = intel_crtc->active ? intel_crtc->config.pipe_src_h : 0;
-       state.orig_src = state.src;
-       state.orig_dst = state.dst;
-
-       ret = intel_check_sprite_plane(plane, &state);
-       if (ret)
-               return ret;
-
-       if (fb != old_fb && fb) {
-               ret = intel_prepare_plane_fb(plane, fb);
-               if (ret)
-                       return ret;
-       }
-
-       intel_commit_sprite_plane(plane, &state);
-
-       if (fb != old_fb && old_fb) {
-               if (intel_crtc->active)
-                       intel_wait_for_vblank(dev, intel_crtc->pipe);
-               intel_cleanup_plane_fb(plane, old_fb);
-       }
-
-       return 0;
-}
-
 static int
 intel_disable_plane(struct drm_plane *plane)
 {
@@ -1678,6 +1622,8 @@ intel_plane_init(struct drm_device *dev, enum pipe pipe, int plane)
        intel_plane->pipe = pipe;
        intel_plane->plane = plane;
        intel_plane->rotation = BIT(DRM_ROTATE_0);
+       intel_plane->check_plane = intel_check_sprite_plane;
+       intel_plane->commit_plane = intel_commit_sprite_plane;
        possible_crtcs = (1 << pipe);
        ret = drm_universal_plane_init(dev, &intel_plane->base, possible_crtcs,
                                       &intel_plane_funcs,