xref: /linux/drivers/soc/qcom/ubwc_config.c (revision 2728285988c3e94ce92104a58b4cee848c4602de)
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,
18*27282859SKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL1 |
19*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL2 |
20*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
211924272bSKonrad Dybcio 	.highest_bank_bit = 14,
221924272bSKonrad Dybcio };
231924272bSKonrad Dybcio 
241924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data msm8998_data = {
251924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_1_0,
261924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_1_0,
27*27282859SKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL1 |
28*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL2 |
29*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
301924272bSKonrad Dybcio 	.highest_bank_bit = 15,
311924272bSKonrad Dybcio };
321924272bSKonrad Dybcio 
331924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data qcm2290_data = {
341924272bSKonrad Dybcio 	/* no UBWC */
351924272bSKonrad Dybcio 	.highest_bank_bit = 15,
361924272bSKonrad Dybcio };
371924272bSKonrad Dybcio 
381924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sa8775p_data = {
391924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
401924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
41709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL3,
421924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
431924272bSKonrad Dybcio 	.highest_bank_bit = 13,
441924272bSKonrad Dybcio 	.macrotile_mode = true,
451924272bSKonrad Dybcio };
461924272bSKonrad Dybcio 
471924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sar2130p_data = {
481924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_3_0, /* 4.0.2 in hw */
491924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_3,
50709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
51709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
521924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
531924272bSKonrad Dybcio 	.highest_bank_bit = 13,
541924272bSKonrad Dybcio 	.macrotile_mode = true,
551924272bSKonrad Dybcio };
561924272bSKonrad Dybcio 
571924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sc7180_data = {
581924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
591924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
60709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
61709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
621924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
631924272bSKonrad Dybcio 	.highest_bank_bit = 14,
641924272bSKonrad Dybcio };
651924272bSKonrad Dybcio 
661924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sc7280_data = {
671924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_3_0,
681924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
69709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
70709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
711924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
721924272bSKonrad Dybcio 	.highest_bank_bit = 14,
731924272bSKonrad Dybcio 	.macrotile_mode = true,
741924272bSKonrad Dybcio };
751924272bSKonrad Dybcio 
761924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sc8180x_data = {
771924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_3_0,
781924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_3_0,
79*27282859SKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
80*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
811924272bSKonrad Dybcio 	.highest_bank_bit = 16,
821924272bSKonrad Dybcio 	.macrotile_mode = true,
831924272bSKonrad Dybcio };
841924272bSKonrad Dybcio 
851924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sc8280xp_data = {
861924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
871924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
88709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
89709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
901924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
911924272bSKonrad Dybcio 	.highest_bank_bit = 16,
921924272bSKonrad Dybcio 	.macrotile_mode = true,
931924272bSKonrad Dybcio };
941924272bSKonrad Dybcio 
951924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sdm670_data = {
961924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
971924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
98*27282859SKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
99*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1001924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1011924272bSKonrad Dybcio };
1021924272bSKonrad Dybcio 
1031924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sdm845_data = {
1041924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
1051924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
106*27282859SKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
107*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1081924272bSKonrad Dybcio 	.highest_bank_bit = 15,
1091924272bSKonrad Dybcio };
1101924272bSKonrad Dybcio 
1111924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm6115_data = {
1121924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_1_0,
1131924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
114709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL1 |
115709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL2 |
116709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1171924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1181924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1191924272bSKonrad Dybcio };
1201924272bSKonrad Dybcio 
1211924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm6125_data = {
1221924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_1_0,
1231924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_3_0,
124709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL1 |
125709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL2 |
126709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1271924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1281924272bSKonrad Dybcio };
1291924272bSKonrad Dybcio 
1301924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm6150_data = {
1311924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
1321924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
133*27282859SKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
134*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1351924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1361924272bSKonrad Dybcio };
1371924272bSKonrad Dybcio 
1381924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm6350_data = {
1391924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
1401924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
141709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
142709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1431924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1441924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1451924272bSKonrad Dybcio };
1461924272bSKonrad Dybcio 
1471924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm7150_data = {
1481924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_2_0,
1491924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_2_0,
150*27282859SKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
151*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1521924272bSKonrad Dybcio 	.highest_bank_bit = 14,
1531924272bSKonrad Dybcio };
1541924272bSKonrad Dybcio 
1551924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8150_data = {
1561924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_3_0,
1571924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_3_0,
158*27282859SKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
159*27282859SKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1601924272bSKonrad Dybcio 	.highest_bank_bit = 15,
1611924272bSKonrad Dybcio };
1621924272bSKonrad Dybcio 
1631924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8250_data = {
1641924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
1651924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
166709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
167709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1681924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1691924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
1701924272bSKonrad Dybcio 	.highest_bank_bit = 16,
1711924272bSKonrad Dybcio 	.macrotile_mode = true,
1721924272bSKonrad Dybcio };
1731924272bSKonrad Dybcio 
1741924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8350_data = {
1751924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
1761924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_0,
177709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
178709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1791924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1801924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
1811924272bSKonrad Dybcio 	.highest_bank_bit = 16,
1821924272bSKonrad Dybcio 	.macrotile_mode = true,
1831924272bSKonrad Dybcio };
1841924272bSKonrad Dybcio 
1851924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8550_data = {
1861924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
1871924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_3,
188709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
189709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
1901924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
1911924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
1921924272bSKonrad Dybcio 	.highest_bank_bit = 16,
1931924272bSKonrad Dybcio 	.macrotile_mode = true,
1941924272bSKonrad Dybcio };
1951924272bSKonrad Dybcio 
1961924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data sm8750_data = {
1971924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_5_0,
1981924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_5_0,
1991924272bSKonrad Dybcio 	.ubwc_swizzle = 6,
2001924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
2011924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
2021924272bSKonrad Dybcio 	.highest_bank_bit = 16,
2031924272bSKonrad Dybcio 	.macrotile_mode = true,
2041924272bSKonrad Dybcio };
2051924272bSKonrad Dybcio 
2061924272bSKonrad Dybcio static const struct qcom_ubwc_cfg_data x1e80100_data = {
2071924272bSKonrad Dybcio 	.ubwc_enc_version = UBWC_4_0,
2081924272bSKonrad Dybcio 	.ubwc_dec_version = UBWC_4_3,
209709dd2ffSKonrad Dybcio 	.ubwc_swizzle = UBWC_SWIZZLE_ENABLE_LVL2 |
210709dd2ffSKonrad Dybcio 			UBWC_SWIZZLE_ENABLE_LVL3,
2111924272bSKonrad Dybcio 	.ubwc_bank_spread = true,
2121924272bSKonrad Dybcio 	/* TODO: highest_bank_bit = 15 for LP_DDR4 */
2131924272bSKonrad Dybcio 	.highest_bank_bit = 16,
2141924272bSKonrad Dybcio 	.macrotile_mode = true,
2151924272bSKonrad Dybcio };
2161924272bSKonrad Dybcio 
2171924272bSKonrad Dybcio static const struct of_device_id qcom_ubwc_configs[] __maybe_unused = {
2181924272bSKonrad Dybcio 	{ .compatible = "qcom,apq8096", .data = &msm8998_data },
2191924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8917", .data = &msm8937_data },
2201924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8937", .data = &msm8937_data },
2211924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8953", .data = &msm8937_data },
2221924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8956", .data = &msm8937_data },
2231924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8976", .data = &msm8937_data },
2241924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8996", .data = &msm8998_data },
2251924272bSKonrad Dybcio 	{ .compatible = "qcom,msm8998", .data = &msm8998_data },
2261924272bSKonrad Dybcio 	{ .compatible = "qcom,qcm2290", .data = &qcm2290_data, },
2271924272bSKonrad Dybcio 	{ .compatible = "qcom,qcm6490", .data = &sc7280_data, },
2281924272bSKonrad Dybcio 	{ .compatible = "qcom,sa8155p", .data = &sm8150_data, },
2291924272bSKonrad Dybcio 	{ .compatible = "qcom,sa8540p", .data = &sc8280xp_data, },
2301924272bSKonrad Dybcio 	{ .compatible = "qcom,sa8775p", .data = &sa8775p_data, },
2311924272bSKonrad Dybcio 	{ .compatible = "qcom,sar2130p", .data = &sar2130p_data },
2321924272bSKonrad Dybcio 	{ .compatible = "qcom,sc7180", .data = &sc7180_data },
2331924272bSKonrad Dybcio 	{ .compatible = "qcom,sc7280", .data = &sc7280_data, },
2341924272bSKonrad Dybcio 	{ .compatible = "qcom,sc8180x", .data = &sc8180x_data, },
2351924272bSKonrad Dybcio 	{ .compatible = "qcom,sc8280xp", .data = &sc8280xp_data, },
2361924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm630", .data = &msm8937_data },
2371924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm636", .data = &msm8937_data },
2381924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm660", .data = &msm8937_data },
2391924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm670", .data = &sdm670_data, },
2401924272bSKonrad Dybcio 	{ .compatible = "qcom,sdm845", .data = &sdm845_data, },
2411924272bSKonrad Dybcio 	{ .compatible = "qcom,sm4250", .data = &sm6115_data, },
2421924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6115", .data = &sm6115_data, },
2431924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6125", .data = &sm6125_data, },
2441924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6150", .data = &sm6150_data, },
2451924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6350", .data = &sm6350_data, },
2461924272bSKonrad Dybcio 	{ .compatible = "qcom,sm6375", .data = &sm6350_data, },
2471924272bSKonrad Dybcio 	{ .compatible = "qcom,sm7125", .data = &sc7180_data },
2481924272bSKonrad Dybcio 	{ .compatible = "qcom,sm7150", .data = &sm7150_data, },
2491924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8150", .data = &sm8150_data, },
2501924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8250", .data = &sm8250_data, },
2511924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8350", .data = &sm8350_data, },
2521924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8450", .data = &sm8350_data, },
2531924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8550", .data = &sm8550_data, },
2541924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8650", .data = &sm8550_data, },
2551924272bSKonrad Dybcio 	{ .compatible = "qcom,sm8750", .data = &sm8750_data, },
2561924272bSKonrad Dybcio 	{ .compatible = "qcom,x1e80100", .data = &x1e80100_data, },
2571924272bSKonrad Dybcio 	{ .compatible = "qcom,x1p42100", .data = &x1e80100_data, },
2581924272bSKonrad Dybcio 	{ }
2591924272bSKonrad Dybcio };
2601924272bSKonrad Dybcio 
2611924272bSKonrad Dybcio const struct qcom_ubwc_cfg_data *qcom_ubwc_config_get_data(void)
2621924272bSKonrad Dybcio {
2631924272bSKonrad Dybcio 	const struct of_device_id *match;
2641924272bSKonrad Dybcio 	struct device_node *root;
2651924272bSKonrad Dybcio 
2661924272bSKonrad Dybcio 	root = of_find_node_by_path("/");
2671924272bSKonrad Dybcio 	if (!root)
2681924272bSKonrad Dybcio 		return ERR_PTR(-ENODEV);
2691924272bSKonrad Dybcio 
2701924272bSKonrad Dybcio 	match = of_match_node(qcom_ubwc_configs, root);
2711924272bSKonrad Dybcio 	of_node_put(root);
2721924272bSKonrad Dybcio 	if (!match) {
2731924272bSKonrad Dybcio 		pr_err("Couldn't find UBWC config data for this platform!\n");
2741924272bSKonrad Dybcio 		return ERR_PTR(-EINVAL);
2751924272bSKonrad Dybcio 	}
2761924272bSKonrad Dybcio 
2771924272bSKonrad Dybcio 	return match->data;
2781924272bSKonrad Dybcio }
2791924272bSKonrad Dybcio EXPORT_SYMBOL_GPL(qcom_ubwc_config_get_data);
2801924272bSKonrad Dybcio 
2811924272bSKonrad Dybcio MODULE_LICENSE("GPL");
2821924272bSKonrad Dybcio MODULE_DESCRIPTION("UBWC config database for QTI SoCs");
283