disp: msm: sde: update DT parsing for VBIF QoS remap levels

Update the sde HW catalog parsing to get separate values for rp_remap
and lvl_remap for each qos level. Previously, only rp_remap were provided
and the same was applied for lvl_remap. As part of the change, add cnoc
remap level which is added as part of MDSS 9.x.

Change-Id: I112a715f8b33cd4b028886d8074e35fef75b8aab
Signed-off-by: Veera Sundaram Sankaran <quic_veeras@quicinc.com>
This commit is contained in:
Veera Sundaram Sankaran
2021-12-16 14:35:45 -08:00
rodzic 689d2cd473
commit 3c8871f45b
5 zmienionych plików z 58 dodań i 54 usunięć

Wyświetl plik

@@ -501,6 +501,7 @@ enum {
VBIF_QOS_NRT_REMAP,
VBIF_QOS_CWB_REMAP,
VBIF_QOS_LUTDMA_REMAP,
VBIF_QOS_CNOC_REMAP,
VBIF_PROP_MAX,
};
@@ -931,24 +932,17 @@ 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},
{VBIF_ID, "qcom,sde-vbif-id", false, PROP_TYPE_U32_ARRAY},
{VBIF_DEFAULT_OT_RD_LIMIT, "qcom,sde-vbif-default-ot-rd-limit", false,
PROP_TYPE_U32},
{VBIF_DEFAULT_OT_WR_LIMIT, "qcom,sde-vbif-default-ot-wr-limit", false,
PROP_TYPE_U32},
{VBIF_DYNAMIC_OT_RD_LIMIT, "qcom,sde-vbif-dynamic-ot-rd-limit", false,
PROP_TYPE_U32_ARRAY},
{VBIF_DYNAMIC_OT_WR_LIMIT, "qcom,sde-vbif-dynamic-ot-wr-limit", false,
PROP_TYPE_U32_ARRAY},
{VBIF_DEFAULT_OT_RD_LIMIT, "qcom,sde-vbif-default-ot-rd-limit", false, PROP_TYPE_U32},
{VBIF_DEFAULT_OT_WR_LIMIT, "qcom,sde-vbif-default-ot-wr-limit", false, PROP_TYPE_U32},
{VBIF_DYNAMIC_OT_RD_LIMIT, "qcom,sde-vbif-dynamic-ot-rd-limit", false, PROP_TYPE_U32_ARRAY},
{VBIF_DYNAMIC_OT_WR_LIMIT, "qcom,sde-vbif-dynamic-ot-wr-limit", false, PROP_TYPE_U32_ARRAY},
{VBIF_MEMTYPE_0, "qcom,sde-vbif-memtype-0", false, PROP_TYPE_U32_ARRAY},
{VBIF_MEMTYPE_1, "qcom,sde-vbif-memtype-1", false, PROP_TYPE_U32_ARRAY},
{VBIF_QOS_RT_REMAP, "qcom,sde-vbif-qos-rt-remap", false,
PROP_TYPE_U32_ARRAY},
{VBIF_QOS_NRT_REMAP, "qcom,sde-vbif-qos-nrt-remap", false,
PROP_TYPE_U32_ARRAY},
{VBIF_QOS_CWB_REMAP, "qcom,sde-vbif-qos-cwb-remap", false,
PROP_TYPE_U32_ARRAY},
{VBIF_QOS_LUTDMA_REMAP, "qcom,sde-vbif-qos-lutdma-remap", false,
PROP_TYPE_U32_ARRAY},
{VBIF_QOS_RT_REMAP, "qcom,sde-vbif-qos-rt-remap", false, PROP_TYPE_U32_ARRAY},
{VBIF_QOS_NRT_REMAP, "qcom,sde-vbif-qos-nrt-remap", false, PROP_TYPE_U32_ARRAY},
{VBIF_QOS_CWB_REMAP, "qcom,sde-vbif-qos-cwb-remap", false, PROP_TYPE_U32_ARRAY},
{VBIF_QOS_LUTDMA_REMAP, "qcom,sde-vbif-qos-lutdma-remap", false, PROP_TYPE_U32_ARRAY},
{VBIF_QOS_CNOC_REMAP, "qcom,sde-vbif-qos-cnoc-remap", false, PROP_TYPE_U32_ARRAY},
};
static struct sde_prop_type uidle_prop[] = {
@@ -3715,42 +3709,39 @@ static int _sde_vbif_populate_ot_parsing(struct sde_vbif_cfg *vbif,
}
static int _sde_vbif_populate_qos_parsing(struct sde_mdss_cfg *sde_cfg,
struct sde_vbif_cfg *vbif, struct sde_prop_value *prop_value,
int *prop_count)
struct sde_vbif_cfg *vbif, struct sde_prop_value *prop_value, int *prop_count)
{
int i, j;
int prop_index = VBIF_QOS_RT_REMAP;
int i, j, prop_index = VBIF_QOS_RT_REMAP;
u32 entries;
for (i = VBIF_RT_CLIENT;
((i < VBIF_MAX_CLIENT) && (prop_index < VBIF_PROP_MAX));
i++, prop_index++) {
vbif->qos_tbl[i].npriority_lvl = prop_count[prop_index];
SDE_DEBUG("qos_tbl[%d].npriority_lvl=%u\n",
i, vbif->qos_tbl[i].npriority_lvl);
for (i = VBIF_RT_CLIENT; ((i < VBIF_MAX_CLIENT) && (prop_index < VBIF_PROP_MAX));
i++, prop_index++) {
vbif->qos_tbl[i].count = prop_count[prop_index];
SDE_DEBUG("qos_tbl[%d].count=%u\n", i, vbif->qos_tbl[i].count);
if (vbif->qos_tbl[i].npriority_lvl == sde_cfg->vbif_qos_nlvl) {
vbif->qos_tbl[i].priority_lvl = kcalloc(
vbif->qos_tbl[i].npriority_lvl,
sizeof(u32), GFP_KERNEL);
if (!vbif->qos_tbl[i].priority_lvl)
entries = 2 * sde_cfg->vbif_qos_nlvl;
if (vbif->qos_tbl[i].count == entries) {
vbif->qos_tbl[i].priority_lvl = kcalloc(entries, sizeof(u32), GFP_KERNEL);
if (!vbif->qos_tbl[i].priority_lvl) {
vbif->qos_tbl[i].count = 0;
return -ENOMEM;
} else if (vbif->qos_tbl[i].npriority_lvl) {
vbif->qos_tbl[i].npriority_lvl = 0;
}
} else if (vbif->qos_tbl[i].count) {
vbif->qos_tbl[i].count = 0;
vbif->qos_tbl[i].priority_lvl = NULL;
SDE_ERROR("invalid qos table for client:%d, prop:%d\n",
i, prop_index);
SDE_ERROR("invalid qos table for client:%d, prop:%d\n", i, prop_index);
continue;
}
for (j = 0; j < vbif->qos_tbl[i].npriority_lvl; j++) {
for (j = 0; j < vbif->qos_tbl[i].count; j++) {
vbif->qos_tbl[i].priority_lvl[j] =
PROP_VALUE_ACCESS(prop_value, prop_index, j);
SDE_DEBUG("client:%d, prop:%d, lvl[%d]=%u\n",
i, prop_index, j,
PROP_VALUE_ACCESS(prop_value, prop_index, j);
SDE_DEBUG("client:%d, prop:%d, lvl[%d]=%u\n", i, prop_index, j,
vbif->qos_tbl[i].priority_lvl[j]);
}
if (vbif->qos_tbl[i].npriority_lvl)
set_bit(SDE_VBIF_QOS_REMAP, &vbif->features);
vbif->qos_tbl[i].count = entries;
set_bit(SDE_VBIF_QOS_REMAP, &vbif->features);
}
return 0;
@@ -3867,6 +3858,11 @@ static int sde_vbif_parse_dt(struct device_node *np,
if (rc)
goto end;
rc = _validate_dt_entry(np, &vbif_prop[VBIF_QOS_CNOC_REMAP], 1,
&prop_count[VBIF_QOS_CNOC_REMAP], NULL);
if (rc)
goto end;
sde_cfg->vbif_count = off_count;
rc = _read_dt_entry(np, vbif_prop, ARRAY_SIZE(vbif_prop), prop_count,

Wyświetl plik

@@ -1494,11 +1494,11 @@ struct sde_vbif_dynamic_ot_tbl {
/**
* struct sde_vbif_qos_tbl - QoS priority table
* @npriority_lvl num of priority level
* @count count of entries - rp_remap + lvl_remap entries
* @priority_lvl pointer to array of priority level in ascending order
*/
struct sde_vbif_qos_tbl {
u32 npriority_lvl;
u32 count;
u32 *priority_lvl;
};
@@ -1508,6 +1508,7 @@ struct sde_vbif_qos_tbl {
* @VBIF_NRT_CLIENT: non-realtime clients like writeback
* @VBIF_CWB_CLIENT: concurrent writeback client
* @VBIF_LUTDMA_CLIENT: LUTDMA client
* @VBIF_CNOC_CLIENT: HW fence client
* @VBIF_MAX_CLIENT: max number of clients
*/
enum sde_vbif_client_type {
@@ -1515,6 +1516,7 @@ enum sde_vbif_client_type {
VBIF_NRT_CLIENT,
VBIF_CWB_CLIENT,
VBIF_LUTDMA_CLIENT,
VBIF_CNOC_CLIENT,
VBIF_MAX_CLIENT
};

Wyświetl plik

@@ -1,5 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
*/
#include <linux/iopoll.h>
@@ -205,7 +206,7 @@ static int sde_hw_get_axi_halt_status(struct sde_hw_vbif *vbif)
}
static void sde_hw_set_qos_remap(struct sde_hw_vbif *vbif,
u32 xin_id, u32 level, u32 remap_level)
u32 xin_id, u32 level, u32 rp_remap, u32 lvl_remap)
{
struct sde_hw_blk_reg_map *c;
u32 reg_val, reg_val_lvl, mask, reg_high, reg_shift;
@@ -224,10 +225,10 @@ static void sde_hw_set_qos_remap(struct sde_hw_vbif *vbif,
mask = 0x7 << reg_shift;
reg_val &= ~mask;
reg_val |= (remap_level << reg_shift) & mask;
reg_val |= (rp_remap << reg_shift) & mask;
reg_val_lvl &= ~mask;
reg_val_lvl |= (remap_level << reg_shift) & mask;
reg_val_lvl |= (lvl_remap << reg_shift) & mask;
SDE_REG_WRITE(c, VBIF_XINL_QOS_RP_REMAP_000 + reg_high, reg_val);
SDE_REG_WRITE(c, VBIF_XINL_QOS_LVL_REMAP_000 + reg_high, reg_val_lvl);

Wyświetl plik

@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
*/
@@ -72,10 +73,11 @@ struct sde_hw_vbif_ops {
* @vbif: vbif context driver
* @xin_id: client interface identifier
* @level: priority level
* @remap_level: remapped level
* @rp_remap: rp_remap level
* @lvl_remap: lvl_remap level
*/
void (*set_qos_remap)(struct sde_hw_vbif *vbif,
u32 xin_id, u32 level, u32 remap_level);
u32 xin_id, u32 level, u32 rp_remap, u32 lvl_remap);
/**
* set_mem_type - set memory type

Wyświetl plik

@@ -1,5 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
* Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
*/
@@ -579,6 +580,7 @@ void sde_vbif_set_qos_remap(struct sde_kms *sde_kms,
bool forced_on = false;
const struct sde_vbif_qos_tbl *qos_tbl;
int i;
u32 nlvl;
if (!sde_kms || !params || !sde_kms->hw_mdp) {
SDE_ERROR("invalid arguments\n");
@@ -616,7 +618,7 @@ void sde_vbif_set_qos_remap(struct sde_kms *sde_kms,
}
qos_tbl = &vbif->cap->qos_tbl[params->client_type];
if (!qos_tbl->npriority_lvl || !qos_tbl->priority_lvl) {
if (!qos_tbl->count || !qos_tbl->priority_lvl) {
SDE_DEBUG("qos tbl not defined\n");
return;
}
@@ -625,12 +627,13 @@ void sde_vbif_set_qos_remap(struct sde_kms *sde_kms,
forced_on = _sde_vbif_setup_clk_force_ctrl(sde_kms, params->clk_ctrl, true);
for (i = 0; i < qos_tbl->npriority_lvl; i++) {
SDE_DEBUG("vbif:%d xin:%d lvl:%d/%d\n",
params->vbif_idx, params->xin_id, i,
qos_tbl->priority_lvl[i]);
nlvl = qos_tbl->count / 2;
for (i = 0; i < nlvl; i++) {
SDE_DEBUG("vbif:%d xin:%d rp_remap:%d/%d, lv_remap:%d/%d\n",
params->vbif_idx, params->xin_id, i, qos_tbl->priority_lvl[i],
i + nlvl, qos_tbl->priority_lvl[i + nlvl]);
vbif->ops.set_qos_remap(vbif, params->xin_id, i,
qos_tbl->priority_lvl[i]);
qos_tbl->priority_lvl[i], qos_tbl->priority_lvl[i + nlvl]);
}
if (forced_on)