blob: 5c8aa463062e9fb7c43797ae025fc134afc3a2df (
plain) (
tree)
|
|
/**
* @file rtems/bspsmp.h
*
* @brief Interface Between RTEMS and an SMP Aware BSP
*
* This include file defines the interface between RTEMS and an
* SMP aware BSP. These methods will only be used when RTEMS
* is configured with SMP support enabled.
*/
/*
* COPYRIGHT (c) 1989-2011.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.com/license/LICENSE.
*/
#ifndef _RTEMS_BSPSMP_H
#define _RTEMS_BSPSMP_H
#include <rtems/score/cpuopts.h>
#if defined (RTEMS_SMP)
#include <rtems/score/percpu.h>
/**
* @defgroup RTEMS BSP SMP Interface
*
* @ingroup Score
*
* This defines the interface between RTEMS and the BSP for
* SMP support. The interface uses the term primary
* to refer to the "boot" processor and secondary to refer
* to the "application" processors. Different architectures
* use different terminology.
*
* It is assumed that when the processor is reset and thus
* when RTEMS is initialized, that the primary processor is
* the only one executing. The others are assumed to be in
* a quiescent or reset state awaiting a command to come online.
*/
/**@{*/
#ifdef __cplusplus
extern "C" {
#endif
#ifndef ASM
/**
* @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.
*
* The BSP may start secondary processors now.
*
* @param[in] configured_cpu_count The count of processors requested by the
* application configuration.
*
* @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.
*/
uint32_t bsp_smp_initialize( uint32_t configured_cpu_count );
/**
* @brief Obtain current CPU index.
*
* This method is invoked by RTEMS when it needs to know the index
* of the CPU it is executing on.
*
* @retval This method returns the current CPU index.
*/
int bsp_smp_processor_id(void) RTEMS_COMPILER_PURE_ATTRIBUTE;
/**
* @brief Make request of another CPU.
*
* This method is invoked by RTEMS when it needs to make a request
* of another CPU. It should be implemented using some type of
* interprocessor interrupt.
*
* @param [in] cpu is the target CPU for this request.
* @param [in] message is message to send
*/
void rtems_smp_send_message(
int cpu,
uint32_t message
);
/**
* @brief Generate an interprocessor broadcast interrupt.
*
* This method is invoked when RTEMS wants to let all of the other
* CPUs know that it has sent them message. CPUs not including
* the originating CPU should receive the interrupt.
*
* @note On CPUs without the capability to generate a broadcast
* to all other CPUs interrupt, this can be implemented by
* a loop of sending interrupts to specific CPUs.
*/
void bsp_smp_broadcast_interrupt(void);
/**
* @brief Generate a interprocessor interrupt.
*
* This method is invoked by RTEMS to let @a cpu know that it
* has sent it a message.
*
* @param [in] cpu is the recipient CPU
*/
void bsp_smp_interrupt_cpu(
int cpu
);
/**
* @brief Obtain CPU core number.
*
* This method is invoked by RTEMS when it needs to know which core
* number it is executing on. This is used when it needs to perform
* some action or bookkeeping and needs to distinguish itself from
* the other cores. For example, it may need to realize it needs to
* preempt a thread on another node.
*
* @retval This method returns the Id of the current CPU core.
*/
int bsp_smp_processor_id( void );
/**
* This method is invoked by @ref rtems_smp_secondary_cpu_initialize
* to allow the BSP to perform some intialization. The @a cpu
* parameter indicates the secondary CPU that the code is executing on
* and is currently being initialized.
*
* @note This is called by @ref rtems_smp_secondary_cpu_initialize.
*/
void bsp_smp_secondary_cpu_initialize(int cpu);
/**
* @brief Initialize secondary CPU and coordinates.
*
* This method is the C entry point which secondary CPUs should
* arrange to call. It performs OS initialization for the secondary
* CPU and coordinates bring it to a useful state.
*
* @note This is provided by RTEMS.
*/
void rtems_smp_secondary_cpu_initialize(void);
/**
* @brief Process the incoming interprocessor request.
*
* This is the method called by the BSP's interrupt handler
* to process the incoming interprocessor request.
*/
void rtems_smp_process_interrupt(void);
void bsp_smp_wait_for(
volatile unsigned int *address,
unsigned int desired,
int maximum_usecs
);
#endif
#ifdef __cplusplus
}
#endif
#else
#define bsp_smp_processor_id() 0
#endif
/**@}*/
#endif
/* end of include file */
|