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