From baf8f4dabc12bc9ff64354e832a06dd5aa03e484 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 14 May 2013 10:12:52 +0200 Subject: smp: Simplify main CPU initialization Call _SMP_Handler_initialize() later and move bsp_smp_initialize() into _SMP_Handler_initialize(). Change bsp_smp_initialize() prototype to match integer types of calling context. --- c/src/lib/libbsp/i386/shared/smp/smp-imps.c | 4 +--- c/src/lib/libbsp/shared/smp/smp_stub.c | 4 +--- c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c | 14 ++++++-------- cpukit/sapi/src/exinit.c | 10 +--------- cpukit/score/include/rtems/bspsmp.h | 23 +++++++++++++---------- cpukit/score/src/percpu.c | 12 ++++++++++-- 6 files changed, 32 insertions(+), 35 deletions(-) diff --git a/c/src/lib/libbsp/i386/shared/smp/smp-imps.c b/c/src/lib/libbsp/i386/shared/smp/smp-imps.c index 60bb0e613a..7ea17e594d 100644 --- a/c/src/lib/libbsp/i386/shared/smp/smp-imps.c +++ b/c/src/lib/libbsp/i386/shared/smp/smp-imps.c @@ -807,9 +807,7 @@ void bsp_smp_secondary_cpu_initialize(int cpu) } #include -int bsp_smp_initialize( - int maximum -) +uint32_t bsp_smp_initialize( uint32_t configured_cpu_count ) { int cores; /* XXX need to deal with finding too many cores */ diff --git a/c/src/lib/libbsp/shared/smp/smp_stub.c b/c/src/lib/libbsp/shared/smp/smp_stub.c index c5d57f4b99..f95cad4610 100644 --- a/c/src/lib/libbsp/shared/smp/smp_stub.c +++ b/c/src/lib/libbsp/shared/smp/smp_stub.c @@ -19,9 +19,7 @@ void bsp_smp_secondary_cpu_initialize(int cpu) { } -int bsp_smp_initialize( - int maximum -) +uint32_t bsp_smp_initialize( uint32_t configured_cpu_count ) { /* return the number of CPUs */ return 1; diff --git a/c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c b/c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c index a9f4a0eebe..b479ffcdc4 100644 --- a/c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c +++ b/c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c @@ -57,12 +57,10 @@ void *bsp_ap_entry; static void bsp_smp_delay( int ); -int bsp_smp_initialize( - int maximum -) +uint32_t bsp_smp_initialize( uint32_t configured_cpu_count ) { - int cpu; - int found_cpus = 0; + uint32_t cpu; + uint32_t found_cpus = 0; sparc_leon3_set_cctrl( 0x80000F ); found_cpus = @@ -71,13 +69,13 @@ int bsp_smp_initialize( printk( "Found %d CPUs\n", found_cpus ); #endif - if ( found_cpus > rtems_configuration_get_maximum_processors() ) { + if ( found_cpus > configured_cpu_count ) { printk( "%d CPUs IS MORE THAN CONFIGURED -- ONLY USING %d\n", found_cpus, - rtems_configuration_get_maximum_processors() + configured_cpu_count ); - found_cpus = rtems_configuration_get_maximum_processors(); + found_cpus = configured_cpu_count; } if ( found_cpus == 1 ) diff --git a/cpukit/sapi/src/exinit.c b/cpukit/sapi/src/exinit.c index a0abe111ab..3fb27fdfa0 100644 --- a/cpukit/sapi/src/exinit.c +++ b/cpukit/sapi/src/exinit.c @@ -119,10 +119,6 @@ void rtems_initialize_data_structures(void) _Thread_Dispatch_initialization(); - #if defined(RTEMS_SMP) - _SMP_Handler_initialize(); - #endif - _User_extensions_Handler_initialization(); _ISR_Handler_initialization(); @@ -159,12 +155,8 @@ void rtems_initialize_data_structures(void) _POSIX_API_Initialize(); #endif - /* - * Discover and initialize the secondary cores in an SMP system. - */ #if defined(RTEMS_SMP) - _SMP_Processor_count = - bsp_smp_initialize( rtems_configuration_get_maximum_processors() ); + _SMP_Handler_initialize(); #endif _System_state_Set( SYSTEM_STATE_BEFORE_MULTITASKING ); diff --git a/cpukit/score/include/rtems/bspsmp.h b/cpukit/score/include/rtems/bspsmp.h index e318ccadec..e1ef4882d5 100644 --- a/cpukit/score/include/rtems/bspsmp.h +++ b/cpukit/score/include/rtems/bspsmp.h @@ -50,21 +50,24 @@ extern "C" { #ifndef ASM + /** - * @brief Initialize secondary CPUs. + * @brief Performs BSP specific SMP initialization in the context of the main + * processor. + * + * This function is invoked on the main processor by RTEMS during + * initialization. All interrupt stacks are allocated at this point in case + * the CPU port allocates the interrupt stacks. * - * This method is invoked by RTEMS during initialization to bring the - * secondary CPUs out of reset. + * The BSP may start secondary processors now. * - * @param [in] maximum is the maximum number of CPU cores that RTEMS - * can handle + * @param[in] configured_cpu_count The count of processors requested by the + * application configuration. * - * @retval This method returns the number of cores available in the - * system. + * @return The count of processors available for the application in the system. + * This value is less than or equal to the configured count of processors. */ -int bsp_smp_initialize( - int maximum -); +uint32_t bsp_smp_initialize( uint32_t configured_cpu_count ); /** * @brief Obtain current CPU index. diff --git a/cpukit/score/src/percpu.c b/cpukit/score/src/percpu.c index d40b2a6154..f01d933cfe 100644 --- a/cpukit/score/src/percpu.c +++ b/cpukit/score/src/percpu.c @@ -31,13 +31,14 @@ void _SMP_Handler_initialize(void) { - int cpu; + uint32_t max_cpus = rtems_configuration_get_maximum_processors(); + uint32_t cpu; /* * Initialize per cpu pointer table */ _Per_CPU_Information_p[0] = &_Per_CPU_Information[0]; - for (cpu=1 ; cpu < rtems_configuration_get_maximum_processors(); cpu++ ) { + for ( cpu = 1 ; cpu < max_cpus; ++cpu ) { Per_CPU_Control *p = &_Per_CPU_Information[cpu]; @@ -59,6 +60,13 @@ p->state = RTEMS_BSP_SMP_CPU_INITIAL_STATE; RTEMS_COMPILER_MEMORY_BARRIER(); } + + /* + * Discover and initialize the secondary cores in an SMP system. + */ + max_cpus = bsp_smp_initialize( max_cpus ); + + _SMP_Processor_count = max_cpus; } #else /* -- cgit v1.2.3