2c8afafa18e860ff98fafb243f2ba7964496c42d
[linux-2.6.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
17 #include <asm/processor.h>
18 #include <asm/smp.h>
19
20 #define LVL_1_INST      1
21 #define LVL_1_DATA      2
22 #define LVL_2           3
23 #define LVL_3           4
24 #define LVL_TRACE       5
25
26 struct _cache_table
27 {
28         unsigned char descriptor;
29         char cache_type;
30         short size;
31 };
32
33 /* all the cache descriptor types we care about (no TLB or trace cache entries) */
34 static struct _cache_table cache_table[] __cpuinitdata =
35 {
36         { 0x06, LVL_1_INST, 8 },        /* 4-way set assoc, 32 byte line size */
37         { 0x08, LVL_1_INST, 16 },       /* 4-way set assoc, 32 byte line size */
38         { 0x0a, LVL_1_DATA, 8 },        /* 2 way set assoc, 32 byte line size */
39         { 0x0c, LVL_1_DATA, 16 },       /* 4-way set assoc, 32 byte line size */
40         { 0x22, LVL_3,      512 },      /* 4-way set assoc, sectored cache, 64 byte line size */
41         { 0x23, LVL_3,      1024 },     /* 8-way set assoc, sectored cache, 64 byte line size */
42         { 0x25, LVL_3,      2048 },     /* 8-way set assoc, sectored cache, 64 byte line size */
43         { 0x29, LVL_3,      4096 },     /* 8-way set assoc, sectored cache, 64 byte line size */
44         { 0x2c, LVL_1_DATA, 32 },       /* 8-way set assoc, 64 byte line size */
45         { 0x30, LVL_1_INST, 32 },       /* 8-way set assoc, 64 byte line size */
46         { 0x39, LVL_2,      128 },      /* 4-way set assoc, sectored cache, 64 byte line size */
47         { 0x3a, LVL_2,      192 },      /* 6-way set assoc, sectored cache, 64 byte line size */
48         { 0x3b, LVL_2,      128 },      /* 2-way set assoc, sectored cache, 64 byte line size */
49         { 0x3c, LVL_2,      256 },      /* 4-way set assoc, sectored cache, 64 byte line size */
50         { 0x3d, LVL_2,      384 },      /* 6-way set assoc, sectored cache, 64 byte line size */
51         { 0x3e, LVL_2,      512 },      /* 4-way set assoc, sectored cache, 64 byte line size */
52         { 0x3f, LVL_2,      256 },      /* 2-way set assoc, 64 byte line size */
53         { 0x41, LVL_2,      128 },      /* 4-way set assoc, 32 byte line size */
54         { 0x42, LVL_2,      256 },      /* 4-way set assoc, 32 byte line size */
55         { 0x43, LVL_2,      512 },      /* 4-way set assoc, 32 byte line size */
56         { 0x44, LVL_2,      1024 },     /* 4-way set assoc, 32 byte line size */
57         { 0x45, LVL_2,      2048 },     /* 4-way set assoc, 32 byte line size */
58         { 0x46, LVL_3,      4096 },     /* 4-way set assoc, 64 byte line size */
59         { 0x47, LVL_3,      8192 },     /* 8-way set assoc, 64 byte line size */
60         { 0x49, LVL_3,      4096 },     /* 16-way set assoc, 64 byte line size */
61         { 0x4a, LVL_3,      6144 },     /* 12-way set assoc, 64 byte line size */
62         { 0x4b, LVL_3,      8192 },     /* 16-way set assoc, 64 byte line size */
63         { 0x4c, LVL_3,     12288 },     /* 12-way set assoc, 64 byte line size */
64         { 0x4d, LVL_3,     16384 },     /* 16-way set assoc, 64 byte line size */
65         { 0x4e, LVL_2,      6144 },     /* 24-way set assoc, 64 byte line size */
66         { 0x60, LVL_1_DATA, 16 },       /* 8-way set assoc, sectored cache, 64 byte line size */
67         { 0x66, LVL_1_DATA, 8 },        /* 4-way set assoc, sectored cache, 64 byte line size */
68         { 0x67, LVL_1_DATA, 16 },       /* 4-way set assoc, sectored cache, 64 byte line size */
69         { 0x68, LVL_1_DATA, 32 },       /* 4-way set assoc, sectored cache, 64 byte line size */
70         { 0x70, LVL_TRACE,  12 },       /* 8-way set assoc */
71         { 0x71, LVL_TRACE,  16 },       /* 8-way set assoc */
72         { 0x72, LVL_TRACE,  32 },       /* 8-way set assoc */
73         { 0x73, LVL_TRACE,  64 },       /* 8-way set assoc */
74         { 0x78, LVL_2,    1024 },       /* 4-way set assoc, 64 byte line size */
75         { 0x79, LVL_2,     128 },       /* 8-way set assoc, sectored cache, 64 byte line size */
76         { 0x7a, LVL_2,     256 },       /* 8-way set assoc, sectored cache, 64 byte line size */
77         { 0x7b, LVL_2,     512 },       /* 8-way set assoc, sectored cache, 64 byte line size */
78         { 0x7c, LVL_2,    1024 },       /* 8-way set assoc, sectored cache, 64 byte line size */
79         { 0x7d, LVL_2,    2048 },       /* 8-way set assoc, 64 byte line size */
80         { 0x7f, LVL_2,     512 },       /* 2-way set assoc, 64 byte line size */
81         { 0x82, LVL_2,     256 },       /* 8-way set assoc, 32 byte line size */
82         { 0x83, LVL_2,     512 },       /* 8-way set assoc, 32 byte line size */
83         { 0x84, LVL_2,    1024 },       /* 8-way set assoc, 32 byte line size */
84         { 0x85, LVL_2,    2048 },       /* 8-way set assoc, 32 byte line size */
85         { 0x86, LVL_2,     512 },       /* 4-way set assoc, 64 byte line size */
86         { 0x87, LVL_2,    1024 },       /* 8-way set assoc, 64 byte line size */
87         { 0x00, 0, 0}
88 };
89
90
91 enum _cache_type
92 {
93         CACHE_TYPE_NULL = 0,
94         CACHE_TYPE_DATA = 1,
95         CACHE_TYPE_INST = 2,
96         CACHE_TYPE_UNIFIED = 3
97 };
98
99 union _cpuid4_leaf_eax {
100         struct {
101                 enum _cache_type        type:5;
102                 unsigned int            level:3;
103                 unsigned int            is_self_initializing:1;
104                 unsigned int            is_fully_associative:1;
105                 unsigned int            reserved:4;
106                 unsigned int            num_threads_sharing:12;
107                 unsigned int            num_cores_on_die:6;
108         } split;
109         u32 full;
110 };
111
112 union _cpuid4_leaf_ebx {
113         struct {
114                 unsigned int            coherency_line_size:12;
115                 unsigned int            physical_line_partition:10;
116                 unsigned int            ways_of_associativity:10;
117         } split;
118         u32 full;
119 };
120
121 union _cpuid4_leaf_ecx {
122         struct {
123                 unsigned int            number_of_sets:32;
124         } split;
125         u32 full;
126 };
127
128 struct _cpuid4_info {
129         union _cpuid4_leaf_eax eax;
130         union _cpuid4_leaf_ebx ebx;
131         union _cpuid4_leaf_ecx ecx;
132         unsigned long size;
133         cpumask_t shared_cpu_map;       /* future?: only cpus/node is needed */
134 };
135
136 unsigned short                  num_cache_leaves;
137
138 /* AMD doesn't have CPUID4. Emulate it here to report the same
139    information to the user.  This makes some assumptions about the machine:
140    L2 not shared, no SMT etc. that is currently true on AMD CPUs.
141
142    In theory the TLBs could be reported as fake type (they are in "dummy").
143    Maybe later */
144 union l1_cache {
145         struct {
146                 unsigned line_size : 8;
147                 unsigned lines_per_tag : 8;
148                 unsigned assoc : 8;
149                 unsigned size_in_kb : 8;
150         };
151         unsigned val;
152 };
153
154 union l2_cache {
155         struct {
156                 unsigned line_size : 8;
157                 unsigned lines_per_tag : 4;
158                 unsigned assoc : 4;
159                 unsigned size_in_kb : 16;
160         };
161         unsigned val;
162 };
163
164 union l3_cache {
165         struct {
166                 unsigned line_size : 8;
167                 unsigned lines_per_tag : 4;
168                 unsigned assoc : 4;
169                 unsigned res : 2;
170                 unsigned size_encoded : 14;
171         };
172         unsigned val;
173 };
174
175 static unsigned short assocs[] __cpuinitdata = {
176         [1] = 1, [2] = 2, [4] = 4, [6] = 8,
177         [8] = 16, [0xa] = 32, [0xb] = 48,
178         [0xc] = 64,
179         [0xf] = 0xffff // ??
180 };
181
182 static unsigned char levels[] __cpuinitdata = { 1, 1, 2, 3 };
183 static unsigned char types[] __cpuinitdata = { 1, 2, 3, 3 };
184
185 static void __cpuinit amd_cpuid4(int leaf, union _cpuid4_leaf_eax *eax,
186                        union _cpuid4_leaf_ebx *ebx,
187                        union _cpuid4_leaf_ecx *ecx)
188 {
189         unsigned dummy;
190         unsigned line_size, lines_per_tag, assoc, size_in_kb;
191         union l1_cache l1i, l1d;
192         union l2_cache l2;
193         union l3_cache l3;
194         union l1_cache *l1 = &l1d;
195
196         eax->full = 0;
197         ebx->full = 0;
198         ecx->full = 0;
199
200         cpuid(0x80000005, &dummy, &dummy, &l1d.val, &l1i.val);
201         cpuid(0x80000006, &dummy, &dummy, &l2.val, &l3.val);
202
203         switch (leaf) {
204         case 1:
205                 l1 = &l1i;
206         case 0:
207                 if (!l1->val)
208                         return;
209                 assoc = l1->assoc;
210                 line_size = l1->line_size;
211                 lines_per_tag = l1->lines_per_tag;
212                 size_in_kb = l1->size_in_kb;
213                 break;
214         case 2:
215                 if (!l2.val)
216                         return;
217                 assoc = l2.assoc;
218                 line_size = l2.line_size;
219                 lines_per_tag = l2.lines_per_tag;
220                 /* cpu_data has errata corrections for K7 applied */
221                 size_in_kb = current_cpu_data.x86_cache_size;
222                 break;
223         case 3:
224                 if (!l3.val)
225                         return;
226                 assoc = l3.assoc;
227                 line_size = l3.line_size;
228                 lines_per_tag = l3.lines_per_tag;
229                 size_in_kb = l3.size_encoded * 512;
230                 break;
231         default:
232                 return;
233         }
234
235         eax->split.is_self_initializing = 1;
236         eax->split.type = types[leaf];
237         eax->split.level = levels[leaf];
238         if (leaf == 3)
239                 eax->split.num_threads_sharing = current_cpu_data.x86_max_cores - 1;
240         else
241                 eax->split.num_threads_sharing = 0;
242         eax->split.num_cores_on_die = current_cpu_data.x86_max_cores - 1;
243
244
245         if (assoc == 0xf)
246                 eax->split.is_fully_associative = 1;
247         ebx->split.coherency_line_size = line_size - 1;
248         ebx->split.ways_of_associativity = assocs[assoc] - 1;
249         ebx->split.physical_line_partition = lines_per_tag - 1;
250         ecx->split.number_of_sets = (size_in_kb * 1024) / line_size /
251                 (ebx->split.ways_of_associativity + 1) - 1;
252 }
253
254 static int __cpuinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf)
255 {
256         union _cpuid4_leaf_eax  eax;
257         union _cpuid4_leaf_ebx  ebx;
258         union _cpuid4_leaf_ecx  ecx;
259         unsigned                edx;
260
261         if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD)
262                 amd_cpuid4(index, &eax, &ebx, &ecx);
263         else
264                 cpuid_count(4, index, &eax.full, &ebx.full, &ecx.full,  &edx);
265         if (eax.split.type == CACHE_TYPE_NULL)
266                 return -EIO; /* better error ? */
267
268         this_leaf->eax = eax;
269         this_leaf->ebx = ebx;
270         this_leaf->ecx = ecx;
271         this_leaf->size = (ecx.split.number_of_sets + 1) *
272                 (ebx.split.coherency_line_size + 1) *
273                 (ebx.split.physical_line_partition + 1) *
274                 (ebx.split.ways_of_associativity + 1);
275         return 0;
276 }
277
278 static int __cpuinit find_num_cache_leaves(void)
279 {
280         unsigned int            eax, ebx, ecx, edx;
281         union _cpuid4_leaf_eax  cache_eax;
282         int                     i = -1;
283
284         do {
285                 ++i;
286                 /* Do cpuid(4) loop to find out num_cache_leaves */
287                 cpuid_count(4, i, &eax, &ebx, &ecx, &edx);
288                 cache_eax.full = eax;
289         } while (cache_eax.split.type != CACHE_TYPE_NULL);
290         return i;
291 }
292
293 unsigned int __cpuinit init_intel_cacheinfo(struct cpuinfo_x86 *c)
294 {
295         unsigned int trace = 0, l1i = 0, l1d = 0, l2 = 0, l3 = 0; /* Cache sizes */
296         unsigned int new_l1d = 0, new_l1i = 0; /* Cache sizes from cpuid(4) */
297         unsigned int new_l2 = 0, new_l3 = 0, i; /* Cache sizes from cpuid(4) */
298         unsigned int l2_id = 0, l3_id = 0, num_threads_sharing, index_msb;
299 #ifdef CONFIG_X86_HT
300         unsigned int cpu = c->cpu_index;
301 #endif
302
303         if (c->cpuid_level > 3) {
304                 static int is_initialized;
305
306                 if (is_initialized == 0) {
307                         /* Init num_cache_leaves from boot CPU */
308                         num_cache_leaves = find_num_cache_leaves();
309                         is_initialized++;
310                 }
311
312                 /*
313                  * Whenever possible use cpuid(4), deterministic cache
314                  * parameters cpuid leaf to find the cache details
315                  */
316                 for (i = 0; i < num_cache_leaves; i++) {
317                         struct _cpuid4_info this_leaf;
318
319                         int retval;
320
321                         retval = cpuid4_cache_lookup(i, &this_leaf);
322                         if (retval >= 0) {
323                                 switch(this_leaf.eax.split.level) {
324                                     case 1:
325                                         if (this_leaf.eax.split.type ==
326                                                         CACHE_TYPE_DATA)
327                                                 new_l1d = this_leaf.size/1024;
328                                         else if (this_leaf.eax.split.type ==
329                                                         CACHE_TYPE_INST)
330                                                 new_l1i = this_leaf.size/1024;
331                                         break;
332                                     case 2:
333                                         new_l2 = this_leaf.size/1024;
334                                         num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing;
335                                         index_msb = get_count_order(num_threads_sharing);
336                                         l2_id = c->apicid >> index_msb;
337                                         break;
338                                     case 3:
339                                         new_l3 = this_leaf.size/1024;
340                                         num_threads_sharing = 1 + this_leaf.eax.split.num_threads_sharing;
341                                         index_msb = get_count_order(num_threads_sharing);
342                                         l3_id = c->apicid >> index_msb;
343                                         break;
344                                     default:
345                                         break;
346                                 }
347                         }
348                 }
349         }
350         /*
351          * Don't use cpuid2 if cpuid4 is supported. For P4, we use cpuid2 for
352          * trace cache
353          */
354         if ((num_cache_leaves == 0 || c->x86 == 15) && c->cpuid_level > 1) {
355                 /* supports eax=2  call */
356                 int j, n;
357                 unsigned int regs[4];
358                 unsigned char *dp = (unsigned char *)regs;
359                 int only_trace = 0;
360
361                 if (num_cache_leaves != 0 && c->x86 == 15)
362                         only_trace = 1;
363
364                 /* Number of times to iterate */
365                 n = cpuid_eax(2) & 0xFF;
366
367                 for ( i = 0 ; i < n ; i++ ) {
368                         cpuid(2, &regs[0], &regs[1], &regs[2], &regs[3]);
369
370                         /* If bit 31 is set, this is an unknown format */
371                         for ( j = 0 ; j < 3 ; j++ ) {
372                                 if (regs[j] & (1 << 31)) regs[j] = 0;
373                         }
374
375                         /* Byte 0 is level count, not a descriptor */
376                         for ( j = 1 ; j < 16 ; j++ ) {
377                                 unsigned char des = dp[j];
378                                 unsigned char k = 0;
379
380                                 /* look up this descriptor in the table */
381                                 while (cache_table[k].descriptor != 0)
382                                 {
383                                         if (cache_table[k].descriptor == des) {
384                                                 if (only_trace && cache_table[k].cache_type != LVL_TRACE)
385                                                         break;
386                                                 switch (cache_table[k].cache_type) {
387                                                 case LVL_1_INST:
388                                                         l1i += cache_table[k].size;
389                                                         break;
390                                                 case LVL_1_DATA:
391                                                         l1d += cache_table[k].size;
392                                                         break;
393                                                 case LVL_2:
394                                                         l2 += cache_table[k].size;
395                                                         break;
396                                                 case LVL_3:
397                                                         l3 += cache_table[k].size;
398                                                         break;
399                                                 case LVL_TRACE:
400                                                         trace += cache_table[k].size;
401                                                         break;
402                                                 }
403
404                                                 break;
405                                         }
406
407                                         k++;
408                                 }
409                         }
410                 }
411         }
412
413         if (new_l1d)
414                 l1d = new_l1d;
415
416         if (new_l1i)
417                 l1i = new_l1i;
418
419         if (new_l2) {
420                 l2 = new_l2;
421 #ifdef CONFIG_X86_HT
422                 per_cpu(cpu_llc_id, cpu) = l2_id;
423 #endif
424         }
425
426         if (new_l3) {
427                 l3 = new_l3;
428 #ifdef CONFIG_X86_HT
429                 per_cpu(cpu_llc_id, cpu) = l3_id;
430 #endif
431         }
432
433         if (trace)
434                 printk (KERN_INFO "CPU: Trace cache: %dK uops", trace);
435         else if ( l1i )
436                 printk (KERN_INFO "CPU: L1 I cache: %dK", l1i);
437
438         if (l1d)
439                 printk(", L1 D cache: %dK\n", l1d);
440         else
441                 printk("\n");
442
443         if (l2)
444                 printk(KERN_INFO "CPU: L2 cache: %dK\n", l2);
445
446         if (l3)
447                 printk(KERN_INFO "CPU: L3 cache: %dK\n", l3);
448
449         c->x86_cache_size = l3 ? l3 : (l2 ? l2 : (l1i+l1d));
450
451         return l2;
452 }
453
454 /* pointer to _cpuid4_info array (for each cache leaf) */
455 static DEFINE_PER_CPU(struct _cpuid4_info *, cpuid4_info);
456 #define CPUID4_INFO_IDX(x, y)    (&((per_cpu(cpuid4_info, x))[y]))
457
458 #ifdef CONFIG_SMP
459 static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
460 {
461         struct _cpuid4_info     *this_leaf, *sibling_leaf;
462         unsigned long num_threads_sharing;
463         int index_msb, i;
464         struct cpuinfo_x86 *c = &cpu_data(cpu);
465
466         this_leaf = CPUID4_INFO_IDX(cpu, index);
467         num_threads_sharing = 1 + this_leaf->eax.split.num_threads_sharing;
468
469         if (num_threads_sharing == 1)
470                 cpu_set(cpu, this_leaf->shared_cpu_map);
471         else {
472                 index_msb = get_count_order(num_threads_sharing);
473
474                 for_each_online_cpu(i) {
475                         if (cpu_data(i).apicid >> index_msb ==
476                             c->apicid >> index_msb) {
477                                 cpu_set(i, this_leaf->shared_cpu_map);
478                                 if (i != cpu && per_cpu(cpuid4_info, i))  {
479                                         sibling_leaf = CPUID4_INFO_IDX(i, index);
480                                         cpu_set(cpu, sibling_leaf->shared_cpu_map);
481                                 }
482                         }
483                 }
484         }
485 }
486 static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index)
487 {
488         struct _cpuid4_info     *this_leaf, *sibling_leaf;
489         int sibling;
490
491         this_leaf = CPUID4_INFO_IDX(cpu, index);
492         for_each_cpu_mask(sibling, this_leaf->shared_cpu_map) {
493                 sibling_leaf = CPUID4_INFO_IDX(sibling, index); 
494                 cpu_clear(cpu, sibling_leaf->shared_cpu_map);
495         }
496 }
497 #else
498 static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index) {}
499 static void __cpuinit cache_remove_shared_cpu_map(unsigned int cpu, int index) {}
500 #endif
501
502 static void __cpuinit free_cache_attributes(unsigned int cpu)
503 {
504         int i;
505
506         for (i = 0; i < num_cache_leaves; i++)
507                 cache_remove_shared_cpu_map(cpu, i);
508
509         kfree(per_cpu(cpuid4_info, cpu));
510         per_cpu(cpuid4_info, cpu) = NULL;
511 }
512
513 static int __cpuinit detect_cache_attributes(unsigned int cpu)
514 {
515         struct _cpuid4_info     *this_leaf;
516         unsigned long           j;
517         int                     retval;
518         cpumask_t               oldmask;
519
520         if (num_cache_leaves == 0)
521                 return -ENOENT;
522
523         per_cpu(cpuid4_info, cpu) = kzalloc(
524             sizeof(struct _cpuid4_info) * num_cache_leaves, GFP_KERNEL);
525         if (per_cpu(cpuid4_info, cpu) == NULL)
526                 return -ENOMEM;
527
528         oldmask = current->cpus_allowed;
529         retval = set_cpus_allowed_ptr(current, &cpumask_of_cpu(cpu));
530         if (retval)
531                 goto out;
532
533         /* Do cpuid and store the results */
534         for (j = 0; j < num_cache_leaves; j++) {
535                 this_leaf = CPUID4_INFO_IDX(cpu, j);
536                 retval = cpuid4_cache_lookup(j, this_leaf);
537                 if (unlikely(retval < 0)) {
538                         int i;
539
540                         for (i = 0; i < j; i++)
541                                 cache_remove_shared_cpu_map(cpu, i);
542                         break;
543                 }
544                 cache_shared_cpu_map_setup(cpu, j);
545         }
546         set_cpus_allowed_ptr(current, &oldmask);
547
548 out:
549         if (retval) {
550                 kfree(per_cpu(cpuid4_info, cpu));
551                 per_cpu(cpuid4_info, cpu) = NULL;
552         }
553
554         return retval;
555 }
556
557 #ifdef CONFIG_SYSFS
558
559 #include <linux/kobject.h>
560 #include <linux/sysfs.h>
561
562 extern struct sysdev_class cpu_sysdev_class; /* from drivers/base/cpu.c */
563
564 /* pointer to kobject for cpuX/cache */
565 static DEFINE_PER_CPU(struct kobject *, cache_kobject);
566
567 struct _index_kobject {
568         struct kobject kobj;
569         unsigned int cpu;
570         unsigned short index;
571 };
572
573 /* pointer to array of kobjects for cpuX/cache/indexY */
574 static DEFINE_PER_CPU(struct _index_kobject *, index_kobject);
575 #define INDEX_KOBJECT_PTR(x, y)    (&((per_cpu(index_kobject, x))[y]))
576
577 #define show_one_plus(file_name, object, val)                           \
578 static ssize_t show_##file_name                                         \
579                         (struct _cpuid4_info *this_leaf, char *buf)     \
580 {                                                                       \
581         return sprintf (buf, "%lu\n", (unsigned long)this_leaf->object + val); \
582 }
583
584 show_one_plus(level, eax.split.level, 0);
585 show_one_plus(coherency_line_size, ebx.split.coherency_line_size, 1);
586 show_one_plus(physical_line_partition, ebx.split.physical_line_partition, 1);
587 show_one_plus(ways_of_associativity, ebx.split.ways_of_associativity, 1);
588 show_one_plus(number_of_sets, ecx.split.number_of_sets, 1);
589
590 static ssize_t show_size(struct _cpuid4_info *this_leaf, char *buf)
591 {
592         return sprintf (buf, "%luK\n", this_leaf->size / 1024);
593 }
594
595 static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf,
596                                         int type, char *buf)
597 {
598         ptrdiff_t len = PTR_ALIGN(buf + PAGE_SIZE - 1, PAGE_SIZE) - buf;
599         int n = 0;
600
601         if (len > 1) {
602                 cpumask_t *mask = &this_leaf->shared_cpu_map;
603
604                 n = type?
605                         cpulist_scnprintf(buf, len-2, *mask):
606                         cpumask_scnprintf(buf, len-2, *mask);
607                 buf[n++] = '\n';
608                 buf[n] = '\0';
609         }
610         return n;
611 }
612
613 static inline ssize_t show_shared_cpu_map(struct _cpuid4_info *leaf, char *buf)
614 {
615         return show_shared_cpu_map_func(leaf, 0, buf);
616 }
617
618 static inline ssize_t show_shared_cpu_list(struct _cpuid4_info *leaf, char *buf)
619 {
620         return show_shared_cpu_map_func(leaf, 1, buf);
621 }
622
623 static ssize_t show_type(struct _cpuid4_info *this_leaf, char *buf) {
624         switch(this_leaf->eax.split.type) {
625             case CACHE_TYPE_DATA:
626                 return sprintf(buf, "Data\n");
627                 break;
628             case CACHE_TYPE_INST:
629                 return sprintf(buf, "Instruction\n");
630                 break;
631             case CACHE_TYPE_UNIFIED:
632                 return sprintf(buf, "Unified\n");
633                 break;
634             default:
635                 return sprintf(buf, "Unknown\n");
636                 break;
637         }
638 }
639
640 struct _cache_attr {
641         struct attribute attr;
642         ssize_t (*show)(struct _cpuid4_info *, char *);
643         ssize_t (*store)(struct _cpuid4_info *, const char *, size_t count);
644 };
645
646 #define define_one_ro(_name) \
647 static struct _cache_attr _name = \
648         __ATTR(_name, 0444, show_##_name, NULL)
649
650 define_one_ro(level);
651 define_one_ro(type);
652 define_one_ro(coherency_line_size);
653 define_one_ro(physical_line_partition);
654 define_one_ro(ways_of_associativity);
655 define_one_ro(number_of_sets);
656 define_one_ro(size);
657 define_one_ro(shared_cpu_map);
658 define_one_ro(shared_cpu_list);
659
660 static struct attribute * default_attrs[] = {
661         &type.attr,
662         &level.attr,
663         &coherency_line_size.attr,
664         &physical_line_partition.attr,
665         &ways_of_associativity.attr,
666         &number_of_sets.attr,
667         &size.attr,
668         &shared_cpu_map.attr,
669         &shared_cpu_list.attr,
670         NULL
671 };
672
673 #define to_object(k) container_of(k, struct _index_kobject, kobj)
674 #define to_attr(a) container_of(a, struct _cache_attr, attr)
675
676 static ssize_t show(struct kobject * kobj, struct attribute * attr, char * buf)
677 {
678         struct _cache_attr *fattr = to_attr(attr);
679         struct _index_kobject *this_leaf = to_object(kobj);
680         ssize_t ret;
681
682         ret = fattr->show ?
683                 fattr->show(CPUID4_INFO_IDX(this_leaf->cpu, this_leaf->index),
684                         buf) :
685                 0;
686         return ret;
687 }
688
689 static ssize_t store(struct kobject * kobj, struct attribute * attr,
690                      const char * buf, size_t count)
691 {
692         return 0;
693 }
694
695 static struct sysfs_ops sysfs_ops = {
696         .show   = show,
697         .store  = store,
698 };
699
700 static struct kobj_type ktype_cache = {
701         .sysfs_ops      = &sysfs_ops,
702         .default_attrs  = default_attrs,
703 };
704
705 static struct kobj_type ktype_percpu_entry = {
706         .sysfs_ops      = &sysfs_ops,
707 };
708
709 static void __cpuinit cpuid4_cache_sysfs_exit(unsigned int cpu)
710 {
711         kfree(per_cpu(cache_kobject, cpu));
712         kfree(per_cpu(index_kobject, cpu));
713         per_cpu(cache_kobject, cpu) = NULL;
714         per_cpu(index_kobject, cpu) = NULL;
715         free_cache_attributes(cpu);
716 }
717
718 static int __cpuinit cpuid4_cache_sysfs_init(unsigned int cpu)
719 {
720         int err;
721
722         if (num_cache_leaves == 0)
723                 return -ENOENT;
724
725         err = detect_cache_attributes(cpu);
726         if (err)
727                 return err;
728
729         /* Allocate all required memory */
730         per_cpu(cache_kobject, cpu) =
731                 kzalloc(sizeof(struct kobject), GFP_KERNEL);
732         if (unlikely(per_cpu(cache_kobject, cpu) == NULL))
733                 goto err_out;
734
735         per_cpu(index_kobject, cpu) = kzalloc(
736             sizeof(struct _index_kobject ) * num_cache_leaves, GFP_KERNEL);
737         if (unlikely(per_cpu(index_kobject, cpu) == NULL))
738                 goto err_out;
739
740         return 0;
741
742 err_out:
743         cpuid4_cache_sysfs_exit(cpu);
744         return -ENOMEM;
745 }
746
747 static cpumask_t cache_dev_map = CPU_MASK_NONE;
748
749 /* Add/Remove cache interface for CPU device */
750 static int __cpuinit cache_add_dev(struct sys_device * sys_dev)
751 {
752         unsigned int cpu = sys_dev->id;
753         unsigned long i, j;
754         struct _index_kobject *this_object;
755         int retval;
756
757         retval = cpuid4_cache_sysfs_init(cpu);
758         if (unlikely(retval < 0))
759                 return retval;
760
761         retval = kobject_init_and_add(per_cpu(cache_kobject, cpu),
762                                       &ktype_percpu_entry,
763                                       &sys_dev->kobj, "%s", "cache");
764         if (retval < 0) {
765                 cpuid4_cache_sysfs_exit(cpu);
766                 return retval;
767         }
768
769         for (i = 0; i < num_cache_leaves; i++) {
770                 this_object = INDEX_KOBJECT_PTR(cpu,i);
771                 this_object->cpu = cpu;
772                 this_object->index = i;
773                 retval = kobject_init_and_add(&(this_object->kobj),
774                                               &ktype_cache,
775                                               per_cpu(cache_kobject, cpu),
776                                               "index%1lu", i);
777                 if (unlikely(retval)) {
778                         for (j = 0; j < i; j++) {
779                                 kobject_put(&(INDEX_KOBJECT_PTR(cpu,j)->kobj));
780                         }
781                         kobject_put(per_cpu(cache_kobject, cpu));
782                         cpuid4_cache_sysfs_exit(cpu);
783                         break;
784                 }
785                 kobject_uevent(&(this_object->kobj), KOBJ_ADD);
786         }
787         if (!retval)
788                 cpu_set(cpu, cache_dev_map);
789
790         kobject_uevent(per_cpu(cache_kobject, cpu), KOBJ_ADD);
791         return retval;
792 }
793
794 static void __cpuinit cache_remove_dev(struct sys_device * sys_dev)
795 {
796         unsigned int cpu = sys_dev->id;
797         unsigned long i;
798
799         if (per_cpu(cpuid4_info, cpu) == NULL)
800                 return;
801         if (!cpu_isset(cpu, cache_dev_map))
802                 return;
803         cpu_clear(cpu, cache_dev_map);
804
805         for (i = 0; i < num_cache_leaves; i++)
806                 kobject_put(&(INDEX_KOBJECT_PTR(cpu,i)->kobj));
807         kobject_put(per_cpu(cache_kobject, cpu));
808         cpuid4_cache_sysfs_exit(cpu);
809 }
810
811 static int __cpuinit cacheinfo_cpu_callback(struct notifier_block *nfb,
812                                         unsigned long action, void *hcpu)
813 {
814         unsigned int cpu = (unsigned long)hcpu;
815         struct sys_device *sys_dev;
816
817         sys_dev = get_cpu_sysdev(cpu);
818         switch (action) {
819         case CPU_ONLINE:
820         case CPU_ONLINE_FROZEN:
821                 cache_add_dev(sys_dev);
822                 break;
823         case CPU_DEAD:
824         case CPU_DEAD_FROZEN:
825                 cache_remove_dev(sys_dev);
826                 break;
827         }
828         return NOTIFY_OK;
829 }
830
831 static struct notifier_block __cpuinitdata cacheinfo_cpu_notifier =
832 {
833         .notifier_call = cacheinfo_cpu_callback,
834 };
835
836 static int __cpuinit cache_sysfs_init(void)
837 {
838         int i;
839
840         if (num_cache_leaves == 0)
841                 return 0;
842
843         for_each_online_cpu(i) {
844                 int err;
845                 struct sys_device *sys_dev = get_cpu_sysdev(i);
846
847                 err = cache_add_dev(sys_dev);
848                 if (err)
849                         return err;
850         }
851         register_hotcpu_notifier(&cacheinfo_cpu_notifier);
852         return 0;
853 }
854
855 device_initcall(cache_sysfs_init);
856
857 #endif