From 950e5edb5d7897b795ea743f08a1534a063ca71b Mon Sep 17 00:00:00 2001 From: James Morse Date: Fri, 26 Feb 2021 20:22:03 +0800 Subject: [PATCH] drivers: base: cacheinfo: Add helper to search cacheinfo by of_node hulk inclusion category: feature feature: ARM MPAM support bugzilla: 48265 CVE: NA -------------------------------- The MPAM ACPI table holds a PPTT-offset that describes a cache. Add a helper cacheinfo_shared_cpu_map_search() to search the cacheinfo structures for a cache that represents this firmware description. The cacheinfo structures are freed and allocated over CPU online/offline, the caller of this helper must hold the cpu-hotplug read lock while the helper runs, and while it holds the return value. Signed-off-by: James Morse Link: http://www.linux-arm.org/git?p=linux-jm.git;a=patch;h=9e5b7ec7c145019f7160c56795ede536f0de5347 Signed-off-by: Wang ShaoBo Signed-off-by: Hongbo Yao Reviewed-by: Cheng Jian Signed-off-by: Zheng Zengkai --- drivers/base/cacheinfo.c | 28 ++++++++++++++++++++++++++++ include/linux/cacheinfo.h | 1 + 2 files changed, 29 insertions(+) diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c index bfc095956dd1..4bcfb06a781e 100644 --- a/drivers/base/cacheinfo.c +++ b/drivers/base/cacheinfo.c @@ -213,6 +213,34 @@ int __weak cache_setup_acpi(unsigned int cpu) return -ENOTSUPP; } +/** + * cacheinfo_shared_cpu_map_search() - find an instance of struct cacheinfo + * from the provided firmware description. + * Caller must hold cpus_read_lock() until its finished with the cacheinfo. + * + * Return a CPUs cache leaf described @fw_desc, or NULL. + */ +struct cacheinfo *cacheinfo_shared_cpu_map_search(void *fw_token) +{ + struct cacheinfo *iter; + unsigned int cpu, index; + struct cpu_cacheinfo *cpu_ci; + + for_each_online_cpu(cpu) { + cpu_ci = get_cpu_cacheinfo(cpu); + + for (index = 0; index < cache_leaves(cpu); index++) { + iter = cpu_ci->info_list + index; + + if (iter->fw_token == fw_token) { + return iter; + } + } + } + + return NULL; +} + unsigned int coherency_max_size; static int cache_shared_cpu_map_setup(unsigned int cpu) diff --git a/include/linux/cacheinfo.h b/include/linux/cacheinfo.h index 4f72b47973c3..78d7300607e3 100644 --- a/include/linux/cacheinfo.h +++ b/include/linux/cacheinfo.h @@ -98,6 +98,7 @@ int func(unsigned int cpu) \ } struct cpu_cacheinfo *get_cpu_cacheinfo(unsigned int cpu); +struct cacheinfo *cacheinfo_shared_cpu_map_search(void *fw_desc); int init_cache_level(unsigned int cpu); int populate_cache_leaves(unsigned int cpu); int cache_setup_acpi(unsigned int cpu); -- GitLab