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 <veeras@codeaurora.org>
This commit is contained in:
@@ -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;
|
||||
|
Viittaa uudesa ongelmassa
Block a user