mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 07:03:03 +02:00
soc: qcom: llcc: add support for SAR2130P and SAR1130P
Implement necessary support for the LLCC control on the SAR1130P and SAR2130P platforms. These two platforms use different ATTR1_MAX_CAP shift and also require manual override for num_banks. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com> Link: https://lore.kernel.org/r/20241026-sar2130p-llcc-v3-3-2a58fa1b4d12@linaro.org Signed-off-by: Bjorn Andersson <andersson@kernel.org>
This commit is contained in:
parent
6dd3f08c72
commit
1685f685ff
|
|
@ -136,6 +136,8 @@ struct qcom_llcc_config {
|
|||
const struct llcc_slice_config *sct_data;
|
||||
const u32 *reg_offset;
|
||||
const struct llcc_edac_reg_offset *edac_reg_offset;
|
||||
u32 max_cap_shift; /* instead of ATTR1_MAX_CAP_SHIFT */
|
||||
u32 num_banks;
|
||||
int size;
|
||||
bool need_llcc_cfg;
|
||||
bool no_edac;
|
||||
|
|
@ -297,6 +299,408 @@ static const struct llcc_slice_config sa8775p_data[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static const struct llcc_slice_config sar1130p_data[] = {
|
||||
{
|
||||
.usecase_id = LLCC_CPUSS,
|
||||
.slice_id = 1,
|
||||
.max_cap = 4096,
|
||||
.priority = 1,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
.activate_on_init = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_VIDSC0,
|
||||
.slice_id = 2,
|
||||
.max_cap = 512,
|
||||
.priority = 3,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_AUDIO,
|
||||
.slice_id = 6,
|
||||
.max_cap = 1024,
|
||||
.priority = 3,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_CMPT,
|
||||
.slice_id = 10,
|
||||
.max_cap = 1024,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_GPUHTW,
|
||||
.slice_id = 11,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_GPU,
|
||||
.slice_id = 12,
|
||||
.max_cap = 3072,
|
||||
.priority = 3,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
.write_scid_en = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_MMUHWT,
|
||||
.slice_id = 13,
|
||||
.max_cap = 512,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
}, {
|
||||
.usecase_id = LLCC_DISP,
|
||||
.slice_id = 16,
|
||||
.max_cap = 12800,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_CVP,
|
||||
.slice_id = 28,
|
||||
.max_cap = 256,
|
||||
.priority = 3,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_APTCM,
|
||||
.slice_id = 26,
|
||||
.max_cap = 2048,
|
||||
.priority = 3,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x3,
|
||||
.cache_mode = true,
|
||||
.dis_cap_alloc = true,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_WRCACHE,
|
||||
.slice_id = 31,
|
||||
.max_cap = 256,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.activate_on_init = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_AENPU,
|
||||
.slice_id = 30,
|
||||
.max_cap = 3072,
|
||||
.priority = 3,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x1fff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_DISP_LEFT,
|
||||
.slice_id = 17,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_DISP_RIGHT,
|
||||
.slice_id = 18,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_EVCS_LEFT,
|
||||
.slice_id = 22,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_EVCS_RIGHT,
|
||||
.slice_id = 23,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct llcc_slice_config sar2130p_data[] = {
|
||||
{
|
||||
.usecase_id = LLCC_CPUSS,
|
||||
.slice_id = 1,
|
||||
.max_cap = 6144,
|
||||
.priority = 1,
|
||||
.fixed_size = 0,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
.activate_on_init = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_VIDSC0,
|
||||
.slice_id = 2,
|
||||
.max_cap = 128,
|
||||
.priority = 2,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_AUDIO,
|
||||
.slice_id = 6,
|
||||
.max_cap = 1024,
|
||||
.priority = 3,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_CMPT,
|
||||
.slice_id = 10,
|
||||
.max_cap = 1024,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_GPUHTW,
|
||||
.slice_id = 11,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_GPU,
|
||||
.slice_id = 12,
|
||||
.max_cap = 1536,
|
||||
.priority = 2,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
.write_scid_en = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_MMUHWT,
|
||||
.slice_id = 13,
|
||||
.max_cap = 1024,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.activate_on_init = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_DISP,
|
||||
.slice_id = 16,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_APTCM,
|
||||
.slice_id = 26,
|
||||
.max_cap = 2048,
|
||||
.priority = 3,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x3,
|
||||
.cache_mode = true,
|
||||
.dis_cap_alloc = true,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_WRCACHE,
|
||||
.slice_id = 31,
|
||||
.max_cap = 256,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.activate_on_init = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_VIEYE,
|
||||
.slice_id = 7,
|
||||
.max_cap = 7168,
|
||||
.priority = 4,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_VIDPTH,
|
||||
.slice_id = 8,
|
||||
.max_cap = 7168,
|
||||
.priority = 4,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_GPUMV,
|
||||
.slice_id = 9,
|
||||
.max_cap = 2048,
|
||||
.priority = 2,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_EVA_LEFT,
|
||||
.slice_id = 20,
|
||||
.max_cap = 7168,
|
||||
.priority = 5,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3ffffffc,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_EVA_RIGHT,
|
||||
.slice_id = 21,
|
||||
.max_cap = 7168,
|
||||
.priority = 5,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3ffffffc,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_EVAGAIN,
|
||||
.slice_id = 25,
|
||||
.max_cap = 1024,
|
||||
.priority = 2,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_AENPU,
|
||||
.slice_id = 30,
|
||||
.max_cap = 3072,
|
||||
.priority = 3,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_VIPTH,
|
||||
.slice_id = 29,
|
||||
.max_cap = 1024,
|
||||
.priority = 4,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x3fffffff,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_DISP_LEFT,
|
||||
.slice_id = 17,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_DISP_RIGHT,
|
||||
.slice_id = 18,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_EVCS_LEFT,
|
||||
.slice_id = 22,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_EVCS_RIGHT,
|
||||
.slice_id = 23,
|
||||
.max_cap = 0,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
}, {
|
||||
.usecase_id = LLCC_SPAD,
|
||||
.slice_id = 24,
|
||||
.max_cap = 7168,
|
||||
.priority = 1,
|
||||
.fixed_size = true,
|
||||
.bonus_ways = 0x0,
|
||||
.res_ways = 0x0,
|
||||
.cache_mode = 0,
|
||||
.retain_on_pc = true,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct llcc_slice_config sc7180_data[] = {
|
||||
{
|
||||
.usecase_id = LLCC_CPUSS,
|
||||
|
|
@ -2686,6 +3090,30 @@ static const struct qcom_llcc_config sa8775p_cfg[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static const struct qcom_llcc_config sar1130p_cfg[] = {
|
||||
{
|
||||
.sct_data = sar1130p_data,
|
||||
.size = ARRAY_SIZE(sar1130p_data),
|
||||
.need_llcc_cfg = true,
|
||||
.reg_offset = llcc_v2_1_reg_offset,
|
||||
.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
|
||||
.max_cap_shift = 14,
|
||||
.num_banks = 2,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct qcom_llcc_config sar2130p_cfg[] = {
|
||||
{
|
||||
.sct_data = sar2130p_data,
|
||||
.size = ARRAY_SIZE(sar2130p_data),
|
||||
.need_llcc_cfg = true,
|
||||
.reg_offset = llcc_v2_1_reg_offset,
|
||||
.edac_reg_offset = &llcc_v2_1_edac_reg_offset,
|
||||
.max_cap_shift = 14,
|
||||
.num_banks = 2,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct qcom_llcc_config sc7180_cfg[] = {
|
||||
{
|
||||
.sct_data = sc7180_data,
|
||||
|
|
@ -2837,6 +3265,16 @@ static const struct qcom_sct_config sa8775p_cfgs = {
|
|||
.num_config = ARRAY_SIZE(sa8775p_cfg),
|
||||
};
|
||||
|
||||
static const struct qcom_sct_config sar1130p_cfgs = {
|
||||
.llcc_config = sar1130p_cfg,
|
||||
.num_config = ARRAY_SIZE(sar1130p_cfg),
|
||||
};
|
||||
|
||||
static const struct qcom_sct_config sar2130p_cfgs = {
|
||||
.llcc_config = sar2130p_cfg,
|
||||
.num_config = ARRAY_SIZE(sar2130p_cfg),
|
||||
};
|
||||
|
||||
static const struct qcom_sct_config sc7180_cfgs = {
|
||||
.llcc_config = sc7180_cfg,
|
||||
.num_config = ARRAY_SIZE(sc7180_cfg),
|
||||
|
|
@ -3144,7 +3582,10 @@ static int _qcom_llcc_cfg_program(const struct llcc_slice_config *config,
|
|||
*/
|
||||
max_cap_cacheline = max_cap_cacheline / drv_data->num_banks;
|
||||
max_cap_cacheline >>= CACHE_LINE_SIZE_SHIFT;
|
||||
attr1_val |= max_cap_cacheline << ATTR1_MAX_CAP_SHIFT;
|
||||
if (cfg->max_cap_shift)
|
||||
attr1_val |= max_cap_cacheline << cfg->max_cap_shift;
|
||||
else
|
||||
attr1_val |= max_cap_cacheline << ATTR1_MAX_CAP_SHIFT;
|
||||
|
||||
attr1_cfg = LLCC_TRP_ATTR1_CFGn(config->slice_id);
|
||||
|
||||
|
|
@ -3381,12 +3822,17 @@ static int qcom_llcc_probe(struct platform_device *pdev)
|
|||
goto err;
|
||||
cfg = &cfgs->llcc_config[cfg_index];
|
||||
|
||||
ret = regmap_read(regmap, cfg->reg_offset[LLCC_COMMON_STATUS0], &num_banks);
|
||||
if (ret)
|
||||
goto err;
|
||||
if (cfg->num_banks) {
|
||||
num_banks = cfg->num_banks;
|
||||
} else {
|
||||
ret = regmap_read(regmap, cfg->reg_offset[LLCC_COMMON_STATUS0], &num_banks);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
num_banks &= LLCC_LB_CNT_MASK;
|
||||
num_banks >>= LLCC_LB_CNT_SHIFT;
|
||||
}
|
||||
|
||||
num_banks &= LLCC_LB_CNT_MASK;
|
||||
num_banks >>= LLCC_LB_CNT_SHIFT;
|
||||
drv_data->num_banks = num_banks;
|
||||
|
||||
drv_data->regmaps = devm_kcalloc(dev, num_banks, sizeof(*drv_data->regmaps), GFP_KERNEL);
|
||||
|
|
@ -3483,6 +3929,8 @@ static int qcom_llcc_probe(struct platform_device *pdev)
|
|||
static const struct of_device_id qcom_llcc_of_match[] = {
|
||||
{ .compatible = "qcom,qdu1000-llcc", .data = &qdu1000_cfgs},
|
||||
{ .compatible = "qcom,sa8775p-llcc", .data = &sa8775p_cfgs },
|
||||
{ .compatible = "qcom,sar1130p-llcc", .data = &sar1130p_cfgs },
|
||||
{ .compatible = "qcom,sar2130p-llcc", .data = &sar2130p_cfgs },
|
||||
{ .compatible = "qcom,sc7180-llcc", .data = &sc7180_cfgs },
|
||||
{ .compatible = "qcom,sc7280-llcc", .data = &sc7280_cfgs },
|
||||
{ .compatible = "qcom,sc8180x-llcc", .data = &sc8180x_cfgs },
|
||||
|
|
|
|||
|
|
@ -54,7 +54,19 @@
|
|||
#define LLCC_CAMEXP4 52
|
||||
#define LLCC_DISP_WB 53
|
||||
#define LLCC_DISP_1 54
|
||||
#define LLCC_VIEYE 57
|
||||
#define LLCC_VIDPTH 58
|
||||
#define LLCC_GPUMV 59
|
||||
#define LLCC_EVA_LEFT 60
|
||||
#define LLCC_EVA_RIGHT 61
|
||||
#define LLCC_EVAGAIN 62
|
||||
#define LLCC_VIPTH 63
|
||||
#define LLCC_VIDVSP 64
|
||||
#define LLCC_DISP_LEFT 65
|
||||
#define LLCC_DISP_RIGHT 66
|
||||
#define LLCC_EVCS_LEFT 67
|
||||
#define LLCC_EVCS_RIGHT 68
|
||||
#define LLCC_SPAD 69
|
||||
|
||||
/**
|
||||
* struct llcc_slice_desc - Cache slice descriptor
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user