locking, lockdep: Convert sprintf_symbol to %pS
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / x86 / kernel / cpu / intel_cacheinfo.c
1 /*
2 * Routines to indentify caches on Intel CPU.
3 *
4 * Changes:
5 * Venkatesh Pallipadi : Adding cache identification through cpuid(4)
6 * Ashok Raj <ashok.raj@intel.com>: Work with CPU hotplug infrastructure.
7 * Andi Kleen / Andreas Herrmann : CPUID4 emulation on AMD.
8 */
9
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>
17
18 #include <asm/processor.h>
19 #include <linux/smp.h>
20 #include <asm/amd_nb.h>
21 #include <asm/smp.h>
22
23 #define LVL_1_INST 1
24 #define LVL_1_DATA 2
25 #define LVL_2 3
26 #define LVL_3 4
27 #define LVL_TRACE 5
28
29 struct _cache_table {
30 unsigned char descriptor;
31 char cache_type;
32 short size;
33 };
34
35 #define MB(x) ((x) * 1024)
36
37 /* All the cache descriptor types we care about (no TLB or
38 trace cache entries) */
39
40 static const struct _cache_table __cpuinitconst cache_table[] =
41 {
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 { 0x21, LVL_2, 256 }, /* 8-way set assoc, 64 byte line size */
49 { 0x22, LVL_3, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
50 { 0x23, LVL_3, MB(1) }, /* 8-way set assoc, sectored cache, 64 byte line size */
51 { 0x25, LVL_3, MB(2) }, /* 8-way set assoc, sectored cache, 64 byte line size */
52 { 0x29, LVL_3, MB(4) }, /* 8-way set assoc, sectored cache, 64 byte line size */
53 { 0x2c, LVL_1_DATA, 32 }, /* 8-way set assoc, 64 byte line size */
54 { 0x30, LVL_1_INST, 32 }, /* 8-way set assoc, 64 byte line size */
55 { 0x39, LVL_2, 128 }, /* 4-way set assoc, sectored cache, 64 byte line size */
56 { 0x3a, LVL_2, 192 }, /* 6-way set assoc, sectored cache, 64 byte line size */
57 { 0x3b, LVL_2, 128 }, /* 2-way set assoc, sectored cache, 64 byte line size */
58 { 0x3c, LVL_2, 256 }, /* 4-way set assoc, sectored cache, 64 byte line size */
59 { 0x3d, LVL_2, 384 }, /* 6-way set assoc, sectored cache, 64 byte line size */
60 { 0x3e, LVL_2, 512 }, /* 4-way set assoc, sectored cache, 64 byte line size */
61 { 0x3f, LVL_2, 256 }, /* 2-way set assoc, 64 byte line size */
62 { 0x41, LVL_2, 128 }, /* 4-way set assoc, 32 byte line size */
63 { 0x42, LVL_2, 256 }, /* 4-way set assoc, 32 byte line size */
64 { 0x43, LVL_2, 512 }, /* 4-way set assoc, 32 byte line size */
65 { 0x44, LVL_2, MB(1) }, /* 4-way set assoc, 32 byte line size */
66 { 0x45, LVL_2, MB(2) }, /* 4-way set assoc, 32 byte line size */
67 { 0x46, LVL_3, MB(4) }, /* 4-way set assoc, 64 byte line size */
68 { 0x47, LVL_3, MB(8) }, /* 8-way set assoc, 64 byte line size */
69 { 0x49, LVL_3, MB(4) }, /* 16-way set assoc, 64 byte line size */
70 { 0x4a, LVL_3, MB(6) }, /* 12-way set assoc, 64 byte line size */
71 { 0x4b, LVL_3, MB(8) }, /* 16-way set assoc, 64 byte line size */
72 { 0x4c, LVL_3, MB(12) }, /* 12-way set assoc, 64 byte line size */
73 { 0x4d, LVL_3, MB(16) }, /* 16-way set assoc, 64 byte line size */
74 { 0x4e, LVL_2, MB(6) }, /* 24-way set assoc, 64 byte line size */
75 { 0x60, LVL_1_DATA, 16 }, /* 8-way set assoc, sectored cache, 64 byte line size */
76 { 0x66, LVL_1_DATA, 8 }, /* 4-way set assoc, sectored cache, 64 byte line size */
77 { 0x67, LVL_1_DATA, 16 }, /* 4-way set assoc, sectored cache, 64 byte line size */
78 { 0x68, LVL_1_DATA, 32 }, /* 4-way set assoc, sectored cache, 64 byte line size */
79 { 0x70, LVL_TRACE, 12 }, /* 8-way set assoc */
80 { 0x71, LVL_TRACE, 16 }, /* 8-way set assoc */
81 { 0x72, LVL_TRACE, 32 }, /* 8-way set assoc */
82 { 0x73, LVL_TRACE, 64 }, /* 8-way set assoc */
83 { 0x78, LVL_2, MB(1) }, /* 4-way set assoc, 64 byte line size */
84 { 0x79, LVL_2, 128 }, /* 8-way set assoc, sectored cache, 64 byte line size */
85 { 0x7a, LVL_2, 256 }, /* 8-way set assoc, sectored cache, 64 byte line size */
86 { 0x7b, LVL_2, 512 }, /* 8-way set assoc, sectored cache, 64 byte line size */
87 { 0x7c, LVL_2, MB(1) }, /* 8-way set assoc, sectored cache, 64 byte line size */
88 { 0x7d, LVL_2, MB(2) }, /* 8-way set assoc, 64 byte line size */
89 { 0x7f, LVL_2, 512 }, /* 2-way set assoc, 64 byte line size */
90 { 0x82, LVL_2, 256 }, /* 8-way set assoc, 32 byte line size */
91 { 0x83, LVL_2, 512 }, /* 8-way set assoc, 32 byte line size */
92 { 0x84, LVL_2, MB(1) }, /* 8-way set assoc, 32 byte line size */
93 { 0x85, LVL_2, MB(2) }, /* 8-way set assoc, 32 byte line size */
94 { 0x86, LVL_2, 512 }, /* 4-way set assoc, 64 byte line size */
95 { 0x87, LVL_2, MB(1) }, /* 8-way set assoc, 64 byte line size */
96 { 0xd0, LVL_3, 512 }, /* 4-way set assoc, 64 byte line size */
97 { 0xd1, LVL_3, MB(1) }, /* 4-way set assoc, 64 byte line size */
98 { 0xd2, LVL_3, MB(2) }, /* 4-way set assoc, 64 byte line size */
99 { 0xd6, LVL_3, MB(1) }, /* 8-way set assoc, 64 byte line size */
100 { 0xd7, LVL_3, MB(2) }, /* 8-way set assoc, 64 byte line size */
101 { 0xd8, LVL_3, MB(4) }, /* 12-way set assoc, 64 byte line size */
102 { 0xdc, LVL_3, MB(2) }, /* 12-way set assoc, 64 byte line size */
103 { 0xdd, LVL_3, MB(4) }, /* 12-way set assoc, 64 byte line size */
104 { 0xde, LVL_3, MB(8) }, /* 12-way set assoc, 64 byte line size */
105 { 0xe2, LVL_3, MB(2) }, /* 16-way set assoc, 64 byte line size */
106 { 0xe3, LVL_3, MB(4) }, /* 16-way set assoc, 64 byte line size */
107 { 0xe4, LVL_3, MB(8) }, /* 16-way set assoc, 64 byte line size */
108 { 0xea, LVL_3, MB(12) }, /* 24-way set assoc, 64 byte line size */
109 { 0xeb, LVL_3, MB(18) }, /* 24-way set assoc, 64 byte line size */
110 { 0xec, LVL_3, MB(24) }, /* 24-way set assoc, 64 byte line size */
111 { 0x00, 0, 0}
112 };
113
114
115 enum _cache_type {
116 CACHE_TYPE_NULL = 0,
117 CACHE_TYPE_DATA = 1,
118 CACHE_TYPE_INST = 2,
119 CACHE_TYPE_UNIFIED = 3
120 };
121
122 union _cpuid4_leaf_eax {
123 struct {
124 enum _cache_type type:5;
125 unsigned int level:3;
126 unsigned int is_self_initializing:1;
127 unsigned int is_fully_associative:1;
128 unsigned int reserved:4;
129 unsigned int num_threads_sharing:12;
130 unsigned int num_cores_on_die:6;
131 } split;
132 u32 full;
133 };
134
135 union _cpuid4_leaf_ebx {
136 struct {
137 unsigned int coherency_line_size:12;
138 unsigned int physical_line_partition:10;
139 unsigned int ways_of_associativity:10;
140 } split;
141 u32 full;
142 };
143
144 union _cpuid4_leaf_ecx {
145 struct {
146 unsigned int number_of_sets:32;
147 } split;
148 u32 full;
149 };
150
151 struct amd_l3_cache {
152 struct pci_dev *dev;
153 bool can_disable;
154 unsigned indices;
155 u8 subcaches[4];
156 };
157
158 struct _cpuid4_info {
159 union _cpuid4_leaf_eax eax;
160 union _cpuid4_leaf_ebx ebx;
161 union _cpuid4_leaf_ecx ecx;
162 unsigned long size;
163 struct amd_l3_cache *l3;
164 DECLARE_BITMAP(shared_cpu_map, NR_CPUS);
165 };
166
167 /* subset of above _cpuid4_info w/o shared_cpu_map */
168 struct _cpuid4_info_regs {
169 union _cpuid4_leaf_eax eax;
170 union _cpuid4_leaf_ebx ebx;
171 union _cpuid4_leaf_ecx ecx;
172 unsigned long size;
173 struct amd_l3_cache *l3;
174 };
175
176 unsigned short num_cache_leaves;
177
178 /* AMD doesn't have CPUID4. Emulate it here to report the same
179 information to the user. This makes some assumptions about the machine:
180 L2 not shared, no SMT etc. that is currently true on AMD CPUs.
181
182 In theory the TLBs could be reported as fake type (they are in "dummy").
183 Maybe later */
184 union l1_cache {
185 struct {
186 unsigned line_size:8;
187 unsigned lines_per_tag:8;
188 unsigned assoc:8;
189 unsigned size_in_kb:8;
190 };
191 unsigned val;
192 };
193
194 union l2_cache {
195 struct {
196 unsigned line_size:8;
197 unsigned lines_per_tag:4;
198 unsigned assoc:4;
199 unsigned size_in_kb:16;
200 };
201 unsigned val;
202 };
203
204 union l3_cache {
205 struct {
206 unsigned line_size:8;
207 unsigned lines_per_tag:4;
208 unsigned assoc:4;
209 unsigned res:2;
210 unsigned size_encoded:14;
211 };
212 unsigned val;
213 };
214
215 static const unsigned short __cpuinitconst assocs[] = {
216 [1] = 1,
217 [2] = 2,
218 [4] = 4,
219 [6] = 8,
220 [8] = 16,
221 [0xa] = 32,
222 [0xb] = 48,
223 [0xc] = 64,
224 [0xd] = 96,
225 [0xe] = 128,
226 [0xf] = 0xffff /* fully associative - no way to show this currently */
227 };
228
229 static const unsigned char __cpuinitconst levels[] = { 1, 1, 2, 3 };
230 static const unsigned char __cpuinitconst types[] = { 1, 2, 3, 3 };
231
232 static void __cpuinit
233 amd_cpuid4(int leaf, union _cpuid4_leaf_eax *eax,
234 union _cpuid4_leaf_ebx *ebx,
235 union _cpuid4_leaf_ecx *ecx)
236 {
237 unsigned dummy;
238 unsigned line_size, lines_per_tag, assoc, size_in_kb;
239 union l1_cache l1i, l1d;
240 union l2_cache l2;
241 union l3_cache l3;
242 union l1_cache *l1 = &l1d;
243
244 eax->full = 0;
245 ebx->full = 0;
246 ecx->full = 0;
247
248 cpuid(0x80000005, &dummy, &dummy, &l1d.val, &l1i.val);
249 cpuid(0x80000006, &dummy, &dummy, &l2.val, &l3.val);
250
251 switch (leaf) {
252 case 1:
253 l1 = &l1i;
254 case 0:
255 if (!l1->val)
256 return;
257 assoc = assocs[l1->assoc];
258 line_size = l1->line_size;
259 lines_per_tag = l1->lines_per_tag;
260 size_in_kb = l1->size_in_kb;
261 break;
262 case 2:
263 if (!l2.val)
264 return;
265 assoc = assocs[l2.assoc];
266 line_size = l2.line_size;
267 lines_per_tag = l2.lines_per_tag;
268 /* cpu_data has errata corrections for K7 applied */
269 size_in_kb = current_cpu_data.x86_cache_size;
270 break;
271 case 3:
272 if (!l3.val)
273 return;
274 assoc = assocs[l3.assoc];
275 line_size = l3.line_size;
276 lines_per_tag = l3.lines_per_tag;
277 size_in_kb = l3.size_encoded * 512;
278 if (boot_cpu_has(X86_FEATURE_AMD_DCM)) {
279 size_in_kb = size_in_kb >> 1;
280 assoc = assoc >> 1;
281 }
282 break;
283 default:
284 return;
285 }
286
287 eax->split.is_self_initializing = 1;
288 eax->split.type = types[leaf];
289 eax->split.level = levels[leaf];
290 eax->split.num_threads_sharing = 0;
291 eax->split.num_cores_on_die = current_cpu_data.x86_max_cores - 1;
292
293
294 if (assoc == 0xffff)
295 eax->split.is_fully_associative = 1;
296 ebx->split.coherency_line_size = line_size - 1;
297 ebx->split.ways_of_associativity = assoc - 1;
298 ebx->split.physical_line_partition = lines_per_tag - 1;
299 ecx->split.number_of_sets = (size_in_kb * 1024) / line_size /
300 (ebx->split.ways_of_associativity + 1) - 1;
301 }
302
303 struct _cache_attr {
304 struct attribute attr;
305 ssize_t (*show)(struct _cpuid4_info *, char *);
306 ssize_t (*store)(struct _cpuid4_info *, const char *, size_t count);
307 };
308
309 #ifdef CONFIG_AMD_NB
310
311 /*
312 * L3 cache descriptors
313 */
314 static struct amd_l3_cache **__cpuinitdata l3_caches;
315
316 static void __cpuinit amd_calc_l3_indices(struct amd_l3_cache *l3)
317 {
318 unsigned int sc0, sc1, sc2, sc3;
319 u32 val = 0;
320
321 pci_read_config_dword(l3->dev, 0x1C4, &val);
322
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));
328
329 l3->indices = (max(max(max(sc0, sc1), sc2), sc3) << 10) - 1;
330 l3->indices = (max(max3(sc0, sc1, sc2), sc3) << 10) - 1;
331 }
332
333 static struct amd_l3_cache * __cpuinit amd_init_l3_cache(int node)
334 {
335 struct amd_l3_cache *l3;
336 struct pci_dev *dev = node_to_k8_nb_misc(node);
337
338 l3 = kzalloc(sizeof(struct amd_l3_cache), GFP_ATOMIC);
339 if (!l3) {
340 printk(KERN_WARNING "Error allocating L3 struct\n");
341 return NULL;
342 }
343
344 l3->dev = dev;
345
346 amd_calc_l3_indices(l3);
347
348 return l3;
349 }
350
351 static void __cpuinit amd_check_l3_disable(struct _cpuid4_info_regs *this_leaf,
352 int index)
353 {
354 int node;
355
356 if (boot_cpu_data.x86 != 0x10)
357 return;
358
359 if (index < 3)
360 return;
361
362 /* see errata #382 and #388 */
363 if (boot_cpu_data.x86_model < 0x8)
364 return;
365
366 if ((boot_cpu_data.x86_model == 0x8 ||
367 boot_cpu_data.x86_model == 0x9)
368 &&
369 boot_cpu_data.x86_mask < 0x1)
370 return;
371
372 /* not in virtualized environments */
373 if (k8_northbridges.num == 0)
374 return;
375
376 /*
377 * Strictly speaking, the amount in @size below is leaked since it is
378 * never freed but this is done only on shutdown so it doesn't matter.
379 */
380 if (!l3_caches) {
381 int size = k8_northbridges.num * sizeof(struct amd_l3_cache *);
382
383 l3_caches = kzalloc(size, GFP_ATOMIC);
384 if (!l3_caches)
385 return;
386 }
387
388 node = amd_get_nb_id(smp_processor_id());
389
390 if (!l3_caches[node]) {
391 l3_caches[node] = amd_init_l3_cache(node);
392 l3_caches[node]->can_disable = true;
393 }
394
395 WARN_ON(!l3_caches[node]);
396
397 this_leaf->l3 = l3_caches[node];
398 }
399
400 /*
401 * check whether a slot used for disabling an L3 index is occupied.
402 * @l3: L3 cache descriptor
403 * @slot: slot number (0..1)
404 *
405 * @returns: the disabled index if used or negative value if slot free.
406 */
407 int amd_get_l3_disable_slot(struct amd_l3_cache *l3, unsigned slot)
408 {
409 unsigned int reg = 0;
410
411 pci_read_config_dword(l3->dev, 0x1BC + slot * 4, &reg);
412
413 /* check whether this slot is activated already */
414 if (reg & (3UL << 30))
415 return reg & 0xfff;
416
417 return -1;
418 }
419
420 static ssize_t show_cache_disable(struct _cpuid4_info *this_leaf, char *buf,
421 unsigned int slot)
422 {
423 int index;
424
425 if (!this_leaf->l3 || !this_leaf->l3->can_disable)
426 return -EINVAL;
427
428 index = amd_get_l3_disable_slot(this_leaf->l3, slot);
429 if (index >= 0)
430 return sprintf(buf, "%d\n", index);
431
432 return sprintf(buf, "FREE\n");
433 }
434
435 #define SHOW_CACHE_DISABLE(slot) \
436 static ssize_t \
437 show_cache_disable_##slot(struct _cpuid4_info *this_leaf, char *buf) \
438 { \
439 return show_cache_disable(this_leaf, buf, slot); \
440 }
441 SHOW_CACHE_DISABLE(0)
442 SHOW_CACHE_DISABLE(1)
443
444 static void amd_l3_disable_index(struct amd_l3_cache *l3, int cpu,
445 unsigned slot, unsigned long idx)
446 {
447 int i;
448
449 idx |= BIT(30);
450
451 /*
452 * disable index in all 4 subcaches
453 */
454 for (i = 0; i < 4; i++) {
455 u32 reg = idx | (i << 20);
456
457 if (!l3->subcaches[i])
458 continue;
459
460 pci_write_config_dword(l3->dev, 0x1BC + slot * 4, reg);
461
462 /*
463 * We need to WBINVD on a core on the node containing the L3
464 * cache which indices we disable therefore a simple wbinvd()
465 * is not sufficient.
466 */
467 wbinvd_on_cpu(cpu);
468
469 reg |= BIT(31);
470 pci_write_config_dword(l3->dev, 0x1BC + slot * 4, reg);
471 }
472 }
473
474 /*
475 * disable a L3 cache index by using a disable-slot
476 *
477 * @l3: L3 cache descriptor
478 * @cpu: A CPU on the node containing the L3 cache
479 * @slot: slot number (0..1)
480 * @index: index to disable
481 *
482 * @return: 0 on success, error status on failure
483 */
484 int amd_set_l3_disable_slot(struct amd_l3_cache *l3, int cpu, unsigned slot,
485 unsigned long index)
486 {
487 int ret = 0;
488
489 #define SUBCACHE_MASK (3UL << 20)
490 #define SUBCACHE_INDEX 0xfff
491
492 /*
493 * check whether this slot is already used or
494 * the index is already disabled
495 */
496 ret = amd_get_l3_disable_slot(l3, slot);
497 if (ret >= 0)
498 return -EINVAL;
499
500 /*
501 * check whether the other slot has disabled the
502 * same index already
503 */
504 if (index == amd_get_l3_disable_slot(l3, !slot))
505 return -EINVAL;
506
507 /* do not allow writes outside of allowed bits */
508 if ((index & ~(SUBCACHE_MASK | SUBCACHE_INDEX)) ||
509 ((index & SUBCACHE_INDEX) > l3->indices))
510 return -EINVAL;
511
512 amd_l3_disable_index(l3, cpu, slot, index);
513
514 return 0;
515 }
516
517 static ssize_t store_cache_disable(struct _cpuid4_info *this_leaf,
518 const char *buf, size_t count,
519 unsigned int slot)
520 {
521 unsigned long val = 0;
522 int cpu, err = 0;
523
524 if (!capable(CAP_SYS_ADMIN))
525 return -EPERM;
526
527 if (!this_leaf->l3 || !this_leaf->l3->can_disable)
528 return -EINVAL;
529
530 cpu = cpumask_first(to_cpumask(this_leaf->shared_cpu_map));
531
532 if (strict_strtoul(buf, 10, &val) < 0)
533 return -EINVAL;
534
535 err = amd_set_l3_disable_slot(this_leaf->l3, cpu, slot, val);
536 if (err) {
537 if (err == -EEXIST)
538 printk(KERN_WARNING "L3 disable slot %d in use!\n",
539 slot);
540 return err;
541 }
542 return count;
543 }
544
545 #define STORE_CACHE_DISABLE(slot) \
546 static ssize_t \
547 store_cache_disable_##slot(struct _cpuid4_info *this_leaf, \
548 const char *buf, size_t count) \
549 { \
550 return store_cache_disable(this_leaf, buf, count, slot); \
551 }
552 STORE_CACHE_DISABLE(0)
553 STORE_CACHE_DISABLE(1)
554
555 static struct _cache_attr cache_disable_0 = __ATTR(cache_disable_0, 0644,
556 show_cache_disable_0, store_cache_disable_0);
557 static struct _cache_attr cache_disable_1 = __ATTR(cache_disable_1, 0644,
558 show_cache_disable_1, store_cache_disable_1);
559
560 #else /* CONFIG_AMD_NB */
561 static void __cpuinit
562 amd_check_l3_disable(struct _cpuid4_info_regs *this_leaf, int index)
563 {
564 };
565 #endif /* CONFIG_AMD_NB */
566
567 static int
568 __cpuinit cpuid4_cache_lookup_regs(int index,
569 struct _cpuid4_info_regs *this_leaf)
570 {
571 union _cpuid4_leaf_eax eax;
572 union _cpuid4_leaf_ebx ebx;
573 union _cpuid4_leaf_ecx ecx;
574 unsigned edx;
575
576 if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
577 amd_cpuid4(index, &eax, &ebx, &ecx);
578 amd_check_l3_disable(this_leaf, index);
579 } else {
580 cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full, &edx);
581 }
582
583 if (eax.split.type == CACHE_TYPE_NULL)
584 return -EIO; /* better error ? */
585
586 this_leaf->eax = eax;
587 this_leaf->ebx = ebx;
588 this_leaf->ecx = ecx;
589 this_leaf->size = (ecx.split.number_of_sets + 1) *
590 (ebx.split.coherency_line_size + 1) *
591 (ebx.split.physical_line_partition + 1) *
592 (ebx.split.ways_of_associativity + 1);
593 return 0;
594 }
595
596 static int __cpuinit find_num_cache_leaves(void)
597 {
598 unsigned int eax, ebx, ecx, edx;
599 union _cpuid4_leaf_eax cache_eax;
600 int i = -1;
601
602 do {
603 ++i;
604 /* Do cpuid(4) loop to find out num_cache_leaves */
605 cpuid_count(4, i, &eax, &ebx, &ecx, &edx);
606 cache_eax.full = eax;
607 } while (cache_eax.split.type != CACHE_TYPE_NULL);
608 return i;
609 }
610
611 unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c)
612 {
613 /* Cache sizes */
614 unsigned int trace = 0, l1i = 0, l1d = 0, l2 = 0, l3 = 0;
615 unsigned int new_l1d = 0, new_l1i = 0; /* Cache sizes from cpuid(4) */
616 unsigned int new_l2 = 0, new_l3 = 0, i; /* Cache sizes from cpuid(4) */
617 unsigned int l2_id = 0, l3_id = 0, num_threads_sharing, index_msb;
618 #ifdef CONFIG_X86_HT
619 unsigned int cpu = c->cpu_index;
620 #endif
621
622 if (c->cpuid_level > 3) {
623 static int is_initialized;
624
625 if (is_initialized == 0) {
626 /* Init num_cache_leaves from boot CPU */
627 num_cache_leaves = find_num_cache_leaves();
628 is_initialized++;
629 }
630
631 /*
632 * Whenever possible use cpuid(4), deterministic cache
633 * parameters cpuid leaf to find the cache details
634 */
635 for (i = 0; i < num_cache_leaves; i++) {
636 struct _cpuid4_info_regs this_leaf;
637 int retval;
638
639 retval = cpuid4_cache_lookup_regs(i, &this_leaf);
640 if (retval >= 0) {
641 switch (this_leaf.eax.split.level) {
642 case 1:
643 if (this_leaf.eax.split.type ==
644 CACHE_TYPE_DATA)
645 new_l1d = this_leaf.size/1024;
646 else if (this_leaf.eax.split.type ==
647 CACHE_TYPE_INST)
648 new_l1i = this_leaf.size/1024;
649 break;
650 case 2:
651 new_l2 = this_leaf.size/1024;
652 num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing;
653 index_msb = get_count_order(num_threads_sharing);
654 l2_id = c->apicid >> index_msb;
655 break;
656 case 3:
657 new_l3 = this_leaf.size/1024;
658 num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing;
659 index_msb = get_count_order(
660 num_threads_sharing);
661 l3_id = c->apicid >> index_msb;
662 break;
663 default:
664 break;
665 }
666 }
667 }
668 }
669 /*
670 * Don't use cpuid2 if cpuid4 is supported. For P4, we use cpuid2 for
671 * trace cache
672 */
673 if ((num_cache_leaves == 0 || c->x86 == 15) && c->cpuid_level > 1) {
674 /* supports eax=2 call */
675 int j, n;
676 unsigned int regs[4];
677 unsigned char *dp = (unsigned char *)regs;
678 int only_trace = 0;
679
680 if (num_cache_leaves != 0 && c->x86 == 15)
681 only_trace = 1;
682
683 /* Number of times to iterate */
684 n = cpuid_eax(2) & 0xFF;
685
686 for (i = 0 ; i < n ; i++) {
687 cpuid(2, &regs[0], &regs[1], &regs[2], &regs[3]);
688
689 /* If bit 31 is set, this is an unknown format */
690 for (j = 0 ; j < 3 ; j++)
691 if (regs[j] & (1 << 31))
692 regs[j] = 0;
693
694 /* Byte 0 is level count, not a descriptor */
695 for (j = 1 ; j < 16 ; j++) {
696 unsigned char des = dp[j];
697 unsigned char k = 0;
698
699 /* look up this descriptor in the table */
700 while (cache_table[k].descriptor != 0) {
701 if (cache_table[k].descriptor == des) {
702 if (only_trace && cache_table[k].cache_type != LVL_TRACE)
703 break;
704 switch (cache_table[k].cache_type) {
705 case LVL_1_INST:
706 l1i += cache_table[k].size;
707 break;
708 case LVL_1_DATA:
709 l1d += cache_table[k].size;
710 break;
711 case LVL_2:
712 l2 += cache_table[k].size;
713 break;
714 case LVL_3:
715 l3 += cache_table[k].size;
716 break;
717 case LVL_TRACE:
718 trace += cache_table[k].size;
719 break;
720 }
721
722 break;
723 }
724
725 k++;
726 }
727 }
728 }
729 }
730
731 if (new_l1d)
732 l1d = new_l1d;
733
734 if (new_l1i)
735 l1i = new_l1i;
736
737 if (new_l2) {
738 l2 = new_l2;
739 #ifdef CONFIG_X86_HT
740 per_cpu(cpu_llc_id, cpu) = l2_id;
741 #endif
742 }
743
744 if (new_l3) {
745 l3 = new_l3;
746 #ifdef CONFIG_X86_HT
747 per_cpu(cpu_llc_id, cpu) = l3_id;
748 #endif
749 }
750
751 c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d));
752
753 return l2;
754 }
755
756 #ifdef CONFIG_SYSFS
757
758 /* pointer to _cpuid4_info array (for each cache leaf) */
759 static DEFINE_PER_CPU(struct _cpuid4_info *, ici_cpuid4_info);
760 #define CPUID4_INFO_IDX(x, y) (&((per_cpu(ici_cpuid4_info, x))[y]))
761
762 #ifdef CONFIG_SMP
763 static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
764 {
765 struct _cpuid4_info *this_leaf, *sibling_leaf;
766 unsigned long num_threads_sharing;
767 int index_msb, i, sibling;
768 struct cpuinfo_x86 *c = &cpu_data(cpu);
769
770 if ((index == 3) && (c->x86_vendor == X86_VENDOR_AMD)) {
771 for_each_cpu(i, c->llc_shared_map) {
772 if (!per_cpu(ici_cpuid4_info, i))
773 continue;
774 this_leaf = CPUID4_INFO_IDX(i, index);
775 for_each_cpu(sibling, c->llc_shared_map) {
776 if (!cpu_online(sibling))
777 continue;
778 set_bit(sibling, this_leaf->shared_cpu_map);
779 }
780 }
781 return;
782 }
783 this_leaf = CPUID4_INFO_IDX(cpu, index);
784 num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing;
785
786 if (num_threads_sharing == 1)
787 cpumask_set_cpu(cpu, to_cpumask(this_leaf->shared_cpu_map));
788 else {
789 index_msb = get_count_order(num_threads_sharing);
790
791 for_each_online_cpu(i) {
792 if (cpu_data(i).apicid >> index_msb ==
793 c->apicid >> index_msb) {
794 cpumask_set_cpu(i,
795 to_cpumask(this_leaf->shared_cpu_map));
796 if (i != cpu && per_cpu(ici_cpuid4_info, i)) {
797 sibling_leaf =
798 CPUID4_INFO_IDX(i, index);
799 cpumask_set_cpu(cpu, to_cpumask(
800 sibling_leaf->shared_cpu_map));
801 }
802 }
803 }
804 }
805 }
806 static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index)
807 {
808 struct _cpuid4_info *this_leaf, *sibling_leaf;
809 int sibling;
810
811 this_leaf = CPUID4_INFO_IDX(cpu, index);
812 for_each_cpu(sibling, to_cpumask(this_leaf->shared_cpu_map)) {
813 sibling_leaf = CPUID4_INFO_IDX(sibling, index);
814 cpumask_clear_cpu(cpu,
815 to_cpumask(sibling_leaf->shared_cpu_map));
816 }
817 }
818 #else
819 static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
820 {
821 }
822
823 static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index)
824 {
825 }
826 #endif
827
828 static void __cpuinit free_cache_attributes(unsigned int cpu)
829 {
830 int i;
831
832 for (i = 0; i < num_cache_leaves; i++)
833 cache_remove_shared_cpu_map(cpu, i);
834
835 kfree(per_cpu(ici_cpuid4_info, cpu)->l3);
836 kfree(per_cpu(ici_cpuid4_info, cpu));
837 per_cpu(ici_cpuid4_info, cpu) = NULL;
838 }
839
840 static int
841 __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf)
842 {
843 struct _cpuid4_info_regs *leaf_regs =
844 (struct _cpuid4_info_regs *)this_leaf;
845
846 return cpuid4_cache_lookup_regs(index, leaf_regs);
847 }
848
849 static void __cpuinit get_cpu_leaves(void *_retval)
850 {
851 int j, *retval = _retval, cpu = smp_processor_id();
852
853 /* Do cpuid and store the results */
854 for (j = 0; j < num_cache_leaves; j++) {
855 struct _cpuid4_info *this_leaf;
856 this_leaf = CPUID4_INFO_IDX(cpu, j);
857 *retval = cpuid4_cache_lookup(j, this_leaf);
858 if (unlikely(*retval < 0)) {
859 int i;
860
861 for (i = 0; i < j; i++)
862 cache_remove_shared_cpu_map(cpu, i);
863 break;
864 }
865 cache_shared_cpu_map_setup(cpu, j);
866 }
867 }
868
869 static int __cpuinit detect_cache_attributes(unsigned int cpu)
870 {
871 int retval;
872
873 if (num_cache_leaves == 0)
874 return -ENOENT;
875
876 per_cpu(ici_cpuid4_info, cpu) = kzalloc(
877 sizeof(struct _cpuid4_info) * num_cache_leaves, GFP_KERNEL);
878 if (per_cpu(ici_cpuid4_info, cpu) == NULL)
879 return -ENOMEM;
880
881 smp_call_function_single(cpu, get_cpu_leaves, &retval, true);
882 if (retval) {
883 kfree(per_cpu(ici_cpuid4_info, cpu));
884 per_cpu(ici_cpuid4_info, cpu) = NULL;
885 }
886
887 return retval;
888 }
889
890 #include <linux/kobject.h>
891 #include <linux/sysfs.h>
892
893 extern struct sysdev_class cpu_sysdev_class; /* from drivers/base/cpu.c */
894
895 /* pointer to kobject for cpuX/cache */
896 static DEFINE_PER_CPU(struct kobject *, ici_cache_kobject);
897
898 struct _index_kobject {
899 struct kobject kobj;
900 unsigned int cpu;
901 unsigned short index;
902 };
903
904 /* pointer to array of kobjects for cpuX/cache/indexY */
905 static DEFINE_PER_CPU(struct _index_kobject *, ici_index_kobject);
906 #define INDEX_KOBJECT_PTR(x, y) (&((per_cpu(ici_index_kobject, x))[y]))
907
908 #define show_one_plus(file_name, object, val) \
909 static ssize_t show_##file_name \
910 (struct _cpuid4_info *this_leaf, char *buf) \
911 { \
912 return sprintf(buf, "%lu\n", (unsigned long)this_leaf->object + val); \
913 }
914
915 show_one_plus(level, eax.split.level, 0);
916 show_one_plus(coherency_line_size, ebx.split.coherency_line_size, 1);
917 show_one_plus(physical_line_partition, ebx.split.physical_line_partition, 1);
918 show_one_plus(ways_of_associativity, ebx.split.ways_of_associativity, 1);
919 show_one_plus(number_of_sets, ecx.split.number_of_sets, 1);
920
921 static ssize_t show_size(struct _cpuid4_info *this_leaf, char *buf)
922 {
923 return sprintf(buf, "%luK\n", this_leaf->size / 1024);
924 }
925
926 static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf,
927 int type, char *buf)
928 {
929 ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf;
930 int n = 0;
931
932 if (len > 1) {
933 const struct cpumask *mask;
934
935 mask = to_cpumask(this_leaf->shared_cpu_map);
936 n = type ?
937 cpulist_scnprintf(buf, len-2, mask) :
938 cpumask_scnprintf(buf, len-2, mask);
939 buf[n++] = '\n';
940 buf[n] = '\0';
941 }
942 return n;
943 }
944
945 static inline ssize_t show_shared_cpu_map(struct _cpuid4_info *leaf, char *buf)
946 {
947 return show_shared_cpu_map_func(leaf, 0, buf);
948 }
949
950 static inline ssize_t show_shared_cpu_list(struct _cpuid4_info *leaf, char *buf)
951 {
952 return show_shared_cpu_map_func(leaf, 1, buf);
953 }
954
955 static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf)
956 {
957 switch (this_leaf->eax.split.type) {
958 case CACHE_TYPE_DATA:
959 return sprintf(buf, "Data\n");
960 case CACHE_TYPE_INST:
961 return sprintf(buf, "Instruction\n");
962 case CACHE_TYPE_UNIFIED:
963 return sprintf(buf, "Unified\n");
964 default:
965 return sprintf(buf, "Unknown\n");
966 }
967 }
968
969 #define to_object(k) container_of(k, struct _index_kobject, kobj)
970 #define to_attr(a) container_of(a, struct _cache_attr, attr)
971
972 #define define_one_ro(_name) \
973 static struct _cache_attr _name = \
974 __ATTR(_name, 0444, show_##_name, NULL)
975
976 define_one_ro(level);
977 define_one_ro(type);
978 define_one_ro(coherency_line_size);
979 define_one_ro(physical_line_partition);
980 define_one_ro(ways_of_associativity);
981 define_one_ro(number_of_sets);
982 define_one_ro(size);
983 define_one_ro(shared_cpu_map);
984 define_one_ro(shared_cpu_list);
985
986 #define DEFAULT_SYSFS_CACHE_ATTRS \
987 &type.attr, \
988 &level.attr, \
989 &coherency_line_size.attr, \
990 &physical_line_partition.attr, \
991 &ways_of_associativity.attr, \
992 &number_of_sets.attr, \
993 &size.attr, \
994 &shared_cpu_map.attr, \
995 &shared_cpu_list.attr
996
997 static struct attribute *default_attrs[] = {
998 DEFAULT_SYSFS_CACHE_ATTRS,
999 NULL
1000 };
1001
1002 static struct attribute *default_l3_attrs[] = {
1003 DEFAULT_SYSFS_CACHE_ATTRS,
1004 #ifdef CONFIG_AMD_NB
1005 &cache_disable_0.attr,
1006 &cache_disable_1.attr,
1007 #endif
1008 NULL
1009 };
1010
1011 static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf)
1012 {
1013 struct _cache_attr *fattr = to_attr(attr);
1014 struct _index_kobject *this_leaf = to_object(kobj);
1015 ssize_t ret;
1016
1017 ret = fattr->show ?
1018 fattr->show(CPUID4_INFO_IDX(this_leaf->cpu, this_leaf->index),
1019 buf) :
1020 0;
1021 return ret;
1022 }
1023
1024 static ssize_t store(struct kobject *kobj, struct attribute *attr,
1025 const char *buf, size_t count)
1026 {
1027 struct _cache_attr *fattr = to_attr(attr);
1028 struct _index_kobject *this_leaf = to_object(kobj);
1029 ssize_t ret;
1030
1031 ret = fattr->store ?
1032 fattr->store(CPUID4_INFO_IDX(this_leaf->cpu, this_leaf->index),
1033 buf, count) :
1034 0;
1035 return ret;
1036 }
1037
1038 static const struct sysfs_ops sysfs_ops = {
1039 .show = show,
1040 .store = store,
1041 };
1042
1043 static struct kobj_type ktype_cache = {
1044 .sysfs_ops = &sysfs_ops,
1045 .default_attrs = default_attrs,
1046 };
1047
1048 static struct kobj_type ktype_percpu_entry = {
1049 .sysfs_ops = &sysfs_ops,
1050 };
1051
1052 static void __cpuinit cpuid4_cache_sysfs_exit(unsigned int cpu)
1053 {
1054 kfree(per_cpu(ici_cache_kobject, cpu));
1055 kfree(per_cpu(ici_index_kobject, cpu));
1056 per_cpu(ici_cache_kobject, cpu) = NULL;
1057 per_cpu(ici_index_kobject, cpu) = NULL;
1058 free_cache_attributes(cpu);
1059 }
1060
1061 static int __cpuinit cpuid4_cache_sysfs_init(unsigned int cpu)
1062 {
1063 int err;
1064
1065 if (num_cache_leaves == 0)
1066 return -ENOENT;
1067
1068 err = detect_cache_attributes(cpu);
1069 if (err)
1070 return err;
1071
1072 /* Allocate all required memory */
1073 per_cpu(ici_cache_kobject, cpu) =
1074 kzalloc(sizeof(struct kobject), GFP_KERNEL);
1075 if (unlikely(per_cpu(ici_cache_kobject, cpu) == NULL))
1076 goto err_out;
1077
1078 per_cpu(ici_index_kobject, cpu) = kzalloc(
1079 sizeof(struct _index_kobject) * num_cache_leaves, GFP_KERNEL);
1080 if (unlikely(per_cpu(ici_index_kobject, cpu) == NULL))
1081 goto err_out;
1082
1083 return 0;
1084
1085 err_out:
1086 cpuid4_cache_sysfs_exit(cpu);
1087 return -ENOMEM;
1088 }
1089
1090 static DECLARE_BITMAP(cache_dev_map, NR_CPUS);
1091
1092 /* Add/Remove cache interface for CPU device */
1093 static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
1094 {
1095 unsigned int cpu = sys_dev->id;
1096 unsigned long i, j;
1097 struct _index_kobject *this_object;
1098 struct _cpuid4_info *this_leaf;
1099 int retval;
1100
1101 retval = cpuid4_cache_sysfs_init(cpu);
1102 if (unlikely(retval < 0))
1103 return retval;
1104
1105 retval = kobject_init_and_add(per_cpu(ici_cache_kobject, cpu),
1106 &ktype_percpu_entry,
1107 &sys_dev->kobj, "%s", "cache");
1108 if (retval < 0) {
1109 cpuid4_cache_sysfs_exit(cpu);
1110 return retval;
1111 }
1112
1113 for (i = 0; i < num_cache_leaves; i++) {
1114 this_object = INDEX_KOBJECT_PTR(cpu, i);
1115 this_object->cpu = cpu;
1116 this_object->index = i;
1117
1118 this_leaf = CPUID4_INFO_IDX(cpu, i);
1119
1120 if (this_leaf->l3 && this_leaf->l3->can_disable)
1121 ktype_cache.default_attrs = default_l3_attrs;
1122 else
1123 ktype_cache.default_attrs = default_attrs;
1124
1125 retval = kobject_init_and_add(&(this_object->kobj),
1126 &ktype_cache,
1127 per_cpu(ici_cache_kobject, cpu),
1128 "index%1lu", i);
1129 if (unlikely(retval)) {
1130 for (j = 0; j < i; j++)
1131 kobject_put(&(INDEX_KOBJECT_PTR(cpu, j)->kobj));
1132 kobject_put(per_cpu(ici_cache_kobject, cpu));
1133 cpuid4_cache_sysfs_exit(cpu);
1134 return retval;
1135 }
1136 kobject_uevent(&(this_object->kobj), KOBJ_ADD);
1137 }
1138 cpumask_set_cpu(cpu, to_cpumask(cache_dev_map));
1139
1140 kobject_uevent(per_cpu(ici_cache_kobject, cpu), KOBJ_ADD);
1141 return 0;
1142 }
1143
1144 static void __cpuinit cache_remove_dev(struct sys_device * sys_dev)
1145 {
1146 unsigned int cpu = sys_dev->id;
1147 unsigned long i;
1148
1149 if (per_cpu(ici_cpuid4_info, cpu) == NULL)
1150 return;
1151 if (!cpumask_test_cpu(cpu, to_cpumask(cache_dev_map)))
1152 return;
1153 cpumask_clear_cpu(cpu, to_cpumask(cache_dev_map));
1154
1155 for (i = 0; i < num_cache_leaves; i++)
1156 kobject_put(&(INDEX_KOBJECT_PTR(cpu, i)->kobj));
1157 kobject_put(per_cpu(ici_cache_kobject, cpu));
1158 cpuid4_cache_sysfs_exit(cpu);
1159 }
1160
1161 static int __cpuinit cacheinfo_cpu_callback(struct notifier_block *nfb,
1162 unsigned long action, void *hcpu)
1163 {
1164 unsigned int cpu = (unsigned long)hcpu;
1165 struct sys_device *sys_dev;
1166
1167 sys_dev = get_cpu_sysdev(cpu);
1168 switch (action) {
1169 case CPU_ONLINE:
1170 case CPU_ONLINE_FROZEN:
1171 cache_add_dev(sys_dev);
1172 break;
1173 case CPU_DEAD:
1174 case CPU_DEAD_FROZEN:
1175 cache_remove_dev(sys_dev);
1176 break;
1177 }
1178 return NOTIFY_OK;
1179 }
1180
1181 static struct notifier_block __cpuinitdata cacheinfo_cpu_notifier = {
1182 .notifier_call = cacheinfo_cpu_callback,
1183 };
1184
1185 static int __cpuinit cache_sysfs_init(void)
1186 {
1187 int i;
1188
1189 if (num_cache_leaves == 0)
1190 return 0;
1191
1192 for_each_online_cpu(i) {
1193 int err;
1194 struct sys_device *sys_dev = get_cpu_sysdev(i);
1195
1196 err = cache_add_dev(sys_dev);
1197 if (err)
1198 return err;
1199 }
1200 register_hotcpu_notifier(&cacheinfo_cpu_notifier);
1201 return 0;
1202 }
1203
1204 device_initcall(cache_sysfs_init);
1205
1206 #endif