drm/msm/sde: use sde plane csc cfg struct for user settings
When an incoming blob property is set for the csc, copy the
settings to the sde plane's config structure rather than a
local one. This allows the correct user values to be programmed
to the hardware.
Change-Id: I4b3e13209dd15cf7e8f932528c9929470bf5af42
Signed-off-by: Clarence Ip <cip@codeaurora.org>
diff --git a/drivers/gpu/drm/msm/sde/sde_plane.c b/drivers/gpu/drm/msm/sde/sde_plane.c
index b7f3dee..424d88d 100644
--- a/drivers/gpu/drm/msm/sde/sde_plane.c
+++ b/drivers/gpu/drm/msm/sde/sde_plane.c
@@ -390,7 +390,7 @@
};
struct sde_drm_csc *csc = NULL;
size_t csc_size = 0;
- bool user_blob = false;
+ int i;
if (!psde || !pstate || !fmt) {
DRM_ERROR("Invalid arguments\n");
@@ -400,16 +400,16 @@
return;
/* check for user space override */
+ psde->csc_ptr = NULL;
csc = msm_property_get_blob(&psde->property_info,
pstate->property_blobs,
&csc_size,
PLANE_PROP_CSC);
if (csc) {
- struct sde_csc_cfg cfg;
- int i;
-
/* user space override */
- memcpy(&cfg, &sde_csc_NOP, sizeof(struct sde_csc_cfg));
+ memcpy(&psde->csc_cfg,
+ &sde_csc_NOP,
+ sizeof(struct sde_csc_cfg));
switch (csc->version) {
case SDE_DRM_CSC_V1:
if (!_sde_plane_verify_blob(csc,
@@ -417,43 +417,37 @@
&csc->v1,
sizeof(struct sde_drm_csc_v1))) {
for (i = 0; i < SDE_CSC_MATRIX_COEFF_SIZE; ++i)
- cfg.csc_mv[i] =
+ psde->csc_cfg.csc_mv[i] =
csc->v1.ctm_coeff[i] >> 16;
for (i = 0; i < SDE_CSC_BIAS_SIZE; ++i) {
- cfg.csc_pre_bv[i] =
+ psde->csc_cfg.csc_pre_bv[i] =
csc->v1.pre_bias[i];
- cfg.csc_post_bv[i] =
+ psde->csc_cfg.csc_post_bv[i] =
csc->v1.post_bias[i];
}
for (i = 0; i < SDE_CSC_CLAMP_SIZE; ++i) {
- cfg.csc_pre_lv[i] =
+ psde->csc_cfg.csc_pre_lv[i] =
csc->v1.pre_clamp[i];
- cfg.csc_post_lv[i] =
+ psde->csc_cfg.csc_post_lv[i] =
csc->v1.post_clamp[i];
}
- user_blob = true;
+ psde->csc_ptr = &psde->csc_cfg;
}
break;
default:
break;
}
-
- if (!user_blob)
- DRM_ERROR("Invalid csc blob, v%lld\n", csc->version);
- else
- psde->pipe_hw->ops.setup_csc(psde->pipe_hw,
- (struct sde_csc_cfg *)&cfg);
+ if (!psde->csc_ptr)
+ DRM_ERROR("invalid csc blob, v%lld\n", csc->version);
}
- if (user_blob) {
- DBG("User blobs override for CSC");
- psde->csc_ptr = &psde->csc_cfg;
+ if (psde->csc_ptr)
+ DBG("user blob override for csc");
/* revert to kernel default */
- } else if (SDE_FORMAT_IS_YUV(fmt)) {
+ else if (SDE_FORMAT_IS_YUV(fmt))
psde->csc_ptr = (struct sde_csc_cfg *)&sde_csc_YUV2RGB_601L;
- } else {
+ else
psde->csc_ptr = (struct sde_csc_cfg *)&sde_csc_NOP;
- }
psde->pipe_hw->ops.setup_csc(psde->pipe_hw, psde->csc_ptr);
}