xref: /openbmc/linux/drivers/base/cacheinfo.c (revision 278002edb19bce2c628fafb0af936e77000f3a5b)
1  // SPDX-License-Identifier: GPL-2.0
2  /*
3   * cacheinfo support - processor cache information via sysfs
4   *
5   * Based on arch/x86/kernel/cpu/intel_cacheinfo.c
6   * Author: Sudeep Holla <sudeep.holla@arm.com>
7   */
8  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9  
10  #include <linux/acpi.h>
11  #include <linux/bitops.h>
12  #include <linux/cacheinfo.h>
13  #include <linux/compiler.h>
14  #include <linux/cpu.h>
15  #include <linux/device.h>
16  #include <linux/init.h>
17  #include <linux/of.h>
18  #include <linux/sched.h>
19  #include <linux/slab.h>
20  #include <linux/smp.h>
21  #include <linux/sysfs.h>
22  
23  /* pointer to per cpu cacheinfo */
24  static DEFINE_PER_CPU(struct cpu_cacheinfo, ci_cpu_cacheinfo);
25  #define ci_cacheinfo(cpu)	(&per_cpu(ci_cpu_cacheinfo, cpu))
26  #define cache_leaves(cpu)	(ci_cacheinfo(cpu)->num_leaves)
27  #define per_cpu_cacheinfo(cpu)	(ci_cacheinfo(cpu)->info_list)
28  #define per_cpu_cacheinfo_idx(cpu, idx)		\
29  				(per_cpu_cacheinfo(cpu) + (idx))
30  
31  /* Set if no cache information is found in DT/ACPI. */
32  static bool use_arch_info;
33  
get_cpu_cacheinfo(unsigned int cpu)34  struct cpu_cacheinfo *get_cpu_cacheinfo(unsigned int cpu)
35  {
36  	return ci_cacheinfo(cpu);
37  }
38  
cache_leaves_are_shared(struct cacheinfo * this_leaf,struct cacheinfo * sib_leaf)39  static inline bool cache_leaves_are_shared(struct cacheinfo *this_leaf,
40  					   struct cacheinfo *sib_leaf)
41  {
42  	/*
43  	 * For non DT/ACPI systems, assume unique level 1 caches,
44  	 * system-wide shared caches for all other levels.
45  	 */
46  	if (!(IS_ENABLED(CONFIG_OF) || IS_ENABLED(CONFIG_ACPI)) ||
47  	    use_arch_info)
48  		return (this_leaf->level != 1) && (sib_leaf->level != 1);
49  
50  	if ((sib_leaf->attributes & CACHE_ID) &&
51  	    (this_leaf->attributes & CACHE_ID))
52  		return sib_leaf->id == this_leaf->id;
53  
54  	return sib_leaf->fw_token == this_leaf->fw_token;
55  }
56  
last_level_cache_is_valid(unsigned int cpu)57  bool last_level_cache_is_valid(unsigned int cpu)
58  {
59  	struct cacheinfo *llc;
60  
61  	if (!cache_leaves(cpu) || !per_cpu_cacheinfo(cpu))
62  		return false;
63  
64  	llc = per_cpu_cacheinfo_idx(cpu, cache_leaves(cpu) - 1);
65  
66  	return (llc->attributes & CACHE_ID) || !!llc->fw_token;
67  
68  }
69  
last_level_cache_is_shared(unsigned int cpu_x,unsigned int cpu_y)70  bool last_level_cache_is_shared(unsigned int cpu_x, unsigned int cpu_y)
71  {
72  	struct cacheinfo *llc_x, *llc_y;
73  
74  	if (!last_level_cache_is_valid(cpu_x) ||
75  	    !last_level_cache_is_valid(cpu_y))
76  		return false;
77  
78  	llc_x = per_cpu_cacheinfo_idx(cpu_x, cache_leaves(cpu_x) - 1);
79  	llc_y = per_cpu_cacheinfo_idx(cpu_y, cache_leaves(cpu_y) - 1);
80  
81  	return cache_leaves_are_shared(llc_x, llc_y);
82  }
83  
84  #ifdef CONFIG_OF
85  
86  static bool of_check_cache_nodes(struct device_node *np);
87  
88  /* OF properties to query for a given cache type */
89  struct cache_type_info {
90  	const char *size_prop;
91  	const char *line_size_props[2];
92  	const char *nr_sets_prop;
93  };
94  
95  static const struct cache_type_info cache_type_info[] = {
96  	{
97  		.size_prop       = "cache-size",
98  		.line_size_props = { "cache-line-size",
99  				     "cache-block-size", },
100  		.nr_sets_prop    = "cache-sets",
101  	}, {
102  		.size_prop       = "i-cache-size",
103  		.line_size_props = { "i-cache-line-size",
104  				     "i-cache-block-size", },
105  		.nr_sets_prop    = "i-cache-sets",
106  	}, {
107  		.size_prop       = "d-cache-size",
108  		.line_size_props = { "d-cache-line-size",
109  				     "d-cache-block-size", },
110  		.nr_sets_prop    = "d-cache-sets",
111  	},
112  };
113  
get_cacheinfo_idx(enum cache_type type)114  static inline int get_cacheinfo_idx(enum cache_type type)
115  {
116  	if (type == CACHE_TYPE_UNIFIED)
117  		return 0;
118  	return type;
119  }
120  
cache_size(struct cacheinfo * this_leaf,struct device_node * np)121  static void cache_size(struct cacheinfo *this_leaf, struct device_node *np)
122  {
123  	const char *propname;
124  	int ct_idx;
125  
126  	ct_idx = get_cacheinfo_idx(this_leaf->type);
127  	propname = cache_type_info[ct_idx].size_prop;
128  
129  	of_property_read_u32(np, propname, &this_leaf->size);
130  }
131  
132  /* not cache_line_size() because that's a macro in include/linux/cache.h */
cache_get_line_size(struct cacheinfo * this_leaf,struct device_node * np)133  static void cache_get_line_size(struct cacheinfo *this_leaf,
134  				struct device_node *np)
135  {
136  	int i, lim, ct_idx;
137  
138  	ct_idx = get_cacheinfo_idx(this_leaf->type);
139  	lim = ARRAY_SIZE(cache_type_info[ct_idx].line_size_props);
140  
141  	for (i = 0; i < lim; i++) {
142  		int ret;
143  		u32 line_size;
144  		const char *propname;
145  
146  		propname = cache_type_info[ct_idx].line_size_props[i];
147  		ret = of_property_read_u32(np, propname, &line_size);
148  		if (!ret) {
149  			this_leaf->coherency_line_size = line_size;
150  			break;
151  		}
152  	}
153  }
154  
cache_nr_sets(struct cacheinfo * this_leaf,struct device_node * np)155  static void cache_nr_sets(struct cacheinfo *this_leaf, struct device_node *np)
156  {
157  	const char *propname;
158  	int ct_idx;
159  
160  	ct_idx = get_cacheinfo_idx(this_leaf->type);
161  	propname = cache_type_info[ct_idx].nr_sets_prop;
162  
163  	of_property_read_u32(np, propname, &this_leaf->number_of_sets);
164  }
165  
cache_associativity(struct cacheinfo * this_leaf)166  static void cache_associativity(struct cacheinfo *this_leaf)
167  {
168  	unsigned int line_size = this_leaf->coherency_line_size;
169  	unsigned int nr_sets = this_leaf->number_of_sets;
170  	unsigned int size = this_leaf->size;
171  
172  	/*
173  	 * If the cache is fully associative, there is no need to
174  	 * check the other properties.
175  	 */
176  	if (!(nr_sets == 1) && (nr_sets > 0 && size > 0 && line_size > 0))
177  		this_leaf->ways_of_associativity = (size / nr_sets) / line_size;
178  }
179  
cache_node_is_unified(struct cacheinfo * this_leaf,struct device_node * np)180  static bool cache_node_is_unified(struct cacheinfo *this_leaf,
181  				  struct device_node *np)
182  {
183  	return of_property_read_bool(np, "cache-unified");
184  }
185  
cache_of_set_props(struct cacheinfo * this_leaf,struct device_node * np)186  static void cache_of_set_props(struct cacheinfo *this_leaf,
187  			       struct device_node *np)
188  {
189  	/*
190  	 * init_cache_level must setup the cache level correctly
191  	 * overriding the architecturally specified levels, so
192  	 * if type is NONE at this stage, it should be unified
193  	 */
194  	if (this_leaf->type == CACHE_TYPE_NOCACHE &&
195  	    cache_node_is_unified(this_leaf, np))
196  		this_leaf->type = CACHE_TYPE_UNIFIED;
197  	cache_size(this_leaf, np);
198  	cache_get_line_size(this_leaf, np);
199  	cache_nr_sets(this_leaf, np);
200  	cache_associativity(this_leaf);
201  }
202  
cache_setup_of_node(unsigned int cpu)203  static int cache_setup_of_node(unsigned int cpu)
204  {
205  	struct device_node *np, *prev;
206  	struct cacheinfo *this_leaf;
207  	unsigned int index = 0;
208  
209  	np = of_cpu_device_node_get(cpu);
210  	if (!np) {
211  		pr_err("Failed to find cpu%d device node\n", cpu);
212  		return -ENOENT;
213  	}
214  
215  	if (!of_check_cache_nodes(np)) {
216  		of_node_put(np);
217  		return -ENOENT;
218  	}
219  
220  	prev = np;
221  
222  	while (index < cache_leaves(cpu)) {
223  		this_leaf = per_cpu_cacheinfo_idx(cpu, index);
224  		if (this_leaf->level != 1) {
225  			np = of_find_next_cache_node(np);
226  			of_node_put(prev);
227  			prev = np;
228  			if (!np)
229  				break;
230  		}
231  		cache_of_set_props(this_leaf, np);
232  		this_leaf->fw_token = np;
233  		index++;
234  	}
235  
236  	of_node_put(np);
237  
238  	if (index != cache_leaves(cpu)) /* not all OF nodes populated */
239  		return -ENOENT;
240  
241  	return 0;
242  }
243  
of_check_cache_nodes(struct device_node * np)244  static bool of_check_cache_nodes(struct device_node *np)
245  {
246  	struct device_node *next;
247  
248  	if (of_property_present(np, "cache-size")   ||
249  	    of_property_present(np, "i-cache-size") ||
250  	    of_property_present(np, "d-cache-size") ||
251  	    of_property_present(np, "cache-unified"))
252  		return true;
253  
254  	next = of_find_next_cache_node(np);
255  	if (next) {
256  		of_node_put(next);
257  		return true;
258  	}
259  
260  	return false;
261  }
262  
of_count_cache_leaves(struct device_node * np)263  static int of_count_cache_leaves(struct device_node *np)
264  {
265  	unsigned int leaves = 0;
266  
267  	if (of_property_read_bool(np, "cache-size"))
268  		++leaves;
269  	if (of_property_read_bool(np, "i-cache-size"))
270  		++leaves;
271  	if (of_property_read_bool(np, "d-cache-size"))
272  		++leaves;
273  
274  	if (!leaves) {
275  		/* The '[i-|d-|]cache-size' property is required, but
276  		 * if absent, fallback on the 'cache-unified' property.
277  		 */
278  		if (of_property_read_bool(np, "cache-unified"))
279  			return 1;
280  		else
281  			return 2;
282  	}
283  
284  	return leaves;
285  }
286  
init_of_cache_level(unsigned int cpu)287  int init_of_cache_level(unsigned int cpu)
288  {
289  	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
290  	struct device_node *np = of_cpu_device_node_get(cpu);
291  	struct device_node *prev = NULL;
292  	unsigned int levels = 0, leaves, level;
293  
294  	if (!of_check_cache_nodes(np)) {
295  		of_node_put(np);
296  		return -ENOENT;
297  	}
298  
299  	leaves = of_count_cache_leaves(np);
300  	if (leaves > 0)
301  		levels = 1;
302  
303  	prev = np;
304  	while ((np = of_find_next_cache_node(np))) {
305  		of_node_put(prev);
306  		prev = np;
307  		if (!of_device_is_compatible(np, "cache"))
308  			goto err_out;
309  		if (of_property_read_u32(np, "cache-level", &level))
310  			goto err_out;
311  		if (level <= levels)
312  			goto err_out;
313  
314  		leaves += of_count_cache_leaves(np);
315  		levels = level;
316  	}
317  
318  	of_node_put(np);
319  	this_cpu_ci->num_levels = levels;
320  	this_cpu_ci->num_leaves = leaves;
321  
322  	return 0;
323  
324  err_out:
325  	of_node_put(np);
326  	return -EINVAL;
327  }
328  
329  #else
cache_setup_of_node(unsigned int cpu)330  static inline int cache_setup_of_node(unsigned int cpu) { return 0; }
init_of_cache_level(unsigned int cpu)331  int init_of_cache_level(unsigned int cpu) { return 0; }
332  #endif
333  
cache_setup_acpi(unsigned int cpu)334  int __weak cache_setup_acpi(unsigned int cpu)
335  {
336  	return -ENOTSUPP;
337  }
338  
339  unsigned int coherency_max_size;
340  
cache_setup_properties(unsigned int cpu)341  static int cache_setup_properties(unsigned int cpu)
342  {
343  	int ret = 0;
344  
345  	if (of_have_populated_dt())
346  		ret = cache_setup_of_node(cpu);
347  	else if (!acpi_disabled)
348  		ret = cache_setup_acpi(cpu);
349  
350  	// Assume there is no cache information available in DT/ACPI from now.
351  	if (ret && use_arch_cache_info())
352  		use_arch_info = true;
353  
354  	return ret;
355  }
356  
cache_shared_cpu_map_setup(unsigned int cpu)357  static int cache_shared_cpu_map_setup(unsigned int cpu)
358  {
359  	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
360  	struct cacheinfo *this_leaf, *sib_leaf;
361  	unsigned int index, sib_index;
362  	int ret = 0;
363  
364  	if (this_cpu_ci->cpu_map_populated)
365  		return 0;
366  
367  	/*
368  	 * skip setting up cache properties if LLC is valid, just need
369  	 * to update the shared cpu_map if the cache attributes were
370  	 * populated early before all the cpus are brought online
371  	 */
372  	if (!last_level_cache_is_valid(cpu) && !use_arch_info) {
373  		ret = cache_setup_properties(cpu);
374  		if (ret)
375  			return ret;
376  	}
377  
378  	for (index = 0; index < cache_leaves(cpu); index++) {
379  		unsigned int i;
380  
381  		this_leaf = per_cpu_cacheinfo_idx(cpu, index);
382  
383  		cpumask_set_cpu(cpu, &this_leaf->shared_cpu_map);
384  		for_each_online_cpu(i) {
385  			struct cpu_cacheinfo *sib_cpu_ci = get_cpu_cacheinfo(i);
386  
387  			if (i == cpu || !sib_cpu_ci->info_list)
388  				continue;/* skip if itself or no cacheinfo */
389  			for (sib_index = 0; sib_index < cache_leaves(i); sib_index++) {
390  				sib_leaf = per_cpu_cacheinfo_idx(i, sib_index);
391  
392  				/*
393  				 * Comparing cache IDs only makes sense if the leaves
394  				 * belong to the same cache level of same type. Skip
395  				 * the check if level and type do not match.
396  				 */
397  				if (sib_leaf->level != this_leaf->level ||
398  				    sib_leaf->type != this_leaf->type)
399  					continue;
400  
401  				if (cache_leaves_are_shared(this_leaf, sib_leaf)) {
402  					cpumask_set_cpu(cpu, &sib_leaf->shared_cpu_map);
403  					cpumask_set_cpu(i, &this_leaf->shared_cpu_map);
404  					break;
405  				}
406  			}
407  		}
408  		/* record the maximum cache line size */
409  		if (this_leaf->coherency_line_size > coherency_max_size)
410  			coherency_max_size = this_leaf->coherency_line_size;
411  	}
412  
413  	/* shared_cpu_map is now populated for the cpu */
414  	this_cpu_ci->cpu_map_populated = true;
415  	return 0;
416  }
417  
cache_shared_cpu_map_remove(unsigned int cpu)418  static void cache_shared_cpu_map_remove(unsigned int cpu)
419  {
420  	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
421  	struct cacheinfo *this_leaf, *sib_leaf;
422  	unsigned int sibling, index, sib_index;
423  
424  	for (index = 0; index < cache_leaves(cpu); index++) {
425  		this_leaf = per_cpu_cacheinfo_idx(cpu, index);
426  		for_each_cpu(sibling, &this_leaf->shared_cpu_map) {
427  			struct cpu_cacheinfo *sib_cpu_ci =
428  						get_cpu_cacheinfo(sibling);
429  
430  			if (sibling == cpu || !sib_cpu_ci->info_list)
431  				continue;/* skip if itself or no cacheinfo */
432  
433  			for (sib_index = 0; sib_index < cache_leaves(sibling); sib_index++) {
434  				sib_leaf = per_cpu_cacheinfo_idx(sibling, sib_index);
435  
436  				/*
437  				 * Comparing cache IDs only makes sense if the leaves
438  				 * belong to the same cache level of same type. Skip
439  				 * the check if level and type do not match.
440  				 */
441  				if (sib_leaf->level != this_leaf->level ||
442  				    sib_leaf->type != this_leaf->type)
443  					continue;
444  
445  				if (cache_leaves_are_shared(this_leaf, sib_leaf)) {
446  					cpumask_clear_cpu(cpu, &sib_leaf->shared_cpu_map);
447  					cpumask_clear_cpu(sibling, &this_leaf->shared_cpu_map);
448  					break;
449  				}
450  			}
451  		}
452  	}
453  
454  	/* cpu is no longer populated in the shared map */
455  	this_cpu_ci->cpu_map_populated = false;
456  }
457  
free_cache_attributes(unsigned int cpu)458  static void free_cache_attributes(unsigned int cpu)
459  {
460  	if (!per_cpu_cacheinfo(cpu))
461  		return;
462  
463  	cache_shared_cpu_map_remove(cpu);
464  }
465  
early_cache_level(unsigned int cpu)466  int __weak early_cache_level(unsigned int cpu)
467  {
468  	return -ENOENT;
469  }
470  
init_cache_level(unsigned int cpu)471  int __weak init_cache_level(unsigned int cpu)
472  {
473  	return -ENOENT;
474  }
475  
populate_cache_leaves(unsigned int cpu)476  int __weak populate_cache_leaves(unsigned int cpu)
477  {
478  	return -ENOENT;
479  }
480  
allocate_cache_info(int cpu)481  static inline int allocate_cache_info(int cpu)
482  {
483  	per_cpu_cacheinfo(cpu) = kcalloc(cache_leaves(cpu), sizeof(struct cacheinfo), GFP_ATOMIC);
484  	if (!per_cpu_cacheinfo(cpu)) {
485  		cache_leaves(cpu) = 0;
486  		return -ENOMEM;
487  	}
488  
489  	return 0;
490  }
491  
fetch_cache_info(unsigned int cpu)492  int fetch_cache_info(unsigned int cpu)
493  {
494  	struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
495  	unsigned int levels = 0, split_levels = 0;
496  	int ret;
497  
498  	if (acpi_disabled) {
499  		ret = init_of_cache_level(cpu);
500  	} else {
501  		ret = acpi_get_cache_info(cpu, &levels, &split_levels);
502  		if (!ret) {
503  			this_cpu_ci->num_levels = levels;
504  			/*
505  			 * This assumes that:
506  			 * - there cannot be any split caches (data/instruction)
507  			 *   above a unified cache
508  			 * - data/instruction caches come by pair
509  			 */
510  			this_cpu_ci->num_leaves = levels + split_levels;
511  		}
512  	}
513  
514  	if (ret || !cache_leaves(cpu)) {
515  		ret = early_cache_level(cpu);
516  		if (ret)
517  			return ret;
518  
519  		if (!cache_leaves(cpu))
520  			return -ENOENT;
521  
522  		this_cpu_ci->early_ci_levels = true;
523  	}
524  
525  	return allocate_cache_info(cpu);
526  }
527  
init_level_allocate_ci(unsigned int cpu)528  static inline int init_level_allocate_ci(unsigned int cpu)
529  {
530  	unsigned int early_leaves = cache_leaves(cpu);
531  
532  	/* Since early initialization/allocation of the cacheinfo is allowed
533  	 * via fetch_cache_info() and this also gets called as CPU hotplug
534  	 * callbacks via cacheinfo_cpu_online, the init/alloc can be skipped
535  	 * as it will happen only once (the cacheinfo memory is never freed).
536  	 * Just populate the cacheinfo. However, if the cacheinfo has been
537  	 * allocated early through the arch-specific early_cache_level() call,
538  	 * there is a chance the info is wrong (this can happen on arm64). In
539  	 * that case, call init_cache_level() anyway to give the arch-specific
540  	 * code a chance to make things right.
541  	 */
542  	if (per_cpu_cacheinfo(cpu) && !ci_cacheinfo(cpu)->early_ci_levels)
543  		return 0;
544  
545  	if (init_cache_level(cpu) || !cache_leaves(cpu))
546  		return -ENOENT;
547  
548  	/*
549  	 * Now that we have properly initialized the cache level info, make
550  	 * sure we don't try to do that again the next time we are called
551  	 * (e.g. as CPU hotplug callbacks).
552  	 */
553  	ci_cacheinfo(cpu)->early_ci_levels = false;
554  
555  	/*
556  	 * Some architectures (e.g., x86) do not use early initialization.
557  	 * Allocate memory now in such case.
558  	 */
559  	if (cache_leaves(cpu) <= early_leaves && per_cpu_cacheinfo(cpu))
560  		return 0;
561  
562  	kfree(per_cpu_cacheinfo(cpu));
563  	return allocate_cache_info(cpu);
564  }
565  
detect_cache_attributes(unsigned int cpu)566  int detect_cache_attributes(unsigned int cpu)
567  {
568  	int ret;
569  
570  	ret = init_level_allocate_ci(cpu);
571  	if (ret)
572  		return ret;
573  
574  	/*
575  	 * If LLC is valid the cache leaves were already populated so just go to
576  	 * update the cpu map.
577  	 */
578  	if (!last_level_cache_is_valid(cpu)) {
579  		/*
580  		 * populate_cache_leaves() may completely setup the cache leaves and
581  		 * shared_cpu_map or it may leave it partially setup.
582  		 */
583  		ret = populate_cache_leaves(cpu);
584  		if (ret)
585  			goto free_ci;
586  	}
587  
588  	/*
589  	 * For systems using DT for cache hierarchy, fw_token
590  	 * and shared_cpu_map will be set up here only if they are
591  	 * not populated already
592  	 */
593  	ret = cache_shared_cpu_map_setup(cpu);
594  	if (ret) {
595  		pr_warn("Unable to detect cache hierarchy for CPU %d\n", cpu);
596  		goto free_ci;
597  	}
598  
599  	return 0;
600  
601  free_ci:
602  	free_cache_attributes(cpu);
603  	return ret;
604  }
605  
606  /* pointer to cpuX/cache device */
607  static DEFINE_PER_CPU(struct device *, ci_cache_dev);
608  #define per_cpu_cache_dev(cpu)	(per_cpu(ci_cache_dev, cpu))
609  
610  static cpumask_t cache_dev_map;
611  
612  /* pointer to array of devices for cpuX/cache/indexY */
613  static DEFINE_PER_CPU(struct device **, ci_index_dev);
614  #define per_cpu_index_dev(cpu)	(per_cpu(ci_index_dev, cpu))
615  #define per_cache_index_dev(cpu, idx)	((per_cpu_index_dev(cpu))[idx])
616  
617  #define show_one(file_name, object)				\
618  static ssize_t file_name##_show(struct device *dev,		\
619  		struct device_attribute *attr, char *buf)	\
620  {								\
621  	struct cacheinfo *this_leaf = dev_get_drvdata(dev);	\
622  	return sysfs_emit(buf, "%u\n", this_leaf->object);	\
623  }
624  
625  show_one(id, id);
626  show_one(level, level);
627  show_one(coherency_line_size, coherency_line_size);
628  show_one(number_of_sets, number_of_sets);
629  show_one(physical_line_partition, physical_line_partition);
630  show_one(ways_of_associativity, ways_of_associativity);
631  
size_show(struct device * dev,struct device_attribute * attr,char * buf)632  static ssize_t size_show(struct device *dev,
633  			 struct device_attribute *attr, char *buf)
634  {
635  	struct cacheinfo *this_leaf = dev_get_drvdata(dev);
636  
637  	return sysfs_emit(buf, "%uK\n", this_leaf->size >> 10);
638  }
639  
shared_cpu_map_show(struct device * dev,struct device_attribute * attr,char * buf)640  static ssize_t shared_cpu_map_show(struct device *dev,
641  				   struct device_attribute *attr, char *buf)
642  {
643  	struct cacheinfo *this_leaf = dev_get_drvdata(dev);
644  	const struct cpumask *mask = &this_leaf->shared_cpu_map;
645  
646  	return sysfs_emit(buf, "%*pb\n", nr_cpu_ids, mask);
647  }
648  
shared_cpu_list_show(struct device * dev,struct device_attribute * attr,char * buf)649  static ssize_t shared_cpu_list_show(struct device *dev,
650  				    struct device_attribute *attr, char *buf)
651  {
652  	struct cacheinfo *this_leaf = dev_get_drvdata(dev);
653  	const struct cpumask *mask = &this_leaf->shared_cpu_map;
654  
655  	return sysfs_emit(buf, "%*pbl\n", nr_cpu_ids, mask);
656  }
657  
type_show(struct device * dev,struct device_attribute * attr,char * buf)658  static ssize_t type_show(struct device *dev,
659  			 struct device_attribute *attr, char *buf)
660  {
661  	struct cacheinfo *this_leaf = dev_get_drvdata(dev);
662  	const char *output;
663  
664  	switch (this_leaf->type) {
665  	case CACHE_TYPE_DATA:
666  		output = "Data";
667  		break;
668  	case CACHE_TYPE_INST:
669  		output = "Instruction";
670  		break;
671  	case CACHE_TYPE_UNIFIED:
672  		output = "Unified";
673  		break;
674  	default:
675  		return -EINVAL;
676  	}
677  
678  	return sysfs_emit(buf, "%s\n", output);
679  }
680  
allocation_policy_show(struct device * dev,struct device_attribute * attr,char * buf)681  static ssize_t allocation_policy_show(struct device *dev,
682  				      struct device_attribute *attr, char *buf)
683  {
684  	struct cacheinfo *this_leaf = dev_get_drvdata(dev);
685  	unsigned int ci_attr = this_leaf->attributes;
686  	const char *output;
687  
688  	if ((ci_attr & CACHE_READ_ALLOCATE) && (ci_attr & CACHE_WRITE_ALLOCATE))
689  		output = "ReadWriteAllocate";
690  	else if (ci_attr & CACHE_READ_ALLOCATE)
691  		output = "ReadAllocate";
692  	else if (ci_attr & CACHE_WRITE_ALLOCATE)
693  		output = "WriteAllocate";
694  	else
695  		return 0;
696  
697  	return sysfs_emit(buf, "%s\n", output);
698  }
699  
write_policy_show(struct device * dev,struct device_attribute * attr,char * buf)700  static ssize_t write_policy_show(struct device *dev,
701  				 struct device_attribute *attr, char *buf)
702  {
703  	struct cacheinfo *this_leaf = dev_get_drvdata(dev);
704  	unsigned int ci_attr = this_leaf->attributes;
705  	int n = 0;
706  
707  	if (ci_attr & CACHE_WRITE_THROUGH)
708  		n = sysfs_emit(buf, "WriteThrough\n");
709  	else if (ci_attr & CACHE_WRITE_BACK)
710  		n = sysfs_emit(buf, "WriteBack\n");
711  	return n;
712  }
713  
714  static DEVICE_ATTR_RO(id);
715  static DEVICE_ATTR_RO(level);
716  static DEVICE_ATTR_RO(type);
717  static DEVICE_ATTR_RO(coherency_line_size);
718  static DEVICE_ATTR_RO(ways_of_associativity);
719  static DEVICE_ATTR_RO(number_of_sets);
720  static DEVICE_ATTR_RO(size);
721  static DEVICE_ATTR_RO(allocation_policy);
722  static DEVICE_ATTR_RO(write_policy);
723  static DEVICE_ATTR_RO(shared_cpu_map);
724  static DEVICE_ATTR_RO(shared_cpu_list);
725  static DEVICE_ATTR_RO(physical_line_partition);
726  
727  static struct attribute *cache_default_attrs[] = {
728  	&dev_attr_id.attr,
729  	&dev_attr_type.attr,
730  	&dev_attr_level.attr,
731  	&dev_attr_shared_cpu_map.attr,
732  	&dev_attr_shared_cpu_list.attr,
733  	&dev_attr_coherency_line_size.attr,
734  	&dev_attr_ways_of_associativity.attr,
735  	&dev_attr_number_of_sets.attr,
736  	&dev_attr_size.attr,
737  	&dev_attr_allocation_policy.attr,
738  	&dev_attr_write_policy.attr,
739  	&dev_attr_physical_line_partition.attr,
740  	NULL
741  };
742  
743  static umode_t
cache_default_attrs_is_visible(struct kobject * kobj,struct attribute * attr,int unused)744  cache_default_attrs_is_visible(struct kobject *kobj,
745  			       struct attribute *attr, int unused)
746  {
747  	struct device *dev = kobj_to_dev(kobj);
748  	struct cacheinfo *this_leaf = dev_get_drvdata(dev);
749  	const struct cpumask *mask = &this_leaf->shared_cpu_map;
750  	umode_t mode = attr->mode;
751  
752  	if ((attr == &dev_attr_id.attr) && (this_leaf->attributes & CACHE_ID))
753  		return mode;
754  	if ((attr == &dev_attr_type.attr) && this_leaf->type)
755  		return mode;
756  	if ((attr == &dev_attr_level.attr) && this_leaf->level)
757  		return mode;
758  	if ((attr == &dev_attr_shared_cpu_map.attr) && !cpumask_empty(mask))
759  		return mode;
760  	if ((attr == &dev_attr_shared_cpu_list.attr) && !cpumask_empty(mask))
761  		return mode;
762  	if ((attr == &dev_attr_coherency_line_size.attr) &&
763  	    this_leaf->coherency_line_size)
764  		return mode;
765  	if ((attr == &dev_attr_ways_of_associativity.attr) &&
766  	    this_leaf->size) /* allow 0 = full associativity */
767  		return mode;
768  	if ((attr == &dev_attr_number_of_sets.attr) &&
769  	    this_leaf->number_of_sets)
770  		return mode;
771  	if ((attr == &dev_attr_size.attr) && this_leaf->size)
772  		return mode;
773  	if ((attr == &dev_attr_write_policy.attr) &&
774  	    (this_leaf->attributes & CACHE_WRITE_POLICY_MASK))
775  		return mode;
776  	if ((attr == &dev_attr_allocation_policy.attr) &&
777  	    (this_leaf->attributes & CACHE_ALLOCATE_POLICY_MASK))
778  		return mode;
779  	if ((attr == &dev_attr_physical_line_partition.attr) &&
780  	    this_leaf->physical_line_partition)
781  		return mode;
782  
783  	return 0;
784  }
785  
786  static const struct attribute_group cache_default_group = {
787  	.attrs = cache_default_attrs,
788  	.is_visible = cache_default_attrs_is_visible,
789  };
790  
791  static const struct attribute_group *cache_default_groups[] = {
792  	&cache_default_group,
793  	NULL,
794  };
795  
796  static const struct attribute_group *cache_private_groups[] = {
797  	&cache_default_group,
798  	NULL, /* Place holder for private group */
799  	NULL,
800  };
801  
802  const struct attribute_group *
cache_get_priv_group(struct cacheinfo * this_leaf)803  __weak cache_get_priv_group(struct cacheinfo *this_leaf)
804  {
805  	return NULL;
806  }
807  
808  static const struct attribute_group **
cache_get_attribute_groups(struct cacheinfo * this_leaf)809  cache_get_attribute_groups(struct cacheinfo *this_leaf)
810  {
811  	const struct attribute_group *priv_group =
812  			cache_get_priv_group(this_leaf);
813  
814  	if (!priv_group)
815  		return cache_default_groups;
816  
817  	if (!cache_private_groups[1])
818  		cache_private_groups[1] = priv_group;
819  
820  	return cache_private_groups;
821  }
822  
823  /* Add/Remove cache interface for CPU device */
cpu_cache_sysfs_exit(unsigned int cpu)824  static void cpu_cache_sysfs_exit(unsigned int cpu)
825  {
826  	int i;
827  	struct device *ci_dev;
828  
829  	if (per_cpu_index_dev(cpu)) {
830  		for (i = 0; i < cache_leaves(cpu); i++) {
831  			ci_dev = per_cache_index_dev(cpu, i);
832  			if (!ci_dev)
833  				continue;
834  			device_unregister(ci_dev);
835  		}
836  		kfree(per_cpu_index_dev(cpu));
837  		per_cpu_index_dev(cpu) = NULL;
838  	}
839  	device_unregister(per_cpu_cache_dev(cpu));
840  	per_cpu_cache_dev(cpu) = NULL;
841  }
842  
cpu_cache_sysfs_init(unsigned int cpu)843  static int cpu_cache_sysfs_init(unsigned int cpu)
844  {
845  	struct device *dev = get_cpu_device(cpu);
846  
847  	if (per_cpu_cacheinfo(cpu) == NULL)
848  		return -ENOENT;
849  
850  	per_cpu_cache_dev(cpu) = cpu_device_create(dev, NULL, NULL, "cache");
851  	if (IS_ERR(per_cpu_cache_dev(cpu)))
852  		return PTR_ERR(per_cpu_cache_dev(cpu));
853  
854  	/* Allocate all required memory */
855  	per_cpu_index_dev(cpu) = kcalloc(cache_leaves(cpu),
856  					 sizeof(struct device *), GFP_KERNEL);
857  	if (unlikely(per_cpu_index_dev(cpu) == NULL))
858  		goto err_out;
859  
860  	return 0;
861  
862  err_out:
863  	cpu_cache_sysfs_exit(cpu);
864  	return -ENOMEM;
865  }
866  
cache_add_dev(unsigned int cpu)867  static int cache_add_dev(unsigned int cpu)
868  {
869  	unsigned int i;
870  	int rc;
871  	struct device *ci_dev, *parent;
872  	struct cacheinfo *this_leaf;
873  	const struct attribute_group **cache_groups;
874  
875  	rc = cpu_cache_sysfs_init(cpu);
876  	if (unlikely(rc < 0))
877  		return rc;
878  
879  	parent = per_cpu_cache_dev(cpu);
880  	for (i = 0; i < cache_leaves(cpu); i++) {
881  		this_leaf = per_cpu_cacheinfo_idx(cpu, i);
882  		if (this_leaf->disable_sysfs)
883  			continue;
884  		if (this_leaf->type == CACHE_TYPE_NOCACHE)
885  			break;
886  		cache_groups = cache_get_attribute_groups(this_leaf);
887  		ci_dev = cpu_device_create(parent, this_leaf, cache_groups,
888  					   "index%1u", i);
889  		if (IS_ERR(ci_dev)) {
890  			rc = PTR_ERR(ci_dev);
891  			goto err;
892  		}
893  		per_cache_index_dev(cpu, i) = ci_dev;
894  	}
895  	cpumask_set_cpu(cpu, &cache_dev_map);
896  
897  	return 0;
898  err:
899  	cpu_cache_sysfs_exit(cpu);
900  	return rc;
901  }
902  
cacheinfo_cpu_online(unsigned int cpu)903  static int cacheinfo_cpu_online(unsigned int cpu)
904  {
905  	int rc = detect_cache_attributes(cpu);
906  
907  	if (rc)
908  		return rc;
909  	rc = cache_add_dev(cpu);
910  	if (rc)
911  		free_cache_attributes(cpu);
912  	return rc;
913  }
914  
cacheinfo_cpu_pre_down(unsigned int cpu)915  static int cacheinfo_cpu_pre_down(unsigned int cpu)
916  {
917  	if (cpumask_test_and_clear_cpu(cpu, &cache_dev_map))
918  		cpu_cache_sysfs_exit(cpu);
919  
920  	free_cache_attributes(cpu);
921  	return 0;
922  }
923  
cacheinfo_sysfs_init(void)924  static int __init cacheinfo_sysfs_init(void)
925  {
926  	return cpuhp_setup_state(CPUHP_AP_BASE_CACHEINFO_ONLINE,
927  				 "base/cacheinfo:online",
928  				 cacheinfo_cpu_online, cacheinfo_cpu_pre_down);
929  }
930  device_initcall(cacheinfo_sysfs_init);
931