disp: msm: sde: Split demura config into two blobs
Some of the demura config parameters are single buffered. When demura config is reprogrammed by user-space clients, single buffered updates can cause artifacts on screen. Change splits the double buffered and single buffered configs into different payloads to allow user-space to update double buffered config. Change-Id: I493b86944f7c2d630dcc1b863174e816cf8c82ed Signed-off-by: Gopikrishnaiah Anand <quic_agopik@quicinc.com>
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

parent
c3622fa326
commit
e556c1083f
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
|
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -642,6 +642,7 @@ struct drm_msm_spr_udc_cfg {
|
|||||||
#define DEMURA_FLAG_0 (1 << 0)
|
#define DEMURA_FLAG_0 (1 << 0)
|
||||||
#define DEMURA_FLAG_1 (1 << 1)
|
#define DEMURA_FLAG_1 (1 << 1)
|
||||||
#define DEMURA_FLAG_2 (3 << 2)
|
#define DEMURA_FLAG_2 (3 << 2)
|
||||||
|
#define DEMURA_SKIP_CFG0_PARAM2 (1 << 4)
|
||||||
#define DEMURA_PRECISION_0 (0 << 2)
|
#define DEMURA_PRECISION_0 (0 << 2)
|
||||||
#define DEMURA_PRECISION_1 (1 << 2)
|
#define DEMURA_PRECISION_1 (1 << 2)
|
||||||
#define DEMURA_PRECISION_2 (2 << 2)
|
#define DEMURA_PRECISION_2 (2 << 2)
|
||||||
@@ -692,6 +693,14 @@ struct drm_msm_dem_cfg {
|
|||||||
__u32 c1_depth;
|
__u32 c1_depth;
|
||||||
__u32 c2_depth;
|
__u32 c2_depth;
|
||||||
__u32 src_id;
|
__u32 src_id;
|
||||||
|
__u32 cfg0_param2_idx;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct drm_msm_dem_cfg0_param2 {
|
||||||
|
__u32 cfg0_param2_len;
|
||||||
|
__u64 cfg0_param2_c0[CFG0_PARAM2_LEN];
|
||||||
|
__u64 cfg0_param2_c1[CFG0_PARAM2_LEN];
|
||||||
|
__u64 cfg0_param2_c2[CFG0_PARAM2_LEN];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1025,6 +1025,22 @@ static int _set_demura_feature(struct sde_hw_dspp *hw_dspp,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _set_demura_cfg0_param2(struct sde_hw_dspp *hw_dspp,
|
||||||
|
struct sde_hw_cp_cfg *hw_cfg,
|
||||||
|
struct sde_crtc *sde_crtc)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!hw_dspp) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
} else {
|
||||||
|
if (hw_dspp->ops.setup_demura_cfg0_param2)
|
||||||
|
hw_dspp->ops.setup_demura_cfg0_param2(hw_dspp, hw_cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int _feature_unsupported(struct sde_hw_dspp *hw_dspp,
|
static int _feature_unsupported(struct sde_hw_dspp *hw_dspp,
|
||||||
struct sde_hw_cp_cfg *hw_cfg,
|
struct sde_hw_cp_cfg *hw_cfg,
|
||||||
struct sde_crtc *sde_crtc)
|
struct sde_crtc *sde_crtc)
|
||||||
@@ -1098,6 +1114,7 @@ do { \
|
|||||||
wrappers[SDE_CP_CRTC_DSPP_SPR_INIT] = _set_spr_init_feature; \
|
wrappers[SDE_CP_CRTC_DSPP_SPR_INIT] = _set_spr_init_feature; \
|
||||||
wrappers[SDE_CP_CRTC_DSPP_SPR_UDC] = _set_spr_udc_feature; \
|
wrappers[SDE_CP_CRTC_DSPP_SPR_UDC] = _set_spr_udc_feature; \
|
||||||
wrappers[SDE_CP_CRTC_DSPP_DEMURA_INIT] = _set_demura_feature; \
|
wrappers[SDE_CP_CRTC_DSPP_DEMURA_INIT] = _set_demura_feature; \
|
||||||
|
wrappers[SDE_CP_CRTC_DSPP_DEMURA_CFG0_PARAM2] = _set_demura_cfg0_param2; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
feature_wrapper set_crtc_pu_feature_wrappers[SDE_CP_CRTC_MAX_PU_FEATURES];
|
feature_wrapper set_crtc_pu_feature_wrappers[SDE_CP_CRTC_MAX_PU_FEATURES];
|
||||||
@@ -1921,6 +1938,7 @@ static const int dspp_feature_to_sub_blk_tbl[SDE_CP_CRTC_MAX_FEATURES] = {
|
|||||||
[SDE_CP_CRTC_DSPP_DEMURA_INIT] = SDE_DSPP_DEMURA,
|
[SDE_CP_CRTC_DSPP_DEMURA_INIT] = SDE_DSPP_DEMURA,
|
||||||
[SDE_CP_CRTC_DSPP_DEMURA_BACKLIGHT] = SDE_DSPP_DEMURA,
|
[SDE_CP_CRTC_DSPP_DEMURA_BACKLIGHT] = SDE_DSPP_DEMURA,
|
||||||
[SDE_CP_CRTC_DSPP_MAX] = SDE_DSPP_MAX,
|
[SDE_CP_CRTC_DSPP_MAX] = SDE_DSPP_MAX,
|
||||||
|
[SDE_CP_CRTC_DSPP_DEMURA_CFG0_PARAM2] = SDE_DSPP_DEMURA,
|
||||||
[SDE_CP_CRTC_LM_GC] = SDE_DSPP_MAX,
|
[SDE_CP_CRTC_LM_GC] = SDE_DSPP_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3537,6 +3555,9 @@ static void _dspp_demura_install_property(struct drm_crtc *crtc)
|
|||||||
SDE_CP_CRTC_DSPP_DEMURA_BOOT_PLANE, true,
|
SDE_CP_CRTC_DSPP_DEMURA_BOOT_PLANE, true,
|
||||||
sde_demura_fetch_planes,
|
sde_demura_fetch_planes,
|
||||||
ARRAY_SIZE(sde_demura_fetch_planes), 0xf);
|
ARRAY_SIZE(sde_demura_fetch_planes), 0xf);
|
||||||
|
_sde_cp_crtc_install_blob_property(crtc, "SDE_DEMURA_CFG0_PARAM2",
|
||||||
|
SDE_CP_CRTC_DSPP_DEMURA_CFG0_PARAM2,
|
||||||
|
sizeof(struct drm_msm_dem_cfg0_param2));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DRM_ERROR("version %d not supported\n", version);
|
DRM_ERROR("version %d not supported\n", version);
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -108,6 +108,7 @@ enum sde_cp_crtc_features {
|
|||||||
SDE_CP_CRTC_DSPP_DEMURA_INIT,
|
SDE_CP_CRTC_DSPP_DEMURA_INIT,
|
||||||
SDE_CP_CRTC_DSPP_DEMURA_BACKLIGHT,
|
SDE_CP_CRTC_DSPP_DEMURA_BACKLIGHT,
|
||||||
SDE_CP_CRTC_DSPP_DEMURA_BOOT_PLANE,
|
SDE_CP_CRTC_DSPP_DEMURA_BOOT_PLANE,
|
||||||
|
SDE_CP_CRTC_DSPP_DEMURA_CFG0_PARAM2,
|
||||||
SDE_CP_CRTC_DSPP_MAX,
|
SDE_CP_CRTC_DSPP_MAX,
|
||||||
/* DSPP features end */
|
/* DSPP features end */
|
||||||
|
|
||||||
|
@@ -455,6 +455,7 @@ enum {
|
|||||||
* @SDE_DSPP_DEMURA Demura block
|
* @SDE_DSPP_DEMURA Demura block
|
||||||
* @SDE_DSPP_RC RC block
|
* @SDE_DSPP_RC RC block
|
||||||
* @SDE_DSPP_SB SB LUT DMA
|
* @SDE_DSPP_SB SB LUT DMA
|
||||||
|
* @SDE_DSPP_DEMURA_CFG0_PARAM2 Demura block
|
||||||
* @SDE_DSPP_MAX maximum value
|
* @SDE_DSPP_MAX maximum value
|
||||||
*/
|
*/
|
||||||
enum {
|
enum {
|
||||||
@@ -474,6 +475,7 @@ enum {
|
|||||||
SDE_DSPP_DEMURA,
|
SDE_DSPP_DEMURA,
|
||||||
SDE_DSPP_RC,
|
SDE_DSPP_RC,
|
||||||
SDE_DSPP_SB,
|
SDE_DSPP_SB,
|
||||||
|
SDE_DSPP_DEMURA_CFG0_PARAM2,
|
||||||
SDE_DSPP_MAX
|
SDE_DSPP_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -373,11 +373,15 @@ static void dspp_spr(struct sde_hw_dspp *c)
|
|||||||
static void dspp_demura(struct sde_hw_dspp *c)
|
static void dspp_demura(struct sde_hw_dspp *c)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
c->ops.setup_demura_cfg = NULL;
|
||||||
|
c->ops.setup_demura_backlight_cfg = NULL;
|
||||||
|
c->ops.setup_demura_cfg0_param2 = NULL;
|
||||||
|
|
||||||
if (c->cap->sblk->demura.version == SDE_COLOR_PROCESS_VER(0x1, 0x0)) {
|
if (c->cap->sblk->demura.version == SDE_COLOR_PROCESS_VER(0x1, 0x0)) {
|
||||||
ret = reg_dmav1_init_dspp_op_v4(SDE_DSPP_DEMURA, c->idx);
|
ret = reg_dmav1_init_dspp_op_v4(SDE_DSPP_DEMURA, c->idx);
|
||||||
c->ops.setup_demura_cfg = NULL;
|
if (!ret)
|
||||||
c->ops.setup_demura_backlight_cfg = NULL;
|
ret = reg_dmav1_init_dspp_op_v4(SDE_DSPP_DEMURA_CFG0_PARAM2, c->idx);
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
c->ops.setup_demura_cfg = reg_dmav1_setup_demurav1;
|
c->ops.setup_demura_cfg = reg_dmav1_setup_demurav1;
|
||||||
c->ops.setup_demura_backlight_cfg =
|
c->ops.setup_demura_backlight_cfg =
|
||||||
@@ -385,11 +389,12 @@ static void dspp_demura(struct sde_hw_dspp *c)
|
|||||||
c->ops.demura_read_plane_status =
|
c->ops.demura_read_plane_status =
|
||||||
sde_demura_read_plane_status;
|
sde_demura_read_plane_status;
|
||||||
c->ops.setup_demura_pu_config = sde_demura_pu_cfg;
|
c->ops.setup_demura_pu_config = sde_demura_pu_cfg;
|
||||||
|
c->ops.setup_demura_cfg0_param2 = reg_dmav1_setup_demura_cfg0_param2;
|
||||||
}
|
}
|
||||||
} else if (c->cap->sblk->demura.version == SDE_COLOR_PROCESS_VER(0x2, 0x0)) {
|
} else if (c->cap->sblk->demura.version == SDE_COLOR_PROCESS_VER(0x2, 0x0)) {
|
||||||
ret = reg_dmav1_init_dspp_op_v4(SDE_DSPP_DEMURA, c->idx);
|
ret = reg_dmav1_init_dspp_op_v4(SDE_DSPP_DEMURA, c->idx);
|
||||||
c->ops.setup_demura_cfg = NULL;
|
if (!ret)
|
||||||
c->ops.setup_demura_backlight_cfg = NULL;
|
ret = reg_dmav1_init_dspp_op_v4(SDE_DSPP_DEMURA_CFG0_PARAM2, c->idx);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
c->ops.setup_demura_cfg = reg_dmav1_setup_demurav2;
|
c->ops.setup_demura_cfg = reg_dmav1_setup_demurav2;
|
||||||
c->ops.setup_demura_backlight_cfg =
|
c->ops.setup_demura_backlight_cfg =
|
||||||
@@ -397,6 +402,7 @@ static void dspp_demura(struct sde_hw_dspp *c)
|
|||||||
c->ops.demura_read_plane_status =
|
c->ops.demura_read_plane_status =
|
||||||
sde_demura_read_plane_status;
|
sde_demura_read_plane_status;
|
||||||
c->ops.setup_demura_pu_config = sde_demura_pu_cfg;
|
c->ops.setup_demura_pu_config = sde_demura_pu_cfg;
|
||||||
|
c->ops.setup_demura_cfg0_param2 = reg_dmav1_setup_demura_cfg0_param2;
|
||||||
} else {
|
} else {
|
||||||
SDE_ERROR("Regdma init dspp op failed for DemuraV2");
|
SDE_ERROR("Regdma init dspp op failed for DemuraV2");
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -326,6 +326,12 @@ struct sde_hw_dspp_ops {
|
|||||||
* @cfg: Pointer to configuration
|
* @cfg: Pointer to configuration
|
||||||
*/
|
*/
|
||||||
void (*setup_demura_pu_config)(struct sde_hw_dspp *ctx, void *cfg);
|
void (*setup_demura_pu_config)(struct sde_hw_dspp *ctx, void *cfg);
|
||||||
|
/**
|
||||||
|
* setup_demura_cfg0_param2 - function to configure demura cfg0_param2 params
|
||||||
|
* @ctx: Pointer to dspp context
|
||||||
|
* @cfg: Pointer to configuration
|
||||||
|
*/
|
||||||
|
void (*setup_demura_cfg0_param2)(struct sde_hw_dspp *ctx, void *cfg);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -937,6 +937,7 @@ int init_v12(struct sde_hw_reg_dma *cfg)
|
|||||||
v1_supported[SPR_PU_CFG] = (GRP_DSPP_HW_BLK_SELECT |
|
v1_supported[SPR_PU_CFG] = (GRP_DSPP_HW_BLK_SELECT |
|
||||||
GRP_MDSS_HW_BLK_SELECT);
|
GRP_MDSS_HW_BLK_SELECT);
|
||||||
v1_supported[DEMURA_CFG] = MDSS | DSPP0 | DSPP1;
|
v1_supported[DEMURA_CFG] = MDSS | DSPP0 | DSPP1;
|
||||||
|
v1_supported[DEMURA_CFG0_PARAM2] = MDSS | DSPP0 | DSPP1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1083,6 +1084,7 @@ int init_v3(struct sde_hw_reg_dma *cfg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
v1_supported[DEMURA_CFG] = v1_supported[DEMURA_CFG] | DSPP2 | DSPP3;
|
v1_supported[DEMURA_CFG] = v1_supported[DEMURA_CFG] | DSPP2 | DSPP3;
|
||||||
|
v1_supported[DEMURA_CFG0_PARAM2] = v1_supported[DEMURA_CFG0_PARAM2] | DSPP2 | DSPP3;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-only
|
// SPDX-License-Identifier: GPL-2.0-only
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -87,6 +87,8 @@
|
|||||||
REG_DMA_HEADERS_BUFFER_SZ)
|
REG_DMA_HEADERS_BUFFER_SZ)
|
||||||
#define DEMURA_MEM_SIZE ((sizeof(struct drm_msm_dem_cfg)) + \
|
#define DEMURA_MEM_SIZE ((sizeof(struct drm_msm_dem_cfg)) + \
|
||||||
REG_DMA_HEADERS_BUFFER_SZ)
|
REG_DMA_HEADERS_BUFFER_SZ)
|
||||||
|
#define DEMURA_CFG0_PARAM2_MEM_SIZE ((sizeof(struct drm_msm_dem_cfg0_param2)) + \
|
||||||
|
REG_DMA_HEADERS_BUFFER_SZ)
|
||||||
|
|
||||||
#define APPLY_MASK_AND_SHIFT(x, n, shift) ((x & (REG_MASK(n))) << (shift))
|
#define APPLY_MASK_AND_SHIFT(x, n, shift) ((x & (REG_MASK(n))) << (shift))
|
||||||
#define REG_DMA_VIG_GAMUT_OP_MASK 0x300
|
#define REG_DMA_VIG_GAMUT_OP_MASK 0x300
|
||||||
@@ -158,6 +160,7 @@ static u32 feature_map[SDE_DSPP_MAX] = {
|
|||||||
[SDE_DSPP_AD] = REG_DMA_FEATURES_MAX,
|
[SDE_DSPP_AD] = REG_DMA_FEATURES_MAX,
|
||||||
[SDE_DSPP_RC] = RC_DATA,
|
[SDE_DSPP_RC] = RC_DATA,
|
||||||
[SDE_DSPP_DEMURA] = DEMURA_CFG,
|
[SDE_DSPP_DEMURA] = DEMURA_CFG,
|
||||||
|
[SDE_DSPP_DEMURA_CFG0_PARAM2] = DEMURA_CFG0_PARAM2,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u32 sspp_feature_map[SDE_SSPP_MAX] = {
|
static u32 sspp_feature_map[SDE_SSPP_MAX] = {
|
||||||
@@ -187,6 +190,7 @@ static u32 feature_reg_dma_sz[SDE_DSPP_MAX] = {
|
|||||||
[SDE_DSPP_RC] = RC_MEM_SIZE,
|
[SDE_DSPP_RC] = RC_MEM_SIZE,
|
||||||
[SDE_DSPP_SPR] = SPR_INIT_MEM_SIZE,
|
[SDE_DSPP_SPR] = SPR_INIT_MEM_SIZE,
|
||||||
[SDE_DSPP_DEMURA] = DEMURA_MEM_SIZE,
|
[SDE_DSPP_DEMURA] = DEMURA_MEM_SIZE,
|
||||||
|
[SDE_DSPP_DEMURA_CFG0_PARAM2] = DEMURA_CFG0_PARAM2_MEM_SIZE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u32 sspp_feature_reg_dma_sz[SDE_SSPP_MAX] = {
|
static u32 sspp_feature_reg_dma_sz[SDE_SSPP_MAX] = {
|
||||||
@@ -5670,41 +5674,15 @@ static void reg_dma_demura_off(struct sde_hw_dspp *ctx,
|
|||||||
DRM_ERROR("failed to kick off ret %d\n", rc);
|
DRM_ERROR("failed to kick off ret %d\n", rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __reg_dmav1_setup_demurav1_cfg0_c_params(
|
static int __reg_dmav1_setup_demurav1_cfg0_c_params_cmn(
|
||||||
struct sde_reg_dma_setup_ops_cfg *dma_write_cfg,
|
struct sde_reg_dma_setup_ops_cfg *dma_write_cfg,
|
||||||
struct drm_msm_dem_cfg *dcfg,
|
struct sde_hw_reg_dma_ops *dma_ops,
|
||||||
struct sde_hw_reg_dma_ops *dma_ops,
|
u64 *p, u32 len, u32 *temp, u32 comp_index,
|
||||||
u32 *temp, u32 temp_sz, u32 comp_index,
|
u32 demura_base)
|
||||||
u32 demura_base)
|
|
||||||
{
|
{
|
||||||
u32 i, len;
|
u32 i;
|
||||||
u64 *p;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (temp_sz < ARRAY_SIZE(dcfg->cfg0_param2_c0) * 8 || comp_index > 2) {
|
|
||||||
DRM_ERROR("exp sz %zd act sz %d comp index %d\n",
|
|
||||||
ARRAY_SIZE(dcfg->cfg0_param2_c0) * 8,
|
|
||||||
temp_sz, comp_index);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(temp, 0x0, ARRAY_SIZE(dcfg->cfg0_param2_c0) * 8);
|
|
||||||
if (comp_index == 0) {
|
|
||||||
len = 1 << dcfg->c0_depth;
|
|
||||||
p = dcfg->cfg0_param2_c0;
|
|
||||||
} else if (comp_index == 1) {
|
|
||||||
len = 1 << dcfg->c1_depth;
|
|
||||||
p = dcfg->cfg0_param2_c1;
|
|
||||||
} else {
|
|
||||||
len = 1 << dcfg->c2_depth;
|
|
||||||
p = dcfg->cfg0_param2_c2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!len || len > 256) {
|
|
||||||
DRM_ERROR("invalid len %d Max 256\n", len);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = ((comp_index & 0x3) << 28) | BIT(31);
|
i = ((comp_index & 0x3) << 28) | BIT(31);
|
||||||
REG_DMA_SETUP_OPS(*dma_write_cfg, demura_base + 0x68,
|
REG_DMA_SETUP_OPS(*dma_write_cfg, demura_base + 0x68,
|
||||||
&i, sizeof(i), REG_SINGLE_WRITE, 0, 0, 0);
|
&i, sizeof(i), REG_SINGLE_WRITE, 0, 0, 0);
|
||||||
@@ -5732,13 +5710,72 @@ static int __reg_dmav1_setup_demurav1_cfg0_c_params(
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __reg_dmav1_setup_demurav1_cfg0_c_params(
|
||||||
|
struct sde_reg_dma_setup_ops_cfg *dma_write_cfg,
|
||||||
|
struct drm_msm_dem_cfg *dcfg,
|
||||||
|
struct sde_hw_reg_dma_ops *dma_ops,
|
||||||
|
u32 *temp, u32 temp_sz, u32 comp_index,
|
||||||
|
u32 demura_base)
|
||||||
|
{
|
||||||
|
u32 len;
|
||||||
|
u64 *p;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (temp_sz < ARRAY_SIZE(dcfg->cfg0_param2_c0) * 8 || comp_index > 2) {
|
||||||
|
DRM_ERROR("exp sz %zd act sz %d comp index %d\n",
|
||||||
|
ARRAY_SIZE(dcfg->cfg0_param2_c0) * 8,
|
||||||
|
temp_sz, comp_index);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(temp, 0x0, ARRAY_SIZE(dcfg->cfg0_param2_c0) * 8);
|
||||||
|
if (comp_index == 0) {
|
||||||
|
len = 1 << dcfg->c0_depth;
|
||||||
|
p = dcfg->cfg0_param2_c0;
|
||||||
|
} else if (comp_index == 1) {
|
||||||
|
len = 1 << dcfg->c1_depth;
|
||||||
|
p = dcfg->cfg0_param2_c1;
|
||||||
|
} else {
|
||||||
|
len = 1 << dcfg->c2_depth;
|
||||||
|
p = dcfg->cfg0_param2_c2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!len || len > 256) {
|
||||||
|
DRM_ERROR("invalid len %d Max 256\n", len);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = __reg_dmav1_setup_demurav1_cfg0_c_params_cmn(dma_write_cfg, dma_ops, p, len,
|
||||||
|
temp, comp_index, demura_base);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u32 __get_offset_idx(u32 idx, u32 depth)
|
||||||
|
{
|
||||||
|
u32 offset;
|
||||||
|
|
||||||
|
if (depth > 8 || idx > 3 || (depth == 8 && idx > 0) || (depth == 7 && idx > 1)) {
|
||||||
|
DRM_ERROR("invalid depth %d index %d\n", depth, idx);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = (1 << depth) * idx;
|
||||||
|
if ((offset + (1 << depth)) > 256) {
|
||||||
|
DRM_ERROR("invalid offset %d end %d > 256\n", offset, (offset + (1 << depth)));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
offset = (offset << 16) | (offset << 8) | offset;
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
static int __reg_dmav1_setup_demurav1_cfg0(struct sde_hw_dspp *ctx,
|
static int __reg_dmav1_setup_demurav1_cfg0(struct sde_hw_dspp *ctx,
|
||||||
struct drm_msm_dem_cfg *dcfg,
|
struct drm_msm_dem_cfg *dcfg,
|
||||||
struct sde_reg_dma_setup_ops_cfg *dma_write_cfg,
|
struct sde_reg_dma_setup_ops_cfg *dma_write_cfg,
|
||||||
struct sde_hw_reg_dma_ops *dma_ops,
|
struct sde_hw_reg_dma_ops *dma_ops,
|
||||||
struct sde_hw_cp_cfg *hw_cfg)
|
struct sde_hw_cp_cfg *hw_cfg)
|
||||||
{
|
{
|
||||||
u32 *temp = NULL, i, *p = NULL, shift, width;
|
u32 *temp = NULL, i, *p = NULL, shift, width, codebook_offset;
|
||||||
int rc;
|
int rc;
|
||||||
u32 demura_base = ctx->cap->sblk->demura.base + ctx->hw.blk_off;
|
u32 demura_base = ctx->cap->sblk->demura.base + ctx->hw.blk_off;
|
||||||
|
|
||||||
@@ -5831,7 +5868,7 @@ static int __reg_dmav1_setup_demurav1_cfg0(struct sde_hw_dspp *ctx,
|
|||||||
goto quit;
|
goto quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 3; i++) {
|
for (i = 0; i < 3 && !(dcfg->flags & DEMURA_SKIP_CFG0_PARAM2); i++) {
|
||||||
rc = __reg_dmav1_setup_demurav1_cfg0_c_params(dma_write_cfg,
|
rc = __reg_dmav1_setup_demurav1_cfg0_c_params(dma_write_cfg,
|
||||||
dcfg, dma_ops, temp,
|
dcfg, dma_ops, temp,
|
||||||
sizeof(struct drm_msm_dem_cfg), i,
|
sizeof(struct drm_msm_dem_cfg), i,
|
||||||
@@ -5840,6 +5877,20 @@ static int __reg_dmav1_setup_demurav1_cfg0(struct sde_hw_dspp *ctx,
|
|||||||
goto quit;
|
goto quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(dcfg->flags & DEMURA_SKIP_CFG0_PARAM2))
|
||||||
|
dcfg->cfg0_param2_idx = 0;
|
||||||
|
|
||||||
|
codebook_offset = __get_offset_idx(dcfg->cfg0_param2_idx, dcfg->c0_depth);
|
||||||
|
|
||||||
|
REG_DMA_SETUP_OPS(*dma_write_cfg, demura_base + 0x70,
|
||||||
|
&codebook_offset, sizeof(codebook_offset), REG_SINGLE_WRITE, 0, 0, 0);
|
||||||
|
rc = dma_ops->setup_payload(dma_write_cfg);
|
||||||
|
if (rc) {
|
||||||
|
DRM_ERROR("0x70: REG_SINGLE_WRITE err %d len %zd buf idx %d\n",
|
||||||
|
rc, sizeof(codebook_offset), dma_write_cfg->dma_buf->index);
|
||||||
|
goto quit;
|
||||||
|
}
|
||||||
|
|
||||||
width = hw_cfg->panel_width >> ((dcfg->flags & DEMURA_FLAG_1) ? 2 : 1);
|
width = hw_cfg->panel_width >> ((dcfg->flags & DEMURA_FLAG_1) ? 2 : 1);
|
||||||
DRM_DEBUG_DRIVER("0x80: value %x\n", width);
|
DRM_DEBUG_DRIVER("0x80: value %x\n", width);
|
||||||
REG_DMA_SETUP_OPS(*dma_write_cfg, demura_base + 0x80,
|
REG_DMA_SETUP_OPS(*dma_write_cfg, demura_base + 0x80,
|
||||||
@@ -6439,3 +6490,68 @@ void reg_dmav1_setup_demurav2(struct sde_hw_dspp *ctx, void *cfx)
|
|||||||
if (rc)
|
if (rc)
|
||||||
DRM_ERROR("failed to kick off demurav2 ret %d\n", rc);
|
DRM_ERROR("failed to kick off demurav2 ret %d\n", rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reg_dmav1_setup_demura_cfg0_param2(struct sde_hw_dspp *ctx, void *cfg)
|
||||||
|
{
|
||||||
|
struct drm_msm_dem_cfg0_param2 *dcfg;
|
||||||
|
struct sde_hw_cp_cfg *hw_cfg = cfg;
|
||||||
|
int rc = 0;
|
||||||
|
struct sde_hw_reg_dma_ops *dma_ops;
|
||||||
|
struct sde_reg_dma_setup_ops_cfg dma_write_cfg;
|
||||||
|
struct sde_reg_dma_kickoff_cfg kick_off;
|
||||||
|
u32 *temp, i, len;
|
||||||
|
u64 *p;
|
||||||
|
u32 demura_base = ctx->cap->sblk->demura.base + ctx->hw.blk_off;
|
||||||
|
|
||||||
|
rc = reg_dma_dspp_check(ctx, cfg, DEMURA_CFG0_PARAM2);
|
||||||
|
if (rc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!hw_cfg->payload) {
|
||||||
|
LOG_FEATURE_OFF;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hw_cfg->len != sizeof(struct drm_msm_dem_cfg0_param2)) {
|
||||||
|
DRM_ERROR("invalid sz of payload len %d exp %zd\n",
|
||||||
|
hw_cfg->len, sizeof(struct drm_msm_dem_cfg0_param2));
|
||||||
|
}
|
||||||
|
dcfg = hw_cfg->payload;
|
||||||
|
dma_ops = sde_reg_dma_get_ops();
|
||||||
|
dma_ops->reset_reg_dma_buf(dspp_buf[DEMURA_CFG0_PARAM2][ctx->idx]);
|
||||||
|
|
||||||
|
REG_DMA_INIT_OPS(dma_write_cfg, MDSS, DEMURA_CFG0_PARAM2,
|
||||||
|
dspp_buf[DEMURA_CFG0_PARAM2][ctx->idx]);
|
||||||
|
|
||||||
|
REG_DMA_SETUP_OPS(dma_write_cfg, 0, NULL, 0, HW_BLK_SELECT, 0, 0, 0);
|
||||||
|
rc = dma_ops->setup_payload(&dma_write_cfg);
|
||||||
|
if (rc) {
|
||||||
|
DRM_ERROR("write decode select failed ret %d\n", rc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
temp = kvzalloc(sizeof(struct drm_msm_dem_cfg0_param2), GFP_KERNEL);
|
||||||
|
if (!temp)
|
||||||
|
return;
|
||||||
|
len = dcfg->cfg0_param2_len;
|
||||||
|
for (i = 0; i < 3; i++) {
|
||||||
|
if (!i)
|
||||||
|
p = dcfg->cfg0_param2_c0;
|
||||||
|
else if (i == 1)
|
||||||
|
p = dcfg->cfg0_param2_c1;
|
||||||
|
else if (i == 2)
|
||||||
|
p = dcfg->cfg0_param2_c2;
|
||||||
|
__reg_dmav1_setup_demurav1_cfg0_c_params_cmn(&dma_write_cfg, dma_ops,
|
||||||
|
p, len, temp, i, demura_base);
|
||||||
|
}
|
||||||
|
REG_DMA_SETUP_KICKOFF(kick_off, hw_cfg->ctl,
|
||||||
|
dspp_buf[DEMURA_CFG0_PARAM2][ctx->idx],
|
||||||
|
REG_DMA_WRITE, DMA_CTL_QUEUE0, WRITE_IMMEDIATE,
|
||||||
|
DEMURA_CFG0_PARAM2);
|
||||||
|
|
||||||
|
rc = dma_ops->kick_off(&kick_off);
|
||||||
|
if (rc)
|
||||||
|
DRM_ERROR("failed to kick off ret %d\n", rc);
|
||||||
|
|
||||||
|
LOG_FEATURE_ON;
|
||||||
|
kvfree(temp);
|
||||||
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -367,5 +367,11 @@ void reg_dmav1_setup_demurav1(struct sde_hw_dspp *ctx, void *cfg);
|
|||||||
*/
|
*/
|
||||||
void reg_dmav1_setup_demurav2(struct sde_hw_dspp *ctx, void *cfg);
|
void reg_dmav1_setup_demurav2(struct sde_hw_dspp *ctx, void *cfg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* reg_dmav1_setup_demura_cfg0_param2() - function to set up the demura cfg0 param2 configuration.
|
||||||
|
* @ctx: dspp ctx info
|
||||||
|
* @cfg: pointer to struct sde_hw_cp_cfg
|
||||||
|
*/
|
||||||
|
void reg_dmav1_setup_demura_cfg0_param2(struct sde_hw_dspp *ctx, void *cfg);
|
||||||
|
|
||||||
#endif /* _SDE_HW_REG_DMA_V1_COLOR_PROC_H */
|
#endif /* _SDE_HW_REG_DMA_V1_COLOR_PROC_H */
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
* Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -85,6 +85,7 @@ enum sde_reg_dma_features {
|
|||||||
LTM_VLUT,
|
LTM_VLUT,
|
||||||
RC_DATA,
|
RC_DATA,
|
||||||
DEMURA_CFG,
|
DEMURA_CFG,
|
||||||
|
DEMURA_CFG0_PARAM2,
|
||||||
REG_DMA_FEATURES_MAX,
|
REG_DMA_FEATURES_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user