summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-05-14 10:12:52 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-05-29 11:06:07 +0200
commitbaf8f4dabc12bc9ff64354e832a06dd5aa03e484 (patch)
treea0f742b9eaff5dfeb03d0a74f9b51eeb7e9aa100
parentsmp: Make CPU_ALLOCATE_INTERRUPT_STACK optional (diff)
downloadrtems-baf8f4dabc12bc9ff64354e832a06dd5aa03e484.tar.bz2
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.
-rw-r--r--c/src/lib/libbsp/i386/shared/smp/smp-imps.c4
-rw-r--r--c/src/lib/libbsp/shared/smp/smp_stub.c4
-rw-r--r--c/src/lib/libbsp/sparc/leon3/smp/smp_leon3.c14
-rw-r--r--cpukit/sapi/src/exinit.c10
-rw-r--r--cpukit/score/include/rtems/bspsmp.h23
-rw-r--r--cpukit/score/src/percpu.c12
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 <rtems/bspsmp.h>
-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
/*