2 * Routines to indentify caches on Intel CPU.
5 * Venkatesh Pallipadi : Adding cache identification through cpuid(4)
7 * Andi Kleen / Andreas Herrmann : CPUID4 emulation on AMD.
10 #include <linux/init.h>
11 #include <linux/slab.h>
12 #include <linux/device.h>
13 #include <linux/compiler.h>
14 #include <linux/cpu.h>
15 #include <linux/sched.h>
16 #include <linux/pci.h>
18 #include <asm/processor.h>
19 #include <linux/smp.h>
20 #include <asm/amd_nb.h>
30 unsigned char descriptor;
35 #define MB(x) ((x) * 1024)
37 /* All the cache descriptor types we care about (no TLB or
38 trace cache entries) */
40 static const struct _cache_table __cpuinitconst cache_table[] =
42 { 0x06, LVL_1_INST, 8 }, /* 4-way set assoc, 32 byte line size */
43 { 0x08, LVL_1_INST, 16 }, /* 4-way set assoc, 32 byte line size */
44 { 0x09, LVL_1_INST, 32 }, /* 4-way set assoc, 64 byte line size */
45 { 0x0a, LVL_1_DATA, 8 }, /* 2 way set assoc, 32 byte line size */
46 { 0x0c, LVL_1_DATA, 16 }, /* 4-way set assoc, 32 byte line size */
47 { 0x0d, LVL_1_DATA, 16 }, /* 4-way set assoc, 64 byte line size */
48 { 0x0e, LVL_1_DATA, 24 }, /* 6-way set assoc, 64 byte line size */
49 { 0x21, LVL_2, 256 }, /* 8-way set assoc, 64 byte line size */
50 { 0x22, LVL_3, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
51 { 0x23, LVL_3, MB(1) }, /* 8-way set assoc, sectored cache, 64 byte line size */
52 { 0x25, LVL_3, MB(2) }, /* 8-way set assoc, sectored cache, 64 byte line size */
53 { 0x29, LVL_3, MB(4) }, /* 8-way set assoc, sectored cache, 64 byte line size */
54 { 0x2c, LVL_1_DATA, 32 }, /* 8-way set assoc, 64 byte line size */
55 { 0x30, LVL_1_INST, 32 }, /* 8-way set assoc, 64 byte line size */
56 { 0x39, LVL_2, 128 }, /* 4-way set assoc, sectored cache, 64 byte line size */
57 { 0x3a, LVL_2, 192 }, /* 6-way set assoc, sectored cache, 64 byte line size */
58 { 0x3b, LVL_2, 128 }, /* 2-way set assoc, sectored cache, 64 byte line size */
59 { 0x3c, LVL_2, 256 }, /* 4-way set assoc, sectored cache, 64 byte line size */
60 { 0x3d, LVL_2, 384 }, /* 6-way set assoc, sectored cache, 64 byte line size */
61 { 0x3e, LVL_2, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
62 { 0x3f, LVL_2, 256 }, /* 2-way set assoc, 64 byte line size */
63 { 0x41, LVL_2, 128 }, /* 4-way set assoc, 32 byte line size */
64 { 0x42, LVL_2, 256 }, /* 4-way set assoc, 32 byte line size */
65 { 0x43, LVL_2, 512 }, /* 4-way set assoc, 32 byte line size */
66 { 0x44, LVL_2, MB(1) }, /* 4-way set assoc, 32 byte line size */
67 { 0x45, LVL_2, MB(2) }, /* 4-way set assoc, 32 byte line size */
68 { 0x46, LVL_3, MB(4) }, /* 4-way set assoc, 64 byte line size */
69 { 0x47, LVL_3, MB(8) }, /* 8-way set assoc, 64 byte line size */
70 { 0x48, LVL_2, MB(3) }, /* 12-way set assoc, 64 byte line size */
71 { 0x49, LVL_3, MB(4) }, /* 16-way set assoc, 64 byte line size */
72 { 0x4a, LVL_3, MB(6) }, /* 12-way set assoc, 64 byte line size */
73 { 0x4b, LVL_3, MB(8) }, /* 16-way set assoc, 64 byte line size */
74 { 0x4c, LVL_3, MB(12) }, /* 12-way set assoc, 64 byte line size */
75 { 0x4d, LVL_3, MB(16) }, /* 16-way set assoc, 64 byte line size */
76 { 0x4e, LVL_2, MB(6) }, /* 24-way set assoc, 64 byte line size */
77 { 0x60, LVL_1_DATA, 16 }, /* 8-way set assoc, sectored cache, 64 byte line size */
78 { 0x66, LVL_1_DATA, 8 }, /* 4-way set assoc, sectored cache, 64 byte line size */
79 { 0x67, LVL_1_DATA, 16 }, /* 4-way set assoc, sectored cache, 64 byte line size */
80 { 0x68, LVL_1_DATA, 32 }, /* 4-way set assoc, sectored cache, 64 byte line size */
81 { 0x70, LVL_TRACE, 12 }, /* 8-way set assoc */
82 { 0x71, LVL_TRACE, 16 }, /* 8-way set assoc */
83 { 0x72, LVL_TRACE, 32 }, /* 8-way set assoc */
84 { 0x73, LVL_TRACE, 64 }, /* 8-way set assoc */
85 { 0x78, LVL_2, MB(1) }, /* 4-way set assoc, 64 byte line size */
86 { 0x79, LVL_2, 128 }, /* 8-way set assoc, sectored cache, 64 byte line size */
87 { 0x7a, LVL_2, 256 }, /* 8-way set assoc, sectored cache, 64 byte line size */
88 { 0x7b, LVL_2, 512 }, /* 8-way set assoc, sectored cache, 64 byte line size */
89 { 0x7c, LVL_2, MB(1) }, /* 8-way set assoc, sectored cache, 64 byte line size */
90 { 0x7d, LVL_2, MB(2) }, /* 8-way set assoc, 64 byte line size */
91 { 0x7f, LVL_2, 512 }, /* 2-way set assoc, 64 byte line size */
92 { 0x80, LVL_2, 512 }, /* 8-way set assoc, 64 byte line size */
93 { 0x82, LVL_2, 256 }, /* 8-way set assoc, 32 byte line size */
94 { 0x83, LVL_2, 512 }, /* 8-way set assoc, 32 byte line size */
95 { 0x84, LVL_2, MB(1) }, /* 8-way set assoc, 32 byte line size */
96 { 0x85, LVL_2, MB(2) }, /* 8-way set assoc, 32 byte line size */
97 { 0x86, LVL_2, 512 }, /* 4-way set assoc, 64 byte line size */
98 { 0x87, LVL_2, MB(1) }, /* 8-way set assoc, 64 byte line size */
99 { 0xd0, LVL_3, 512 }, /* 4-way set assoc, 64 byte line size */
100 { 0xd1, LVL_3, MB(1) }, /* 4-way set assoc, 64 byte line size */
101 { 0xd2, LVL_3, MB(2) }, /* 4-way set assoc, 64 byte line size */
102 { 0xd6, LVL_3, MB(1) }, /* 8-way set assoc, 64 byte line size */
103 { 0xd7, LVL_3, MB(2) }, /* 8-way set assoc, 64 byte line size */
104 { 0xd8, LVL_3, MB(4) }, /* 12-way set assoc, 64 byte line size */
105 { 0xdc, LVL_3, MB(2) }, /* 12-way set assoc, 64 byte line size */
106 { 0xdd, LVL_3, MB(4) }, /* 12-way set assoc, 64 byte line size */
107 { 0xde, LVL_3, MB(8) }, /* 12-way set assoc, 64 byte line size */
108 { 0xe2, LVL_3, MB(2) }, /* 16-way set assoc, 64 byte line size */
109 { 0xe3, LVL_3, MB(4) }, /* 16-way set assoc, 64 byte line size */
110 { 0xe4, LVL_3, MB(8) }, /* 16-way set assoc, 64 byte line size */
111 { 0xea, LVL_3, MB(12) }, /* 24-way set assoc, 64 byte line size */
112 { 0xeb, LVL_3, MB(18) }, /* 24-way set assoc, 64 byte line size */
113 { 0xec, LVL_3, MB(24) }, /* 24-way set assoc, 64 byte line size */
122 CACHE_TYPE_UNIFIED = 3
125 union _cpuid4_leaf_eax {
127 enum _cache_type type:5;
128 unsigned int level:3;
129 unsigned int is_self_initializing:1;
130 unsigned int is_fully_associative:1;
131 unsigned int reserved:4;
132 unsigned int num_threads_sharing:12;
133 unsigned int num_cores_on_die:6;
138 union _cpuid4_leaf_ebx {
140 unsigned int coherency_line_size:12;
141 unsigned int physical_line_partition:10;
142 unsigned int ways_of_associativity:10;
147 union _cpuid4_leaf_ecx {
149 unsigned int number_of_sets:32;
154 struct amd_l3_cache {
155 struct amd_northbridge *nb;
160 struct _cpuid4_info {
161 union _cpuid4_leaf_eax eax;
162 union _cpuid4_leaf_ebx ebx;
163 union _cpuid4_leaf_ecx ecx;
165 struct amd_l3_cache *l3;
166 DECLARE_BITMAP(shared_cpu_map, NR_CPUS);
169 /* subset of above _cpuid4_info w/o shared_cpu_map */
170 struct _cpuid4_info_regs {
171 union _cpuid4_leaf_eax eax;
172 union _cpuid4_leaf_ebx ebx;
173 union _cpuid4_leaf_ecx ecx;
175 struct amd_l3_cache *l3;
178 unsigned short num_cache_leaves;
180 /* AMD doesn't have CPUID4. Emulate it here to report the same
181 information to the user. This makes some assumptions about the machine:
182 L2 not shared, no SMT etc. that is currently true on AMD CPUs.
184 In theory the TLBs could be reported as fake type (they are in "dummy").
188 unsigned line_size:8;
189 unsigned lines_per_tag:8;
191 unsigned size_in_kb:8;
198 unsigned line_size:8;
199 unsigned lines_per_tag:4;
201 unsigned size_in_kb:16;
208 unsigned line_size:8;
209 unsigned lines_per_tag:4;
212 unsigned size_encoded:14;
217 static const unsigned short __cpuinitconst assocs[] = {
228 [0xf] = 0xffff /* fully associative - no way to show this currently */
231 static const unsigned char __cpuinitconst levels[] = { 1, 1, 2, 3 };
232 static const unsigned char __cpuinitconst types[] = { 1, 2, 3, 3 };
234 static void __cpuinit
235 amd_cpuid4(int leaf, union _cpuid4_leaf_eax *eax,
236 union _cpuid4_leaf_ebx *ebx,
237 union _cpuid4_leaf_ecx *ecx)
240 unsigned line_size, lines_per_tag, assoc, size_in_kb;
241 union l1_cache l1i, l1d;
244 union l1_cache *l1 = &l1d;
250 cpuid(0x80000005, &dummy, &dummy, &l1d.val, &l1i.val);
251 cpuid(0x80000006, &dummy, &dummy, &l2.val, &l3.val);
259 assoc = assocs[l1->assoc];
260 line_size = l1->line_size;
261 lines_per_tag = l1->lines_per_tag;
262 size_in_kb = l1->size_in_kb;
267 assoc = assocs[l2.assoc];
268 line_size = l2.line_size;
269 lines_per_tag = l2.lines_per_tag;
270 /* cpu_data has errata corrections for K7 applied */
271 size_in_kb = __this_cpu_read(cpu_info.x86_cache_size);
276 assoc = assocs[l3.assoc];
277 line_size = l3.line_size;
278 lines_per_tag = l3.lines_per_tag;
279 size_in_kb = l3.size_encoded * 512;
280 if (boot_cpu_has(X86_FEATURE_AMD_DCM)) {
281 size_in_kb = size_in_kb >> 1;
289 eax->split.is_self_initializing = 1;
290 eax->split.type = types[leaf];
291 eax->split.level = levels[leaf];
292 eax->split.num_threads_sharing = 0;
293 eax->split.num_cores_on_die = __this_cpu_read(cpu_info.x86_max_cores) - 1;
297 eax->split.is_fully_associative = 1;
298 ebx->split.coherency_line_size = line_size - 1;
299 ebx->split.ways_of_associativity = assoc - 1;
300 ebx->split.physical_line_partition = lines_per_tag - 1;
301 ecx->split.number_of_sets = (size_in_kb * 1024) / line_size /
302 (ebx->split.ways_of_associativity + 1) - 1;
306 struct attribute attr;
307 ssize_t (*show)(struct _cpuid4_info *, char *);
308 ssize_t (*store)(struct _cpuid4_info *, const char *, size_t count);
314 * L3 cache descriptors
316 static void __cpuinit amd_calc_l3_indices(struct amd_l3_cache *l3)
318 unsigned int sc0, sc1, sc2, sc3;
321 pci_read_config_dword(l3->nb->misc, 0x1C4, &val);
323 /* calculate subcache sizes */
324 l3->subcaches[0] = sc0 = !(val & BIT(0));
325 l3->subcaches[1] = sc1 = !(val & BIT(4));
326 l3->subcaches[2] = sc2 = !(val & BIT(8)) + !(val & BIT(9));
327 l3->subcaches[3] = sc3 = !(val & BIT(12)) + !(val & BIT(13));
329 l3->indices = (max(max(max(sc0, sc1), sc2), sc3) << 10) - 1;
330 l3->indices = (max(max3(sc0, sc1, sc2), sc3) << 10) - 1;
333 static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf,
336 static struct amd_l3_cache *__cpuinitdata l3_caches;
339 /* only for L3, and not in virtualized environments */
340 if (index < 3 || amd_nb_num() == 0)
344 * Strictly speaking, the amount in @size below is leaked since it is
345 * never freed but this is done only on shutdown so it doesn't matter.
348 int size = amd_nb_num() * sizeof(struct amd_l3_cache);
350 l3_caches = kzalloc(size, GFP_ATOMIC);
355 node = amd_get_nb_id(smp_processor_id());
357 if (!l3_caches[node].nb) {
358 l3_caches[node].nb = node_to_amd_nb(node);
359 amd_calc_l3_indices(&l3_caches[node]);
362 this_leaf->l3 = &l3_caches[node];
366 * check whether a slot used for disabling an L3 index is occupied.
367 * @l3: L3 cache descriptor
368 * @slot: slot number (0..1)
370 * @returns: the disabled index if used or negative value if slot free.
372 int amd_get_l3_disable_slot(struct amd_l3_cache *l3, unsigned slot)
374 unsigned int reg = 0;
376 pci_read_config_dword(l3->nb->misc, 0x1BC + slot * 4, ®);
378 /* check whether this slot is activated already */
379 if (reg & (3UL << 30))
385 static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf,
390 if (!this_leaf->l3 ||
391 !amd_nb_has_feature(AMD_NB_L3_INDEX_DISABLE))
394 index = amd_get_l3_disable_slot(this_leaf->l3, slot);
396 return sprintf(buf, "%d\n", index);
398 return sprintf(buf, "FREE\n");
401 #define SHOW_CACHE_DISABLE(slot) \
403 show_cache_disable_##slot(struct _cpuid4_info *this_leaf, char *buf) \
405 return show_cache_disable(this_leaf, buf, slot); \
407 SHOW_CACHE_DISABLE(0)
408 SHOW_CACHE_DISABLE(1)
410 static void amd_l3_disable_index(struct amd_l3_cache *l3, int cpu,
411 unsigned slot, unsigned long idx)
418 * disable index in all 4 subcaches
420 for (i = 0; i < 4; i++) {
421 u32 reg = idx | (i << 20);
423 if (!l3->subcaches[i])
426 pci_write_config_dword(l3->nb->misc, 0x1BC + slot * 4, reg);
429 * We need to WBINVD on a core on the node containing the L3
430 * cache which indices we disable therefore a simple wbinvd()
436 pci_write_config_dword(l3->nb->misc, 0x1BC + slot * 4, reg);
441 * disable a L3 cache index by using a disable-slot
443 * @l3: L3 cache descriptor
444 * @cpu: A CPU on the node containing the L3 cache
445 * @slot: slot number (0..1)
446 * @index: index to disable
448 * @return: 0 on success, error status on failure
450 int amd_set_l3_disable_slot(struct amd_l3_cache *l3, int cpu, unsigned slot,
455 #define SUBCACHE_MASK (3UL << 20)
456 #define SUBCACHE_INDEX 0xfff
459 * check whether this slot is already used or
460 * the index is already disabled
462 ret = amd_get_l3_disable_slot(l3, slot);
467 * check whether the other slot has disabled the
470 if (index == amd_get_l3_disable_slot(l3, !slot))
473 /* do not allow writes outside of allowed bits */
474 if ((index & ~(SUBCACHE_MASK | SUBCACHE_INDEX)) ||
475 ((index & SUBCACHE_INDEX) > l3->indices))
478 amd_l3_disable_index(l3, cpu, slot, index);
483 static ssize_t store_cache_disable(struct _cpuid4_info *this_leaf,
484 const char *buf, size_t count,
487 unsigned long val = 0;
490 if (!capable(CAP_SYS_ADMIN))
493 if (!this_leaf->l3 ||
494 !amd_nb_has_feature(AMD_NB_L3_INDEX_DISABLE))
497 cpu = cpumask_first(to_cpumask(this_leaf->shared_cpu_map));
499 if (strict_strtoul(buf, 10, &val) < 0)
502 err = amd_set_l3_disable_slot(this_leaf->l3, cpu, slot, val);
505 printk(KERN_WARNING "L3 disable slot %d in use!\n",
512 #define STORE_CACHE_DISABLE(slot) \
514 store_cache_disable_##slot(struct _cpuid4_info *this_leaf, \
515 const char *buf, size_t count) \
517 return store_cache_disable(this_leaf, buf, count, slot); \
519 STORE_CACHE_DISABLE(0)
520 STORE_CACHE_DISABLE(1)
522 static struct _cache_attr cache_disable_0 = __ATTR(cache_disable_0, 0644,
523 show_cache_disable_0, store_cache_disable_0);
524 static struct _cache_attr cache_disable_1 = __ATTR(cache_disable_1, 0644,
525 show_cache_disable_1, store_cache_disable_1);
527 #else /* CONFIG_AMD_NB */
528 #define amd_init_l3_cache(x, y)
529 #endif /* CONFIG_AMD_NB */
532 __cpuinit cpuid4_cache_lookup_regs(int index,
533 struct _cpuid4_info_regs *this_leaf)
535 union _cpuid4_leaf_eax eax;
536 union _cpuid4_leaf_ebx ebx;
537 union _cpuid4_leaf_ecx ecx;
540 if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
541 amd_cpuid4(index, &eax, &ebx, &ecx);
542 amd_init_l3_cache(this_leaf, index);
544 cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full, &edx);
547 if (eax.split.type == CACHE_TYPE_NULL)
548 return -EIO; /* better error ? */
550 this_leaf->eax = eax;
551 this_leaf->ebx = ebx;
552 this_leaf->ecx = ecx;
553 this_leaf->size = (ecx.split.number_of_sets + 1) *
554 (ebx.split.coherency_line_size + 1) *
555 (ebx.split.physical_line_partition + 1) *
556 (ebx.split.ways_of_associativity + 1);
560 static int __cpuinit find_num_cache_leaves(void)
562 unsigned int eax, ebx, ecx, edx;
563 union _cpuid4_leaf_eax cache_eax;
568 /* Do cpuid(4) loop to find out num_cache_leaves */
569 cpuid_count(4, i, &eax, &ebx, &ecx, &edx);
570 cache_eax.full = eax;
571 } while (cache_eax.split.type != CACHE_TYPE_NULL);
575 unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c)
578 unsigned int trace = 0, l1i = 0, l1d = 0, l2 = 0, l3 = 0;
579 unsigned int new_l1d = 0, new_l1i = 0; /* Cache sizes from cpuid(4) */
580 unsigned int new_l2 = 0, new_l3 = 0, i; /* Cache sizes from cpuid(4) */
581 unsigned int l2_id = 0, l3_id = 0, num_threads_sharing, index_msb;
583 unsigned int cpu = c->cpu_index;
586 if (c->cpuid_level > 3) {
587 static int is_initialized;
589 if (is_initialized == 0) {
590 /* Init num_cache_leaves from boot CPU */
591 num_cache_leaves = find_num_cache_leaves();
596 * Whenever possible use cpuid(4), deterministic cache
597 * parameters cpuid leaf to find the cache details
599 for (i = 0; i < num_cache_leaves; i++) {
600 struct _cpuid4_info_regs this_leaf;
603 retval = cpuid4_cache_lookup_regs(i, &this_leaf);
605 switch (this_leaf.eax.split.level) {
607 if (this_leaf.eax.split.type ==
609 new_l1d = this_leaf.size/1024;
610 else if (this_leaf.eax.split.type ==
612 new_l1i = this_leaf.size/1024;
615 new_l2 = this_leaf.size/1024;
616 num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing;
617 index_msb = get_count_order(num_threads_sharing);
618 l2_id = c->apicid >> index_msb;
621 new_l3 = this_leaf.size/1024;
622 num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing;
623 index_msb = get_count_order(
624 num_threads_sharing);
625 l3_id = c->apicid >> index_msb;
634 * Don't use cpuid2 if cpuid4 is supported. For P4, we use cpuid2 for
637 if ((num_cache_leaves == 0 || c->x86 == 15) && c->cpuid_level > 1) {
638 /* supports eax=2 call */
640 unsigned int regs[4];
641 unsigned char *dp = (unsigned char *)regs;
644 if (num_cache_leaves != 0 && c->x86 == 15)
647 /* Number of times to iterate */
648 n = cpuid_eax(2) & 0xFF;
650 for (i = 0 ; i < n ; i++) {
651 cpuid(2, ®s[0], ®s[1], ®s[2], ®s[3]);
653 /* If bit 31 is set, this is an unknown format */
654 for (j = 0 ; j < 3 ; j++)
655 if (regs[j] & (1 << 31))
658 /* Byte 0 is level count, not a descriptor */
659 for (j = 1 ; j < 16 ; j++) {
660 unsigned char des = dp[j];
663 /* look up this descriptor in the table */
664 while (cache_table[k].descriptor != 0) {
665 if (cache_table[k].descriptor == des) {
666 if (only_trace && cache_table[k].cache_type != LVL_TRACE)
668 switch (cache_table[k].cache_type) {
670 l1i += cache_table[k].size;
673 l1d += cache_table[k].size;
676 l2 += cache_table[k].size;
679 l3 += cache_table[k].size;
682 trace += cache_table[k].size;
704 per_cpu(cpu_llc_id, cpu) = l2_id;
711 per_cpu(cpu_llc_id, cpu) = l3_id;
715 c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d));
722 /* pointer to _cpuid4_info array (for each cache leaf) */
723 static DEFINE_PER_CPU(struct _cpuid4_info *, ici_cpuid4_info);
724 #define CPUID4_INFO_IDX(x, y) (&((per_cpu(ici_cpuid4_info, x))[y]))
727 static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
729 struct _cpuid4_info *this_leaf, *sibling_leaf;
730 unsigned long num_threads_sharing;
731 int index_msb, i, sibling;
732 struct cpuinfo_x86 *c = &cpu_data(cpu);
734 if ((index == 3) && (c->x86_vendor == X86_VENDOR_AMD)) {
735 for_each_cpu(i, c->llc_shared_map) {
736 if (!per_cpu(ici_cpuid4_info, i))
738 this_leaf = CPUID4_INFO_IDX(i, index);
739 for_each_cpu(sibling, c->llc_shared_map) {
740 if (!cpu_online(sibling))
742 set_bit(sibling, this_leaf->shared_cpu_map);
747 this_leaf = CPUID4_INFO_IDX(cpu, index);
748 num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing;
750 if (num_threads_sharing == 1)
751 cpumask_set_cpu(cpu, to_cpumask(this_leaf->shared_cpu_map));
753 index_msb = get_count_order(num_threads_sharing);
755 for_each_online_cpu(i) {
756 if (cpu_data(i).apicid >> index_msb ==
757 c->apicid >> index_msb) {
759 to_cpumask(this_leaf->shared_cpu_map));
760 if (i != cpu && per_cpu(ici_cpuid4_info, i)) {
762 CPUID4_INFO_IDX(i, index);
763 cpumask_set_cpu(cpu, to_cpumask(
764 sibling_leaf->shared_cpu_map));
770 static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index)
772 struct _cpuid4_info *this_leaf, *sibling_leaf;
775 this_leaf = CPUID4_INFO_IDX(cpu, index);
776 for_each_cpu(sibling, to_cpumask(this_leaf->shared_cpu_map)) {
777 sibling_leaf = CPUID4_INFO_IDX(sibling, index);
778 cpumask_clear_cpu(cpu,
779 to_cpumask(sibling_leaf->shared_cpu_map));
783 static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
787 static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index)
792 static void __cpuinit free_cache_attributes(unsigned int cpu)
796 for (i = 0; i < num_cache_leaves; i++)
797 cache_remove_shared_cpu_map(cpu, i);
799 kfree(per_cpu(ici_cpuid4_info, cpu)->l3);
800 kfree(per_cpu(ici_cpuid4_info, cpu));
801 per_cpu(ici_cpuid4_info, cpu) = NULL;
805 __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf)
807 struct _cpuid4_info_regs *leaf_regs =
808 (struct _cpuid4_info_regs *)this_leaf;
810 return cpuid4_cache_lookup_regs(index, leaf_regs);
813 static void __cpuinit get_cpu_leaves(void *_retval)
815 int j, *retval = _retval, cpu = smp_processor_id();
817 /* Do cpuid and store the results */
818 for (j = 0; j < num_cache_leaves; j++) {
819 struct _cpuid4_info *this_leaf;
820 this_leaf = CPUID4_INFO_IDX(cpu, j);
821 *retval = cpuid4_cache_lookup(j, this_leaf);
822 if (unlikely(*retval < 0)) {
825 for (i = 0; i < j; i++)
826 cache_remove_shared_cpu_map(cpu, i);
829 cache_shared_cpu_map_setup(cpu, j);
833 static int __cpuinit detect_cache_attributes(unsigned int cpu)
837 if (num_cache_leaves == 0)
840 per_cpu(ici_cpuid4_info, cpu) = kzalloc(
841 sizeof(struct _cpuid4_info) * num_cache_leaves, GFP_KERNEL);
842 if (per_cpu(ici_cpuid4_info, cpu) == NULL)
845 smp_call_function_single(cpu, get_cpu_leaves, &retval, true);
847 kfree(per_cpu(ici_cpuid4_info, cpu));
848 per_cpu(ici_cpuid4_info, cpu) = NULL;
854 #include <linux/kobject.h>
855 #include <linux/sysfs.h>
857 extern struct sysdev_class cpu_sysdev_class; /* from drivers/base/cpu.c */
859 /* pointer to kobject for cpuX/cache */
860 static DEFINE_PER_CPU(struct kobject *, ici_cache_kobject);
862 struct _index_kobject {
865 unsigned short index;
868 /* pointer to array of kobjects for cpuX/cache/indexY */
869 static DEFINE_PER_CPU(struct _index_kobject *, ici_index_kobject);
870 #define INDEX_KOBJECT_PTR(x, y) (&((per_cpu(ici_index_kobject, x))[y]))
872 #define show_one_plus(file_name, object, val) \
873 static ssize_t show_##file_name \
874 (struct _cpuid4_info *this_leaf, char *buf) \
876 return sprintf(buf, "%lu\n", (unsigned long)this_leaf->object + val); \
879 show_one_plus(level, eax.split.level, 0);
880 show_one_plus(coherency_line_size, ebx.split.coherency_line_size, 1);
881 show_one_plus(physical_line_partition, ebx.split.physical_line_partition, 1);
882 show_one_plus(ways_of_associativity, ebx.split.ways_of_associativity, 1);
883 show_one_plus(number_of_sets, ecx.split.number_of_sets, 1);
885 static ssize_t show_size(struct _cpuid4_info *this_leaf, char *buf)
887 return sprintf(buf, "%luK\n", this_leaf->size / 1024);
890 static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf,
893 ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf;
897 const struct cpumask *mask;
899 mask = to_cpumask(this_leaf->shared_cpu_map);
901 cpulist_scnprintf(buf, len-2, mask) :
902 cpumask_scnprintf(buf, len-2, mask);
909 static inline ssize_t show_shared_cpu_map(struct _cpuid4_info *leaf, char *buf)
911 return show_shared_cpu_map_func(leaf, 0, buf);
914 static inline ssize_t show_shared_cpu_list(struct _cpuid4_info *leaf, char *buf)
916 return show_shared_cpu_map_func(leaf, 1, buf);
919 static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf)
921 switch (this_leaf->eax.split.type) {
922 case CACHE_TYPE_DATA:
923 return sprintf(buf, "Data\n");
924 case CACHE_TYPE_INST:
925 return sprintf(buf, "Instruction\n");
926 case CACHE_TYPE_UNIFIED:
927 return sprintf(buf, "Unified\n");
929 return sprintf(buf, "Unknown\n");
933 #define to_object(k) container_of(k, struct _index_kobject, kobj)
934 #define to_attr(a) container_of(a, struct _cache_attr, attr)
936 #define define_one_ro(_name) \
937 static struct _cache_attr _name = \
938 __ATTR(_name, 0444, show_##_name, NULL)
940 define_one_ro(level);
942 define_one_ro(coherency_line_size);
943 define_one_ro(physical_line_partition);
944 define_one_ro(ways_of_associativity);
945 define_one_ro(number_of_sets);
947 define_one_ro(shared_cpu_map);
948 define_one_ro(shared_cpu_list);
950 static struct attribute *default_attrs[] = {
953 &coherency_line_size.attr,
954 &physical_line_partition.attr,
955 &ways_of_associativity.attr,
956 &number_of_sets.attr,
958 &shared_cpu_map.attr,
959 &shared_cpu_list.attr,
964 static struct attribute ** __cpuinit amd_l3_attrs(void)
966 static struct attribute **attrs;
972 n = sizeof (default_attrs) / sizeof (struct attribute *);
974 if (amd_nb_has_feature(AMD_NB_L3_INDEX_DISABLE))
977 attrs = kzalloc(n * sizeof (struct attribute *), GFP_KERNEL);
979 return attrs = default_attrs;
981 for (n = 0; default_attrs[n]; n++)
982 attrs[n] = default_attrs[n];
984 if (amd_nb_has_feature(AMD_NB_L3_INDEX_DISABLE)) {
985 attrs[n++] = &cache_disable_0.attr;
986 attrs[n++] = &cache_disable_1.attr;
993 static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
995 struct _cache_attr *fattr = to_attr(attr);
996 struct _index_kobject *this_leaf = to_object(kobj);
1000 fattr->show(CPUID4_INFO_IDX(this_leaf->cpu, this_leaf->index),
1006 static ssize_t store(struct kobject *kobj, struct attribute *attr,
1007 const char *buf, size_t count)
1009 struct _cache_attr *fattr = to_attr(attr);
1010 struct _index_kobject *this_leaf = to_object(kobj);
1013 ret = fattr->store ?
1014 fattr->store(CPUID4_INFO_IDX(this_leaf->cpu, this_leaf->index),
1020 static const struct sysfs_ops sysfs_ops = {
1025 static struct kobj_type ktype_cache = {
1026 .sysfs_ops = &sysfs_ops,
1027 .default_attrs = default_attrs,
1030 static struct kobj_type ktype_percpu_entry = {
1031 .sysfs_ops = &sysfs_ops,
1034 static void __cpuinit cpuid4_cache_sysfs_exit(unsigned int cpu)
1036 kfree(per_cpu(ici_cache_kobject, cpu));
1037 kfree(per_cpu(ici_index_kobject, cpu));
1038 per_cpu(ici_cache_kobject, cpu) = NULL;
1039 per_cpu(ici_index_kobject, cpu) = NULL;
1040 free_cache_attributes(cpu);
1043 static int __cpuinit cpuid4_cache_sysfs_init(unsigned int cpu)
1047 if (num_cache_leaves == 0)
1050 err = detect_cache_attributes(cpu);
1054 /* Allocate all required memory */
1055 per_cpu(ici_cache_kobject, cpu) =
1056 kzalloc(sizeof(struct kobject), GFP_KERNEL);
1057 if (unlikely(per_cpu(ici_cache_kobject, cpu) == NULL))
1060 per_cpu(ici_index_kobject, cpu) = kzalloc(
1061 sizeof(struct _index_kobject) * num_cache_leaves, GFP_KERNEL);
1062 if (unlikely(per_cpu(ici_index_kobject, cpu) == NULL))
1068 cpuid4_cache_sysfs_exit(cpu);
1072 static DECLARE_BITMAP(cache_dev_map, NR_CPUS);
1074 /* Add/Remove cache interface for CPU device */
1075 static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
1077 unsigned int cpu = sys_dev->id;
1079 struct _index_kobject *this_object;
1080 struct _cpuid4_info *this_leaf;
1083 retval = cpuid4_cache_sysfs_init(cpu);
1084 if (unlikely(retval < 0))
1087 retval = kobject_init_and_add(per_cpu(ici_cache_kobject, cpu),
1088 &ktype_percpu_entry,
1089 &sys_dev->kobj, "%s", "cache");
1091 cpuid4_cache_sysfs_exit(cpu);
1095 for (i = 0; i < num_cache_leaves; i++) {
1096 this_object = INDEX_KOBJECT_PTR(cpu, i);
1097 this_object->cpu = cpu;
1098 this_object->index = i;
1100 this_leaf = CPUID4_INFO_IDX(cpu, i);
1102 ktype_cache.default_attrs = default_attrs;
1103 #ifdef CONFIG_AMD_NB
1105 ktype_cache.default_attrs = amd_l3_attrs();
1107 retval = kobject_init_and_add(&(this_object->kobj),
1109 per_cpu(ici_cache_kobject, cpu),
1111 if (unlikely(retval)) {
1112 for (j = 0; j < i; j++)
1113 kobject_put(&(INDEX_KOBJECT_PTR(cpu, j)->kobj));
1114 kobject_put(per_cpu(ici_cache_kobject, cpu));
1115 cpuid4_cache_sysfs_exit(cpu);
1118 kobject_uevent(&(this_object->kobj), KOBJ_ADD);
1120 cpumask_set_cpu(cpu, to_cpumask(cache_dev_map));
1122 kobject_uevent(per_cpu(ici_cache_kobject, cpu), KOBJ_ADD);
1126 static void __cpuinit cache_remove_dev(struct sys_device * sys_dev)
1128 unsigned int cpu = sys_dev->id;
1131 if (per_cpu(ici_cpuid4_info, cpu) == NULL)
1133 if (!cpumask_test_cpu(cpu, to_cpumask(cache_dev_map)))
1135 cpumask_clear_cpu(cpu, to_cpumask(cache_dev_map));
1137 for (i = 0; i < num_cache_leaves; i++)
1138 kobject_put(&(INDEX_KOBJECT_PTR(cpu, i)->kobj));
1139 kobject_put(per_cpu(ici_cache_kobject, cpu));
1140 cpuid4_cache_sysfs_exit(cpu);
1143 static int __cpuinit cacheinfo_cpu_callback(struct notifier_block *nfb,
1144 unsigned long action, void *hcpu)
1146 unsigned int cpu = (unsigned long)hcpu;
1147 struct sys_device *sys_dev;
1149 sys_dev = get_cpu_sysdev(cpu);
1152 case CPU_ONLINE_FROZEN:
1153 cache_add_dev(sys_dev);
1156 case CPU_DEAD_FROZEN:
1157 cache_remove_dev(sys_dev);
1163 static struct notifier_block __cpuinitdata cacheinfo_cpu_notifier = {
1164 .notifier_call = cacheinfo_cpu_callback,
1167 static int __cpuinit cache_sysfs_init(void)
1171 if (num_cache_leaves == 0)
1174 for_each_online_cpu(i) {
1176 struct sys_device *sys_dev = get_cpu_sysdev(i);
1178 err = cache_add_dev(sys_dev);
1182 register_hotcpu_notifier(&cacheinfo_cpu_notifier);
1186 device_initcall(cache_sysfs_init);