Commit 10d235ac authored by James Morse's avatar James Morse Committed by Yang Yingliang
Browse files

drivers: base: cacheinfo: Add helper to search cacheinfo by of_node



hulk inclusion
category: feature
bugzilla: 34278
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: default avatarJames Morse <james.morse@arm.com>
Link: http://www.linux-arm.org/git?p=linux-jm.git;a=patch;h=9e5b7ec7c145019f7160c56795ede536f0de5347


Signed-off-by: default avatarWang ShaoBo <bobo.shaobowang@huawei.com>
Reviewed-by: default avatarXiongfeng Wang <wangxiongfeng2@huawei.com>
Reviewed-by: default avatarCheng Jian <cj.chengjian@huawei.com>
Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
Signed-off-by: default avatarCheng Jian <cj.chengjian@huawei.com>
parent b55756d8
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -213,6 +213,44 @@ 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);

		/*
		 * info_list of this cacheinfo instance
		 * may not be initialized because sometimes
		 * free_cache_attributes() may free this
		 * info_list but not set num_leaves to zero,
		 * for example when PPTT is not supported.
		 */
		if (!cpu_ci->info_list)
		    continue;

		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)
+1 −0
Original line number Diff line number Diff line
@@ -97,6 +97,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);