2008-02-08 04:19:31 -08:00
/* MN10300 Arch-specific initialisation
*
* Copyright ( C ) 2007 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public Licence
* as published by the Free Software Foundation ; either version
* 2 of the Licence , or ( at your option ) any later version .
*/
# include <linux/errno.h>
# include <linux/sched.h>
# include <linux/kernel.h>
# include <linux/mm.h>
# include <linux/stddef.h>
# include <linux/unistd.h>
# include <linux/ptrace.h>
# include <linux/user.h>
# include <linux/tty.h>
# include <linux/ioport.h>
# include <linux/delay.h>
# include <linux/init.h>
# include <linux/bootmem.h>
# include <linux/seq_file.h>
2010-10-27 17:28:55 +01:00
# include <linux/cpu.h>
2008-02-08 04:19:31 -08:00
# include <asm/processor.h>
# include <linux/console.h>
# include <asm/uaccess.h>
# include <asm/setup.h>
# include <asm/io.h>
# include <asm/smp.h>
2009-04-10 14:33:48 +01:00
# include <proc/proc.h>
2008-02-08 04:19:31 -08:00
# include <asm/fpu.h>
# include <asm/sections.h>
struct mn10300_cpuinfo boot_cpu_data ;
mn10300: Use early_param() to parse "mem=" parameter
This fixes the problem that "init=" options may not be passed to kernel
correctly.
parse_mem_cmdline() of mn10300 arch gets rid of "mem=" string from
redboot_command_line. Then init_setup() parses the "init=" options from
static_command_line, which is a copy of redboot_command_line, and keeps
the pointer to the init options in execute_command variable.
Since the commit 026cee0 upstream (params: <level>_initcall-like kernel
parameters), static_command_line becomes overwritten by saved_command_line at
do_initcall_level(). Notice that saved_command_line is a command line
which includes "mem=" string.
As a result, execute_command may point to weird string by the length of
"mem=" parameter.
I noticed this problem when using the command line like this:
mem=128M console=ttyS0,115200 init=/bin/sh
Here is the processing flow of command line parameters.
start_kernel()
setup_arch(&command_line)
parse_mem_cmdline(cmdline_p)
* strcpy(boot_command_line, redboot_command_line);
* Remove "mem=xxx" from redboot_command_line.
* *cmdline_p = redboot_command_line;
setup_command_line(command_line) <-- command_line is redboot_command_line
* strcpy(saved_command_line, boot_command_line)
* strcpy(static_command_line, command_line)
parse_early_param()
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
parse_early_options(tmp_cmdline);
parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
parse_args("Booting ..", static_command_line, ...);
init_setup() <-- save the pointer in execute_command
rest_init()
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
At this point, execute_command points to "/bin/sh" string.
kernel_init()
kernel_init_freeable()
do_basic_setup()
do_initcalls()
do_initcall_level()
(*) strcpy(static_command_line, saved_command_line);
Here, execute_command gets to point to "200" string !!
Signed-off-by: David Howells <dhowells@redhat.com>
2013-06-28 16:53:03 +01:00
static char __initdata cmd_line [ COMMAND_LINE_SIZE ] ;
2008-02-08 04:19:31 -08:00
char redboot_command_line [ COMMAND_LINE_SIZE ] =
" console=ttyS0,115200 root=/dev/mtdblock3 rw " ;
char __initdata redboot_platform_name [ COMMAND_LINE_SIZE ] ;
static struct resource code_resource = {
. start = 0x100000 ,
. end = 0 ,
. name = " Kernel code " ,
} ;
static struct resource data_resource = {
. start = 0 ,
. end = 0 ,
. name = " Kernel data " ,
} ;
static unsigned long __initdata phys_memory_base ;
static unsigned long __initdata phys_memory_end ;
static unsigned long __initdata memory_end ;
unsigned long memory_size ;
struct thread_info * __current_ti = & init_thread_union . thread_info ;
struct task_struct * __current = & init_task ;
2010-10-27 17:28:55 +01:00
# define mn10300_known_cpus 5
2008-02-08 04:19:31 -08:00
static const char * const mn10300_cputypes [ ] = {
2010-10-27 17:28:55 +01:00
" am33-1 " ,
" am33-2 " ,
" am34-1 " ,
" am33-3 " ,
" am34-2 " ,
2008-02-08 04:19:31 -08:00
" unknown "
} ;
/*
mn10300: Use early_param() to parse "mem=" parameter
This fixes the problem that "init=" options may not be passed to kernel
correctly.
parse_mem_cmdline() of mn10300 arch gets rid of "mem=" string from
redboot_command_line. Then init_setup() parses the "init=" options from
static_command_line, which is a copy of redboot_command_line, and keeps
the pointer to the init options in execute_command variable.
Since the commit 026cee0 upstream (params: <level>_initcall-like kernel
parameters), static_command_line becomes overwritten by saved_command_line at
do_initcall_level(). Notice that saved_command_line is a command line
which includes "mem=" string.
As a result, execute_command may point to weird string by the length of
"mem=" parameter.
I noticed this problem when using the command line like this:
mem=128M console=ttyS0,115200 init=/bin/sh
Here is the processing flow of command line parameters.
start_kernel()
setup_arch(&command_line)
parse_mem_cmdline(cmdline_p)
* strcpy(boot_command_line, redboot_command_line);
* Remove "mem=xxx" from redboot_command_line.
* *cmdline_p = redboot_command_line;
setup_command_line(command_line) <-- command_line is redboot_command_line
* strcpy(saved_command_line, boot_command_line)
* strcpy(static_command_line, command_line)
parse_early_param()
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
parse_early_options(tmp_cmdline);
parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
parse_args("Booting ..", static_command_line, ...);
init_setup() <-- save the pointer in execute_command
rest_init()
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
At this point, execute_command points to "/bin/sh" string.
kernel_init()
kernel_init_freeable()
do_basic_setup()
do_initcalls()
do_initcall_level()
(*) strcpy(static_command_line, saved_command_line);
Here, execute_command gets to point to "200" string !!
Signed-off-by: David Howells <dhowells@redhat.com>
2013-06-28 16:53:03 +01:00
* Pick out the memory size . We look for mem = size ,
* where size is " size[KkMm] "
2008-02-08 04:19:31 -08:00
*/
mn10300: Use early_param() to parse "mem=" parameter
This fixes the problem that "init=" options may not be passed to kernel
correctly.
parse_mem_cmdline() of mn10300 arch gets rid of "mem=" string from
redboot_command_line. Then init_setup() parses the "init=" options from
static_command_line, which is a copy of redboot_command_line, and keeps
the pointer to the init options in execute_command variable.
Since the commit 026cee0 upstream (params: <level>_initcall-like kernel
parameters), static_command_line becomes overwritten by saved_command_line at
do_initcall_level(). Notice that saved_command_line is a command line
which includes "mem=" string.
As a result, execute_command may point to weird string by the length of
"mem=" parameter.
I noticed this problem when using the command line like this:
mem=128M console=ttyS0,115200 init=/bin/sh
Here is the processing flow of command line parameters.
start_kernel()
setup_arch(&command_line)
parse_mem_cmdline(cmdline_p)
* strcpy(boot_command_line, redboot_command_line);
* Remove "mem=xxx" from redboot_command_line.
* *cmdline_p = redboot_command_line;
setup_command_line(command_line) <-- command_line is redboot_command_line
* strcpy(saved_command_line, boot_command_line)
* strcpy(static_command_line, command_line)
parse_early_param()
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
parse_early_options(tmp_cmdline);
parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
parse_args("Booting ..", static_command_line, ...);
init_setup() <-- save the pointer in execute_command
rest_init()
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
At this point, execute_command points to "/bin/sh" string.
kernel_init()
kernel_init_freeable()
do_basic_setup()
do_initcalls()
do_initcall_level()
(*) strcpy(static_command_line, saved_command_line);
Here, execute_command gets to point to "200" string !!
Signed-off-by: David Howells <dhowells@redhat.com>
2013-06-28 16:53:03 +01:00
static int __init early_mem ( char * p )
2008-02-08 04:19:31 -08:00
{
mn10300: Use early_param() to parse "mem=" parameter
This fixes the problem that "init=" options may not be passed to kernel
correctly.
parse_mem_cmdline() of mn10300 arch gets rid of "mem=" string from
redboot_command_line. Then init_setup() parses the "init=" options from
static_command_line, which is a copy of redboot_command_line, and keeps
the pointer to the init options in execute_command variable.
Since the commit 026cee0 upstream (params: <level>_initcall-like kernel
parameters), static_command_line becomes overwritten by saved_command_line at
do_initcall_level(). Notice that saved_command_line is a command line
which includes "mem=" string.
As a result, execute_command may point to weird string by the length of
"mem=" parameter.
I noticed this problem when using the command line like this:
mem=128M console=ttyS0,115200 init=/bin/sh
Here is the processing flow of command line parameters.
start_kernel()
setup_arch(&command_line)
parse_mem_cmdline(cmdline_p)
* strcpy(boot_command_line, redboot_command_line);
* Remove "mem=xxx" from redboot_command_line.
* *cmdline_p = redboot_command_line;
setup_command_line(command_line) <-- command_line is redboot_command_line
* strcpy(saved_command_line, boot_command_line)
* strcpy(static_command_line, command_line)
parse_early_param()
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
parse_early_options(tmp_cmdline);
parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
parse_args("Booting ..", static_command_line, ...);
init_setup() <-- save the pointer in execute_command
rest_init()
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
At this point, execute_command points to "/bin/sh" string.
kernel_init()
kernel_init_freeable()
do_basic_setup()
do_initcalls()
do_initcall_level()
(*) strcpy(static_command_line, saved_command_line);
Here, execute_command gets to point to "200" string !!
Signed-off-by: David Howells <dhowells@redhat.com>
2013-06-28 16:53:03 +01:00
memory_size = memparse ( p , & p ) ;
2008-02-08 04:19:31 -08:00
if ( memory_size = = 0 )
panic ( " Memory size not known \n " ) ;
mn10300: Use early_param() to parse "mem=" parameter
This fixes the problem that "init=" options may not be passed to kernel
correctly.
parse_mem_cmdline() of mn10300 arch gets rid of "mem=" string from
redboot_command_line. Then init_setup() parses the "init=" options from
static_command_line, which is a copy of redboot_command_line, and keeps
the pointer to the init options in execute_command variable.
Since the commit 026cee0 upstream (params: <level>_initcall-like kernel
parameters), static_command_line becomes overwritten by saved_command_line at
do_initcall_level(). Notice that saved_command_line is a command line
which includes "mem=" string.
As a result, execute_command may point to weird string by the length of
"mem=" parameter.
I noticed this problem when using the command line like this:
mem=128M console=ttyS0,115200 init=/bin/sh
Here is the processing flow of command line parameters.
start_kernel()
setup_arch(&command_line)
parse_mem_cmdline(cmdline_p)
* strcpy(boot_command_line, redboot_command_line);
* Remove "mem=xxx" from redboot_command_line.
* *cmdline_p = redboot_command_line;
setup_command_line(command_line) <-- command_line is redboot_command_line
* strcpy(saved_command_line, boot_command_line)
* strcpy(static_command_line, command_line)
parse_early_param()
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
parse_early_options(tmp_cmdline);
parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
parse_args("Booting ..", static_command_line, ...);
init_setup() <-- save the pointer in execute_command
rest_init()
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
At this point, execute_command points to "/bin/sh" string.
kernel_init()
kernel_init_freeable()
do_basic_setup()
do_initcalls()
do_initcall_level()
(*) strcpy(static_command_line, saved_command_line);
Here, execute_command gets to point to "200" string !!
Signed-off-by: David Howells <dhowells@redhat.com>
2013-06-28 16:53:03 +01:00
return 0 ;
2008-02-08 04:19:31 -08:00
}
mn10300: Use early_param() to parse "mem=" parameter
This fixes the problem that "init=" options may not be passed to kernel
correctly.
parse_mem_cmdline() of mn10300 arch gets rid of "mem=" string from
redboot_command_line. Then init_setup() parses the "init=" options from
static_command_line, which is a copy of redboot_command_line, and keeps
the pointer to the init options in execute_command variable.
Since the commit 026cee0 upstream (params: <level>_initcall-like kernel
parameters), static_command_line becomes overwritten by saved_command_line at
do_initcall_level(). Notice that saved_command_line is a command line
which includes "mem=" string.
As a result, execute_command may point to weird string by the length of
"mem=" parameter.
I noticed this problem when using the command line like this:
mem=128M console=ttyS0,115200 init=/bin/sh
Here is the processing flow of command line parameters.
start_kernel()
setup_arch(&command_line)
parse_mem_cmdline(cmdline_p)
* strcpy(boot_command_line, redboot_command_line);
* Remove "mem=xxx" from redboot_command_line.
* *cmdline_p = redboot_command_line;
setup_command_line(command_line) <-- command_line is redboot_command_line
* strcpy(saved_command_line, boot_command_line)
* strcpy(static_command_line, command_line)
parse_early_param()
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
parse_early_options(tmp_cmdline);
parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
parse_args("Booting ..", static_command_line, ...);
init_setup() <-- save the pointer in execute_command
rest_init()
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
At this point, execute_command points to "/bin/sh" string.
kernel_init()
kernel_init_freeable()
do_basic_setup()
do_initcalls()
do_initcall_level()
(*) strcpy(static_command_line, saved_command_line);
Here, execute_command gets to point to "200" string !!
Signed-off-by: David Howells <dhowells@redhat.com>
2013-06-28 16:53:03 +01:00
early_param ( " mem " , early_mem ) ;
2008-02-08 04:19:31 -08:00
/*
* architecture specific setup
*/
void __init setup_arch ( char * * cmdline_p )
{
unsigned long bootmap_size ;
unsigned long kstart_pfn , start_pfn , free_pfn , end_pfn ;
cpu_init ( ) ;
unit_setup ( ) ;
2010-10-27 17:28:55 +01:00
smp_init_cpus ( ) ;
mn10300: Use early_param() to parse "mem=" parameter
This fixes the problem that "init=" options may not be passed to kernel
correctly.
parse_mem_cmdline() of mn10300 arch gets rid of "mem=" string from
redboot_command_line. Then init_setup() parses the "init=" options from
static_command_line, which is a copy of redboot_command_line, and keeps
the pointer to the init options in execute_command variable.
Since the commit 026cee0 upstream (params: <level>_initcall-like kernel
parameters), static_command_line becomes overwritten by saved_command_line at
do_initcall_level(). Notice that saved_command_line is a command line
which includes "mem=" string.
As a result, execute_command may point to weird string by the length of
"mem=" parameter.
I noticed this problem when using the command line like this:
mem=128M console=ttyS0,115200 init=/bin/sh
Here is the processing flow of command line parameters.
start_kernel()
setup_arch(&command_line)
parse_mem_cmdline(cmdline_p)
* strcpy(boot_command_line, redboot_command_line);
* Remove "mem=xxx" from redboot_command_line.
* *cmdline_p = redboot_command_line;
setup_command_line(command_line) <-- command_line is redboot_command_line
* strcpy(saved_command_line, boot_command_line)
* strcpy(static_command_line, command_line)
parse_early_param()
strlcpy(tmp_cmdline, boot_command_line, COMMAND_LINE_SIZE);
parse_early_options(tmp_cmdline);
parse_args("early options", cmdline, NULL, 0, 0, 0, do_early_param);
parse_args("Booting ..", static_command_line, ...);
init_setup() <-- save the pointer in execute_command
rest_init()
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
At this point, execute_command points to "/bin/sh" string.
kernel_init()
kernel_init_freeable()
do_basic_setup()
do_initcalls()
do_initcall_level()
(*) strcpy(static_command_line, saved_command_line);
Here, execute_command gets to point to "200" string !!
Signed-off-by: David Howells <dhowells@redhat.com>
2013-06-28 16:53:03 +01:00
/* save unparsed command line copy for /proc/cmdline */
strlcpy ( boot_command_line , redboot_command_line , COMMAND_LINE_SIZE ) ;
/* populate cmd_line too for later use, preserving boot_command_line */
strlcpy ( cmd_line , boot_command_line , COMMAND_LINE_SIZE ) ;
* cmdline_p = cmd_line ;
parse_early_param ( ) ;
memory_end = ( unsigned long ) CONFIG_KERNEL_RAM_BASE_ADDRESS +
memory_size ;
if ( memory_end > phys_memory_end )
memory_end = phys_memory_end ;
2008-02-08 04:19:31 -08:00
init_mm . start_code = ( unsigned long ) & _text ;
init_mm . end_code = ( unsigned long ) & _etext ;
init_mm . end_data = ( unsigned long ) & _edata ;
init_mm . brk = ( unsigned long ) & _end ;
code_resource . start = virt_to_bus ( & _text ) ;
code_resource . end = virt_to_bus ( & _etext ) - 1 ;
data_resource . start = virt_to_bus ( & _etext ) ;
data_resource . end = virt_to_bus ( & _edata ) - 1 ;
start_pfn = ( CONFIG_KERNEL_RAM_BASE_ADDRESS > > PAGE_SHIFT ) ;
kstart_pfn = PFN_UP ( __pa ( & _text ) ) ;
free_pfn = PFN_UP ( __pa ( & _end ) ) ;
end_pfn = PFN_DOWN ( __pa ( memory_end ) ) ;
bootmap_size = init_bootmem_node ( & contig_page_data ,
free_pfn ,
start_pfn ,
end_pfn ) ;
if ( kstart_pfn > start_pfn )
free_bootmem ( PFN_PHYS ( start_pfn ) ,
PFN_PHYS ( kstart_pfn - start_pfn ) ) ;
free_bootmem ( PFN_PHYS ( free_pfn ) ,
PFN_PHYS ( end_pfn - free_pfn ) ) ;
/* If interrupt vector table is in main ram, then we need to
reserve the page it is occupying . */
if ( CONFIG_INTERRUPT_VECTOR_BASE > = CONFIG_KERNEL_RAM_BASE_ADDRESS & &
CONFIG_INTERRUPT_VECTOR_BASE < memory_end )
2008-12-10 12:43:39 +00:00
reserve_bootmem ( CONFIG_INTERRUPT_VECTOR_BASE , PAGE_SIZE ,
2008-02-08 04:19:31 -08:00
BOOTMEM_DEFAULT ) ;
reserve_bootmem ( PAGE_ALIGN ( PFN_PHYS ( free_pfn ) ) , bootmap_size ,
BOOTMEM_DEFAULT ) ;
# ifdef CONFIG_VT
# if defined(CONFIG_VGA_CONSOLE)
conswitchp = & vga_con ;
# elif defined(CONFIG_DUMMY_CONSOLE)
conswitchp = & dummy_con ;
# endif
# endif
paging_init ( ) ;
}
/*
* perform CPU initialisation
*/
void __init cpu_init ( void )
{
unsigned long cpurev = CPUREV , type ;
type = ( CPUREV & CPUREV_TYPE ) > > CPUREV_TYPE_S ;
if ( type > mn10300_known_cpus )
type = mn10300_known_cpus ;
2010-10-27 17:29:00 +01:00
printk ( KERN_INFO " Panasonic %s, rev %ld \n " ,
2008-02-08 04:19:31 -08:00
mn10300_cputypes [ type ] ,
( cpurev & CPUREV_REVISION ) > > CPUREV_REVISION_S ) ;
2010-10-27 17:28:55 +01:00
get_mem_info ( & phys_memory_base , & memory_size ) ;
phys_memory_end = phys_memory_base + memory_size ;
2008-02-08 04:19:31 -08:00
2010-10-27 17:28:55 +01:00
fpu_init_state ( ) ;
}
2008-02-08 04:19:31 -08:00
2010-10-27 17:28:55 +01:00
static struct cpu cpu_devices [ NR_CPUS ] ;
2008-02-08 04:19:31 -08:00
2010-10-27 17:28:55 +01:00
static int __init topology_init ( void )
{
int i ;
2008-02-08 04:19:31 -08:00
2010-10-27 17:28:55 +01:00
for_each_present_cpu ( i )
register_cpu ( & cpu_devices [ i ] , i ) ;
2008-02-08 04:19:31 -08:00
2010-10-27 17:28:55 +01:00
return 0 ;
2008-02-08 04:19:31 -08:00
}
2010-10-27 17:28:55 +01:00
subsys_initcall ( topology_init ) ;
2008-02-08 04:19:31 -08:00
/*
* Get CPU information for use by the procfs .
*/
static int show_cpuinfo ( struct seq_file * m , void * v )
{
2010-10-27 17:28:55 +01:00
# ifdef CONFIG_SMP
struct mn10300_cpuinfo * c = v ;
unsigned long cpu_id = c - cpu_data ;
unsigned long cpurev = c - > type , type , icachesz , dcachesz ;
# else /* CONFIG_SMP */
unsigned long cpu_id = 0 ;
2008-02-08 04:19:31 -08:00
unsigned long cpurev = CPUREV , type , icachesz , dcachesz ;
2010-10-27 17:28:55 +01:00
# endif /* CONFIG_SMP */
2008-02-08 04:19:31 -08:00
2010-10-27 17:28:55 +01:00
# ifdef CONFIG_SMP
if ( ! cpu_online ( cpu_id ) )
return 0 ;
# endif
type = ( cpurev & CPUREV_TYPE ) > > CPUREV_TYPE_S ;
2008-02-08 04:19:31 -08:00
if ( type > mn10300_known_cpus )
type = mn10300_known_cpus ;
icachesz =
( ( cpurev & CPUREV_ICWAY ) > > CPUREV_ICWAY_S ) *
( ( cpurev & CPUREV_ICSIZE ) > > CPUREV_ICSIZE_S ) *
1024 ;
dcachesz =
( ( cpurev & CPUREV_DCWAY ) > > CPUREV_DCWAY_S ) *
( ( cpurev & CPUREV_DCSIZE ) > > CPUREV_DCSIZE_S ) *
1024 ;
seq_printf ( m ,
2010-10-27 17:28:55 +01:00
" processor : %ld \n "
2010-10-27 17:29:00 +01:00
" vendor_id : " PROCESSOR_VENDOR_NAME " \n "
2008-02-08 04:19:31 -08:00
" cpu core : %s \n "
" cpu rev : %lu \n "
" model name : " PROCESSOR_MODEL_NAME " \n "
" icache size: %lu \n "
" dcache size: %lu \n " ,
2010-10-27 17:28:55 +01:00
cpu_id ,
2008-02-08 04:19:31 -08:00
mn10300_cputypes [ type ] ,
( cpurev & CPUREV_REVISION ) > > CPUREV_REVISION_S ,
icachesz ,
dcachesz
) ;
seq_printf ( m ,
" ioclk speed: %lu.%02luMHz \n "
" bogomips : %lu.%02lu \n \n " ,
MN10300_IOCLK / 1000000 ,
( MN10300_IOCLK / 10000 ) % 100 ,
2010-10-27 17:28:55 +01:00
# ifdef CONFIG_SMP
c - > loops_per_jiffy / ( 500000 / HZ ) ,
( c - > loops_per_jiffy / ( 5000 / HZ ) ) % 100
# else /* CONFIG_SMP */
2008-02-08 04:19:31 -08:00
loops_per_jiffy / ( 500000 / HZ ) ,
( loops_per_jiffy / ( 5000 / HZ ) ) % 100
2010-10-27 17:28:55 +01:00
# endif /* CONFIG_SMP */
2008-02-08 04:19:31 -08:00
) ;
return 0 ;
}
static void * c_start ( struct seq_file * m , loff_t * pos )
{
return * pos < NR_CPUS ? cpu_data + * pos : NULL ;
}
static void * c_next ( struct seq_file * m , void * v , loff_t * pos )
{
+ + * pos ;
return c_start ( m , pos ) ;
}
static void c_stop ( struct seq_file * m , void * v )
{
}
2009-09-22 16:43:43 -07:00
const struct seq_operations cpuinfo_op = {
2008-02-08 04:19:31 -08:00
. start = c_start ,
. next = c_next ,
. stop = c_stop ,
. show = show_cpuinfo ,
} ;