diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2017-03-23 21:27:09 +0200 |
---|---|---|
committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2017-03-27 15:58:33 +0300 |
commit | a0864d5905a94359621946a027e180a3063f80a5 (patch) | |
tree | c746248c0c5227bea799b570d059ca58d6540570 /drivers/gpu/drm/i915/intel_sprite.c | |
parent | 6a4407a653e93f56e0d7b8849fc9c1d334de39fc (diff) | |
download | linux-a0864d5905a94359621946a027e180a3063f80a5.tar.bz2 |
drm/i915: Pre-compute plane control register value
Computing the plane control register value is branchy so moving it out
from the plane commit hook seems prudent. Let's pre-compute it during
the atomic check phase and store the result in the plane state.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/20170323192712.30682-4-ville.syrjala@linux.intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sprite.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_sprite.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index 12e33bc149e4..6b76012ded1a 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c @@ -217,7 +217,7 @@ skl_update_plane(struct drm_plane *drm_plane, struct drm_framebuffer *fb = plane_state->base.fb; enum plane_id plane_id = intel_plane->id; enum pipe pipe = intel_plane->pipe; - u32 plane_ctl; + u32 plane_ctl = plane_state->ctl; const struct drm_intel_sprite_colorkey *key = &plane_state->ckey; u32 surf_addr = plane_state->main.offset; unsigned int rotation = plane_state->base.rotation; @@ -232,8 +232,6 @@ skl_update_plane(struct drm_plane *drm_plane, uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16; unsigned long irqflags; - plane_ctl = skl_plane_ctl(crtc_state, plane_state); - /* Sizes are 0 based */ src_w--; src_h--; @@ -420,7 +418,7 @@ vlv_update_plane(struct drm_plane *dplane, struct drm_framebuffer *fb = plane_state->base.fb; enum pipe pipe = intel_plane->pipe; enum plane_id plane_id = intel_plane->id; - u32 sprctl; + u32 sprctl = plane_state->ctl; u32 sprsurf_offset, linear_offset; unsigned int rotation = plane_state->base.rotation; const struct drm_intel_sprite_colorkey *key = &plane_state->ckey; @@ -434,8 +432,6 @@ vlv_update_plane(struct drm_plane *dplane, uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16; unsigned long irqflags; - sprctl = vlv_sprite_ctl(crtc_state, plane_state); - /* Sizes are 0 based */ src_w--; src_h--; @@ -569,7 +565,7 @@ ivb_update_plane(struct drm_plane *plane, struct intel_plane *intel_plane = to_intel_plane(plane); struct drm_framebuffer *fb = plane_state->base.fb; enum pipe pipe = intel_plane->pipe; - u32 sprctl, sprscale = 0; + u32 sprctl = plane_state->ctl, sprscale = 0; u32 sprsurf_offset, linear_offset; unsigned int rotation = plane_state->base.rotation; const struct drm_intel_sprite_colorkey *key = &plane_state->ckey; @@ -583,8 +579,6 @@ ivb_update_plane(struct drm_plane *plane, uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16; unsigned long irqflags; - sprctl = ivb_sprite_ctl(crtc_state, plane_state); - /* Sizes are 0 based */ src_w--; src_h--; @@ -722,7 +716,7 @@ ilk_update_plane(struct drm_plane *plane, struct intel_plane *intel_plane = to_intel_plane(plane); struct drm_framebuffer *fb = plane_state->base.fb; int pipe = intel_plane->pipe; - u32 dvscntr, dvsscale; + u32 dvscntr = plane_state->ctl, dvsscale; u32 dvssurf_offset, linear_offset; unsigned int rotation = plane_state->base.rotation; const struct drm_intel_sprite_colorkey *key = &plane_state->ckey; @@ -736,8 +730,6 @@ ilk_update_plane(struct drm_plane *plane, uint32_t src_h = drm_rect_height(&plane_state->base.src) >> 16; unsigned long irqflags; - dvscntr = ilk_sprite_ctl(crtc_state, plane_state); - /* Sizes are 0 based */ src_w--; src_h--; @@ -986,6 +978,14 @@ intel_check_sprite_plane(struct drm_plane *plane, ret = skl_check_plane_surface(state); if (ret) return ret; + + state->ctl = skl_plane_ctl(crtc_state, state); + } else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) { + state->ctl = vlv_sprite_ctl(crtc_state, state); + } else if (INTEL_GEN(dev_priv) >= 7) { + state->ctl = ivb_sprite_ctl(crtc_state, state); + } else { + state->ctl = ilk_sprite_ctl(crtc_state, state); } return 0; |