Commit b2b55502 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/i915: Pass proper old/new states to intel_plane_atomic_check_with_state()

Eliminate plane->state and crtc->state usage from
intel_plane_atomic_check_with_state() and its callers. Instead pass the
proper states in or dig them up from the top level atomic state.

Note that intel_plane_atomic_check_with_state() itself isn't allowed to
use the top level atomic state as there is none when it gets called from
the legacy cursor short circuit path.

v2: Rename some variables for easier comprehension (Maarten)

Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170823152226.22938-4-ville.syrjala@linux.intel.comReviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
parent 18b53818
...@@ -107,7 +107,9 @@ intel_plane_destroy_state(struct drm_plane *plane, ...@@ -107,7 +107,9 @@ intel_plane_destroy_state(struct drm_plane *plane,
drm_atomic_helper_plane_destroy_state(plane, state); drm_atomic_helper_plane_destroy_state(plane, state);
} }
int intel_plane_atomic_check_with_state(struct intel_crtc_state *crtc_state, int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_state,
struct intel_crtc_state *crtc_state,
const struct intel_plane_state *old_plane_state,
struct intel_plane_state *intel_state) struct intel_plane_state *intel_state)
{ {
struct drm_plane *plane = intel_state->base.plane; struct drm_plane *plane = intel_state->base.plane;
...@@ -124,7 +126,7 @@ int intel_plane_atomic_check_with_state(struct intel_crtc_state *crtc_state, ...@@ -124,7 +126,7 @@ int intel_plane_atomic_check_with_state(struct intel_crtc_state *crtc_state,
* anything driver-specific we need to test in that case, so * anything driver-specific we need to test in that case, so
* just return success. * just return success.
*/ */
if (!intel_state->base.crtc && !plane->state->crtc) if (!intel_state->base.crtc && !old_plane_state->base.crtc)
return 0; return 0;
/* Clip all planes to CRTC size, or 0x0 if CRTC is disabled */ /* Clip all planes to CRTC size, or 0x0 if CRTC is disabled */
...@@ -194,16 +196,21 @@ int intel_plane_atomic_check_with_state(struct intel_crtc_state *crtc_state, ...@@ -194,16 +196,21 @@ int intel_plane_atomic_check_with_state(struct intel_crtc_state *crtc_state,
else else
crtc_state->active_planes &= ~BIT(intel_plane->id); crtc_state->active_planes &= ~BIT(intel_plane->id);
return intel_plane_atomic_calc_changes(&crtc_state->base, state); return intel_plane_atomic_calc_changes(old_crtc_state,
&crtc_state->base,
old_plane_state,
state);
} }
static int intel_plane_atomic_check(struct drm_plane *plane, static int intel_plane_atomic_check(struct drm_plane *plane,
struct drm_plane_state *state) struct drm_plane_state *new_plane_state)
{ {
struct drm_crtc *crtc = state->crtc; struct drm_atomic_state *state = new_plane_state->state;
struct drm_crtc_state *drm_crtc_state; const struct drm_plane_state *old_plane_state =
drm_atomic_get_old_plane_state(state, plane);
crtc = crtc ? crtc : plane->state->crtc; struct drm_crtc *crtc = new_plane_state->crtc ?: old_plane_state->crtc;
const struct drm_crtc_state *old_crtc_state;
struct drm_crtc_state *new_crtc_state;
/* /*
* Both crtc and plane->crtc could be NULL if we're updating a * Both crtc and plane->crtc could be NULL if we're updating a
...@@ -214,29 +221,33 @@ static int intel_plane_atomic_check(struct drm_plane *plane, ...@@ -214,29 +221,33 @@ static int intel_plane_atomic_check(struct drm_plane *plane,
if (!crtc) if (!crtc)
return 0; return 0;
drm_crtc_state = drm_atomic_get_existing_crtc_state(state->state, crtc); old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc);
if (WARN_ON(!drm_crtc_state)) new_crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
return -EINVAL;
return intel_plane_atomic_check_with_state(to_intel_crtc_state(drm_crtc_state), return intel_plane_atomic_check_with_state(to_intel_crtc_state(old_crtc_state),
to_intel_plane_state(state)); to_intel_crtc_state(new_crtc_state),
to_intel_plane_state(old_plane_state),
to_intel_plane_state(new_plane_state));
} }
static void intel_plane_atomic_update(struct drm_plane *plane, static void intel_plane_atomic_update(struct drm_plane *plane,
struct drm_plane_state *old_state) struct drm_plane_state *old_state)
{ {
struct intel_atomic_state *state = to_intel_atomic_state(old_state->state);
struct intel_plane *intel_plane = to_intel_plane(plane); struct intel_plane *intel_plane = to_intel_plane(plane);
struct intel_plane_state *intel_state = const struct intel_plane_state *new_plane_state =
to_intel_plane_state(plane->state); intel_atomic_get_new_plane_state(state, intel_plane);
struct drm_crtc *crtc = plane->state->crtc ?: old_state->crtc; struct drm_crtc *crtc = new_plane_state->base.crtc ?: old_state->crtc;
if (new_plane_state->base.visible) {
const struct intel_crtc_state *new_crtc_state =
intel_atomic_get_new_crtc_state(state, to_intel_crtc(crtc));
if (intel_state->base.visible) {
trace_intel_update_plane(plane, trace_intel_update_plane(plane,
to_intel_crtc(crtc)); to_intel_crtc(crtc));
intel_plane->update_plane(intel_plane, intel_plane->update_plane(intel_plane,
to_intel_crtc_state(crtc->state), new_crtc_state, new_plane_state);
intel_state);
} else { } else {
trace_intel_disable_plane(plane, trace_intel_disable_plane(plane,
to_intel_crtc(crtc)); to_intel_crtc(crtc));
......
...@@ -10340,7 +10340,7 @@ static bool intel_wm_need_update(struct drm_plane *plane, ...@@ -10340,7 +10340,7 @@ static bool intel_wm_need_update(struct drm_plane *plane,
return false; return false;
} }
static bool needs_scaling(struct intel_plane_state *state) static bool needs_scaling(const struct intel_plane_state *state)
{ {
int src_w = drm_rect_width(&state->base.src) >> 16; int src_w = drm_rect_width(&state->base.src) >> 16;
int src_h = drm_rect_height(&state->base.src) >> 16; int src_h = drm_rect_height(&state->base.src) >> 16;
...@@ -10350,7 +10350,9 @@ static bool needs_scaling(struct intel_plane_state *state) ...@@ -10350,7 +10350,9 @@ static bool needs_scaling(struct intel_plane_state *state)
return (src_w != dst_w || src_h != dst_h); return (src_w != dst_w || src_h != dst_h);
} }
int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state, int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
struct drm_crtc_state *crtc_state,
const struct intel_plane_state *old_plane_state,
struct drm_plane_state *plane_state) struct drm_plane_state *plane_state)
{ {
struct intel_crtc_state *pipe_config = to_intel_crtc_state(crtc_state); struct intel_crtc_state *pipe_config = to_intel_crtc_state(crtc_state);
...@@ -10359,10 +10361,8 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state, ...@@ -10359,10 +10361,8 @@ int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state,
struct intel_plane *plane = to_intel_plane(plane_state->plane); struct intel_plane *plane = to_intel_plane(plane_state->plane);
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct drm_i915_private *dev_priv = to_i915(dev); struct drm_i915_private *dev_priv = to_i915(dev);
struct intel_plane_state *old_plane_state =
to_intel_plane_state(plane->base.state);
bool mode_changed = needs_modeset(crtc_state); bool mode_changed = needs_modeset(crtc_state);
bool was_crtc_enabled = crtc->state->active; bool was_crtc_enabled = old_crtc_state->base.active;
bool is_crtc_enabled = crtc_state->active; bool is_crtc_enabled = crtc_state->active;
bool turn_off, turn_on, visible, was_visible; bool turn_off, turn_on, visible, was_visible;
struct drm_framebuffer *fb = plane_state->fb; struct drm_framebuffer *fb = plane_state->fb;
...@@ -13162,6 +13162,8 @@ intel_legacy_cursor_update(struct drm_plane *plane, ...@@ -13162,6 +13162,8 @@ intel_legacy_cursor_update(struct drm_plane *plane,
new_plane_state->crtc_h = crtc_h; new_plane_state->crtc_h = crtc_h;
ret = intel_plane_atomic_check_with_state(to_intel_crtc_state(crtc->state), ret = intel_plane_atomic_check_with_state(to_intel_crtc_state(crtc->state),
to_intel_crtc_state(crtc->state), /* FIXME need a new crtc state? */
to_intel_plane_state(plane->state),
to_intel_plane_state(new_plane_state)); to_intel_plane_state(new_plane_state));
if (ret) if (ret)
goto out_free; goto out_free;
......
...@@ -1192,6 +1192,14 @@ hdmi_to_dig_port(struct intel_hdmi *intel_hdmi) ...@@ -1192,6 +1192,14 @@ hdmi_to_dig_port(struct intel_hdmi *intel_hdmi)
return container_of(intel_hdmi, struct intel_digital_port, hdmi); return container_of(intel_hdmi, struct intel_digital_port, hdmi);
} }
static inline struct intel_plane_state *
intel_atomic_get_new_plane_state(struct intel_atomic_state *state,
struct intel_plane *plane)
{
return to_intel_plane_state(drm_atomic_get_new_plane_state(&state->base,
&plane->base));
}
static inline struct intel_crtc_state * static inline struct intel_crtc_state *
intel_atomic_get_old_crtc_state(struct intel_atomic_state *state, intel_atomic_get_old_crtc_state(struct intel_atomic_state *state,
struct intel_crtc *crtc) struct intel_crtc *crtc)
...@@ -1419,7 +1427,9 @@ int intel_plane_atomic_set_property(struct drm_plane *plane, ...@@ -1419,7 +1427,9 @@ int intel_plane_atomic_set_property(struct drm_plane *plane,
struct drm_plane_state *state, struct drm_plane_state *state,
struct drm_property *property, struct drm_property *property,
uint64_t val); uint64_t val);
int intel_plane_atomic_calc_changes(struct drm_crtc_state *crtc_state, int intel_plane_atomic_calc_changes(const struct intel_crtc_state *old_crtc_state,
struct drm_crtc_state *crtc_state,
const struct intel_plane_state *old_plane_state,
struct drm_plane_state *plane_state); struct drm_plane_state *plane_state);
void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv, void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
...@@ -1978,7 +1988,9 @@ struct drm_plane_state *intel_plane_duplicate_state(struct drm_plane *plane); ...@@ -1978,7 +1988,9 @@ struct drm_plane_state *intel_plane_duplicate_state(struct drm_plane *plane);
void intel_plane_destroy_state(struct drm_plane *plane, void intel_plane_destroy_state(struct drm_plane *plane,
struct drm_plane_state *state); struct drm_plane_state *state);
extern const struct drm_plane_helper_funcs intel_plane_helper_funcs; extern const struct drm_plane_helper_funcs intel_plane_helper_funcs;
int intel_plane_atomic_check_with_state(struct intel_crtc_state *crtc_state, int intel_plane_atomic_check_with_state(const struct intel_crtc_state *old_crtc_state,
struct intel_crtc_state *crtc_state,
const struct intel_plane_state *old_plane_state,
struct intel_plane_state *intel_state); struct intel_plane_state *intel_state);
/* intel_color.c */ /* intel_color.c */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment