Переглянути джерело

disp: msm: sde: add hw catalog parsing for dnsc_blur block

Add device tree parsing code for downscale blur block and sub blocks.
Add restrictions to allow downscale blur block to be used only by the
writeback. Set allowed interfaces for the block while parsing from
device-tree to restrict usage.

Change-Id: Ifa4c89ec52863d245a40bd4715a4e31f542b8117
Signed-off-by: Veera Sundaram Sankaran <[email protected]>
Veera Sundaram Sankaran 4 роки тому
батько
коміт
1c722f2094
2 змінених файлів з 112 додано та 0 видалено
  1. 99 0
      msm/sde/sde_hw_catalog.c
  2. 13 0
      msm/sde/sde_hw_catalog.h

+ 99 - 0
msm/sde/sde_hw_catalog.c

@@ -369,6 +369,17 @@ enum {
 	VDC_PROP_MAX,
 };
 
+enum {
+	DNSC_BLUR_OFF,
+	DNSC_BLUR_LEN,
+	DNSC_BLUR_VERSION,
+	DNSC_BLUR_GAUS_LUT_OFF,
+	DNSC_BLUR_GAUS_LUT_LEN,
+	DNSC_BLUR_DITHER_OFF,
+	DNSC_BLUR_DITHER_LEN,
+	DNSC_BLUR_PROP_MAX,
+};
+
 enum {
 	DS_TOP_OFF,
 	DS_TOP_LEN,
@@ -905,6 +916,16 @@ static struct sde_prop_type wb_prop[] = {
 		PROP_TYPE_BIT_OFFSET_ARRAY},
 };
 
+static struct sde_prop_type dnsc_blur_prop[] = {
+	{DNSC_BLUR_OFF, "qcom,sde-dnsc-blur-off", false, PROP_TYPE_U32_ARRAY},
+	{DNSC_BLUR_LEN, "qcom,sde-dnsc-blur-size", false, PROP_TYPE_U32},
+	{DNSC_BLUR_VERSION, "qcom,sde-dnsc-blur-version", false, PROP_TYPE_U32},
+	{DNSC_BLUR_GAUS_LUT_OFF, "qcom,sde-dnsc-blur-gaus-lut-off", false, PROP_TYPE_U32_ARRAY},
+	{DNSC_BLUR_GAUS_LUT_LEN, "qcom,sde-dnsc-blur-gaus-lut-size", false, PROP_TYPE_U32},
+	{DNSC_BLUR_DITHER_OFF, "qcom,sde-dnsc-blur-dither-off", false, PROP_TYPE_U32_ARRAY},
+	{DNSC_BLUR_DITHER_LEN, "qcom,sde-dnsc-blur-dither-size", false, PROP_TYPE_U32},
+};
+
 static struct sde_prop_type vbif_prop[] = {
 	{VBIF_OFF, "qcom,sde-vbif-off", true, PROP_TYPE_U32_ARRAY},
 	{VBIF_LEN, "qcom,sde-vbif-size", false, PROP_TYPE_U32},
@@ -3423,6 +3444,76 @@ end:
 	return rc;
 }
 
+static int sde_dnsc_blur_parse_dt(struct device_node *np, struct sde_mdss_cfg *sde_cfg)
+{
+	int rc, prop_count[DNSC_BLUR_PROP_MAX], i, j;
+	struct sde_prop_value *prop_value = NULL;
+	bool prop_exists[DNSC_BLUR_PROP_MAX];
+	u32 off_count;
+	struct sde_dnsc_blur_cfg *dnsc_blur;
+	struct sde_dnsc_blur_sub_blks *sblk;
+
+	if (!sde_cfg) {
+		SDE_ERROR("invalid argument\n");
+		rc = -EINVAL;
+		goto end;
+	}
+
+	prop_value = kzalloc(DNSC_BLUR_PROP_MAX * sizeof(struct sde_prop_value), GFP_KERNEL);
+	if (!prop_value) {
+		rc = -ENOMEM;
+		goto end;
+	}
+
+	rc = _validate_dt_entry(np, dnsc_blur_prop, ARRAY_SIZE(dnsc_blur_prop),
+			prop_count, &off_count);
+	if (rc)
+		goto end;
+
+	sde_cfg->dnsc_blur_count = off_count;
+
+	rc = _read_dt_entry(np, dnsc_blur_prop, ARRAY_SIZE(dnsc_blur_prop), prop_count,
+		prop_exists, prop_value);
+	if (rc)
+		goto end;
+
+	for (i = 0; i < sde_cfg->dnsc_blur_count; i++) {
+		dnsc_blur = sde_cfg->dnsc_blur + i;
+
+		sblk = kzalloc(sizeof(*sblk), GFP_KERNEL);
+		if (!sblk) {
+			rc = -ENOMEM;
+			/* catalog deinit will release the allocated blocks */
+			goto end;
+		}
+		dnsc_blur->sblk = sblk;
+
+		dnsc_blur->base = PROP_VALUE_ACCESS(prop_value, DNSC_BLUR_OFF, i);
+		dnsc_blur->id = DNSC_BLUR_0 + i;
+		dnsc_blur->len = PROP_VALUE_ACCESS(prop_value, DNSC_BLUR_LEN, 0);
+		snprintf(dnsc_blur->name, SDE_HW_BLK_NAME_LEN, "dnsc_blur_%u",
+				dnsc_blur->id - DNSC_BLUR_0);
+		sde_cfg->dnsc_blur_rev = PROP_VALUE_ACCESS(prop_value, DNSC_BLUR_VERSION, 0);
+
+		sblk->gaus_lut.base = PROP_VALUE_ACCESS(prop_value, DNSC_BLUR_GAUS_LUT_OFF, i);
+		sblk->gaus_lut.len = PROP_VALUE_ACCESS(prop_value, DNSC_BLUR_GAUS_LUT_LEN, 0);
+		snprintf(sblk->gaus_lut.name, SDE_HW_BLK_NAME_LEN, "dnsc_blur_lut_%u",
+				dnsc_blur->id - DNSC_BLUR_0);
+
+		sblk->dither.base = PROP_VALUE_ACCESS(prop_value, DNSC_BLUR_DITHER_OFF, i);
+		sblk->dither.len = PROP_VALUE_ACCESS(prop_value, DNSC_BLUR_DITHER_LEN, 0);
+		snprintf(sblk->dither.name, SDE_HW_BLK_NAME_LEN, "dnsc_blur_dit_%u",
+				dnsc_blur->id - DNSC_BLUR_0);
+
+		for (j = 0; j < sde_cfg->wb_count; j++)
+			dnsc_blur->wb_connect |= BIT(sde_cfg->wb[j].id);
+	}
+
+end:
+	kfree(prop_value);
+	return rc;
+}
+
 static int sde_uidle_parse_dt(struct device_node *np,
 				struct sde_mdss_cfg *sde_cfg)
 {
@@ -5242,6 +5333,9 @@ void sde_hw_catalog_deinit(struct sde_mdss_cfg *sde_cfg)
 	for (i = 0; i < sde_cfg->vdc_count; i++)
 		kfree(sde_cfg->vdc[i].sblk);
 
+	for (i = 0; i < sde_cfg->dnsc_blur_count; i++)
+		kfree(sde_cfg->dnsc_blur[i].sblk);
+
 	for (i = 0; i < sde_cfg->vbif_count; i++) {
 		kfree(sde_cfg->vbif[i].dynamic_ot_rd_tbl.cfg);
 		kfree(sde_cfg->vbif[i].dynamic_ot_wr_tbl.cfg);
@@ -5404,6 +5498,11 @@ struct sde_mdss_cfg *sde_hw_catalog_init(struct drm_device *dev)
 	if (rc)
 		goto end;
 
+	/* dnsc_blur parsing should be done after wb for mapping setup */
+	rc = sde_dnsc_blur_parse_dt(np, sde_cfg);
+	if (rc)
+		goto end;
+
 	rc = sde_vbif_parse_dt(np, sde_cfg);
 	if (rc)
 		goto end;

+ 13 - 0
msm/sde/sde_hw_catalog.h

@@ -127,6 +127,13 @@
 #define IS_SDE_INLINE_ROT_REV_201(rev) \
 	((rev) == SDE_INLINE_ROT_VERSION_2_0_1)
 
+/**
+ * Downscale Blur supported versions
+ */
+#define SDE_DNSC_BLUR_VERSION_1_0_0	0x100
+
+#define IS_SDE_DNSC_BLUR_REV_100(rev) \
+	((rev) == SDE_DNSC_BLUR_VERSION_1_0_0)
 
 /*
  * UIDLE supported versions
@@ -1345,10 +1352,12 @@ struct sde_cdm_cfg   {
  * @base               register offset of this block
  * @features           bit mask identifying sub-blocks/features
  * @sblk               sub-blocks associated with Downscale Blur
+ * @wb_connect:        Bitmask of Writeback IDs this CDM can connect to
  */
 struct sde_dnsc_blur_cfg   {
 	SDE_HW_BLK_INFO;
 	struct sde_dnsc_blur_sub_blks *sblk;
+	unsigned long wb_connect;
 };
 
 /**
@@ -1660,6 +1669,7 @@ struct sde_perf_cfg {
  * @ctl_rev             control path block version
  * @ts_prefill_rev      prefill traffic shaper feature revision
  * @true_inline_rot_rev inline rotator feature revision
+ * @dnsc_blur_rev       downscale blur HW block version
  * @mdss_count          number of valid MDSS HW blocks
  * @mdss                array of pointers to MDSS HW blocks
  * @mdss_hw_block_size  max offset of MDSS_HW block (0 offset), used for debug
@@ -1684,6 +1694,8 @@ struct sde_perf_cfg {
  * @vdc                 array of pointers to VDC blocks
  * @cdm_count           number of valid chroma-down modules available
  * @cdm                 array of pointers to CDM blocks
+ * @dnsc_blur_count     number of valid Downscale Blur modules available
+ * @dnsc_blur           array of pointers to Downscale Blur blocks
  * @intf_count          number of valid INTF blocks available
  * @intf                array of pointers to INTF blocks
  * @wb_count            number of valid writeback blocks available
@@ -1756,6 +1768,7 @@ struct sde_mdss_cfg {
 	u32 ctl_rev;
 	u32 ts_prefill_rev;
 	u32 true_inline_rot_rev;
+	u32 dnsc_blur_rev;
 
 	/* HW Blocks */
 	u32 mdss_count;