Merge "disp: msm: sde: fix inline rotator downscale ratio check"

This commit is contained in:
qctecmdr
2019-09-19 17:26:03 -07:00
committed by Gerrit - the friendly Code Review server
4 changed files with 31 additions and 17 deletions

View File

@@ -456,7 +456,7 @@ static inline bool _sde_core_perf_is_wb(struct drm_crtc *crtc)
{ {
enum sde_intf_mode if_mode = INTF_MODE_NONE; enum sde_intf_mode if_mode = INTF_MODE_NONE;
if_mode = sde_crtc_get_intf_mode(crtc); if_mode = sde_crtc_get_intf_mode(crtc, crtc->state);
if (if_mode == INTF_MODE_WB_BLOCK || if (if_mode == INTF_MODE_WB_BLOCK ||
if_mode == INTF_MODE_WB_LINE) if_mode == INTF_MODE_WB_LINE)
return true; return true;
@@ -678,7 +678,7 @@ void sde_core_perf_crtc_release_bw(struct drm_crtc *crtc)
sde_cstate = to_sde_crtc_state(crtc->state); sde_cstate = to_sde_crtc_state(crtc->state);
/* only do this for command mode rt client (non-rsc client) */ /* only do this for command mode rt client (non-rsc client) */
if ((sde_crtc_get_intf_mode(crtc) != INTF_MODE_CMD) && if ((sde_crtc_get_intf_mode(crtc, crtc->state) != INTF_MODE_CMD) &&
(sde_crtc_get_client_type(crtc) != RT_RSC_CLIENT)) (sde_crtc_get_client_type(crtc) != RT_RSC_CLIENT))
return; return;
@@ -686,11 +686,11 @@ void sde_core_perf_crtc_release_bw(struct drm_crtc *crtc)
* If video interface present, cmd panel bandwidth cannot be * If video interface present, cmd panel bandwidth cannot be
* released. * released.
*/ */
if (sde_crtc_get_intf_mode(crtc) == INTF_MODE_CMD) if (sde_crtc_get_intf_mode(crtc, crtc->state) == INTF_MODE_CMD)
drm_for_each_crtc(tmp_crtc, crtc->dev) { drm_for_each_crtc(tmp_crtc, crtc->dev) {
if (_sde_core_perf_crtc_is_power_on(tmp_crtc) && if (_sde_core_perf_crtc_is_power_on(tmp_crtc) &&
sde_crtc_get_intf_mode(tmp_crtc) == sde_crtc_get_intf_mode(tmp_crtc,
INTF_MODE_VIDEO) tmp_crtc->state) == INTF_MODE_VIDEO)
return; return;
} }

View File

@@ -2227,17 +2227,18 @@ end:
spin_unlock_irqrestore(&dev->event_lock, flags); spin_unlock_irqrestore(&dev->event_lock, flags);
} }
enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc) enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc,
struct drm_crtc_state *cstate)
{ {
struct drm_encoder *encoder; struct drm_encoder *encoder;
if (!crtc || !crtc->dev) { if (!crtc || !crtc->dev || !cstate) {
SDE_ERROR("invalid crtc\n"); SDE_ERROR("invalid crtc\n");
return INTF_MODE_NONE; return INTF_MODE_NONE;
} }
drm_for_each_encoder_mask(encoder, crtc->dev, drm_for_each_encoder_mask(encoder, crtc->dev,
crtc->state->encoder_mask) { cstate->encoder_mask) {
/* continue if copy encoder is encountered */ /* continue if copy encoder is encountered */
if (sde_encoder_in_clone_mode(encoder)) if (sde_encoder_in_clone_mode(encoder))
continue; continue;
@@ -5589,7 +5590,8 @@ static int sde_crtc_debugfs_state_show(struct seq_file *s, void *v)
seq_printf(s, "num_connectors: %d\n", cstate->num_connectors); seq_printf(s, "num_connectors: %d\n", cstate->num_connectors);
seq_printf(s, "client type: %d\n", sde_crtc_get_client_type(crtc)); seq_printf(s, "client type: %d\n", sde_crtc_get_client_type(crtc));
seq_printf(s, "intf_mode: %d\n", sde_crtc_get_intf_mode(crtc)); seq_printf(s, "intf_mode: %d\n", sde_crtc_get_intf_mode(crtc,
crtc->state));
seq_printf(s, "core_clk_rate: %llu\n", seq_printf(s, "core_clk_rate: %llu\n",
sde_crtc->cur_perf.core_clk_rate); sde_crtc->cur_perf.core_clk_rate);
for (i = SDE_POWER_HANDLE_DBUS_ID_MNOC; for (i = SDE_POWER_HANDLE_DBUS_ID_MNOC;

View File

@@ -593,9 +593,11 @@ int sde_crtc_register_custom_event(struct sde_kms *kms,
/** /**
* sde_crtc_get_intf_mode - get interface mode of the given crtc * sde_crtc_get_intf_mode - get interface mode of the given crtc
* @crtc: Pointert to crtc * @crtc: Pointert to DRM crtc
* @crtc: Pointert to DRM crtc_state
*/ */
enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc); enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc,
struct drm_crtc_state *cstate);
/** /**
* sde_crtc_get_fps_mode - get frame rate of the given crtc * sde_crtc_get_fps_mode - get frame rate of the given crtc
@@ -621,14 +623,16 @@ static inline enum sde_crtc_client_type sde_crtc_get_client_type(
/** /**
* sde_crtc_is_rt_client - check if real-time client or not * sde_crtc_is_rt_client - check if real-time client or not
* @crtc: Pointer to crtc * @crtc: Pointer to DRM crtc
* @crtc_state: Pointer to DRM crtc_state
*/ */
static inline bool sde_crtc_is_rt_client(struct drm_crtc *crtc) static inline bool sde_crtc_is_rt_client(struct drm_crtc *crtc,
struct drm_crtc_state *cstate)
{ {
if (!crtc || !crtc->state) if (!crtc || !cstate)
return true; return true;
return (sde_crtc_get_intf_mode(crtc) != INTF_MODE_WB_LINE); return (sde_crtc_get_intf_mode(crtc, cstate) != INTF_MODE_WB_LINE);
} }
/** /**

View File

@@ -2406,6 +2406,12 @@ static int _sde_atomic_check_decimation_scaler(struct drm_plane_state *state,
uint32_t max_upscale, max_linewidth; uint32_t max_upscale, max_linewidth;
bool inline_rotation, rt_client; bool inline_rotation, rt_client;
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct drm_crtc_state *new_cstate;
if (!state || !state->state || !state->crtc) {
SDE_ERROR_PLANE(psde, "invalid arguments\n");
return -EINVAL;
}
deci_w = sde_plane_get_property(pstate, PLANE_PROP_H_DECIMATE); deci_w = sde_plane_get_property(pstate, PLANE_PROP_H_DECIMATE);
deci_h = sde_plane_get_property(pstate, PLANE_PROP_V_DECIMATE); deci_h = sde_plane_get_property(pstate, PLANE_PROP_V_DECIMATE);
@@ -2427,7 +2433,9 @@ static int _sde_atomic_check_decimation_scaler(struct drm_plane_state *state,
max_linewidth = psde->pipe_sblk->maxlinewidth; max_linewidth = psde->pipe_sblk->maxlinewidth;
crtc = state->crtc; crtc = state->crtc;
rt_client = sde_crtc_is_rt_client(crtc); new_cstate = drm_atomic_get_new_crtc_state(state->state, crtc);
rt_client = sde_crtc_is_rt_client(crtc, new_cstate);
max_downscale_denom = 1; max_downscale_denom = 1;
/* inline rotation RT clients have a different max downscaling limit */ /* inline rotation RT clients have a different max downscaling limit */
@@ -3208,7 +3216,7 @@ static int sde_plane_sspp_atomic_update(struct drm_plane *plane,
return 0; return 0;
pstate->pending = true; pstate->pending = true;
psde->is_rt_pipe = sde_crtc_is_rt_client(crtc); psde->is_rt_pipe = sde_crtc_is_rt_client(crtc, crtc->state);
_sde_plane_set_qos_ctrl(plane, false, SDE_PLANE_QOS_PANIC_CTRL); _sde_plane_set_qos_ctrl(plane, false, SDE_PLANE_QOS_PANIC_CTRL);
_sde_plane_update_properties(plane, crtc, fb); _sde_plane_update_properties(plane, crtc, fb);