From 7fdf48aaf241cb050607a8aa441ff19a34a7ddb7 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Sun, 28 Apr 2019 14:29:21 +0200 Subject: score: Add _SMP_Othercast_action() --- bsps/arm/shared/clock/clock-a9mpcore.c | 12 +++++------- bsps/arm/shared/clock/clock-generic-timer.c | 10 ++++------ cpukit/include/rtems/score/smpimpl.h | 15 +++++++++++++++ cpukit/score/src/smpmulticastaction.c | 12 ++++++++++++ 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/bsps/arm/shared/clock/clock-a9mpcore.c b/bsps/arm/shared/clock/clock-a9mpcore.c index 7dac8445f2..6eaea05baf 100644 --- a/bsps/arm/shared/clock/clock-a9mpcore.c +++ b/bsps/arm/shared/clock/clock-a9mpcore.c @@ -102,13 +102,11 @@ typedef struct { static void a9mpcore_clock_secondary_action(void *arg) { - if (!_Per_CPU_Is_boot_processor(_Per_CPU_Get())) { - volatile a9mpcore_gt *gt = A9MPCORE_GT; - a9mpcore_clock_init_data *init_data = arg; + volatile a9mpcore_gt *gt = A9MPCORE_GT; + a9mpcore_clock_init_data *init_data = arg; - a9mpcore_clock_gt_init(gt, init_data->cmpval, init_data->interval); - bsp_interrupt_vector_enable(A9MPCORE_IRQ_GT); - } + a9mpcore_clock_gt_init(gt, init_data->cmpval, init_data->interval); + bsp_interrupt_vector_enable(A9MPCORE_IRQ_GT); } #endif @@ -124,7 +122,7 @@ static void a9mpcore_clock_secondary_initialization( .interval = interval }; - _SMP_Broadcast_action(a9mpcore_clock_secondary_action, &init_data); + _SMP_Othercast_action(a9mpcore_clock_secondary_action, &init_data); if (cmpval - a9mpcore_clock_get_counter(gt) >= interval) { bsp_fatal(BSP_ARM_A9MPCORE_FATAL_CLOCK_SMP_INIT); diff --git a/bsps/arm/shared/clock/clock-generic-timer.c b/bsps/arm/shared/clock/clock-generic-timer.c index 88fb1967e5..1369a5d6f1 100644 --- a/bsps/arm/shared/clock/clock-generic-timer.c +++ b/bsps/arm/shared/clock/clock-generic-timer.c @@ -122,13 +122,11 @@ static void arm_gt_clock_gt_init(uint64_t cval) #if defined(RTEMS_SMP) && !defined(CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR) static void arm_gt_clock_secondary_action(void *arg) { - if (!_Per_CPU_Is_boot_processor(_Per_CPU_Get())) { - uint64_t *cval; + uint64_t *cval; - cval = arg; - arm_gt_clock_gt_init(*cval); - bsp_interrupt_vector_enable(arm_gt_clock_instance.irq); - } + cval = arg; + arm_gt_clock_gt_init(*cval); + bsp_interrupt_vector_enable(arm_gt_clock_instance.irq); } #endif diff --git a/cpukit/include/rtems/score/smpimpl.h b/cpukit/include/rtems/score/smpimpl.h index bc24f828fe..452f39a3b5 100644 --- a/cpukit/include/rtems/score/smpimpl.h +++ b/cpukit/include/rtems/score/smpimpl.h @@ -284,6 +284,21 @@ void _SMP_Broadcast_action( void *arg ); +/** + * @brief Initiates an SMP multicast action to the set of all online + * processors excluding the current processor. + * + * Simply calls _SMP_Multicast_action() with _SMP_Get_online_processors() as + * the target processor set excluding the current processor. + * + * @param handler The multicast action handler. + * @param arg The multicast action argument. + */ +void _SMP_Othercast_action( + SMP_Action_handler handler, + void *arg +); + #endif /* defined( RTEMS_SMP ) */ /** diff --git a/cpukit/score/src/smpmulticastaction.c b/cpukit/score/src/smpmulticastaction.c index b703ba14a7..f7dd503fae 100644 --- a/cpukit/score/src/smpmulticastaction.c +++ b/cpukit/score/src/smpmulticastaction.c @@ -258,3 +258,15 @@ void _SMP_Broadcast_action( { _SMP_Multicast_action( _SMP_Get_online_processors(), handler, arg ); } + +void _SMP_Othercast_action( + SMP_Action_handler handler, + void *arg +) +{ + Processor_mask targets; + + _Processor_mask_Assign( &targets, _SMP_Get_online_processors() ); + _Processor_mask_Clear( &targets, _SMP_Get_current_processor() ); + _SMP_Multicast_action( &targets, handler, arg ); +} -- cgit v1.2.3