Loading Documentation/devicetree/bindings/arm/msm/qcom,llcc.txt +2 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,8 @@ Optional Properties: compatible devices: qcom,sdm845-llcc, qcom,sdm670-llcc qcom,sdm670-llcc, qcom,qcs605-llcc Example: Loading drivers/soc/qcom/Kconfig +8 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,14 @@ config QCOM_SDM670_LLCC can start using the LLCC slices. Say yes here to enable llcc driver for SDM670. config QCOM_QCS605_LLCC tristate "Qualcomm Technologies, Inc. QCS605 LLCC driver" depends on QCOM_LLCC help This provides Last level cache controller driver for QCS605. This driver provides data required to configure LLCC, so that clients can start using the LLCC slices. Say yes here to enable llcc driver for QCS605. config QCOM_LLCC_AMON tristate "Qualcomm Technologies, Inc. LLCC Activity Monitor(AMON) driver" Loading drivers/soc/qcom/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ obj-$(CONFIG_QCOM_GSBI) += qcom_gsbi.o obj-$(CONFIG_QCOM_LLCC) += llcc-core.o llcc-slice.o obj-$(CONFIG_QCOM_SDM845_LLCC) += llcc-sdm845.o obj-$(CONFIG_QCOM_SDM670_LLCC) += llcc-sdm670.o obj-$(CONFIG_QCOM_QCS605_LLCC) += llcc-qcs605.o obj-$(CONFIG_QCOM_LLCC_PERFMON) += llcc_perfmon.o obj-$(CONFIG_QCOM_LLCC_AMON) += llcc-amon.o obj-$(CONFIG_QPNP_PBS) += qpnp-pbs.o Loading drivers/soc/qcom/llcc-qcs605.c 0 → 100644 +106 −0 Original line number Diff line number Diff line /* Copyright (c) 2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/soc/qcom/llcc-qcom.h> /* * SCT entry contains of the following parameters * name: Name of the client's use case for which the llcc slice is used * uid: Unique id for the client's use case * slice_id: llcc slice id for each client * max_cap: The maximum capacity of the cache slice provided in KB * priority: Priority of the client used to select victim line for replacement * fixed_size: Determine of the slice has a fixed capacity * bonus_ways: Bonus ways to be used by any slice, bonus way is used only if * it't not a reserved way. * res_ways: Reserved ways for the cache slice, the reserved ways cannot be used * by any other client than the one its assigned to. * cache_mode: Each slice operates as a cache, this controls the mode of the * slice normal or TCM * probe_target_ways: Determines what ways to probe for access hit. When * configured to 1 only bonus and reseved ways are probed. * when configured to 0 all ways in llcc are probed. * dis_cap_alloc: Disable capacity based allocation for a client * retain_on_pc: If this bit is set and client has maitained active vote * then the ways assigned to this client are not flushed on power * collapse. * activate_on_init: Activate the slice immidiately after the SCT is programmed */ #define SCT_ENTRY(n, uid, sid, mc, p, fs, bway, rway, cmod, ptw, dca, rp, a) \ { \ .name = n, \ .usecase_id = uid, \ .slice_id = sid, \ .max_cap = mc, \ .priority = p, \ .fixed_size = fs, \ .bonus_ways = bway, \ .res_ways = rway, \ .cache_mode = cmod, \ .probe_target_ways = ptw, \ .dis_cap_alloc = dca, \ .retain_on_pc = rp, \ .activate_on_init = a, \ } static struct llcc_slice_config qcs605_data[] = { SCT_ENTRY("cpuss", 1, 1, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 1), SCT_ENTRY("vidsc0", 2, 2, 256, 2, 1, 0x3, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("vidsc1", 3, 3, 256, 2, 1, 0x3, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("voice", 5, 5, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("audio", 6, 6, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("modem", 8, 8, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("compute", 10, 10, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("gpu", 12, 12, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("mmuhwt", 13, 13, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 0, 1), SCT_ENTRY("audiohw", 22, 22, 512, 1, 1, 0xF, 0x0, 0, 0, 1, 1, 0), }; static int qcs605_qcom_llcc_probe(struct platform_device *pdev) { return qcom_llcc_probe(pdev, qcs605_data, ARRAY_SIZE(qcs605_data)); } static const struct of_device_id qcs605_qcom_llcc_of_match[] = { { .compatible = "qcom,qcs605-llcc", }, { }, }; static struct platform_driver qcs605_qcom_llcc_driver = { .driver = { .name = "qcs605-llcc", .owner = THIS_MODULE, .of_match_table = qcs605_qcom_llcc_of_match, }, .probe = qcs605_qcom_llcc_probe, .remove = qcom_llcc_remove, }; static int __init qcs605_init_qcom_llcc_init(void) { return platform_driver_register(&qcs605_qcom_llcc_driver); } module_init(qcs605_init_qcom_llcc_init); static void __exit qcs605_exit_qcom_llcc_exit(void) { platform_driver_unregister(&qcs605_qcom_llcc_driver); } module_exit(qcs605_exit_qcom_llcc_exit); MODULE_DESCRIPTION("QTI qcs605 LLCC driver"); MODULE_LICENSE("GPL v2"); Loading
Documentation/devicetree/bindings/arm/msm/qcom,llcc.txt +2 −1 Original line number Diff line number Diff line Loading @@ -86,7 +86,8 @@ Optional Properties: compatible devices: qcom,sdm845-llcc, qcom,sdm670-llcc qcom,sdm670-llcc, qcom,qcs605-llcc Example: Loading
drivers/soc/qcom/Kconfig +8 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,14 @@ config QCOM_SDM670_LLCC can start using the LLCC slices. Say yes here to enable llcc driver for SDM670. config QCOM_QCS605_LLCC tristate "Qualcomm Technologies, Inc. QCS605 LLCC driver" depends on QCOM_LLCC help This provides Last level cache controller driver for QCS605. This driver provides data required to configure LLCC, so that clients can start using the LLCC slices. Say yes here to enable llcc driver for QCS605. config QCOM_LLCC_AMON tristate "Qualcomm Technologies, Inc. LLCC Activity Monitor(AMON) driver" Loading
drivers/soc/qcom/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ obj-$(CONFIG_QCOM_GSBI) += qcom_gsbi.o obj-$(CONFIG_QCOM_LLCC) += llcc-core.o llcc-slice.o obj-$(CONFIG_QCOM_SDM845_LLCC) += llcc-sdm845.o obj-$(CONFIG_QCOM_SDM670_LLCC) += llcc-sdm670.o obj-$(CONFIG_QCOM_QCS605_LLCC) += llcc-qcs605.o obj-$(CONFIG_QCOM_LLCC_PERFMON) += llcc_perfmon.o obj-$(CONFIG_QCOM_LLCC_AMON) += llcc-amon.o obj-$(CONFIG_QPNP_PBS) += qpnp-pbs.o Loading
drivers/soc/qcom/llcc-qcs605.c 0 → 100644 +106 −0 Original line number Diff line number Diff line /* Copyright (c) 2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/soc/qcom/llcc-qcom.h> /* * SCT entry contains of the following parameters * name: Name of the client's use case for which the llcc slice is used * uid: Unique id for the client's use case * slice_id: llcc slice id for each client * max_cap: The maximum capacity of the cache slice provided in KB * priority: Priority of the client used to select victim line for replacement * fixed_size: Determine of the slice has a fixed capacity * bonus_ways: Bonus ways to be used by any slice, bonus way is used only if * it't not a reserved way. * res_ways: Reserved ways for the cache slice, the reserved ways cannot be used * by any other client than the one its assigned to. * cache_mode: Each slice operates as a cache, this controls the mode of the * slice normal or TCM * probe_target_ways: Determines what ways to probe for access hit. When * configured to 1 only bonus and reseved ways are probed. * when configured to 0 all ways in llcc are probed. * dis_cap_alloc: Disable capacity based allocation for a client * retain_on_pc: If this bit is set and client has maitained active vote * then the ways assigned to this client are not flushed on power * collapse. * activate_on_init: Activate the slice immidiately after the SCT is programmed */ #define SCT_ENTRY(n, uid, sid, mc, p, fs, bway, rway, cmod, ptw, dca, rp, a) \ { \ .name = n, \ .usecase_id = uid, \ .slice_id = sid, \ .max_cap = mc, \ .priority = p, \ .fixed_size = fs, \ .bonus_ways = bway, \ .res_ways = rway, \ .cache_mode = cmod, \ .probe_target_ways = ptw, \ .dis_cap_alloc = dca, \ .retain_on_pc = rp, \ .activate_on_init = a, \ } static struct llcc_slice_config qcs605_data[] = { SCT_ENTRY("cpuss", 1, 1, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 1), SCT_ENTRY("vidsc0", 2, 2, 256, 2, 1, 0x3, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("vidsc1", 3, 3, 256, 2, 1, 0x3, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("voice", 5, 5, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("audio", 6, 6, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("modem", 8, 8, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("compute", 10, 10, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("gpu", 12, 12, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 1, 0), SCT_ENTRY("mmuhwt", 13, 13, 512, 1, 0, 0xF, 0x0, 0, 0, 1, 0, 1), SCT_ENTRY("audiohw", 22, 22, 512, 1, 1, 0xF, 0x0, 0, 0, 1, 1, 0), }; static int qcs605_qcom_llcc_probe(struct platform_device *pdev) { return qcom_llcc_probe(pdev, qcs605_data, ARRAY_SIZE(qcs605_data)); } static const struct of_device_id qcs605_qcom_llcc_of_match[] = { { .compatible = "qcom,qcs605-llcc", }, { }, }; static struct platform_driver qcs605_qcom_llcc_driver = { .driver = { .name = "qcs605-llcc", .owner = THIS_MODULE, .of_match_table = qcs605_qcom_llcc_of_match, }, .probe = qcs605_qcom_llcc_probe, .remove = qcom_llcc_remove, }; static int __init qcs605_init_qcom_llcc_init(void) { return platform_driver_register(&qcs605_qcom_llcc_driver); } module_init(qcs605_init_qcom_llcc_init); static void __exit qcs605_exit_qcom_llcc_exit(void) { platform_driver_unregister(&qcs605_qcom_llcc_driver); } module_exit(qcs605_exit_qcom_llcc_exit); MODULE_DESCRIPTION("QTI qcs605 LLCC driver"); MODULE_LICENSE("GPL v2");