Browse Source

disp: msm: sde: add dtsi parsing support for noise layer

Noise layer feature is supported on certain version of dpu. Change adds
parsing support for the feature into the sde hw catalog.

Change-Id: I8037cab1d7bba1ea74c13c917ee5a36c50dc50cf
Signed-off-by: Gopikrishnaiah Anandan <[email protected]>
Gopikrishnaiah Anandan 5 years ago
parent
commit
0902623719
2 changed files with 56 additions and 1 deletions
  1. 51 0
      msm/sde/sde_hw_catalog.c
  2. 5 1
      msm/sde/sde_hw_catalog.h

+ 51 - 0
msm/sde/sde_hw_catalog.c

@@ -498,6 +498,12 @@ enum {
 	REG_DMA_PROP_MAX
 };
 
+enum {
+	NOISE_LAYER_OFF,
+	NOISE_LAYER_VERSION,
+	NOISEL_LAYER_PROP_MAX
+};
+
 /*************************************************************
  * dts property definition
  *************************************************************/
@@ -961,9 +967,17 @@ static struct sde_prop_type demura_prop[] = {
 			false, PROP_TYPE_U32},
 };
 
+static struct sde_prop_type noise_layer_prop[] = {
+	[NOISE_LAYER_OFF] = {NOISE_LAYER_OFF, "qcom,sde-lm-noise-off",
+			false, PROP_TYPE_U32},
+	[NOISE_LAYER_VERSION] =  {NOISE_LAYER_VERSION,
+		"qcom,sde-lm-noise-version", false, PROP_TYPE_U32},
+};
+
 /*************************************************************
  * static API list
  *************************************************************/
+static int _sde_lm_noise_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg);
 
 static int _parse_dt_u32_handler(struct device_node *np,
 	char *prop_name, u32 *offsets, int len, bool mandatory)
@@ -2320,6 +2334,7 @@ static int sde_mixer_parse_dt(struct device_node *np,
 		}
 	}
 	sde_cfg->mixer_count = mixer_count;
+	_sde_lm_noise_parse_dt(np, sde_cfg);
 
 end:
 	sde_put_dt_props(blend_props);
@@ -2855,6 +2870,42 @@ static int _sde_rc_parse_dt(struct device_node *np,
 	return 0;
 }
 
+static int _sde_lm_noise_parse_dt(struct device_node *np,
+		struct sde_mdss_cfg *sde_cfg)
+{
+	int off_count, i;
+	struct sde_dt_props *props;
+
+	props = sde_get_dt_props(np, NOISEL_LAYER_PROP_MAX, noise_layer_prop,
+			ARRAY_SIZE(noise_layer_prop), &off_count);
+	if (IS_ERR(props)) {
+		SDE_ERROR("noise: failed to get dt props\n");
+		return PTR_ERR(props);
+	}
+
+	if (!props->exists[NOISE_LAYER_OFF] ||
+		!props->exists[NOISE_LAYER_VERSION]) {
+		SDE_ERROR("noise: prop doesnt exist %d %d\n",
+			props->exists[NOISE_LAYER_OFF],
+			props->exists[NOISE_LAYER_VERSION]);
+		goto exit;
+	}
+
+	for (i = 0; i < sde_cfg->mixer_count; i++) {
+		struct sde_lm_cfg *lm = &sde_cfg->mixer[i];
+		struct sde_lm_sub_blks *sblk = lm->sblk;
+		sblk->nlayer.base = PROP_VALUE_ACCESS(props->values,
+					NOISE_LAYER_OFF, 0);
+		sblk->nlayer.version = PROP_VALUE_ACCESS(props->values,
+					NOISE_LAYER_VERSION, 0);
+		sblk->nlayer.len = sizeof(u32);
+		set_bit(SDE_MIXER_NOISE_LAYER, &lm->features);
+	}
+exit:
+	sde_put_dt_props(props);
+	return 0;
+}
+
 static void _sde_init_dspp_sblk(struct sde_dspp_cfg *dspp,
 		struct sde_pp_blk *pp_blk, int prop_id, int blk_id,
 		struct sde_dt_props *props)

+ 5 - 1
msm/sde/sde_hw_catalog.h

@@ -337,6 +337,7 @@ enum {
  * @SDE_DISP_PRIMARY_PREF     Layer mixer preferred for primary display
  * @SDE_DISP_SECONDARY_PREF   Layer mixer preferred for secondary display
  * @SDE_MIXER_COMBINED_ALPHA  Layer mixer bg and fg alpha in single register
+ * @SDE_MIXER_NOISE_LAYER     Layer mixer supports noise layer
  * @SDE_MIXER_MAX             maximum value
  */
 enum {
@@ -349,6 +350,7 @@ enum {
 	SDE_DISP_CWB_PREF,
 	SDE_DISP_DCWB_PREF,
 	SDE_MIXER_COMBINED_ALPHA,
+	SDE_MIXER_NOISE_LAYER,
 	SDE_MIXER_MAX
 };
 
@@ -811,12 +813,14 @@ struct sde_sspp_sub_blks {
  * @maxblendstages:         Max number of blend-stages supported
  * @blendstage_base:        Blend-stage register base offset
  * @gc: gamma correction block
+ * @nlayer: noise layer block
  */
 struct sde_lm_sub_blks {
 	u32 maxwidth;
 	u32 maxblendstages;
 	u32 blendstage_base[MAX_BLOCKS];
 	struct sde_pp_blk gc;
+	struct sde_pp_blk nlayer;
 };
 
 /**
@@ -1021,7 +1025,7 @@ struct sde_sspp_cfg {
  */
 struct sde_lm_cfg {
 	SDE_HW_BLK_INFO;
-	const struct sde_lm_sub_blks *sblk;
+	struct sde_lm_sub_blks *sblk;
 	u32 dspp;
 	u32 pingpong;
 	u32 ds;