disp: msm: move from drm_mode to msm_mode

Move away from the private and private_flags fields from drm_mode,
as it is being deprecated in latest kernel version. Instead, Add
msm_display_mode as a wrapper to be used in downstream to store these
parameters. Also, store msm_mode in connector_state to be accessed
in commit path.

Change-Id: Ia5bdebe75f00aa15fb7db4dc3a0d50c30894a95c
Signed-off-by: Orion Brody <obrody@codeaurora.org>
This commit is contained in:
orion brody
2020-11-24 14:19:42 -08:00
parent 262099e94a
commit d00d481360
12 changed files with 396 additions and 169 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2021, The Linux Foundation. All rights reserved.
* Copyright (C) 2013 Red Hat
* Author: Rob Clark <robdclark@gmail.com>
*
@@ -961,6 +961,9 @@ static int sde_encoder_virt_atomic_check(
sde_conn = to_sde_connector(conn_state->connector);
sde_conn_state = to_sde_connector_state(conn_state);
sde_crtc_state = to_sde_crtc_state(crtc_state);
ret = sde_connector_set_msm_mode(conn_state, adj_mode);
if (ret)
return ret;
SDE_EVT32(DRMID(drm_enc), crtc_state->mode_changed,
crtc_state->active_changed, crtc_state->connectors_changed);
@@ -1006,18 +1009,18 @@ static int sde_encoder_virt_atomic_check(
CONNECTOR_PROP_QSYNC_MODE);
if (has_modeset && qsync_dirty &&
(msm_is_mode_seamless_poms(adj_mode) ||
msm_is_mode_seamless_dms(adj_mode) ||
msm_is_mode_seamless_dyn_clk(adj_mode))) {
(msm_is_mode_seamless_poms(&sde_conn_state->msm_mode) ||
msm_is_mode_seamless_dms(&sde_conn_state->msm_mode) ||
msm_is_mode_seamless_dyn_clk(&sde_conn_state->msm_mode))) {
SDE_ERROR("invalid qsync update during modeset priv flag:%x\n",
adj_mode->private_flags);
sde_conn_state->msm_mode.private_flags);
return -EINVAL;
}
SDE_EVT32(DRMID(drm_enc), adj_mode->flags, adj_mode->private_flags,
old_top, adj_mode->vrefresh, adj_mode->hdisplay,
adj_mode->vdisplay, adj_mode->htotal, adj_mode->vtotal);
SDE_EVT32(DRMID(drm_enc), adj_mode->flags,
sde_conn_state->msm_mode.private_flags,
old_top, adj_mode->vrefresh, adj_mode->hdisplay,
adj_mode->vdisplay, adj_mode->htotal, adj_mode->vtotal);
return ret;
}
@@ -2095,7 +2098,7 @@ static int sde_encoder_resource_control(struct drm_encoder *drm_enc,
}
static void sde_encoder_virt_mode_switch(struct drm_encoder *drm_enc,
enum sde_intf_mode intf_mode, struct drm_display_mode *adj_mode)
enum sde_intf_mode intf_mode, struct msm_display_mode *adj_mode)
{
int i = 0;
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
@@ -2112,19 +2115,21 @@ static void sde_encoder_virt_mode_switch(struct drm_encoder *drm_enc,
sde_enc->phys_encs[i] = sde_enc->phys_vid_encs[i];
SDE_DEBUG_ENC(sde_enc, "switch to video physical encoder\n");
SDE_EVT32(DRMID(&sde_enc->base), intf_mode, adj_mode->flags,
adj_mode->private_flags, SDE_EVTLOG_FUNC_CASE1);
SDE_EVT32(DRMID(&sde_enc->base), intf_mode,
adj_mode->base->flags, adj_mode->private_flags,
SDE_EVTLOG_FUNC_CASE1);
} else if (intf_mode == INTF_MODE_VIDEO) {
for (i = 0; i < sde_enc->num_phys_encs; i++)
sde_enc->phys_encs[i] = sde_enc->phys_cmd_encs[i];
SDE_DEBUG_ENC(sde_enc, "switch to command physical encoder\n");
SDE_EVT32(DRMID(&sde_enc->base), intf_mode, adj_mode->flags,
adj_mode->private_flags, SDE_EVTLOG_FUNC_CASE2);
SDE_EVT32(DRMID(&sde_enc->base), intf_mode,
adj_mode->base->flags, adj_mode->private_flags,
SDE_EVTLOG_FUNC_CASE2);
}
}
static struct drm_connector *_sde_encoder_get_connector(
struct drm_connector *sde_encoder_get_connector(
struct drm_device *dev, struct drm_encoder *drm_enc)
{
struct drm_connector_list_iter conn_iter;
@@ -2227,7 +2232,7 @@ static bool sde_encoder_detect_panel_mode_switch(
}
static int sde_encoder_virt_modeset_rc(struct drm_encoder *drm_enc,
struct drm_display_mode *adj_mode, bool pre_modeset)
struct msm_display_mode *msm_mode, bool pre_modeset)
{
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
enum sde_intf_mode intf_mode;
@@ -2239,8 +2244,8 @@ static int sde_encoder_virt_modeset_rc(struct drm_encoder *drm_enc,
if (pre_modeset) {
intf_mode = sde_encoder_get_intf_mode(drm_enc);
if (msm_is_mode_seamless_dms(adj_mode) ||
(msm_is_mode_seamless_dyn_clk(adj_mode) &&
if (msm_is_mode_seamless_dms(msm_mode) ||
(msm_is_mode_seamless_dyn_clk(msm_mode) &&
is_cmd_mode)) {
/* restore resource state before releasing them */
ret = sde_encoder_resource_control(drm_enc,
@@ -2257,20 +2262,20 @@ static int sde_encoder_virt_modeset_rc(struct drm_encoder *drm_enc,
* modeset to guarantee previous kickoff has finished.
*/
sde_encoder_dce_disable(sde_enc);
} else if (sde_encoder_detect_panel_mode_switch(adj_mode,
} else if (sde_encoder_detect_panel_mode_switch(msm_mode->base,
intf_mode)) {
_sde_encoder_modeset_helper_locked(drm_enc,
SDE_ENC_RC_EVENT_PRE_MODESET);
sde_encoder_virt_mode_switch(drm_enc, intf_mode,
adj_mode);
msm_mode);
}
} else {
if (msm_is_mode_seamless_dms(adj_mode) ||
(msm_is_mode_seamless_dyn_clk(adj_mode) &&
if (msm_is_mode_seamless_dms(msm_mode) ||
(msm_is_mode_seamless_dyn_clk(msm_mode) &&
is_cmd_mode))
sde_encoder_resource_control(&sde_enc->base,
SDE_ENC_RC_EVENT_POST_MODESET);
else if (msm_is_mode_seamless_poms(adj_mode))
else if (msm_is_mode_seamless_poms(msm_mode))
_sde_encoder_modeset_helper_locked(drm_enc,
SDE_ENC_RC_EVENT_POST_MODESET);
}
@@ -2285,6 +2290,8 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
struct sde_encoder_virt *sde_enc;
struct sde_kms *sde_kms;
struct drm_connector *conn;
struct sde_connector_state *c_state;
struct msm_display_mode *msm_mode;
int i = 0, ret;
int num_lm, num_intf, num_pp_per_intf;
@@ -2319,7 +2326,7 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
sde_crtc_set_qos_dirty(drm_enc->crtc);
/* get and store the mode_info */
conn = _sde_encoder_get_connector(sde_kms->dev, drm_enc);
conn = sde_encoder_get_connector(sde_kms->dev, drm_enc);
if (!conn) {
SDE_ERROR_ENC(sde_enc, "failed to find attached connector\n");
return;
@@ -2330,9 +2337,15 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
sde_connector_state_get_mode_info(conn->state, &sde_enc->mode_info);
sde_encoder_dce_set_bpp(sde_enc->mode_info, sde_enc->crtc);
c_state = to_sde_connector_state(conn->state);
if (!c_state) {
SDE_ERROR_ENC(sde_enc, "could not get connector state");
return;
}
/* release resources before seamless mode change */
ret = sde_encoder_virt_modeset_rc(drm_enc, adj_mode, true);
msm_mode = &c_state->msm_mode;
ret = sde_encoder_virt_modeset_rc(drm_enc, msm_mode, true);
if (ret)
return;
@@ -2374,7 +2387,7 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
}
/* update resources after seamless mode change */
sde_encoder_virt_modeset_rc(drm_enc, adj_mode, false);
sde_encoder_virt_modeset_rc(drm_enc, msm_mode, false);
}
void sde_encoder_control_te(struct drm_encoder *drm_enc, bool enable)
@@ -2694,8 +2707,10 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
{
struct sde_encoder_virt *sde_enc = NULL;
int i, ret = 0;
struct sde_connector_state *c_state;
struct msm_compression_info *comp_info = NULL;
struct drm_display_mode *cur_mode = NULL;
struct msm_display_mode *msm_mode;
struct msm_display_info *disp_info;
if (!drm_enc || !drm_enc->crtc) {
@@ -2736,12 +2751,18 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
}
_sde_encoder_input_handler_register(drm_enc);
c_state = to_sde_connector_state(sde_enc->cur_master->connector->state);
if (!c_state) {
SDE_ERROR("invalid connector state\n");
return;
}
msm_mode = &c_state->msm_mode;
if ((drm_enc->crtc->state->connectors_changed &&
sde_encoder_in_clone_mode(drm_enc)) ||
!(msm_is_mode_seamless_vrr(cur_mode)
|| msm_is_mode_seamless_dms(cur_mode)
|| msm_is_mode_seamless_dyn_clk(cur_mode)))
!(msm_is_mode_seamless_vrr(msm_mode)
|| msm_is_mode_seamless_dms(msm_mode)
|| msm_is_mode_seamless_dyn_clk(msm_mode)))
kthread_init_delayed_work(&sde_enc->delayed_off_work,
sde_encoder_off_work);
@@ -2785,8 +2806,8 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
* already. Invoke restore to reconfigure the
* new mode.
*/
if ((msm_is_mode_seamless_dms(cur_mode) ||
msm_is_mode_seamless_dyn_clk(cur_mode)) &&
if ((msm_is_mode_seamless_dms(msm_mode) ||
msm_is_mode_seamless_dyn_clk(msm_mode)) &&
phys->ops.restore)
phys->ops.restore(phys);
else if (phys->ops.enable)
@@ -2799,8 +2820,8 @@ static void sde_encoder_virt_enable(struct drm_encoder *drm_enc)
sde_enc->misr_frame_count);
}
if ((msm_is_mode_seamless_dms(cur_mode) ||
msm_is_mode_seamless_dyn_clk(cur_mode)) &&
if ((msm_is_mode_seamless_dms(msm_mode) ||
msm_is_mode_seamless_dyn_clk(msm_mode)) &&
sde_enc->cur_master->ops.restore)
sde_enc->cur_master->ops.restore(sde_enc->cur_master);
else if (sde_enc->cur_master->ops.enable)
@@ -5285,9 +5306,9 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
return -EINVAL;
}
drm_mode = &encoder->crtc->state->adjusted_mode;
ret = sde_connector_get_mode_info(&sde_conn->base,
&encoder->crtc->state->adjusted_mode,
&sde_conn_state->mode_info);
drm_mode, &sde_conn_state->mode_info);
if (ret) {
SDE_ERROR_ENC(sde_enc,
"conn: ->get_mode_info failed. ret=%d\n", ret);
@@ -5314,7 +5335,6 @@ int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
SDE_DEBUG_ENC(sde_enc, "connector topology = %llu\n",
sde_connector_get_topology_name(conn));
drm_mode = &encoder->crtc->state->adjusted_mode;
SDE_DEBUG_ENC(sde_enc, "hdisplay = %d, vdisplay = %d\n",
drm_mode->hdisplay, drm_mode->vdisplay);
drm_set_preferred_mode(conn, drm_mode->hdisplay, drm_mode->vdisplay);