/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup RTEMSScoreMPCI
*
* @brief This header file provides interfaces of the
* @ref RTEMSScoreMPCI which are used by the implementation and the
* @ref RTEMSImplApplConfig.
*/
/*
* COPYRIGHT (c) 1989-2009.
* On-Line Applications Research Corporation (OAR).
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _RTEMS_SCORE_MPCI_H
#define _RTEMS_SCORE_MPCI_H
#include <rtems/score/mppkt.h>
#include <rtems/score/thread.h>
#include <rtems/score/threadq.h>
#include <rtems/score/watchdog.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup RTEMSScoreMPCI MPCI Handler
*
* @ingroup RTEMSScore
*
* @brief This group contains the MPCI Handler implementation.
*
* The MPCI Handler encapsulates functionality which is related to the
* generation, receipt, and processing of remote operations in a
* multiprocessor system. This handler contains the message passing
* support for making remote service calls as well as the server thread
* which processes requests from remote nodes.
*
* @{
*/
/**
* The following defines the node number used when a broadcast is desired.
*/
#define MPCI_ALL_NODES 0
/**
* This type is returned by all user provided MPCI routines.
*/
typedef void MPCI_Entry;
/**
* This type defines the prototype for the initization entry point
* in an Multiprocessor Communications Interface.
*/
typedef MPCI_Entry ( *MPCI_initialization_entry )( void );
/**
* This type defines the prototype for the get packet entry point
* in an Multiprocessor Communications Interface. The single
* parameter will point to the packet allocated.
*/
typedef MPCI_Entry ( *MPCI_get_packet_entry )(
MP_packet_Prefix **
);
/**
* This type defines the prototype for the return packet entry point
* in an Multiprocessor Communications Interface. The single
* parameter will point to a packet previously allocated by the
* get packet MPCI entry.
*/
typedef MPCI_Entry ( *MPCI_return_packet_entry )(
MP_packet_Prefix *
);
/**
* This type defines the prototype for send get packet entry point
* in an Multiprocessor Communications Interface. The single
* parameter will point to a packet previously allocated by the
* get packet entry point that has been filled in by the caller.
*/
typedef MPCI_Entry ( *MPCI_send_entry )(
uint32_t,
MP_packet_Prefix *
);
/**
* This type defines the prototype for the receive packet entry point
* in an Multiprocessor Communications Interface. The single
* parameter will point to a packet allocated and filled in by the
* receive packet handler. The caller will block until a packet is
* received.
*/
typedef MPCI_Entry ( *MPCI_receive_entry )(
MP_packet_Prefix **
);
/**
* This type defines the Multiprocessor Communications
* Interface (MPCI) Table. This table defines the user-provided
* MPCI which is a required part of a multiprocessor system.
*
* For non-blocking local operations that become remote operations,
* we need a timeout. This is a per-driver timeout: default_timeout
*/
typedef struct {
/** This fields contains the timeout for MPCI operations in ticks. */
uint32_t default_timeout;
/** This field contains the maximum size of a packet supported by this
* MPCI layer. This size places a limit on the size of a message
* which can be transmitted over this interface.
**/
size_t maximum_packet_size;
/** This field points to the MPCI initialization entry point. */
MPCI_initialization_entry initialization;
/** This field points to the MPCI get packet entry point. */
MPCI_get_packet_entry get_packet;
/** This field points to the MPCI return packet entry point. */
MPCI_return_packet_entry return_packet;
/** This field points to the MPCI send packet entry point. */
MPCI_send_entry send_packet;
/** This field points to the MPCI receive packet entry point. */
MPCI_receive_entry receive_packet;
} MPCI_Control;
/*
* The following records define the Multiprocessor Configuration
* Table. This table defines the multiprocessor system
* characteristics which must be known by RTEMS in a multiprocessor
* system.
*/
typedef struct {
/** This is the local node number. */
uint32_t node;
/** This is the maximum number of nodes in system. */
uint32_t maximum_nodes;
/** This is the maximum number of global objects. */
uint32_t maximum_global_objects;
/** This is the maximum number of proxies. */
uint32_t maximum_proxies;
/**
* The MPCI Receive server is assumed to have a stack of at least
* minimum stack size. This field specifies the amount of extra
* stack this task will be given in bytes.
*/
uint32_t extra_mpci_receive_server_stack;
/** This is a pointer to User/BSP provided MPCI Table. */
MPCI_Control *User_mpci_table;
} MPCI_Configuration;
/**
* @brief The MPCI configuration.
*
* Provided by the application via <rtems/confdefs.h>.
*/
extern const MPCI_Configuration _MPCI_Configuration;
/**
* @brief The MPCI receive server stack.
*
* Provided by the application via <rtems/confdefs.h>
*/
extern char _MPCI_Receive_server_stack[];
/** @} */
#ifdef __cplusplus
}
#endif
#endif
/* end of include file */