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