Lines Matching +full:cache +full:- +full:level

1 // SPDX-License-Identifier: GPL-2.0
3 * Extract CPU cache information and expose them via sysfs.
71 struct cacheinfo *cache; in show_cacheinfo() local
77 for (idx = 0; idx < this_cpu_ci->num_leaves; idx++) { in show_cacheinfo()
78 cache = this_cpu_ci->info_list + idx; in show_cacheinfo()
79 seq_printf(m, "cache%-11d: ", idx); in show_cacheinfo()
80 seq_printf(m, "level=%d ", cache->level); in show_cacheinfo()
81 seq_printf(m, "type=%s ", cache_type_string[cache->type]); in show_cacheinfo()
83 cache->disable_sysfs ? "Shared" : "Private"); in show_cacheinfo()
84 seq_printf(m, "size=%dK ", cache->size >> 10); in show_cacheinfo()
85 seq_printf(m, "line_size=%u ", cache->coherency_line_size); in show_cacheinfo()
86 seq_printf(m, "associativity=%d", cache->ways_of_associativity); in show_cacheinfo()
91 static inline enum cache_type get_cache_type(struct cache_info *ci, int level) in get_cache_type() argument
93 if (level >= CACHE_MAX_LEVEL) in get_cache_type()
95 ci += level; in get_cache_type()
96 if (ci->scope != CACHE_SCOPE_SHARED && ci->scope != CACHE_SCOPE_PRIVATE) in get_cache_type()
98 return cache_type_map[ci->type]; in get_cache_type()
107 enum cache_type type, unsigned int level, int cpu) in ci_leaf_init() argument
115 this_leaf->level = level + 1; in ci_leaf_init()
116 this_leaf->type = type; in ci_leaf_init()
117 this_leaf->coherency_line_size = ecag(EXTRACT_LINE_SIZE, level, ti); in ci_leaf_init()
118 this_leaf->ways_of_associativity = ecag(EXTRACT_ASSOCIATIVITY, level, ti); in ci_leaf_init()
119 this_leaf->size = ecag(EXTRACT_SIZE, level, ti); in ci_leaf_init()
120 num_sets = this_leaf->size / this_leaf->coherency_line_size; in ci_leaf_init()
121 num_sets /= this_leaf->ways_of_associativity; in ci_leaf_init()
122 this_leaf->number_of_sets = num_sets; in ci_leaf_init()
123 cpumask_set_cpu(cpu, &this_leaf->shared_cpu_map); in ci_leaf_init()
125 this_leaf->disable_sysfs = true; in ci_leaf_init()
131 unsigned int level = 0, leaves = 0; in init_cache_level() local
136 return -EOPNOTSUPP; in init_cache_level()
138 return -EINVAL; in init_cache_level()
141 ctype = get_cache_type(&ct.ci[0], level); in init_cache_level()
146 } while (++level < CACHE_MAX_LEVEL); in init_cache_level()
147 this_cpu_ci->num_levels = level; in init_cache_level()
148 this_cpu_ci->num_leaves = leaves; in init_cache_level()
155 struct cacheinfo *this_leaf = this_cpu_ci->info_list; in populate_cache_leaves()
156 unsigned int level, idx, pvt; in populate_cache_leaves() local
161 return -EOPNOTSUPP; in populate_cache_leaves()
163 for (idx = 0, level = 0; level < this_cpu_ci->num_levels && in populate_cache_leaves()
164 idx < this_cpu_ci->num_leaves; idx++, level++) { in populate_cache_leaves()
166 return -EINVAL; in populate_cache_leaves()
167 pvt = (ct.ci[level].scope == CACHE_SCOPE_PRIVATE) ? 1 : 0; in populate_cache_leaves()
168 ctype = get_cache_type(&ct.ci[0], level); in populate_cache_leaves()
170 ci_leaf_init(this_leaf++, pvt, CACHE_TYPE_DATA, level, cpu); in populate_cache_leaves()
171 ci_leaf_init(this_leaf++, pvt, CACHE_TYPE_INST, level, cpu); in populate_cache_leaves()
173 ci_leaf_init(this_leaf++, pvt, ctype, level, cpu); in populate_cache_leaves()