xref: /linux/drivers/soc/qcom/ubwc_config.c (revision 709dd2ff2357734f5a0b2ef68e1f7c4256543a70)
11924272bSKonrad Dybcio // SPDX-License-Identifier: GPL-2.0-only
21924272bSKonrad Dybcio /*
31924272bSKonrad Dybcio  * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
41924272bSKonrad Dybcio  */
51924272bSKonrad Dybcio 
61924272bSKonrad Dybcio #include <linux/debugfs.h>
71924272bSKonrad Dybcio #include <linux/io.h>
81924272bSKonrad Dybcio #include <linux/module.h>
91924272bSKonrad Dybcio #include <linux/of.h>
101924272bSKonrad Dybcio #include <linux/of_address.h>
111924272bSKonrad Dybcio #include <linux/platform_device.h>
121924272bSKonrad Dybcio 
131924272bSKonrad Dybcio #include <linux/soc/qcom/ubwc.h>
141924272bSKonrad Dybcio 
151924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data msm8937_data = {
161924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_1_0,
171924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_1_0,
181924272bSKonrad Dybcio 	.highest_bank_bit = 14,
191924272bSKonrad Dybcio };
201924272bSKonrad Dybcio 
211924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data msm8998_data = {
221924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_1_0,
231924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_1_0,
241924272bSKonrad Dybcio 	.highest_bank_bit = 15,
251924272bSKonrad Dybcio };
261924272bSKonrad Dybcio 
271924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data qcm2290_data = {
281924272bSKonrad Dybcio 	/* no UBWC */
291924272bSKonrad Dybcio 	.highest_bank_bit = 15,
301924272bSKonrad Dybcio };
311924272bSKonrad Dybcio 
321924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sa8775p_data = {
331924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
341924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
35*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL3,
361924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
371924272bSKonrad Dybcio 	.highest_bank_bit = 13,
381924272bSKonrad Dybcio 	.macrotile_mode = true,
391924272bSKonrad Dybcio };
401924272bSKonrad Dybcio 
411924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sar2130p_data = {
421924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_3_0, /* 4.0.2 in hw */
431924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_3,
44*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
45*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
461924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
471924272bSKonrad Dybcio 	.highest_bank_bit = 13,
481924272bSKonrad Dybcio 	.macrotile_mode = true,
491924272bSKonrad Dybcio };
501924272bSKonrad Dybcio 
511924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sc7180_data = {
521924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
531924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
54*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
55*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
561924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
571924272bSKonrad Dybcio 	.highest_bank_bit = 14,
581924272bSKonrad Dybcio };
591924272bSKonrad Dybcio 
601924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sc7280_data = {
611924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_3_0,
621924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
63*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
64*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
651924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
661924272bSKonrad Dybcio 	.highest_bank_bit = 14,
671924272bSKonrad Dybcio 	.macrotile_mode = true,
681924272bSKonrad Dybcio };
691924272bSKonrad Dybcio 
701924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sc8180x_data = {
711924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_3_0,
721924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_3_0,
731924272bSKonrad Dybcio 	.highest_bank_bit = 16,
741924272bSKonrad Dybcio 	.macrotile_mode = true,
751924272bSKonrad Dybcio };
761924272bSKonrad Dybcio 
771924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sc8280xp_data = {
781924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
791924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
80*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
81*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
821924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
831924272bSKonrad Dybcio 	.highest_bank_bit = 16,
841924272bSKonrad Dybcio 	.macrotile_mode = true,
851924272bSKonrad Dybcio };
861924272bSKonrad Dybcio 
871924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sdm670_data = {
881924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
891924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
901924272bSKonrad Dybcio 	.highest_bank_bit = 14,
911924272bSKonrad Dybcio };
921924272bSKonrad Dybcio 
931924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sdm845_data = {
941924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
951924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
961924272bSKonrad Dybcio 	.highest_bank_bit = 15,
971924272bSKonrad Dybcio };
981924272bSKonrad Dybcio 
991924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm6115_data = {
1001924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_1_0,
1011924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
102*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL1 |
103*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL2 |
104*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1051924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1061924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1071924272bSKonrad Dybcio };
1081924272bSKonrad Dybcio 
1091924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm6125_data = {
1101924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_1_0,
1111924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_3_0,
112*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL1 |
113*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL2 |
114*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1151924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1161924272bSKonrad Dybcio };
1171924272bSKonrad Dybcio 
1181924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm6150_data = {
1191924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
1201924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
1211924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1221924272bSKonrad Dybcio };
1231924272bSKonrad Dybcio 
1241924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm6350_data = {
1251924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
1261924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
127*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
128*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1291924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1301924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1311924272bSKonrad Dybcio };
1321924272bSKonrad Dybcio 
1331924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm7150_data = {
1341924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
1351924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
1361924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1371924272bSKonrad Dybcio };
1381924272bSKonrad Dybcio 
1391924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8150_data = {
1401924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_3_0,
1411924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_3_0,
1421924272bSKonrad Dybcio 	.highest_bank_bit = 15,
1431924272bSKonrad Dybcio };
1441924272bSKonrad Dybcio 
1451924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8250_data = {
1461924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
1471924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
148*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
149*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1501924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1511924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
1521924272bSKonrad Dybcio 	.highest_bank_bit = 16,
1531924272bSKonrad Dybcio 	.macrotile_mode = true,
1541924272bSKonrad Dybcio };
1551924272bSKonrad Dybcio 
1561924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8350_data = {
1571924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
1581924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
159*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
160*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1611924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1621924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
1631924272bSKonrad Dybcio 	.highest_bank_bit = 16,
1641924272bSKonrad Dybcio 	.macrotile_mode = true,
1651924272bSKonrad Dybcio };
1661924272bSKonrad Dybcio 
1671924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8550_data = {
1681924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
1691924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_3,
170*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
171*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1721924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1731924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
1741924272bSKonrad Dybcio 	.highest_bank_bit = 16,
1751924272bSKonrad Dybcio 	.macrotile_mode = true,
1761924272bSKonrad Dybcio };
1771924272bSKonrad Dybcio 
1781924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8750_data = {
1791924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_5_0,
1801924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_5_0,
1811924272bSKonrad Dybcio 	.ubwc_swizzle = 6,
1821924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1831924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
1841924272bSKonrad Dybcio 	.highest_bank_bit = 16,
1851924272bSKonrad Dybcio 	.macrotile_mode = true,
1861924272bSKonrad Dybcio };
1871924272bSKonrad Dybcio 
1881924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data x1e80100_data = {
1891924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
1901924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_3,
191*709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
192*709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1931924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1941924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
1951924272bSKonrad Dybcio 	.highest_bank_bit = 16,
1961924272bSKonrad Dybcio 	.macrotile_mode = true,
1971924272bSKonrad Dybcio };
1981924272bSKonrad Dybcio 
1991924272bSKonrad Dybcio static const struct of_device_id qcom_ubwc_configs[] __maybe_unused = {
2001924272bSKonrad Dybcio 	{ .compatible = "qcom,apq8096", .data = &msm8998_data },
2011924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8917", .data = &msm8937_data },
2021924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8937", .data = &msm8937_data },
2031924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8953", .data = &msm8937_data },
2041924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8956", .data = &msm8937_data },
2051924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8976", .data = &msm8937_data },
2061924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8996", .data = &msm8998_data },
2071924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8998", .data = &msm8998_data },
2081924272bSKonrad Dybcio 	{ .compatible = "qcom,qcm2290", .data = &qcm2290_data, },
2091924272bSKonrad Dybcio 	{ .compatible = "qcom,qcm6490", .data = &sc7280_data, },
2101924272bSKonrad Dybcio 	{ .compatible = "qcom,sa8155p", .data = &sm8150_data, },
2111924272bSKonrad Dybcio 	{ .compatible = "qcom,sa8540p", .data = &sc8280xp_data, },
2121924272bSKonrad Dybcio 	{ .compatible = "qcom,sa8775p", .data = &sa8775p_data, },
2131924272bSKonrad Dybcio 	{ .compatible = "qcom,sar2130p", .data = &sar2130p_data },
2141924272bSKonrad Dybcio 	{ .compatible = "qcom,sc7180", .data = &sc7180_data },
2151924272bSKonrad Dybcio 	{ .compatible = "qcom,sc7280", .data = &sc7280_data, },
2161924272bSKonrad Dybcio 	{ .compatible = "qcom,sc8180x", .data = &sc8180x_data, },
2171924272bSKonrad Dybcio 	{ .compatible = "qcom,sc8280xp", .data = &sc8280xp_data, },
2181924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm630", .data = &msm8937_data },
2191924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm636", .data = &msm8937_data },
2201924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm660", .data = &msm8937_data },
2211924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm670", .data = &sdm670_data, },
2221924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm845", .data = &sdm845_data, },
2231924272bSKonrad Dybcio 	{ .compatible = "qcom,sm4250", .data = &sm6115_data, },
2241924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6115", .data = &sm6115_data, },
2251924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6125", .data = &sm6125_data, },
2261924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6150", .data = &sm6150_data, },
2271924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6350", .data = &sm6350_data, },
2281924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6375", .data = &sm6350_data, },
2291924272bSKonrad Dybcio 	{ .compatible = "qcom,sm7125", .data = &sc7180_data },
2301924272bSKonrad Dybcio 	{ .compatible = "qcom,sm7150", .data = &sm7150_data, },
2311924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8150", .data = &sm8150_data, },
2321924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8250", .data = &sm8250_data, },
2331924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8350", .data = &sm8350_data, },
2341924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8450", .data = &sm8350_data, },
2351924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8550", .data = &sm8550_data, },
2361924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8650", .data = &sm8550_data, },
2371924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8750", .data = &sm8750_data, },
2381924272bSKonrad Dybcio 	{ .compatible = "qcom,x1e80100", .data = &x1e80100_data, },
2391924272bSKonrad Dybcio 	{ .compatible = "qcom,x1p42100", .data = &x1e80100_data, },
2401924272bSKonrad Dybcio 	{ }
2411924272bSKonrad Dybcio };
2421924272bSKonrad Dybcio 
2431924272bSKonrad Dybcio const struct qcom_ubwc_cfg_data *qcom_ubwc_config_get_data(void)
2441924272bSKonrad Dybcio {
2451924272bSKonrad Dybcio 	const struct of_device_id *match;
2461924272bSKonrad Dybcio 	struct device_node *root;
2471924272bSKonrad Dybcio 
2481924272bSKonrad Dybcio 	root = of_find_node_by_path("/");
2491924272bSKonrad Dybcio 	if (!root)
2501924272bSKonrad Dybcio 		return ERR_PTR(-ENODEV);
2511924272bSKonrad Dybcio 
2521924272bSKonrad Dybcio 	match = of_match_node(qcom_ubwc_configs, root);
2531924272bSKonrad Dybcio 	of_node_put(root);
2541924272bSKonrad Dybcio 	if (!match) {
2551924272bSKonrad Dybcio 		pr_err("Couldn't find UBWC config data for this platform!\n");
2561924272bSKonrad Dybcio 		return ERR_PTR(-EINVAL);
2571924272bSKonrad Dybcio 	}
2581924272bSKonrad Dybcio 
2591924272bSKonrad Dybcio 	return match->data;
2601924272bSKonrad Dybcio }
2611924272bSKonrad Dybcio EXPORT_SYMBOL_GPL(qcom_ubwc_config_get_data);
2621924272bSKonrad Dybcio 
2631924272bSKonrad Dybcio MODULE_LICENSE("GPL");
2641924272bSKonrad Dybcio MODULE_DESCRIPTION("UBWC config database for QTI SoCs");
265