Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a337e44c authored by Gopikrishnaiah Anandan's avatar Gopikrishnaiah Anandan
Browse files

msm: sde: demura support for register dma



Demura block of dpu will use the register dma path for programming.
Change updates the register dma frame-work to allow programming of the
demura block.

Change-Id: Ie5a64df1b2fffcb84d9554e5211249892ed2d96d
Signed-off-by: default avatarGopikrishnaiah Anandan <agopik@codeaurora.org>
parent a8371c6a
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -814,6 +814,20 @@ static int set_spr_init_feature(struct sde_hw_dspp *hw_dspp,
	return ret;
}

static int set_demura_feature(struct sde_hw_dspp *hw_dspp,
				   struct sde_hw_cp_cfg *hw_cfg,
				   struct sde_crtc *hw_crtc)
{
	int ret = 0;

	if (!hw_dspp || !hw_dspp->ops.setup_demura_cfg)
		ret = -EINVAL;
	else
		hw_dspp->ops.setup_demura_cfg(hw_dspp, hw_cfg);

	return ret;
}

feature_wrapper check_crtc_feature_wrappers[SDE_CP_CRTC_MAX_FEATURES];
#define setup_check_crtc_feature_wrappers(wrappers) \
do { \
@@ -864,6 +878,7 @@ do { \
	wrappers[SDE_CP_CRTC_DSPP_LTM_HIST_CTL] = set_ltm_hist_crtl_feature; \
	wrappers[SDE_CP_CRTC_DSPP_RC_MASK] = set_rc_mask_feature; \
	wrappers[SDE_CP_CRTC_DSPP_SPR_INIT] = set_spr_init_feature; \
	wrappers[SDE_CP_CRTC_DSPP_DEMURA_INIT] = set_demura_feature; \
} while (0)

feature_wrapper set_crtc_pu_feature_wrappers[SDE_CP_CRTC_MAX_PU_FEATURES];
@@ -1526,6 +1541,8 @@ static const int dspp_feature_to_sub_blk_tbl[SDE_CP_CRTC_MAX_FEATURES] = {
	[SDE_CP_CRTC_DSPP_SB] = SDE_DSPP_SB,
	[SDE_CP_CRTC_DSPP_SPR_INIT] = SDE_DSPP_SPR,
	[SDE_CP_CRTC_DSPP_RC_MASK] = SDE_DSPP_RC,
	[SDE_CP_CRTC_DSPP_DEMURA_INIT] = SDE_DSPP_DEMURA,
	[SDE_CP_CRTC_DSPP_DEMURA_BACKLIGHT] = SDE_DSPP_DEMURA,
	[SDE_CP_CRTC_DSPP_MAX] = SDE_DSPP_MAX,
	[SDE_CP_CRTC_LM_GC] = SDE_DSPP_MAX,
};
@@ -2754,7 +2771,7 @@ static void dspp_demura_install_property(struct drm_crtc *crtc)
	kms = get_kms(crtc);
	catalog = kms->catalog;

	version = catalog->dspp[0].sblk->demura.version >> 28;
	version = catalog->dspp[0].sblk->demura.version >> 16;
	switch (version) {
	case 1:
		sde_cp_crtc_install_blob_property(crtc, "DEMURA_INIT_V1",
+17 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 */
#include <drm/msm_drm_pp.h>
#include "sde_hw_color_proc_common_v4.h"
@@ -392,3 +392,19 @@ void sde_ltm_read_intr_status(struct sde_hw_dspp *ctx, u32 *status)
	clear |= BIT(1) | BIT(2);
	SDE_REG_WRITE(&ctx->hw, ctx->cap->sblk->ltm.base + 0x58, clear);
}

void sde_demura_backlight_cfg(struct sde_hw_dspp *dspp, u64 val)
{
	u32 demura_base;
	u32 backlight;

	if (!dspp) {
		DRM_ERROR("invalid parameter ctx %pK", dspp);
		return;
	}
	demura_base = dspp->cap->sblk->demura.base;
	backlight = (val & REG_MASK(11));
	backlight |= ((val & REG_MASK_SHIFT(11, 32)) >> 16);
	SDE_REG_WRITE(&dspp->hw, dspp->cap->sblk->demura.base + 0x8,
			backlight);
}
+8 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
 */
#ifndef _SDE_HW_COLOR_PROC_V4_H_
#define _SDE_HW_COLOR_PROC_V4_H_
@@ -70,4 +70,11 @@ void sde_setup_dspp_ltm_hist_bufferv1(struct sde_hw_dspp *ctx, u64 addr);
 */
void sde_ltm_read_intr_status(struct sde_hw_dspp *dspp, u32 *status);

/**
 * sde_demura_backlight_cfg - api to set backlight for demura
 * @dspp: pointer to dspp object
 * @val: value of backlight
 */
void sde_demura_backlight_cfg(struct sde_hw_dspp *dspp, u64 val);

#endif /* _SDE_HW_COLOR_PROC_V4_H_ */
+17 −0
Original line number Diff line number Diff line
@@ -284,6 +284,22 @@ static void dspp_spr(struct sde_hw_dspp *c)
	}
}

static void dspp_demura(struct sde_hw_dspp *c)
{
	int ret;

	if (c->cap->sblk->demura.version == SDE_COLOR_PROCESS_VER(0x1, 0x0)) {
		ret = reg_dmav1_init_dspp_op_v4(SDE_DSPP_DEMURA, c->idx);
		c->ops.setup_demura_cfg = NULL;
		c->ops.setup_demura_backlight_cfg = NULL;
		if (!ret) {
			c->ops.setup_demura_cfg = reg_dmav1_setup_demurav1;
			c->ops.setup_demura_backlight_cfg =
				sde_demura_backlight_cfg;
		}
	}
}

static void (*dspp_blocks[SDE_DSPP_MAX])(struct sde_hw_dspp *c);

static void _init_dspp_ops(void)
@@ -302,6 +318,7 @@ static void _init_dspp_ops(void)
	dspp_blocks[SDE_DSPP_LTM] = dspp_ltm;
	dspp_blocks[SDE_DSPP_RC] = dspp_rc;
	dspp_blocks[SDE_DSPP_SPR] = dspp_spr;
	dspp_blocks[SDE_DSPP_DEMURA] = dspp_demura;
}

static void _setup_dspp_ops(struct sde_hw_dspp *c, unsigned long features)
+14 −0
Original line number Diff line number Diff line
@@ -256,6 +256,20 @@ struct sde_hw_dspp_ops {
	 * @cfg: Pointer to configuration
	 */
	void (*setup_spr_init_config)(struct sde_hw_dspp *ctx, void *cfg);

	/**
	 * setup_demura_cfg - function to program demura cfg
	 * @ctx: Pointer to dspp context
	 * @status: Pointer to configuration.
	 */
	void (*setup_demura_cfg)(struct sde_hw_dspp *ctx, void *cfg);

	/**
	 * setup_demura_backlight_cfg - function to program demura backlight
	 * @ctx: Pointer to dspp context
	 * @status: Pointer to configuration.
	 */
	void (*setup_demura_backlight_cfg)(struct sde_hw_dspp *ctx, u64 val);
};

/**
Loading