mirror of https://gitee.com/openkylin/linux.git
drm/i915: Pass around plane_state instead of fb+rotation
intel_compute_tile_offset() and intel_add_fb_offsets() get passed the fb and the rotation. As both of those come from the plane state we can just pass that in instead. For extra consitency pass the plane state to intel_fb_xy_to_linear() as well even though it only really needs the fb. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Reviewed-by: Sivakumar Thulasimani <sivakumar.thulasimani@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1470821001-25272-5-git-send-email-ville.syrjala@linux.intel.com
This commit is contained in:
parent
d21967740f
commit
2949056c86
|
@ -2283,8 +2283,10 @@ static int intel_fb_pitch(const struct drm_framebuffer *fb, int plane,
|
||||||
* with gen2/3, and 90/270 degree rotations isn't supported on any of them.
|
* with gen2/3, and 90/270 degree rotations isn't supported on any of them.
|
||||||
*/
|
*/
|
||||||
u32 intel_fb_xy_to_linear(int x, int y,
|
u32 intel_fb_xy_to_linear(int x, int y,
|
||||||
const struct drm_framebuffer *fb, int plane)
|
const struct intel_plane_state *state,
|
||||||
|
int plane)
|
||||||
{
|
{
|
||||||
|
const struct drm_framebuffer *fb = state->base.fb;
|
||||||
unsigned int cpp = drm_format_plane_cpp(fb->pixel_format, plane);
|
unsigned int cpp = drm_format_plane_cpp(fb->pixel_format, plane);
|
||||||
unsigned int pitch = fb->pitches[plane];
|
unsigned int pitch = fb->pitches[plane];
|
||||||
|
|
||||||
|
@ -2297,11 +2299,12 @@ u32 intel_fb_xy_to_linear(int x, int y,
|
||||||
* specify the start of scanout from the beginning of the gtt mapping.
|
* specify the start of scanout from the beginning of the gtt mapping.
|
||||||
*/
|
*/
|
||||||
void intel_add_fb_offsets(int *x, int *y,
|
void intel_add_fb_offsets(int *x, int *y,
|
||||||
const struct drm_framebuffer *fb, int plane,
|
const struct intel_plane_state *state,
|
||||||
unsigned int rotation)
|
int plane)
|
||||||
|
|
||||||
{
|
{
|
||||||
const struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
|
const struct intel_framebuffer *intel_fb = to_intel_framebuffer(state->base.fb);
|
||||||
|
unsigned int rotation = state->base.rotation;
|
||||||
|
|
||||||
if (intel_rotation_90_or_270(rotation)) {
|
if (intel_rotation_90_or_270(rotation)) {
|
||||||
*x += intel_fb->rotated[plane].x;
|
*x += intel_fb->rotated[plane].x;
|
||||||
|
@ -2408,10 +2411,12 @@ static u32 _intel_compute_tile_offset(const struct drm_i915_private *dev_priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 intel_compute_tile_offset(int *x, int *y,
|
u32 intel_compute_tile_offset(int *x, int *y,
|
||||||
const struct drm_framebuffer *fb, int plane,
|
const struct intel_plane_state *state,
|
||||||
unsigned int rotation)
|
int plane)
|
||||||
{
|
{
|
||||||
const struct drm_i915_private *dev_priv = to_i915(fb->dev);
|
const struct drm_i915_private *dev_priv = to_i915(state->base.plane->dev);
|
||||||
|
const struct drm_framebuffer *fb = state->base.fb;
|
||||||
|
unsigned int rotation = state->base.rotation;
|
||||||
u32 alignment = intel_surf_alignment(dev_priv, fb->modifier[plane]);
|
u32 alignment = intel_surf_alignment(dev_priv, fb->modifier[plane]);
|
||||||
int pitch = intel_fb_pitch(fb, plane, rotation);
|
int pitch = intel_fb_pitch(fb, plane, rotation);
|
||||||
|
|
||||||
|
@ -2835,11 +2840,11 @@ static void i9xx_update_primary_plane(struct drm_plane *primary,
|
||||||
if (IS_G4X(dev))
|
if (IS_G4X(dev))
|
||||||
dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
|
dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
|
||||||
|
|
||||||
intel_add_fb_offsets(&x, &y, fb, 0, rotation);
|
intel_add_fb_offsets(&x, &y, plane_state, 0);
|
||||||
|
|
||||||
if (INTEL_INFO(dev)->gen >= 4)
|
if (INTEL_INFO(dev)->gen >= 4)
|
||||||
intel_crtc->dspaddr_offset =
|
intel_crtc->dspaddr_offset =
|
||||||
intel_compute_tile_offset(&x, &y, fb, 0, rotation);
|
intel_compute_tile_offset(&x, &y, plane_state, 0);
|
||||||
|
|
||||||
if (rotation == BIT(DRM_ROTATE_180)) {
|
if (rotation == BIT(DRM_ROTATE_180)) {
|
||||||
dspcntr |= DISPPLANE_ROTATE_180;
|
dspcntr |= DISPPLANE_ROTATE_180;
|
||||||
|
@ -2848,7 +2853,7 @@ static void i9xx_update_primary_plane(struct drm_plane *primary,
|
||||||
y += (crtc_state->pipe_src_h - 1);
|
y += (crtc_state->pipe_src_h - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
linear_offset = intel_fb_xy_to_linear(x, y, fb, 0);
|
linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
|
||||||
|
|
||||||
if (INTEL_INFO(dev)->gen < 4)
|
if (INTEL_INFO(dev)->gen < 4)
|
||||||
intel_crtc->dspaddr_offset = linear_offset;
|
intel_crtc->dspaddr_offset = linear_offset;
|
||||||
|
@ -2938,10 +2943,10 @@ static void ironlake_update_primary_plane(struct drm_plane *primary,
|
||||||
if (!IS_HASWELL(dev) && !IS_BROADWELL(dev))
|
if (!IS_HASWELL(dev) && !IS_BROADWELL(dev))
|
||||||
dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
|
dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
|
||||||
|
|
||||||
intel_add_fb_offsets(&x, &y, fb, 0, rotation);
|
intel_add_fb_offsets(&x, &y, plane_state, 0);
|
||||||
|
|
||||||
intel_crtc->dspaddr_offset =
|
intel_crtc->dspaddr_offset =
|
||||||
intel_compute_tile_offset(&x, &y, fb, 0, rotation);
|
intel_compute_tile_offset(&x, &y, plane_state, 0);
|
||||||
|
|
||||||
if (rotation == BIT(DRM_ROTATE_180)) {
|
if (rotation == BIT(DRM_ROTATE_180)) {
|
||||||
dspcntr |= DISPPLANE_ROTATE_180;
|
dspcntr |= DISPPLANE_ROTATE_180;
|
||||||
|
@ -2952,7 +2957,7 @@ static void ironlake_update_primary_plane(struct drm_plane *primary,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
linear_offset = intel_fb_xy_to_linear(x, y, fb, 0);
|
linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
|
||||||
|
|
||||||
intel_crtc->adjusted_x = x;
|
intel_crtc->adjusted_x = x;
|
||||||
intel_crtc->adjusted_y = y;
|
intel_crtc->adjusted_y = y;
|
||||||
|
@ -3179,8 +3184,8 @@ static void skylake_update_primary_plane(struct drm_plane *plane,
|
||||||
src_h = drm_rect_height(&r);
|
src_h = drm_rect_height(&r);
|
||||||
}
|
}
|
||||||
|
|
||||||
intel_add_fb_offsets(&src_x, &src_y, fb, 0, rotation);
|
intel_add_fb_offsets(&src_x, &src_y, plane_state, 0);
|
||||||
surf_addr = intel_compute_tile_offset(&src_x, &src_y, fb, 0, rotation);
|
surf_addr = intel_compute_tile_offset(&src_x, &src_y, plane_state, 0);
|
||||||
|
|
||||||
/* Sizes are 0 based */
|
/* Sizes are 0 based */
|
||||||
src_w--;
|
src_w--;
|
||||||
|
|
|
@ -1167,10 +1167,10 @@ int vlv_get_cck_clock(struct drm_i915_private *dev_priv,
|
||||||
extern const struct drm_plane_funcs intel_plane_funcs;
|
extern const struct drm_plane_funcs intel_plane_funcs;
|
||||||
void intel_init_display_hooks(struct drm_i915_private *dev_priv);
|
void intel_init_display_hooks(struct drm_i915_private *dev_priv);
|
||||||
unsigned int intel_fb_xy_to_linear(int x, int y,
|
unsigned int intel_fb_xy_to_linear(int x, int y,
|
||||||
const struct drm_framebuffer *fb, int plane);
|
const struct intel_plane_state *state,
|
||||||
|
int plane);
|
||||||
void intel_add_fb_offsets(int *x, int *y,
|
void intel_add_fb_offsets(int *x, int *y,
|
||||||
const struct drm_framebuffer *fb, int plane,
|
const struct intel_plane_state *state, int plane);
|
||||||
unsigned int rotation);
|
|
||||||
unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info);
|
unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info);
|
||||||
bool intel_has_pending_fb_unpin(struct drm_device *dev);
|
bool intel_has_pending_fb_unpin(struct drm_device *dev);
|
||||||
void intel_mark_busy(struct drm_i915_private *dev_priv);
|
void intel_mark_busy(struct drm_i915_private *dev_priv);
|
||||||
|
@ -1296,8 +1296,7 @@ void assert_pipe(struct drm_i915_private *dev_priv, enum pipe pipe, bool state);
|
||||||
#define assert_pipe_enabled(d, p) assert_pipe(d, p, true)
|
#define assert_pipe_enabled(d, p) assert_pipe(d, p, true)
|
||||||
#define assert_pipe_disabled(d, p) assert_pipe(d, p, false)
|
#define assert_pipe_disabled(d, p) assert_pipe(d, p, false)
|
||||||
u32 intel_compute_tile_offset(int *x, int *y,
|
u32 intel_compute_tile_offset(int *x, int *y,
|
||||||
const struct drm_framebuffer *fb, int plane,
|
const struct intel_plane_state *state, int plane);
|
||||||
unsigned int rotation);
|
|
||||||
void intel_prepare_reset(struct drm_i915_private *dev_priv);
|
void intel_prepare_reset(struct drm_i915_private *dev_priv);
|
||||||
void intel_finish_reset(struct drm_i915_private *dev_priv);
|
void intel_finish_reset(struct drm_i915_private *dev_priv);
|
||||||
void hsw_enable_pc8(struct drm_i915_private *dev_priv);
|
void hsw_enable_pc8(struct drm_i915_private *dev_priv);
|
||||||
|
|
|
@ -256,8 +256,8 @@ skl_update_plane(struct drm_plane *drm_plane,
|
||||||
src_h = drm_rect_height(&r);
|
src_h = drm_rect_height(&r);
|
||||||
}
|
}
|
||||||
|
|
||||||
intel_add_fb_offsets(&x, &y, fb, 0, rotation);
|
intel_add_fb_offsets(&x, &y, plane_state, 0);
|
||||||
surf_addr = intel_compute_tile_offset(&x, &y, fb, 0, rotation);
|
surf_addr = intel_compute_tile_offset(&x, &y, plane_state, 0);
|
||||||
|
|
||||||
/* Sizes are 0 based */
|
/* Sizes are 0 based */
|
||||||
src_w--;
|
src_w--;
|
||||||
|
@ -436,8 +436,8 @@ vlv_update_plane(struct drm_plane *dplane,
|
||||||
crtc_w--;
|
crtc_w--;
|
||||||
crtc_h--;
|
crtc_h--;
|
||||||
|
|
||||||
intel_add_fb_offsets(&x, &y, fb, 0, rotation);
|
intel_add_fb_offsets(&x, &y, plane_state, 0);
|
||||||
sprsurf_offset = intel_compute_tile_offset(&x, &y, fb, 0, rotation);
|
sprsurf_offset = intel_compute_tile_offset(&x, &y, plane_state, 0);
|
||||||
|
|
||||||
if (rotation == BIT(DRM_ROTATE_180)) {
|
if (rotation == BIT(DRM_ROTATE_180)) {
|
||||||
sprctl |= SP_ROTATE_180;
|
sprctl |= SP_ROTATE_180;
|
||||||
|
@ -446,7 +446,7 @@ vlv_update_plane(struct drm_plane *dplane,
|
||||||
y += src_h;
|
y += src_h;
|
||||||
}
|
}
|
||||||
|
|
||||||
linear_offset = intel_fb_xy_to_linear(x, y, fb, 0);
|
linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
|
||||||
|
|
||||||
if (key->flags) {
|
if (key->flags) {
|
||||||
I915_WRITE(SPKEYMINVAL(pipe, plane), key->min_value);
|
I915_WRITE(SPKEYMINVAL(pipe, plane), key->min_value);
|
||||||
|
@ -567,8 +567,8 @@ ivb_update_plane(struct drm_plane *plane,
|
||||||
if (crtc_w != src_w || crtc_h != src_h)
|
if (crtc_w != src_w || crtc_h != src_h)
|
||||||
sprscale = SPRITE_SCALE_ENABLE | (src_w << 16) | src_h;
|
sprscale = SPRITE_SCALE_ENABLE | (src_w << 16) | src_h;
|
||||||
|
|
||||||
intel_add_fb_offsets(&x, &y, fb, 0, rotation);
|
intel_add_fb_offsets(&x, &y, plane_state, 0);
|
||||||
sprsurf_offset = intel_compute_tile_offset(&x, &y, fb, 0, rotation);
|
sprsurf_offset = intel_compute_tile_offset(&x, &y, plane_state, 0);
|
||||||
|
|
||||||
if (rotation == BIT(DRM_ROTATE_180)) {
|
if (rotation == BIT(DRM_ROTATE_180)) {
|
||||||
sprctl |= SPRITE_ROTATE_180;
|
sprctl |= SPRITE_ROTATE_180;
|
||||||
|
@ -580,7 +580,7 @@ ivb_update_plane(struct drm_plane *plane,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
linear_offset = intel_fb_xy_to_linear(x, y, fb, 0);
|
linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
|
||||||
|
|
||||||
if (key->flags) {
|
if (key->flags) {
|
||||||
I915_WRITE(SPRKEYVAL(pipe), key->min_value);
|
I915_WRITE(SPRKEYVAL(pipe), key->min_value);
|
||||||
|
@ -702,8 +702,8 @@ ilk_update_plane(struct drm_plane *plane,
|
||||||
if (crtc_w != src_w || crtc_h != src_h)
|
if (crtc_w != src_w || crtc_h != src_h)
|
||||||
dvsscale = DVS_SCALE_ENABLE | (src_w << 16) | src_h;
|
dvsscale = DVS_SCALE_ENABLE | (src_w << 16) | src_h;
|
||||||
|
|
||||||
intel_add_fb_offsets(&x, &y, fb, 0, rotation);
|
intel_add_fb_offsets(&x, &y, plane_state, 0);
|
||||||
dvssurf_offset = intel_compute_tile_offset(&x, &y, fb, 0, rotation);
|
dvssurf_offset = intel_compute_tile_offset(&x, &y, plane_state, 0);
|
||||||
|
|
||||||
if (rotation == BIT(DRM_ROTATE_180)) {
|
if (rotation == BIT(DRM_ROTATE_180)) {
|
||||||
dvscntr |= DVS_ROTATE_180;
|
dvscntr |= DVS_ROTATE_180;
|
||||||
|
@ -712,7 +712,7 @@ ilk_update_plane(struct drm_plane *plane,
|
||||||
y += src_h;
|
y += src_h;
|
||||||
}
|
}
|
||||||
|
|
||||||
linear_offset = intel_fb_xy_to_linear(x, y, fb, 0);
|
linear_offset = intel_fb_xy_to_linear(x, y, plane_state, 0);
|
||||||
|
|
||||||
if (key->flags) {
|
if (key->flags) {
|
||||||
I915_WRITE(DVSKEYVAL(pipe), key->min_value);
|
I915_WRITE(DVSKEYVAL(pipe), key->min_value);
|
||||||
|
|
Loading…
Reference in New Issue