1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * Copyright (C) 1995, 1996, 2001 Ralf Baechle
44194318cSRalf Baechle * Copyright (C) 2001, 2004 MIPS Technologies, Inc.
54194318cSRalf Baechle * Copyright (C) 2004 Maciej W. Rozycki
61da177e4SLinus Torvalds */
71da177e4SLinus Torvalds #include <linux/delay.h>
81da177e4SLinus Torvalds #include <linux/kernel.h>
91da177e4SLinus Torvalds #include <linux/sched.h>
101da177e4SLinus Torvalds #include <linux/seq_file.h>
111da177e4SLinus Torvalds #include <asm/bootinfo.h>
121da177e4SLinus Torvalds #include <asm/cpu.h>
131da177e4SLinus Torvalds #include <asm/cpu-features.h>
14bdc92d74SRalf Baechle #include <asm/idle.h>
151da177e4SLinus Torvalds #include <asm/mipsregs.h>
161da177e4SLinus Torvalds #include <asm/processor.h>
179169a5d0SJohn Crispin #include <asm/prom.h>
181da177e4SLinus Torvalds
191da177e4SLinus Torvalds unsigned int vced_count, vcei_count;
201da177e4SLinus Torvalds
21d6d3c9afSRalf Baechle /*
2201fde9a0SIlya Lipnitskiy * No lock; only written during early bootup by CPU 0.
2301fde9a0SIlya Lipnitskiy */
24d6d3c9afSRalf Baechle static RAW_NOTIFIER_HEAD(proc_cpuinfo_chain);
25d6d3c9afSRalf Baechle
register_proc_cpuinfo_notifier(struct notifier_block * nb)26d6d3c9afSRalf Baechle int __ref register_proc_cpuinfo_notifier(struct notifier_block *nb)
27d6d3c9afSRalf Baechle {
28d6d3c9afSRalf Baechle return raw_notifier_chain_register(&proc_cpuinfo_chain, nb);
29d6d3c9afSRalf Baechle }
30d6d3c9afSRalf Baechle
proc_cpuinfo_notifier_call_chain(unsigned long val,void * v)31d6d3c9afSRalf Baechle int proc_cpuinfo_notifier_call_chain(unsigned long val, void *v)
32d6d3c9afSRalf Baechle {
33d6d3c9afSRalf Baechle return raw_notifier_call_chain(&proc_cpuinfo_chain, val, v);
34d6d3c9afSRalf Baechle }
35d6d3c9afSRalf Baechle
show_cpuinfo(struct seq_file * m,void * v)361da177e4SLinus Torvalds static int show_cpuinfo(struct seq_file *m, void *v)
371da177e4SLinus Torvalds {
38d6d3c9afSRalf Baechle struct proc_cpuinfo_notifier_args proc_cpuinfo_notifier_args;
391da177e4SLinus Torvalds unsigned long n = (unsigned long) v - 1;
4031aa3665SKarl-Johan Karlsson unsigned int version = cpu_data[n].processor_id;
4131aa3665SKarl-Johan Karlsson unsigned int fp_vers = cpu_data[n].fpu_id;
421da177e4SLinus Torvalds char fmt[64];
43654f57bfSDavid Daney int i;
441da177e4SLinus Torvalds
451da177e4SLinus Torvalds #ifdef CONFIG_SMP
460b5f9c00SRusty Russell if (!cpu_online(n))
471da177e4SLinus Torvalds return 0;
481da177e4SLinus Torvalds #endif
491da177e4SLinus Torvalds
501da177e4SLinus Torvalds /*
511da177e4SLinus Torvalds * For the first processor also print the system type
521da177e4SLinus Torvalds */
53487d70d0SGabor Juhos if (n == 0) {
541da177e4SLinus Torvalds seq_printf(m, "system type\t\t: %s\n", get_system_type());
55487d70d0SGabor Juhos if (mips_get_machine_name())
56487d70d0SGabor Juhos seq_printf(m, "machine\t\t\t: %s\n",
57487d70d0SGabor Juhos mips_get_machine_name());
58487d70d0SGabor Juhos }
591da177e4SLinus Torvalds
601da177e4SLinus Torvalds seq_printf(m, "processor\t\t: %ld\n", n);
611da177e4SLinus Torvalds sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n",
62e04582b7SAtsushi Nemoto cpu_data[n].options & MIPS_CPU_FPU ? " FPU V%d.%d" : "");
63e47c659bSJohannes Dickgreber seq_printf(m, fmt, __cpu_name[n],
641da177e4SLinus Torvalds (version >> 4) & 0x0f, version & 0x0f,
651da177e4SLinus Torvalds (fp_vers >> 4) & 0x0f, fp_vers & 0x0f);
665636919bSRalf Baechle seq_printf(m, "BogoMIPS\t\t: %u.%02u\n",
670ac35480SRalf Baechle cpu_data[n].udelay_val / (500000/HZ),
680ac35480SRalf Baechle (cpu_data[n].udelay_val / (5000/HZ)) % 100);
69*c4a0a4a4SThorsten Blum seq_printf(m, "wait instruction\t: %s\n", str_yes_no(cpu_wait));
701da177e4SLinus Torvalds seq_printf(m, "microsecond timers\t: %s\n",
71*c4a0a4a4SThorsten Blum str_yes_no(cpu_has_counter));
7231aa3665SKarl-Johan Karlsson seq_printf(m, "tlb_entries\t\t: %d\n", cpu_data[n].tlbsize);
731da177e4SLinus Torvalds seq_printf(m, "extra interrupt vector\t: %s\n",
74*c4a0a4a4SThorsten Blum str_yes_no(cpu_has_divec));
75*c4a0a4a4SThorsten Blum seq_printf(m, "hardware watchpoint\t: %s", str_yes_no(cpu_has_watch));
76654f57bfSDavid Daney if (cpu_has_watch) {
77*c4a0a4a4SThorsten Blum seq_printf(m, ", count: %d, address/irw mask: [",
78654f57bfSDavid Daney cpu_data[n].watch_reg_count);
79654f57bfSDavid Daney for (i = 0; i < cpu_data[n].watch_reg_count; i++)
80654f57bfSDavid Daney seq_printf(m, "%s0x%04x", i ? ", " : "",
81654f57bfSDavid Daney cpu_data[n].watch_reg_masks[i]);
82*c4a0a4a4SThorsten Blum seq_puts(m, "]");
83654f57bfSDavid Daney }
8441315b6eSAaro Koskinen
85*c4a0a4a4SThorsten Blum seq_puts(m, "\nisa\t\t\t:");
86e5f5a5b0SMaciej W. Rozycki if (cpu_has_mips_1)
871ad964aeSIlya Lipnitskiy seq_puts(m, " mips1");
88a96102beSSteven J. Hill if (cpu_has_mips_2)
891ad964aeSIlya Lipnitskiy seq_puts(m, " mips2");
90a96102beSSteven J. Hill if (cpu_has_mips_3)
911ad964aeSIlya Lipnitskiy seq_puts(m, " mips3");
92a96102beSSteven J. Hill if (cpu_has_mips_4)
931ad964aeSIlya Lipnitskiy seq_puts(m, " mips4");
94a96102beSSteven J. Hill if (cpu_has_mips_5)
951ad964aeSIlya Lipnitskiy seq_puts(m, " mips5");
96a96102beSSteven J. Hill if (cpu_has_mips32r1)
971ad964aeSIlya Lipnitskiy seq_puts(m, " mips32r1");
98a96102beSSteven J. Hill if (cpu_has_mips32r2)
991ad964aeSIlya Lipnitskiy seq_puts(m, " mips32r2");
100ab7c01fdSSerge Semin if (cpu_has_mips32r5)
1011ad964aeSIlya Lipnitskiy seq_puts(m, " mips32r5");
102515a6393SMarkos Chandras if (cpu_has_mips32r6)
1031ad964aeSIlya Lipnitskiy seq_puts(m, " mips32r6");
104a96102beSSteven J. Hill if (cpu_has_mips64r1)
1051ad964aeSIlya Lipnitskiy seq_puts(m, " mips64r1");
106a96102beSSteven J. Hill if (cpu_has_mips64r2)
1071ad964aeSIlya Lipnitskiy seq_puts(m, " mips64r2");
108ab7c01fdSSerge Semin if (cpu_has_mips64r5)
1091ad964aeSIlya Lipnitskiy seq_puts(m, " mips64r5");
110515a6393SMarkos Chandras if (cpu_has_mips64r6)
1111ad964aeSIlya Lipnitskiy seq_puts(m, " mips64r6");
1121ad964aeSIlya Lipnitskiy seq_puts(m, "\n");
113981ef0deSRalf Baechle
1141ad964aeSIlya Lipnitskiy seq_puts(m, "ASEs implemented\t:");
11501fde9a0SIlya Lipnitskiy if (cpu_has_mips16)
1161ad964aeSIlya Lipnitskiy seq_puts(m, " mips16");
11701fde9a0SIlya Lipnitskiy if (cpu_has_mips16e2)
1181ad964aeSIlya Lipnitskiy seq_puts(m, " mips16e2");
11901fde9a0SIlya Lipnitskiy if (cpu_has_mdmx)
1201ad964aeSIlya Lipnitskiy seq_puts(m, " mdmx");
12101fde9a0SIlya Lipnitskiy if (cpu_has_mips3d)
1221ad964aeSIlya Lipnitskiy seq_puts(m, " mips3d");
12301fde9a0SIlya Lipnitskiy if (cpu_has_smartmips)
1241ad964aeSIlya Lipnitskiy seq_puts(m, " smartmips");
12501fde9a0SIlya Lipnitskiy if (cpu_has_dsp)
1261ad964aeSIlya Lipnitskiy seq_puts(m, " dsp");
12701fde9a0SIlya Lipnitskiy if (cpu_has_dsp2)
1281ad964aeSIlya Lipnitskiy seq_puts(m, " dsp2");
12901fde9a0SIlya Lipnitskiy if (cpu_has_dsp3)
1301ad964aeSIlya Lipnitskiy seq_puts(m, " dsp3");
13101fde9a0SIlya Lipnitskiy if (cpu_has_mipsmt)
1321ad964aeSIlya Lipnitskiy seq_puts(m, " mt");
13301fde9a0SIlya Lipnitskiy if (cpu_has_mmips)
1341ad964aeSIlya Lipnitskiy seq_puts(m, " micromips");
13501fde9a0SIlya Lipnitskiy if (cpu_has_vz)
1361ad964aeSIlya Lipnitskiy seq_puts(m, " vz");
13701fde9a0SIlya Lipnitskiy if (cpu_has_msa)
1381ad964aeSIlya Lipnitskiy seq_puts(m, " msa");
13901fde9a0SIlya Lipnitskiy if (cpu_has_eva)
1401ad964aeSIlya Lipnitskiy seq_puts(m, " eva");
14101fde9a0SIlya Lipnitskiy if (cpu_has_htw)
1421ad964aeSIlya Lipnitskiy seq_puts(m, " htw");
14301fde9a0SIlya Lipnitskiy if (cpu_has_xpa)
1441ad964aeSIlya Lipnitskiy seq_puts(m, " xpa");
14501fde9a0SIlya Lipnitskiy if (cpu_has_loongson_mmi)
1461ad964aeSIlya Lipnitskiy seq_puts(m, " loongson-mmi");
14701fde9a0SIlya Lipnitskiy if (cpu_has_loongson_cam)
1481ad964aeSIlya Lipnitskiy seq_puts(m, " loongson-cam");
14901fde9a0SIlya Lipnitskiy if (cpu_has_loongson_ext)
1501ad964aeSIlya Lipnitskiy seq_puts(m, " loongson-ext");
15101fde9a0SIlya Lipnitskiy if (cpu_has_loongson_ext2)
1521ad964aeSIlya Lipnitskiy seq_puts(m, " loongson-ext2");
1531ad964aeSIlya Lipnitskiy seq_puts(m, "\n");
154981ef0deSRalf Baechle
155bce86083SSteven J. Hill if (cpu_has_mmips) {
156bce86083SSteven J. Hill seq_printf(m, "micromips kernel\t: %s\n",
157*c4a0a4a4SThorsten Blum str_yes_no(read_c0_config3() & MIPS_CONF3_ISA_OE));
158bce86083SSteven J. Hill }
159626bfa03SHauke Mehrtens
160626bfa03SHauke Mehrtens seq_puts(m, "Options implemented\t:");
161626bfa03SHauke Mehrtens if (cpu_has_tlb)
162626bfa03SHauke Mehrtens seq_puts(m, " tlb");
163626bfa03SHauke Mehrtens if (cpu_has_ftlb)
164626bfa03SHauke Mehrtens seq_puts(m, " ftlb");
165626bfa03SHauke Mehrtens if (cpu_has_tlbinv)
166626bfa03SHauke Mehrtens seq_puts(m, " tlbinv");
167626bfa03SHauke Mehrtens if (cpu_has_segments)
168626bfa03SHauke Mehrtens seq_puts(m, " segments");
169626bfa03SHauke Mehrtens if (cpu_has_rixiex)
170626bfa03SHauke Mehrtens seq_puts(m, " rixiex");
171626bfa03SHauke Mehrtens if (cpu_has_ldpte)
172626bfa03SHauke Mehrtens seq_puts(m, " ldpte");
173626bfa03SHauke Mehrtens if (cpu_has_maar)
174626bfa03SHauke Mehrtens seq_puts(m, " maar");
175626bfa03SHauke Mehrtens if (cpu_has_rw_llb)
176626bfa03SHauke Mehrtens seq_puts(m, " rw_llb");
177626bfa03SHauke Mehrtens if (cpu_has_4kex)
178626bfa03SHauke Mehrtens seq_puts(m, " 4kex");
179626bfa03SHauke Mehrtens if (cpu_has_3k_cache)
180626bfa03SHauke Mehrtens seq_puts(m, " 3k_cache");
181626bfa03SHauke Mehrtens if (cpu_has_4k_cache)
182626bfa03SHauke Mehrtens seq_puts(m, " 4k_cache");
183626bfa03SHauke Mehrtens if (cpu_has_octeon_cache)
184626bfa03SHauke Mehrtens seq_puts(m, " octeon_cache");
1851cab5bd6STiezhu Yang if (raw_cpu_has_fpu)
186626bfa03SHauke Mehrtens seq_puts(m, " fpu");
187626bfa03SHauke Mehrtens if (cpu_has_32fpr)
188626bfa03SHauke Mehrtens seq_puts(m, " 32fpr");
189626bfa03SHauke Mehrtens if (cpu_has_cache_cdex_p)
190626bfa03SHauke Mehrtens seq_puts(m, " cache_cdex_p");
191626bfa03SHauke Mehrtens if (cpu_has_cache_cdex_s)
192626bfa03SHauke Mehrtens seq_puts(m, " cache_cdex_s");
193626bfa03SHauke Mehrtens if (cpu_has_prefetch)
194626bfa03SHauke Mehrtens seq_puts(m, " prefetch");
195626bfa03SHauke Mehrtens if (cpu_has_mcheck)
196626bfa03SHauke Mehrtens seq_puts(m, " mcheck");
197626bfa03SHauke Mehrtens if (cpu_has_ejtag)
198626bfa03SHauke Mehrtens seq_puts(m, " ejtag");
199626bfa03SHauke Mehrtens if (cpu_has_llsc)
200626bfa03SHauke Mehrtens seq_puts(m, " llsc");
201626bfa03SHauke Mehrtens if (cpu_has_guestctl0ext)
202626bfa03SHauke Mehrtens seq_puts(m, " guestctl0ext");
203626bfa03SHauke Mehrtens if (cpu_has_guestctl1)
204626bfa03SHauke Mehrtens seq_puts(m, " guestctl1");
205626bfa03SHauke Mehrtens if (cpu_has_guestctl2)
206626bfa03SHauke Mehrtens seq_puts(m, " guestctl2");
207626bfa03SHauke Mehrtens if (cpu_has_guestid)
208626bfa03SHauke Mehrtens seq_puts(m, " guestid");
209626bfa03SHauke Mehrtens if (cpu_has_drg)
210626bfa03SHauke Mehrtens seq_puts(m, " drg");
211626bfa03SHauke Mehrtens if (cpu_has_rixi)
212626bfa03SHauke Mehrtens seq_puts(m, " rixi");
213626bfa03SHauke Mehrtens if (cpu_has_lpa)
214626bfa03SHauke Mehrtens seq_puts(m, " lpa");
215626bfa03SHauke Mehrtens if (cpu_has_mvh)
216626bfa03SHauke Mehrtens seq_puts(m, " mvh");
217626bfa03SHauke Mehrtens if (cpu_has_vtag_icache)
218626bfa03SHauke Mehrtens seq_puts(m, " vtag_icache");
219626bfa03SHauke Mehrtens if (cpu_has_dc_aliases)
220626bfa03SHauke Mehrtens seq_puts(m, " dc_aliases");
221626bfa03SHauke Mehrtens if (cpu_has_ic_fills_f_dc)
222626bfa03SHauke Mehrtens seq_puts(m, " ic_fills_f_dc");
223626bfa03SHauke Mehrtens if (cpu_has_pindexed_dcache)
224626bfa03SHauke Mehrtens seq_puts(m, " pindexed_dcache");
225626bfa03SHauke Mehrtens if (cpu_has_userlocal)
226626bfa03SHauke Mehrtens seq_puts(m, " userlocal");
227626bfa03SHauke Mehrtens if (cpu_has_nofpuex)
228626bfa03SHauke Mehrtens seq_puts(m, " nofpuex");
229626bfa03SHauke Mehrtens if (cpu_has_vint)
230626bfa03SHauke Mehrtens seq_puts(m, " vint");
231626bfa03SHauke Mehrtens if (cpu_has_veic)
232626bfa03SHauke Mehrtens seq_puts(m, " veic");
233626bfa03SHauke Mehrtens if (cpu_has_inclusive_pcaches)
234626bfa03SHauke Mehrtens seq_puts(m, " inclusive_pcaches");
235626bfa03SHauke Mehrtens if (cpu_has_perf_cntr_intr_bit)
236626bfa03SHauke Mehrtens seq_puts(m, " perf_cntr_intr_bit");
237626bfa03SHauke Mehrtens if (cpu_has_ufr)
238626bfa03SHauke Mehrtens seq_puts(m, " ufr");
239626bfa03SHauke Mehrtens if (cpu_has_fre)
240626bfa03SHauke Mehrtens seq_puts(m, " fre");
241626bfa03SHauke Mehrtens if (cpu_has_cdmm)
242626bfa03SHauke Mehrtens seq_puts(m, " cdmm");
243626bfa03SHauke Mehrtens if (cpu_has_small_pages)
244626bfa03SHauke Mehrtens seq_puts(m, " small_pages");
245626bfa03SHauke Mehrtens if (cpu_has_nan_legacy)
246626bfa03SHauke Mehrtens seq_puts(m, " nan_legacy");
247626bfa03SHauke Mehrtens if (cpu_has_nan_2008)
248626bfa03SHauke Mehrtens seq_puts(m, " nan_2008");
249626bfa03SHauke Mehrtens if (cpu_has_ebase_wg)
250626bfa03SHauke Mehrtens seq_puts(m, " ebase_wg");
251626bfa03SHauke Mehrtens if (cpu_has_badinstr)
252626bfa03SHauke Mehrtens seq_puts(m, " badinstr");
253626bfa03SHauke Mehrtens if (cpu_has_badinstrp)
254626bfa03SHauke Mehrtens seq_puts(m, " badinstrp");
255626bfa03SHauke Mehrtens if (cpu_has_contextconfig)
256626bfa03SHauke Mehrtens seq_puts(m, " contextconfig");
257626bfa03SHauke Mehrtens if (cpu_has_perf)
258626bfa03SHauke Mehrtens seq_puts(m, " perf");
259626bfa03SHauke Mehrtens if (cpu_has_mac2008_only)
260626bfa03SHauke Mehrtens seq_puts(m, " mac2008_only");
261626bfa03SHauke Mehrtens if (cpu_has_ftlbparex)
262626bfa03SHauke Mehrtens seq_puts(m, " ftlbparex");
263626bfa03SHauke Mehrtens if (cpu_has_gsexcex)
264626bfa03SHauke Mehrtens seq_puts(m, " gsexcex");
265626bfa03SHauke Mehrtens if (cpu_has_shared_ftlb_ram)
266626bfa03SHauke Mehrtens seq_puts(m, " shared_ftlb_ram");
267626bfa03SHauke Mehrtens if (cpu_has_shared_ftlb_entries)
268626bfa03SHauke Mehrtens seq_puts(m, " shared_ftlb_entries");
269626bfa03SHauke Mehrtens if (cpu_has_mipsmt_pertccounters)
270626bfa03SHauke Mehrtens seq_puts(m, " mipsmt_pertccounters");
271626bfa03SHauke Mehrtens if (cpu_has_mmid)
272626bfa03SHauke Mehrtens seq_puts(m, " mmid");
273626bfa03SHauke Mehrtens if (cpu_has_mm_sysad)
274626bfa03SHauke Mehrtens seq_puts(m, " mm_sysad");
275626bfa03SHauke Mehrtens if (cpu_has_mm_full)
276626bfa03SHauke Mehrtens seq_puts(m, " mm_full");
277626bfa03SHauke Mehrtens seq_puts(m, "\n");
278626bfa03SHauke Mehrtens
279f6771dbbSRalf Baechle seq_printf(m, "shadow register sets\t: %d\n",
280f6771dbbSRalf Baechle cpu_data[n].srsets);
281e77c32feSDavid Daney seq_printf(m, "kscratch registers\t: %d\n",
282e77c32feSDavid Daney hweight8(cpu_data[n].kscratch_mask));
283bda4584cSHuacai Chen seq_printf(m, "package\t\t\t: %d\n", cpu_data[n].package);
284f875a832SPaul Burton seq_printf(m, "core\t\t\t: %d\n", cpu_core(&cpu_data[n]));
2855508d456SRalf Baechle
286765b0647SMatt Redfearn #if defined(CONFIG_MIPS_MT_SMP) || defined(CONFIG_CPU_MIPSR6)
287765b0647SMatt Redfearn if (cpu_has_mipsmt)
288f875a832SPaul Burton seq_printf(m, "VPE\t\t\t: %d\n", cpu_vpe_id(&cpu_data[n]));
289765b0647SMatt Redfearn else if (cpu_has_vp)
290f875a832SPaul Burton seq_printf(m, "VP\t\t\t: %d\n", cpu_vpe_id(&cpu_data[n]));
291765b0647SMatt Redfearn #endif
292765b0647SMatt Redfearn
2931da177e4SLinus Torvalds sprintf(fmt, "VCE%%c exceptions\t\t: %s\n",
2941da177e4SLinus Torvalds cpu_has_vce ? "%u" : "not available");
2951da177e4SLinus Torvalds seq_printf(m, fmt, 'D', vced_count);
2961da177e4SLinus Torvalds seq_printf(m, fmt, 'I', vcei_count);
297d6d3c9afSRalf Baechle
298d6d3c9afSRalf Baechle proc_cpuinfo_notifier_args.m = m;
299d6d3c9afSRalf Baechle proc_cpuinfo_notifier_args.n = n;
300d6d3c9afSRalf Baechle
301d6d3c9afSRalf Baechle raw_notifier_call_chain(&proc_cpuinfo_chain, 0,
302d6d3c9afSRalf Baechle &proc_cpuinfo_notifier_args);
303d6d3c9afSRalf Baechle
3041ad964aeSIlya Lipnitskiy seq_puts(m, "\n");
3051da177e4SLinus Torvalds
3061da177e4SLinus Torvalds return 0;
3071da177e4SLinus Torvalds }
3081da177e4SLinus Torvalds
c_start(struct seq_file * m,loff_t * pos)3091da177e4SLinus Torvalds static void *c_start(struct seq_file *m, loff_t *pos)
3101da177e4SLinus Torvalds {
3111da177e4SLinus Torvalds unsigned long i = *pos;
3121da177e4SLinus Torvalds
313e1a534f5SHuacai Chen return i < nr_cpu_ids ? (void *) (i + 1) : NULL;
3141da177e4SLinus Torvalds }
3151da177e4SLinus Torvalds
c_next(struct seq_file * m,void * v,loff_t * pos)3161da177e4SLinus Torvalds static void *c_next(struct seq_file *m, void *v, loff_t *pos)
3171da177e4SLinus Torvalds {
3181da177e4SLinus Torvalds ++*pos;
3191da177e4SLinus Torvalds return c_start(m, pos);
3201da177e4SLinus Torvalds }
3211da177e4SLinus Torvalds
c_stop(struct seq_file * m,void * v)3221da177e4SLinus Torvalds static void c_stop(struct seq_file *m, void *v)
3231da177e4SLinus Torvalds {
3241da177e4SLinus Torvalds }
3251da177e4SLinus Torvalds
32612323cacSJan Engelhardt const struct seq_operations cpuinfo_op = {
3271da177e4SLinus Torvalds .start = c_start,
3281da177e4SLinus Torvalds .next = c_next,
3291da177e4SLinus Torvalds .stop = c_stop,
3301da177e4SLinus Torvalds .show = show_cpuinfo,
3311da177e4SLinus Torvalds };
332