xref: /aosp_15_r20/external/cpuinfo/tools/cache-info.c (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li #include <stdio.h>
2*2b54f0dbSXin Li #include <stdlib.h>
3*2b54f0dbSXin Li #include <inttypes.h>
4*2b54f0dbSXin Li 
5*2b54f0dbSXin Li #include <cpuinfo.h>
6*2b54f0dbSXin Li 
7*2b54f0dbSXin Li 
report_cache(uint32_t count,const struct cpuinfo_cache * cache,uint32_t level,const char * nonunified_type)8*2b54f0dbSXin Li void report_cache(
9*2b54f0dbSXin Li 	uint32_t count, const struct cpuinfo_cache* cache,
10*2b54f0dbSXin Li 	uint32_t level, const char* nonunified_type)
11*2b54f0dbSXin Li {
12*2b54f0dbSXin Li 	const char* type = (cache->flags & CPUINFO_CACHE_UNIFIED) ? "unified" : nonunified_type;
13*2b54f0dbSXin Li 	printf("L%"PRIu32" %s cache: ", level, type);
14*2b54f0dbSXin Li 
15*2b54f0dbSXin Li 	uint32_t size = cache->size;
16*2b54f0dbSXin Li 	const char* units = "bytes";
17*2b54f0dbSXin Li 	if (size % UINT32_C(1048576) == 0) {
18*2b54f0dbSXin Li 		size /= UINT32_C(1048576);
19*2b54f0dbSXin Li 		units = "MB";
20*2b54f0dbSXin Li 	} else if (size % UINT32_C(1024) == 0) {
21*2b54f0dbSXin Li 		size /= UINT32_C(1024);
22*2b54f0dbSXin Li 		units = "KB";
23*2b54f0dbSXin Li 	}
24*2b54f0dbSXin Li 	if (count != 1) {
25*2b54f0dbSXin Li 		printf("%"PRIu32" x ", count);
26*2b54f0dbSXin Li 	}
27*2b54f0dbSXin Li 	if (level == 1) {
28*2b54f0dbSXin Li 		printf("%"PRIu32" %s, ", size, units);
29*2b54f0dbSXin Li 	} else {
30*2b54f0dbSXin Li 		printf("%"PRIu32" %s (%s), ", size, units, (cache->flags & CPUINFO_CACHE_INCLUSIVE) ? "inclusive" : "exclusive");
31*2b54f0dbSXin Li 	}
32*2b54f0dbSXin Li 
33*2b54f0dbSXin Li 	if (cache->associativity * cache->line_size == cache->size) {
34*2b54f0dbSXin Li 		printf("fully associative");
35*2b54f0dbSXin Li 	} else {
36*2b54f0dbSXin Li 		printf("%"PRIu32"-way set associative", cache->associativity);
37*2b54f0dbSXin Li 	}
38*2b54f0dbSXin Li 	if (cache->sets != 0) {
39*2b54f0dbSXin Li 		printf(" (%"PRIu32" sets", cache->sets);
40*2b54f0dbSXin Li 		if (cache->partitions != 1) {
41*2b54f0dbSXin Li 			printf(", %"PRIu32" partitions", cache->partitions);
42*2b54f0dbSXin Li 		}
43*2b54f0dbSXin Li 		if (cache->flags & CPUINFO_CACHE_COMPLEX_INDEXING) {
44*2b54f0dbSXin Li 			printf(", complex indexing), ");
45*2b54f0dbSXin Li 		} else {
46*2b54f0dbSXin Li 			printf("), ");
47*2b54f0dbSXin Li 		}
48*2b54f0dbSXin Li 	}
49*2b54f0dbSXin Li 
50*2b54f0dbSXin Li 	printf("%"PRIu32" byte lines", cache->line_size);
51*2b54f0dbSXin Li 	if (cache->processor_count != 0) {
52*2b54f0dbSXin Li 		printf(", shared by %"PRIu32" processors\n", cache->processor_count);
53*2b54f0dbSXin Li 	} else {
54*2b54f0dbSXin Li 		printf("\n");
55*2b54f0dbSXin Li 	}
56*2b54f0dbSXin Li }
57*2b54f0dbSXin Li 
main(int argc,char ** argv)58*2b54f0dbSXin Li int main(int argc, char** argv) {
59*2b54f0dbSXin Li 	if (!cpuinfo_initialize()) {
60*2b54f0dbSXin Li 		fprintf(stderr, "failed to initialize CPU information\n");
61*2b54f0dbSXin Li 		exit(EXIT_FAILURE);
62*2b54f0dbSXin Li 	}
63*2b54f0dbSXin Li 	printf("Max cache size (upper bound): %"PRIu32" bytes\n", cpuinfo_get_max_cache_size());
64*2b54f0dbSXin Li 
65*2b54f0dbSXin Li 	if (cpuinfo_get_l1i_caches_count() != 0 && (cpuinfo_get_l1i_cache(0)->flags & CPUINFO_CACHE_UNIFIED) == 0) {
66*2b54f0dbSXin Li 		report_cache(cpuinfo_get_l1i_caches_count(), cpuinfo_get_l1i_cache(0), 1, "instruction");
67*2b54f0dbSXin Li 	}
68*2b54f0dbSXin Li 	if (cpuinfo_get_l1d_caches_count() != 0) {
69*2b54f0dbSXin Li 		report_cache(cpuinfo_get_l1d_caches_count(), cpuinfo_get_l1d_cache(0), 1, "data");
70*2b54f0dbSXin Li 	}
71*2b54f0dbSXin Li 	if (cpuinfo_get_l2_caches_count() != 0) {
72*2b54f0dbSXin Li 		report_cache(cpuinfo_get_l2_caches_count(), cpuinfo_get_l2_cache(0), 2, "data");
73*2b54f0dbSXin Li 	}
74*2b54f0dbSXin Li 	if (cpuinfo_get_l3_caches_count() != 0) {
75*2b54f0dbSXin Li 		report_cache(cpuinfo_get_l3_caches_count(), cpuinfo_get_l3_cache(0), 3, "data");
76*2b54f0dbSXin Li 	}
77*2b54f0dbSXin Li 	if (cpuinfo_get_l4_caches_count() != 0) {
78*2b54f0dbSXin Li 		report_cache(cpuinfo_get_l4_caches_count(), cpuinfo_get_l4_cache(0), 4, "data");
79*2b54f0dbSXin Li 	}
80*2b54f0dbSXin Li }
81