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>
*
@@ -40,6 +40,7 @@
#include "sde_power_handle.h"
#include "sde_core_perf.h"
#include "sde_trace.h"
#include "msm_drv.h"
#define SDE_PSTATES_MAX (SDE_STAGE_MAX * 4)
#define SDE_MULTIRECT_PLANE_MAX (SDE_STAGE_MAX * 2)
@@ -455,15 +456,83 @@ static void sde_crtc_destroy(struct drm_crtc *crtc)
kfree(sde_crtc);
}
struct msm_display_mode *sde_crtc_get_msm_mode(struct drm_crtc_state *c_state)
{
struct drm_connector *connector;
struct drm_encoder *encoder;
struct sde_connector_state *conn_state;
bool encoder_valid = false;
drm_for_each_encoder_mask(encoder, c_state->crtc->dev,
c_state->encoder_mask) {
if (!sde_encoder_in_clone_mode(encoder)) {
encoder_valid = true;
break;
}
}
if (!encoder_valid)
return NULL;
connector = sde_encoder_get_connector(c_state->crtc->dev, encoder);
if (!connector)
return NULL;
conn_state = to_sde_connector_state(connector->state);
if (!conn_state)
return NULL;
return &conn_state->msm_mode;
}
static bool sde_crtc_mode_fixup(struct drm_crtc *crtc,
const struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)
{
struct msm_display_mode *msm_mode;
struct drm_crtc_state *c_state;
struct drm_connector *connector;
struct drm_encoder *encoder;
struct drm_connector_state *new_conn_state;
struct sde_connector_state *c_conn_state;
bool encoder_valid = false;
int i;
SDE_DEBUG("\n");
if ((msm_is_mode_seamless(adjusted_mode) ||
(msm_is_mode_seamless_vrr(adjusted_mode) ||
msm_is_mode_seamless_dyn_clk(adjusted_mode))) &&
c_state = container_of(adjusted_mode, struct drm_crtc_state,
adjusted_mode);
drm_for_each_encoder_mask(encoder, c_state->crtc->dev,
c_state->encoder_mask) {
if (!sde_encoder_in_clone_mode(encoder)) {
encoder_valid = true;
break;
}
}
if (!encoder_valid) {
SDE_ERROR("encoder not found\n");
return true;
}
for_each_new_connector_in_state(c_state->state, connector,
new_conn_state, i) {
if (new_conn_state->best_encoder == encoder){
break;
}
}
c_conn_state = to_sde_connector_state(new_conn_state);
if (!c_conn_state) {
SDE_ERROR("could not get connector state\n");
return true;
}
msm_mode = &c_conn_state->msm_mode;
if ((msm_is_mode_seamless(msm_mode) ||
(msm_is_mode_seamless_vrr(msm_mode) ||
msm_is_mode_seamless_dyn_clk(msm_mode))) &&
(!crtc->enabled)) {
SDE_ERROR("crtc state prevents seamless transition\n");
return false;
@@ -4266,6 +4335,7 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
u32 power_on;
int ret, i;
struct sde_crtc_state *cstate;
struct msm_display_mode *msm_mode;
if (!crtc || !crtc->dev || !crtc->dev->dev_private) {
SDE_ERROR("invalid crtc\n");
@@ -4302,12 +4372,17 @@ static void sde_crtc_enable(struct drm_crtc *crtc,
* change is also consider to enable/disable UIDLE
*/
sde_core_perf_crtc_update_uidle(crtc, true);
msm_mode = sde_crtc_get_msm_mode(crtc->state);
if (!msm_mode){
SDE_ERROR("invalid msm mode, %s\n",
crtc->state->adjusted_mode.name);
return;
}
/* return early if crtc is already enabled, do this after UIDLE check */
if (sde_crtc->enabled) {
if (msm_is_mode_seamless_dms(&crtc->state->adjusted_mode) ||
msm_is_mode_seamless_dyn_clk(&crtc->state->adjusted_mode))
if (msm_is_mode_seamless_dms(msm_mode) ||
msm_is_mode_seamless_dyn_clk(msm_mode))
SDE_DEBUG("%s extra crtc enable expected during DMS\n",
sde_crtc->name);
else