[PATCH 05/41] rtems: Generate <rtems/irq-extension.h>
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Jul 12 12:49:27 UTC 2021
Use <rtems/score/chain.h> which just provides the data types and avoid a
dependency on <rtems/chain.h> which contains the full chain
implementation.
Change license to BSD-2-Clause according to file histories and
documentation re-licensing agreement.
Update #3269.
Update #3899.
Update #3993.
---
cpukit/include/rtems/irq-extension.h | 1830 +++++++++++++++++++-------
1 file changed, 1354 insertions(+), 476 deletions(-)
diff --git a/cpukit/include/rtems/irq-extension.h b/cpukit/include/rtems/irq-extension.h
index 915be09e2b..5f24fb502e 100644
--- a/cpukit/include/rtems/irq-extension.h
+++ b/cpukit/include/rtems/irq-extension.h
@@ -1,294 +1,566 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
/**
* @file
*
- * @ingroup rtems_interrupt_extension
+ * @ingroup RTEMSAPIClassicIntr
*
- * @brief Header file for the Interrupt Manager Extension.
+ * @brief This header file defines the Interrupt Manager Extension API.
+ */
+
+/*
+ * Copyright (C) 2008, 2021 embedded brains GmbH (http://www.embedded-brains.de)
+ *
+ * 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.
*/
/*
- * Based on concepts of Pavel Pisa, Till Straumann and Eric Valette.
+ * This file is part of the RTEMS quality process and was automatically
+ * generated. If you find something that needs to be fixed or
+ * worded better please post a report or patch to an RTEMS mailing list
+ * or raise a bug report:
+ *
+ * https://www.rtems.org/bugs.html
*
- * Copyright (C) 2008, 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ * For information on updating and regenerating please refer to the How-To
+ * section in the Software Requirements Engineering chapter of the
+ * RTEMS Software Engineering manual. The manual is provided as a part of
+ * a release. For development sources please refer to the online
+ * documentation at:
*
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
+ * https://docs.rtems.org
*/
-#ifndef RTEMS_IRQ_EXTENSION_H
-#define RTEMS_IRQ_EXTENSION_H
+/* Generated from spec:/rtems/intr/if/header-2 */
-#include <rtems.h>
-#include <rtems/chain.h>
+#ifndef _RTEMS_IRQ_EXTENSION_H
+#define _RTEMS_IRQ_EXTENSION_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <sys/cpuset.h>
+#include <rtems/rtems/attr.h>
+#include <rtems/rtems/intr.h>
+#include <rtems/rtems/modes.h>
+#include <rtems/rtems/options.h>
+#include <rtems/rtems/status.h>
+#include <rtems/rtems/types.h>
+#include <rtems/score/chain.h>
#ifdef __cplusplus
extern "C" {
-#endif /* __cplusplus */
+#endif
+
+/* Generated from spec:/rtems/intr/if/handler */
/**
- * @defgroup rtems_interrupt_extension Interrupt Manager Extension
- *
* @ingroup RTEMSAPIClassicIntr
*
- * In addition to the Classic API interrupt handler with a handle are
- * supported. You can also install multiple shared handler for one interrupt
- * vector.
+ * @brief Interrupt handler routines shall have this type.
*/
-/**@{**/
+typedef void ( *rtems_interrupt_handler )( void * );
+
+/* Generated from spec:/rtems/intr/if/per-handler-routine */
/**
- * @brief Makes the interrupt handler unique. Prevents other handler from
- * using the same interrupt vector.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Visitor routines invoked by rtems_interrupt_handler_iterate() shall
+ * have this type.
*/
-#define RTEMS_INTERRUPT_UNIQUE ((rtems_option) 0x00000001)
+typedef void ( *rtems_interrupt_per_handler_routine )(
+ void *,
+ const char *,
+ rtems_option,
+ rtems_interrupt_handler,
+ void *
+);
+
+/* Generated from spec:/rtems/intr/if/shared */
/**
- * @brief Allows that this interrupt handler may share a common interrupt
- * vector with other handler.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief This interrupt handler install option allows that the interrupt
+ * handler may share the interrupt vector with other handler.
*/
-#define RTEMS_INTERRUPT_SHARED ((rtems_option) 0x00000000)
+#define RTEMS_INTERRUPT_SHARED ( (rtems_option) 0x00000000 )
+
+/* Generated from spec:/rtems/intr/if/unique */
/**
- * @brief Forces that this interrupt handler replaces the first handler with
- * the same argument.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief This interrupt handler install option ensures that the interrupt
+ * handler is unique.
+ *
+ * This option prevents other handler from using the same interrupt vector.
*/
-#define RTEMS_INTERRUPT_REPLACE ((rtems_option) 0x00000002)
+#define RTEMS_INTERRUPT_UNIQUE ( (rtems_option) 0x00000001 )
+
+/* Generated from spec:/rtems/intr/if/replace */
/**
- * @brief Returns true if the interrupt handler unique option is set.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief This interrupt handler install option requests that the interrupt
+ * handler replaces the first handler with the same argument.
*/
-#define RTEMS_INTERRUPT_IS_UNIQUE( options) \
- ((options) & RTEMS_INTERRUPT_UNIQUE)
+#define RTEMS_INTERRUPT_REPLACE ( (rtems_option) 0x00000002 )
+
+/* Generated from spec:/rtems/intr/if/is-shared */
/**
- * @brief Returns true if the interrupt handler shared option is set.
+ * @brief Checks if the interrupt handler shared option is set.
+ *
+ * @param _options is the interrupt handler option set to check.
+ *
+ * @return Returns true, if the interrupt handler shared option
+ * #RTEMS_INTERRUPT_SHARED is set, otherwise false.
*/
-#define RTEMS_INTERRUPT_IS_SHARED( options) \
- (!RTEMS_INTERRUPT_IS_UNIQUE( options))
+#define RTEMS_INTERRUPT_IS_SHARED( _options ) \
+ ( ( _options ) & RTEMS_INTERRUPT_SHARED )
+
+/* Generated from spec:/rtems/intr/if/is-unique */
/**
- * @brief Returns true if the interrupt handler replace option is set.
+ * @brief Checks if the interrupt handler unique option is set.
+ *
+ * @param _options is the interrupt handler option set to check.
+ *
+ * @return Returns true, if the interrupt handler unique option
+ * #RTEMS_INTERRUPT_UNIQUE is set, otherwise false.
*/
-#define RTEMS_INTERRUPT_IS_REPLACE( options) \
- ((options) & RTEMS_INTERRUPT_REPLACE)
+#define RTEMS_INTERRUPT_IS_UNIQUE( _options ) \
+ ( ( _options ) & RTEMS_INTERRUPT_UNIQUE )
+
+/* Generated from spec:/rtems/intr/if/is-replace */
/**
- * @brief Interrupt handler routine type.
+ * @brief Checks if the interrupt handler replace option is set.
+ *
+ * @param _options is the interrupt handler option set to check.
+ *
+ * @return Returns true, if the interrupt handler replace option
+ * #RTEMS_INTERRUPT_REPLACE is set, otherwise false.
*/
-typedef void (*rtems_interrupt_handler)(void *);
+#define RTEMS_INTERRUPT_IS_REPLACE( _options ) \
+ ( ( _options ) & RTEMS_INTERRUPT_REPLACE )
+
+/* Generated from spec:/rtems/intr/if/handler-install */
/**
- * @brief Installs the interrupt handler routine @a handler for the interrupt
- * vector with number @a vector.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Installs the interrupt handler routine and argument at the interrupt
+ * vector.
+ *
+ * @param vector is the interrupt vector number.
+ *
+ * @param info is the descriptive information of the interrupt handler to
+ * install.
+ *
+ * @param options is the interrupt handler install option set.
+ *
+ * @param routine is the interrupt handler routine to install.
*
- * You can set one of the mutually exclusive options
+ * @param arg is the interrupt handler argument to install.
*
- * - @ref RTEMS_INTERRUPT_UNIQUE
- * - @ref RTEMS_INTERRUPT_SHARED
- * - @ref RTEMS_INTERRUPT_REPLACE
+ * One of the following mutually exclusive options
*
- * with the @a options parameter for the interrupt handler.
+ * * #RTEMS_INTERRUPT_UNIQUE,
*
- * The handler routine shall be called with argument @a arg when dispatched.
- * The order in which the shared interrupt handlers are dispatched for one
- * vector is BSP dependent.
+ * * #RTEMS_INTERRUPT_SHARED, and
*
- * If the option @ref RTEMS_INTERRUPT_UNIQUE is set then it shall be ensured
- * that this handler will be the only one for this vector.
+ * * #RTEMS_INTERRUPT_REPLACE
*
- * If the option @ref RTEMS_INTERRUPT_REPLACE is set then it shall be ensured
- * that this handler will replace the first handler with the same argument for
- * this vector if it exists, otherwise an error status shall be returned. A
- * second handler with the same argument for this vector shall remain
- * unchanged. The new handler will inherit the unique or shared option from
+ * shall be set in the ``options`` parameter.
+ *
+ * The handler routine will be called with the argument specified by ``arg``
+ * when dispatched. The order in which shared interrupt handlers are
+ * dispatched for one vector is defined by the installation order. The first
+ * installed handler is dispatched first.
+ *
+ * If the option #RTEMS_INTERRUPT_UNIQUE is set, then it will be ensured that
+ * the handler will be the only one for the interrupt vector.
+ *
+ * If the option #RTEMS_INTERRUPT_SHARED is set, then multiple handler may be
+ * installed for the interrupt vector.
+ *
+ * If the option #RTEMS_INTERRUPT_REPLACE is set, then the handler specified by
+ * ``routine`` will replace the first handler with the same argument for the
+ * interrupt vector if it exists, otherwise an error status will be returned.
+ * A second handler with the same argument for the interrupt vector will remain
+ * unchanged. The new handler will inherit the unique or shared options from
* the replaced handler.
*
- * You can provide an informative description @a info. This may be used for
- * system debugging and status tools. The string has to be persistent during
- * the handler life time.
- *
- * This function may block.
- *
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt
- * context this shall be returned.
- * @retval RTEMS_INVALID_ADDRESS If the handler address is NULL this shall be
- * returned.
- * @retval RTEMS_INVALID_ID If the vector number is out of range this shall be
- * returned.
- * @retval RTEMS_INVALID_NUMBER If an option is not applicable this shall be
- * returned.
- * @retval RTEMS_RESOURCE_IN_USE If the vector is already occupied with a
- * unique handler this shall be returned. If a unique handler should be
- * installed and there is already a handler installed this shall be returned.
- * @retval RTEMS_TOO_MANY If a handler with this argument is already installed
- * for the vector this shall be returned.
- * @retval RTEMS_UNSATISFIED If no handler exists to replace with the specified
- * argument and vector this shall be returned.
- * @retval RTEMS_IO_ERROR Reserved for board support package specific error
- * conditions.
+ * An informative description may be provided in ``info``. It may be used for
+ * system debugging and diagnostic tools. The referenced string has to be
+ * persistent as long as the handler is installed.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INCORRECT_STATE The service was not initialized.
+ *
+ * @retval ::RTEMS_INVALID_ADDRESS The ``routine`` parameter was NULL.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
+ * number specified by ``vector``.
+ *
+ * @retval ::RTEMS_CALLED_FROM_ISR The directive was called from within
+ * interrupt context.
+ *
+ * @retval ::RTEMS_NO_MEMORY There was not enough memory available to allocate
+ * data structures to install the handler.
+ *
+ * @retval ::RTEMS_RESOURCE_IN_USE The #RTEMS_INTERRUPT_UNIQUE option was set
+ * in ``options`` and the interrupt vector was already occupied by a handler.
+ *
+ * @retval ::RTEMS_RESOURCE_IN_USE The #RTEMS_INTERRUPT_SHARED option was set
+ * in ``options`` and the interrupt vector was already occupied by a unique
+ * handler.
+ *
+ * @retval ::RTEMS_TOO_MANY The handler specified by ``routine`` was already
+ * installed for the interrupt vector specified by ``vector`` with an
+ * argument equal to the argument specified by ``arg``.
+ *
+ * @retval ::RTEMS_UNSATISFIED The #RTEMS_INTERRUPT_REPLACE option was set in
+ * ``options`` and no handler to replace was installed.
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_handler_install(
- rtems_vector_number vector,
- const char *info,
- rtems_option options,
- rtems_interrupt_handler handler,
- void *arg
+ rtems_vector_number vector,
+ const char *info,
+ rtems_option options,
+ rtems_interrupt_handler routine,
+ void *arg
);
+/* Generated from spec:/rtems/intr/if/handler-remove */
+
/**
- * @brief Removes the interrupt handler routine @a handler with argument @a arg
- * for the interrupt vector with number @a vector.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Removes the interrupt handler routine and argument from the interrupt
+ * vector.
+ *
+ * @param vector is the interrupt vector number.
*
- * This function may block.
+ * @param routine is the interrupt handler routine to remove.
*
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt
- * context this shall be returned.
- * @retval RTEMS_INVALID_ADDRESS If the handler address is NULL this shall be
- * returned.
- * @retval RTEMS_INVALID_ID If the vector number is out of range this shall be
- * returned.
- * @retval RTEMS_UNSATISFIED If the handler with its argument is not installed
- * for the vector this shall be returned.
- * @retval RTEMS_IO_ERROR Reserved for board support package specific error
- * conditions.
+ * @param arg is the interrupt handler argument to remove.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INCORRECT_STATE The service was not initialized.
+ *
+ * @retval ::RTEMS_INVALID_ADDRESS The ``routine`` parameter was NULL.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
+ * number specified by ``vector``.
+ *
+ * @retval ::RTEMS_CALLED_FROM_ISR The directive was called from within
+ * interrupt context.
+ *
+ * @retval ::RTEMS_UNSATISFIED There was no handler routine and argument pair
+ * installed specified by ``routine`` and ``arg``.
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_handler_remove(
- rtems_vector_number vector,
- rtems_interrupt_handler handler,
- void *arg
+ rtems_vector_number vector,
+ rtems_interrupt_handler routine,
+ void *arg
);
-/**
- * @brief Interrupt handler iteration routine type.
- *
- * @see rtems_interrupt_handler_iterate()
- */
-typedef void (*rtems_interrupt_per_handler_routine)(
- void *, const char *, rtems_option, rtems_interrupt_handler, void *
-);
+/* Generated from spec:/rtems/intr/if/get-affinity */
/**
- * @brief Iterates over all installed interrupt handler of the interrupt vector
- * with number @a vector.
+ * @ingroup RTEMSAPIClassicIntr
*
- * For each installed handler of the vector the function @a routine will be
- * called with the supplied argument @a arg and the handler information,
- * options, routine and argument.
+ * @brief Gets the processor affinity set of the interrupt vector.
*
- * This function is intended for system information and diagnostics.
+ * @param vector is the interrupt vector number.
*
- * This function may block. Never install or remove an interrupt handler
- * within the iteration routine. This may result in a deadlock.
+ * @param affinity_size is the size of the processor set referenced by
+ * ``affinity`` in bytes.
*
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_CALLED_FROM_ISR If this function is called from interrupt
- * context this shall be returned.
- * @retval RTEMS_INVALID_ID If the vector number is out of range this shall be
- * returned.
- * @retval RTEMS_IO_ERROR Reserved for board support package specific error
- * conditions.
+ * @param[out] affinity is the pointer to a cpu_set_t object. When the
+ * directive call is successful, the processor affinity set of the interrupt
+ * vector will be stored in this object. A set bit in the processor set
+ * means that the corresponding processor is in the processor affinity set of
+ * the interrupt vector, otherwise the bit is cleared.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INVALID_ADDRESS The ``affinity`` parameter was NULL.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
+ * number specified by ``vector``.
+ *
+ * @retval ::RTEMS_INVALID_SIZE The size specified by ``affinity_size`` of the
+ * processor set was too small for the processor affinity set of the
+ * interrupt vector.
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within interrupt context.
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive will not cause the calling task to be preempted.
+ * @endparblock
*/
-rtems_status_code rtems_interrupt_handler_iterate(
+rtems_status_code rtems_interrupt_get_affinity(
rtems_vector_number vector,
- rtems_interrupt_per_handler_routine routine,
- void *arg
+ size_t affinity_size,
+ cpu_set_t *affinity
);
+/* Generated from spec:/rtems/intr/if/set-affinity */
+
/**
- * @brief Sets the processor affinity set of an interrupt vector.
+ * @ingroup RTEMSAPIClassicIntr
*
- * @param[in] vector The interrupt vector number.
- * @param[in] affinity_size The storage size of the affinity set.
- * @param[in] affinity_set The new processor affinity set for the interrupt
- * vector. This pointer must not be @c NULL.
+ * @brief Sets the processor affinity set of the interrupt vector.
*
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_INVALID_ID The vector number is invalid.
- * @retval RTEMS_INVALID_SIZE Invalid affinity set size.
- * @retval RTEMS_INVALID_NUMBER Invalid processor affinity set.
+ * @param vector is the interrupt vector number.
+ *
+ * @param affinity_size is the size of the processor set referenced by
+ * ``affinity`` in bytes.
+ *
+ * @param affinity is the pointer to a cpu_set_t object. The processor set
+ * defines the new processor affinity set of the interrupt vector. A set bit
+ * in the processor set means that the corresponding processor shall be in
+ * the processor affinity set of the interrupt vector, otherwise the bit
+ * shall be cleared.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INVALID_ADDRESS The ``affinity`` parameter was NULL.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
+ * number specified by ``vector``.
+ *
+ * @retval ::RTEMS_INVALID_NUMBER The referenced processor set was not a valid
+ * new processor affinity set for the interrupt vector.
+ *
+ * @retval ::RTEMS_UNSATISFIED The request to set the processor affinity of the
+ * interrupt vector has not been satisfied.
+ *
+ * @par Notes
+ * The rtems_interrupt_get_attributes() directive may be used to check if the
+ * processor affinity of an interrupt vector can be set.
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within interrupt context.
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive will not cause the calling task to be preempted.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_set_affinity(
- rtems_vector_number vector,
- size_t affinity_size,
- const cpu_set_t *affinity
+ rtems_vector_number vector,
+ size_t affinity_size,
+ const cpu_set_t *affinity
);
+/* Generated from spec:/rtems/intr/if/handler-iterate */
+
/**
- * @brief Gets the processor affinity set of an interrupt vector.
+ * @ingroup RTEMSAPIClassicIntr
*
- * @param[in] vector The interrupt vector number.
- * @param[in] affinity_size The storage size of the affinity set.
- * @param[out] affinity_set The current processor affinity set for the
- * interrupt vector. This pointer must not be @c NULL.
+ * @brief Iterates over all interrupt handler installed at the interrupt
+ * vector.
*
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_INVALID_ID The vector number is invalid.
- * @retval RTEMS_INVALID_SIZE Invalid affinity set size.
- */
-rtems_status_code rtems_interrupt_get_affinity(
- rtems_vector_number vector,
- size_t affinity_size,
- cpu_set_t *affinity
-);
-
-/**
- * @brief An interrupt server action.
+ * @param vector is the interrupt vector number.
+ *
+ * @param routine is the visitor routine.
+ *
+ * @param arg is the visitor argument.
+ *
+ * For each installed handler at the interrupt vector the visitor function
+ * specified by ``routine`` will be called with the argument specified by
+ * ``arg`` and the handler information, options, routine and argument.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INCORRECT_STATE The service was not initialized.
+ *
+ * @retval ::RTEMS_INVALID_ADDRESS The ``routine`` parameter was NULL.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
+ * number specified by ``vector``.
+ *
+ * @retval ::RTEMS_CALLED_FROM_ISR The directive was called from within
+ * interrupt context.
+ *
+ * @par Notes
+ * @parblock
+ * The directive is intended for system information and diagnostics.
*
- * This structure must be treated as an opaque data type. Members must not be
- * accessed directly.
+ * Never install or remove an interrupt handler within the visitor function.
+ * This may result in a deadlock.
+ * @endparblock
*
- * @see rtems_interrupt_server_action_prepend().
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ * @endparblock
*/
-typedef struct rtems_interrupt_server_action {
- struct rtems_interrupt_server_action *next;
- rtems_interrupt_handler handler;
- void *arg;
-} rtems_interrupt_server_action;
+rtems_status_code rtems_interrupt_handler_iterate(
+ rtems_vector_number vector,
+ rtems_interrupt_per_handler_routine routine,
+ void *arg
+);
+
+/* Generated from spec:/rtems/intr/if/server-default */
/**
- * @brief The interrupt server index of the default interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief The constant represents the index of the default interrupt server.
*/
#define RTEMS_INTERRUPT_SERVER_DEFAULT 0
+/* Generated from spec:/rtems/intr/if/server-control */
+
/**
- * @brief An interrupt server control.
+ * @ingroup RTEMSAPIClassicIntr
*
- * This structure must be treated as an opaque data type. Members must not be
- * accessed directly.
+ * @brief This structure represents an interrupt server.
*
- * @see rtems_interrupt_server_create()
+ * @par Notes
+ * This structure shall be treated as an opaque data type from the API point of
+ * view. Members shall not be accessed directly. The structure is initialized
+ * by rtems_interrupt_server_create() and maintained by the interrupt server
+ * support.
*/
typedef struct rtems_interrupt_server_control {
- RTEMS_INTERRUPT_LOCK_MEMBER( lock )
- rtems_chain_control entries;
- rtems_id server;
- unsigned long errors;
- uint32_t index;
- rtems_chain_node node;
+ #if defined(RTEMS_SMP)
+ /**
+ * @brief This member is the ISR lock protecting the server control state.
+ */
+ rtems_interrupt_lock lock;
+ #endif
+
+ /**
+ * @brief This member is the chain of pending interrupt entries.
+ */
+ Chain_Control entries;
+
+ /**
+ * @brief This member is the identifier of the server task.
+ */
+ rtems_id server;
+
+ /**
+ * @brief This member is the error count.
+ */
+ unsigned long errors;
+
+ /**
+ * @brief This member is the server index.
+ */
+ uint32_t index;
+
+ /**
+ * @brief This member is the node for the interrupt server registry.
+ */
+ Chain_Node node;
+
+ /**
+ * @brief This member is the optional handler to destroy the interrupt server
+ * control.
+ */
void ( *destroy )( struct rtems_interrupt_server_control * );
} rtems_interrupt_server_control;
+/* Generated from spec:/rtems/intr/if/server-config */
+
/**
- * @brief An interrupt server configuration.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief This structure defines an interrupt server configuration.
*
- * @see rtems_interrupt_server_create()
+ * @par Notes
+ * See also rtems_interrupt_server_create().
*/
typedef struct {
/**
- * @brief The task name of the interrupt server.
+ * @brief This member is the task name of the interrupt server.
*/
rtems_name name;
/**
- * @brief The initial task priority of the interrupt server.
+ * @brief This member is the initial task priority of the interrupt server.
*/
rtems_task_priority priority;
/**
- * @brief The task storage area of the interrupt server.
+ * @brief This member is the task storage area of the interrupt server.
*
* It shall be NULL for interrupt servers created by
* rtems_interrupt_server_create().
@@ -296,127 +568,142 @@ typedef struct {
void *storage_area;
/**
- * @brief The task storage size of the interrupt server.
+ * @brief This member is the task storage size of the interrupt server.
*
- * For interrupt servers created by rtems_interrupt_server_create() this is
- * the task stack size.
+ * For interrupt servers created by rtems_interrupt_server_create() this is the
+ * task stack size.
*/
size_t storage_size;
/**
- * @brief The initial task modes of the interrupt server.
+ * @brief This member is the initial mode set of the interrupt server.
*/
rtems_mode modes;
/**
- * @brief The task attributes of the interrupt server.
+ * @brief This member is the attribute set of the interrupt server.
*/
rtems_attribute attributes;
/**
- * @brief An optional handler to destroy the interrupt server control handed
- * over to rtems_interrupt_server_create().
+ * @brief This member is an optional handler to destroy the interrupt server
+ * control handed over to rtems_interrupt_server_create().
*
- * This handler is called in the context of the interrupt server to be
+ * The destroy handler is optional and may be NULL. If the destroy handler is
+ * present, it is called from within the context of the interrupt server to be
* deleted, see also rtems_interrupt_server_delete().
*/
void ( *destroy )( rtems_interrupt_server_control * );
} rtems_interrupt_server_config;
+/* Generated from spec:/rtems/intr/if/server-initialize */
+
/**
- * @brief An interrupt server entry.
+ * @ingroup RTEMSAPIClassicIntr
*
- * This structure must be treated as an opaque data type. Members must not be
- * accessed directly.
+ * @brief Initializes the interrupt server tasks.
*
- * @see rtems_interrupt_server_entry_initialize(),
- * rtems_interrupt_server_action_prepend(),
- * rtems_interrupt_server_entry_submit(), and
- * rtems_interrupt_server_entry_destroy().
- */
-typedef struct {
- rtems_chain_node node;
- void *server;
- rtems_vector_number vector;
- rtems_interrupt_server_action *actions;
-} rtems_interrupt_server_entry;
-
-/**
- * @brief An interrupt server request.
+ * @param priority is the initial task priority of the created interrupt
+ * servers.
*
- * This structure must be treated as an opaque data type. Members must not be
- * accessed directly.
+ * @param stack_size is the task stack size of the created interrupt servers.
*
- * @see rtems_interrupt_server_request_initialize(),
- * rtems_interrupt_server_request_set_vector(),
- * rtems_interrupt_server_request_submit(), and
- * rtems_interrupt_server_request_destroy().
- */
-typedef struct {
- rtems_interrupt_server_entry entry;
- rtems_interrupt_server_action action;
-} rtems_interrupt_server_request;
-
-/**
- * @brief Initializes the interrupt server tasks.
+ * @param modes is the initial mode set of the created interrupt servers.
+ *
+ * @param attributes is the attribute set of the created interrupt servers.
+ *
+ * @param[out] server_count is the pointer to an uint32_t object or NULL. When
+ * the pointer is not equal to NULL, the count of successfully created
+ * interrupt servers is stored in this object regardless of the return
+ * status.
+ *
+ * The directive tries to create an interrupt server task for each online
+ * processor in the system. The tasks will have the initial priority specified
+ * by ``priority``, the stack size specified by ``stack_size``, the initial
+ * mode set specified by ``modes``, and the attribute set specified by
+ * ``attributes``. The count of successfully created server tasks will be
+ * returned in ``server_count`` if the pointer is not equal to NULL.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
*
- * This function tries to create an interrupt server task for each processor in
- * the system. The tasks will have the priority @a priority, the stack size @a
- * stack_size, the modes @a modes and the attributes @a attributes. The count
- * of server tasks will be returned in @a server_count. Interrupt handlers can
- * be installed on an interrupt server with
+ * @retval ::RTEMS_INCORRECT_STATE The interrupt servers were already
+ * initialized.
+ *
+ * @return The directive uses rtems_task_create(). If this directive fails,
+ * then its error status will be returned.
+ *
+ * @par Notes
+ * @parblock
+ * Interrupt handlers may be installed on an interrupt server with
* rtems_interrupt_server_handler_install() and removed with
* rtems_interrupt_server_handler_remove() using a server index. In case of an
* interrupt, the request will be forwarded to the interrupt server. The
* handlers are executed within the interrupt server context. If one handler
* blocks on something this may delay the processing of other handlers.
*
- * The server count pointer @a server_count may be @a NULL.
- *
- * The task name of interrupt servers created by this function is
- * rtems_build_name( 'I', 'R', 'Q', 'S' ).
- *
- * This function may block.
+ * Interrupt servers may be deleted by rtems_interrupt_server_delete().
+ * @endparblock
*
- * @retval RTEMS_SUCCESSFUL The operation was successful.
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
*
- * @retval RTEMS_INCORRECT_STATE The interrupt servers were already initialized.
+ * * The directive may be called from within device driver initialization
+ * context.
*
- * @return The function uses rtems_task_create(). If this operation is not
- * successful, then its status code is returned.
+ * * The directive may be called from within task context.
*
- * @see rtems_interrupt_server_create() and rtems_interrupt_server_delete().
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_server_initialize(
rtems_task_priority priority,
- size_t stack_size,
- rtems_mode modes,
- rtems_attribute attributes,
- uint32_t *server_count
+ size_t stack_size,
+ rtems_mode modes,
+ rtems_attribute attributes,
+ uint32_t *server_count
);
+/* Generated from spec:/rtems/intr/if/server-create */
+
/**
- * @brief Creates an interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
*
- * This function may block.
+ * @brief Creates an interrupt server.
*
- * @param[out] control is the interrupt server control. The ownership of this
- * structure is transferred from the caller of this function to the interrupt
+ * @param[out] control is the pointer to an rtems_interrupt_server_control
+ * object. When the directive call was successful, the ownership of the
+ * object was transferred from the caller of the directive to the interrupt
* server management.
*
* @param config is the interrupt server configuration.
*
- * @param[out] server_index is the pointer to a server index variable. The
- * index of the built interrupt server will be stored in the referenced
- * variable if the operation was successful.
+ * @param[out] server_index is the pointer to an uint32_t object. When the
+ * directive call was successful, the index of the created interrupt server
+ * will be stored in this object.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @return The directive uses rtems_task_create(). If this directive fails,
+ * then its error status will be returned.
+ *
+ * @par Notes
+ * See also rtems_interrupt_server_initialize() and
+ * rtems_interrupt_server_delete().
*
- * @retval RTEMS_SUCCESSFUL The operation was successful.
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
*
- * @return The function uses rtems_task_create(). If this operation is not
- * successful, then its status code is returned.
+ * * The directive may be called from within device driver initialization
+ * context.
*
- * @see rtems_interrupt_server_initialize() and
- * rtems_interrupt_server_delete().
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_server_create(
rtems_interrupt_server_control *control,
@@ -424,318 +711,832 @@ rtems_status_code rtems_interrupt_server_create(
uint32_t *server_index
);
+/* Generated from spec:/rtems/intr/if/server-handler-install */
+
/**
- * @brief Destroys the interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Installs the interrupt handler routine and argument at the interrupt
+ * vector on the interrupt server.
*
- * This function may block.
+ * @param server_index is the interrupt server index. The constant
+ * #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default
+ * interrupt server.
*
- * The interrupt server deletes itself, so after the return of the function the
- * interrupt server may be still in the termination process depending on the
- * task priorities of the system.
+ * @param vector is the interrupt vector number.
*
- * @param server_index is the index of the interrupt server to destroy. Use
- * ::RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
+ * @param info is the descriptive information of the interrupt handler to
+ * install.
*
- * @retval RTEMS_SUCCESSFUL The operation was successful.
- * @retval RTEMS_INVALID_ID The interrupt server index was invalid.
+ * @param options is the interrupt handler install option set.
*
- * @see rtems_interrupt_server_create()
- */
-rtems_status_code rtems_interrupt_server_delete( uint32_t server_index );
-
-/**
- * @brief Installs the interrupt handler routine @a handler for the interrupt
- * vector with number @a vector on the server @a server.
+ * @param routine is the interrupt handler routine to install.
+ *
+ * @param arg is the interrupt handler argument to install.
+ *
+ * The handler routine specified by ``routine`` will be executed within the
+ * context of the interrupt server task specified by ``server_index``.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
*
- * The handler routine will be executed on the corresponding interrupt server
- * task. A server index @a server_index of @c RTEMS_INTERRUPT_SERVER_DEFAULT
- * may be used to install the handler on the default server.
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``server_index``.
*
- * This function may block.
+ * @retval ::RTEMS_CALLED_FROM_ISR The directive was called from within
+ * interrupt context.
*
- * @see rtems_interrupt_handler_install().
+ * @retval ::RTEMS_INVALID_ADDRESS The ``routine`` parameter was NULL.
*
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
- * @retval * For other errors see rtems_interrupt_handler_install().
+ * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
+ * number specified by ``vector``.
+ *
+ * @retval ::RTEMS_INVALID_NUMBER An option specified by ``info`` was not
+ * applicable.
+ *
+ * @retval ::RTEMS_RESOURCE_IN_USE The #RTEMS_INTERRUPT_UNIQUE option was set
+ * in ``info`` and the interrupt vector was already occupied by a handler.
+ *
+ * @retval ::RTEMS_RESOURCE_IN_USE The #RTEMS_INTERRUPT_SHARED option was set
+ * in ``info`` and the interrupt vector was already occupied by a unique
+ * handler.
+ *
+ * @retval ::RTEMS_TOO_MANY The handler specified by ``routine`` was already
+ * installed for the interrupt vector specified by ``vector`` with an
+ * argument equal to the argument specified by ``arg``.
+ *
+ * @retval ::RTEMS_UNSATISFIED The #RTEMS_INTERRUPT_REPLACE option was set in
+ * ``info`` and no handler to replace was installed.
+ *
+ * @par Notes
+ * See also rtems_interrupt_handler_install().
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_server_handler_install(
- uint32_t server_index,
- rtems_vector_number vector,
- const char *info,
- rtems_option options,
- rtems_interrupt_handler handler,
- void *arg
+ uint32_t server_index,
+ rtems_vector_number vector,
+ const char *info,
+ rtems_option options,
+ rtems_interrupt_handler routine,
+ void *arg
);
+/* Generated from spec:/rtems/intr/if/server-handler-remove */
+
/**
- * @brief Removes the interrupt handler routine @a handler with argument @a arg
- * for the interrupt vector with number @a vector from the server @a server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Removes the interrupt handler routine and argument from the interrupt
+ * vector and the interrupt server.
*
- * A server index @a server_index of @c RTEMS_INTERRUPT_SERVER_DEFAULT may be
- * used to remove the handler from the default server.
+ * @param server_index is the interrupt server index. The constant
+ * #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default
+ * interrupt server.
*
- * This function may block.
+ * @param vector is the interrupt vector number.
*
- * @see rtems_interrupt_handler_remove().
+ * @param routine is the interrupt handler routine to remove.
*
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
- * @retval * For other errors see rtems_interrupt_handler_remove().
+ * @param arg is the interrupt handler argument to remove.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``server_index``.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
+ * number specified by ``vector``.
+ *
+ * @retval ::RTEMS_UNSATISFIED There was no handler routine and argument pair
+ * installed specified by ``routine`` and ``arg``.
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ *
+ * * The directive sends a request to another task and waits for a response.
+ * This may cause the calling task to be blocked and unblocked.
+ *
+ * * The directive shall not be called from within the context of an interrupt
+ * server. Calling the directive from within the context of an interrupt
+ * server is undefined behaviour.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_server_handler_remove(
- uint32_t server_index,
- rtems_vector_number vector,
- rtems_interrupt_handler handler,
- void *arg
+ uint32_t server_index,
+ rtems_vector_number vector,
+ rtems_interrupt_handler routine,
+ void *arg
);
+/* Generated from spec:/rtems/intr/if/server-set-affinity */
+
/**
- * @brief Iterates over all interrupt handler of the interrupt vector with
- * number @a vector which are installed on the interrupt server specified by
- * @a server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Sets the processor affinity of the interrupt server.
+ *
+ * @param server_index is the interrupt server index. The constant
+ * #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default
+ * interrupt server.
*
- * A server index @a server_index of @c RTEMS_INTERRUPT_SERVER_DEFAULT may be
- * used to specify the default server.
+ * @param affinity_size is the size of the processor set referenced by
+ * ``affinity`` in bytes.
*
- * @see rtems_interrupt_handler_iterate()
+ * @param affinity is the pointer to a cpu_set_t object. The processor set
+ * defines the new processor affinity set of the interrupt server. A set bit
+ * in the processor set means that the corresponding processor shall be in
+ * the processor affinity set of the task, otherwise the bit shall be
+ * cleared.
*
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
- * @retval * For other errors see rtems_interrupt_handler_iterate().
+ * @param priority is the new real priority for the interrupt server.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``server_index``.
+ *
+ * @return The directive uses rtems_scheduler_ident_by_processor_set(),
+ * rtems_task_set_scheduler(), and rtems_task_set_affinity(). If one of
+ * these directive fails, then its error status will be returned.
+ *
+ * @par Notes
+ * @parblock
+ * The scheduler is set determined by the highest numbered processor in the
+ * affinity set specified by ``affinity``.
+ *
+ * This operation is only reliable in case the interrupt server was suspended
+ * via rtems_interrupt_server_suspend().
+ * @endparblock
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within interrupt context.
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may change the processor affinity of a task. This may cause
+ * the calling task to be preempted.
+ *
+ * * The directive may change the priority of a task. This may cause the
+ * calling task to be preempted.
+ * @endparblock
*/
-rtems_status_code rtems_interrupt_server_handler_iterate(
- uint32_t server_index,
- rtems_vector_number vector,
- rtems_interrupt_per_handler_routine routine,
- void *arg
+rtems_status_code rtems_interrupt_server_set_affinity(
+ uint32_t server_index,
+ size_t affinity_size,
+ const cpu_set_t *affinity,
+ rtems_task_priority priority
);
+/* Generated from spec:/rtems/intr/if/server-delete */
+
/**
- * @brief Moves the interrupt handlers installed on the specified source
- * interrupt server to the destination interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Deletes the interrupt server.
*
- * This function must be called from thread context. It may block. Calling
- * this function within the context of an interrupt server is undefined
- * behaviour.
+ * @param server_index is the index of the interrupt server to delete.
*
- * @param[in] source_server_index The source interrupt server index. Use
- * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
- * @param[in] vector The interrupt vector number.
- * @param[in] destination_server_index The destination interrupt server index.
- * Use @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
*
- * @retval RTEMS_SUCCESSFUL Successful operation
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID The destination interrupt server index is invalid.
- * @retval RTEMS_INVALID_ID The vector number is invalid.
- * @retval RTEMS_INVALID_ID The destination interrupt server index is invalid.
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * server index specified by ``server_index``.
+ *
+ * @par Notes
+ * @parblock
+ * The interrupt server deletes itself, so after the return of the directive
+ * the interrupt server may be still in the termination process depending on
+ * the task priorities of the system.
+ *
+ * See also rtems_interrupt_server_create().
+ * @endparblock
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive shall not be called from within the context of an interrupt
+ * server. Calling the directive from within the context of an interrupt
+ * server is undefined behaviour.
+ *
+ * * The directive sends a request to another task and waits for a response.
+ * This may cause the calling task to be blocked and unblocked.
+ * @endparblock
*/
-rtems_status_code rtems_interrupt_server_move(
- uint32_t source_server_index,
- rtems_vector_number vector,
- uint32_t destination_server_index
-);
+rtems_status_code rtems_interrupt_server_delete( uint32_t server_index );
+
+/* Generated from spec:/rtems/intr/if/server-suspend */
/**
- * @brief Suspends the specified interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Suspends the interrupt server.
+ *
+ * @param server_index is the index of the interrupt server to suspend. The
+ * constant #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the
+ * default interrupt server.
*
- * A suspend request is sent to the specified interrupt server. This function
- * waits for an acknowledgment from the specified interrupt server.
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
*
- * This function must be called from thread context. It may block. Calling
- * this function within the context of an interrupt server is undefined
- * behaviour.
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``server_index``.
*
- * @param[in] server_index The interrupt server index. Use
- * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
+ * @par Notes
+ * Interrupt server may be resumed by rtems_interrupt_server_resume().
*
- * @see rtems_interrupt_server_resume().
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
*
- * @retval RTEMS_SUCCESSFUL Successful operation
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
+ * * The directive may be called from within task context.
+ *
+ * * The directive shall not be called from within the context of an interrupt
+ * server. Calling the directive from within the context of an interrupt
+ * server is undefined behaviour.
+ *
+ * * The directive sends a request to another task and waits for a response.
+ * This may cause the calling task to be blocked and unblocked.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_server_suspend( uint32_t server_index );
+/* Generated from spec:/rtems/intr/if/server-resume */
+
/**
- * @brief Resumes the specified interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Resumes the interrupt server.
+ *
+ * @param server_index is the index of the interrupt server to resume. The
+ * constant #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the
+ * default interrupt server.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
*
- * This function must be called from thread context. It may block. Calling
- * this function within the context of an interrupt server is undefined
- * behaviour.
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``server_index``.
*
- * @param[in] server_index The interrupt server index. Use
- * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
+ * @par Notes
+ * Interrupt server may be suspended by rtems_interrupt_server_suspend().
*
- * @see rtems_interrupt_server_suspend().
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
*
- * @retval RTEMS_SUCCESSFUL Successful operation
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
+ * * The directive may be called from within task context.
+ *
+ * * The directive shall not be called from within the context of an interrupt
+ * server. Calling the directive from within the context of an interrupt
+ * server is undefined behaviour.
+ *
+ * * The directive sends a request to another task and waits for a response.
+ * This may cause the calling task to be blocked and unblocked.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_server_resume( uint32_t server_index );
+/* Generated from spec:/rtems/intr/if/server-move */
+
/**
- * @brief Sets the processor affinity of the specified interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
*
- * The scheduler is set determined by the highest numbered processor in the
- * specified affinity set.
+ * @brief Moves the interrupt handlers installed at the interrupt vector and
+ * the source interrupt server to the destination interrupt server.
*
- * This operation is only reliable in case the specified interrupt was
- * suspended via rtems_interrupt_server_suspend().
+ * @param source_server_index is the index of the source interrupt server. The
+ * constant #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the
+ * default interrupt server.
*
- * @param[in] server_index The interrupt server index. Use
- * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
- * @param[in] affinity_size The storage size of the affinity set.
- * @param[in] affinity The desired processor affinity set for the specified
- * interrupt server.
- * @param[in] priority The task priority with respect to the corresponding
- * scheduler instance.
- *
- * @retval RTEMS_SUCCESSFUL Successful operation
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
- * @retval RTEMS_INVALID_SIZE Invalid affinity set size.
- * @retval RTEMS_INVALID_NAME The affinity set contains no online processor.
- * @retval RTEMS_INCORRECT_STATE The highest numbered online processor in the
- * specified affinity set is not owned by a scheduler.
- * @retval RTEMS_INVALID_PRIORITY Invalid priority.
- * @retval RTEMS_RESOURCE_IN_USE The interrupt server owns resources which deny
- * a scheduler change.
- * @retval RTEMS_INVALID_NUMBER Invalid processor affinity set.
+ * @param vector is the interrupt vector number.
+ *
+ * @param destination_server_index is the index of the destination interrupt
+ * server. The constant #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to
+ * specify the default interrupt server.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``source_server_index``.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``destination_server_index``.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
+ * number specified by ``vector``.
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive shall not be called from within the context of an interrupt
+ * server. Calling the directive from within the context of an interrupt
+ * server is undefined behaviour.
+ *
+ * * The directive sends a request to another task and waits for a response.
+ * This may cause the calling task to be blocked and unblocked.
+ * @endparblock
*/
-rtems_status_code rtems_interrupt_server_set_affinity(
- uint32_t server_index,
- size_t affinity_size,
- const cpu_set_t *affinity,
- rtems_task_priority priority
+rtems_status_code rtems_interrupt_server_move(
+ uint32_t source_server_index,
+ rtems_vector_number vector,
+ uint32_t destination_server_index
+);
+
+/* Generated from spec:/rtems/intr/if/server-handler-iterate */
+
+/**
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Iterates over all interrupt handler installed at the interrupt vector
+ * and interrupt server.
+ *
+ * @param server_index is the index of the interrupt server.
+ *
+ * @param vector is the interrupt vector number.
+ *
+ * @param routine is the visitor routine.
+ *
+ * @param arg is the visitor argument.
+ *
+ * For each installed handler at the interrupt vector and interrupt server the
+ * visitor function specified by ``vector`` will be called with the argument
+ * specified by ``routine`` and the handler information, options, routine and
+ * argument.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``server_index``.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt vector associated with the
+ * number specified by ``vector``.
+ *
+ * @par Notes
+ * @parblock
+ * The directive is intended for system information and diagnostics.
+ *
+ * Never install or remove an interrupt handler within the visitor function.
+ * This may result in a deadlock.
+ * @endparblock
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ * @endparblock
+ */
+rtems_status_code rtems_interrupt_server_handler_iterate(
+ uint32_t server_index,
+ rtems_vector_number vector,
+ rtems_interrupt_per_handler_routine routine,
+ void *arg
);
+/* Generated from spec:/rtems/intr/if/server-action */
+
/**
- * @brief Initializes the specified interrupt server entry.
+ * @ingroup RTEMSAPIClassicIntr
*
- * @param[in] server_index The interrupt server index. Use
- * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
- * @param[in] entry The interrupt server entry to initialize.
+ * @brief This structure represents an interrupt server action.
+ *
+ * @par Notes
+ * This structure shall be treated as an opaque data type from the API point of
+ * view. Members shall not be accessed directly.
+ */
+typedef struct rtems_interrupt_server_action {
+ /**
+ * @brief This member is the reference to the next action or NULL.
+ */
+ struct rtems_interrupt_server_action *next;
+
+ /**
+ * @brief This member is the interrupt handler.
+ */
+ rtems_interrupt_handler handler;
+
+ /**
+ * @brief This member is the interrupt handler argument.
+ */
+ void *arg;
+} rtems_interrupt_server_action;
+
+/* Generated from spec:/rtems/intr/if/server-entry */
+
+/**
+ * @ingroup RTEMSAPIClassicIntr
*
- * @see rtems_interrupt_server_action_prepend().
+ * @brief This structure represents an interrupt server entry.
*
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
+ * @par Notes
+ * This structure shall be treated as an opaque data type from the API point of
+ * view. Members shall not be accessed directly. An entry is initialized by
+ * rtems_interrupt_server_entry_initialize() and destroyed by
+ * rtems_interrupt_server_entry_destroy(). Interrupt server actions can be
+ * prepended to the entry by rtems_interrupt_server_action_prepend(). The
+ * entry is submitted to be serviced by rtems_interrupt_server_entry_submit().
+ */
+typedef struct {
+ /**
+ * @brief This member is the node for the interrupt entry processing.
+ */
+ Chain_Node node;
+
+ /**
+ * @brief This member references the interrupt server used to process the
+ * entry.
+ */
+ rtems_interrupt_server_control *server;
+
+ /**
+ * @brief This member is the interrupt vector number.
+ */
+ rtems_vector_number vector;
+
+ /**
+ * @brief This member is the interrupt server actions list head.
+ */
+ rtems_interrupt_server_action *actions;
+} rtems_interrupt_server_entry;
+
+/* Generated from spec:/rtems/intr/if/server-entry-initialize */
+
+/**
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Initializes the interrupt server entry.
+ *
+ * @param server_index is the interrupt server index. The constant
+ * #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default
+ * interrupt server.
+ *
+ * @param entry is the interrupt server entry to initialize.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``server_index``.
+ *
+ * @par Notes
+ * After initialization, the list of actions of the interrupt server entry is
+ * empty. Actions may be prepended by rtems_interrupt_server_action_prepend().
+ * Interrupt server entries may be moved to another interrupt vector with
+ * rtems_interrupt_server_entry_move(). Server entries may be submitted to get
+ * serviced by the interrupt server with rtems_interrupt_server_entry_submit().
+ * Server entries may be destroyed by rtems_interrupt_server_entry_destroy().
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_server_entry_initialize(
uint32_t server_index,
rtems_interrupt_server_entry *entry
);
+/* Generated from spec:/rtems/intr/if/server-action-prepend */
+
/**
- * @brief Prepends the specified interrupt server action to the list of actions
- * of the specified interrupt server entry.
+ * @ingroup RTEMSAPIClassicIntr
*
- * No error checking is performed.
+ * @brief Prepends the interrupt server action to the list of actions of the
+ * interrupt server entry.
*
- * @param[in] entry The interrupt server entry to prepend the interrupt server
- * action. It must have been initialized via
+ * @param[in,out] entry is the interrupt server entry to prepend the interrupt
+ * server action. It shall have been initialized via
* rtems_interrupt_server_entry_initialize().
- * @param[in] action The interrupt server action to prepend the list of actions
- * of the entry.
- * @param[in] handler The interrupt handler for the action.
- * @param[in] arg The interrupt handler argument for the action.
+ *
+ * @param[out] action is the interrupt server action to initialize and prepend
+ * to the list of actions of the entry.
+ *
+ * @param routine is the interrupt handler routine to set in the action.
+ *
+ * @param arg is the interrupt handler argument to set in the action.
+ *
+ * @par Notes
+ * No error checking is performed by the directive.
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within interrupt context.
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive will not cause the calling task to be preempted.
+ *
+ * * The interrupt server entry shall have been initialized by
+ * rtems_interrupt_server_entry_initialize() and further optional calls to
+ * rtems_interrupt_server_action_prepend().
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_action_prepend() with the same interrupt server
+ * entry. Calling the directive under this condition is undefined behaviour.
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_entry_move() with the same interrupt server entry.
+ * Calling the directive under this condition is undefined behaviour.
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_entry_submit() with the same interrupt server
+ * entry. Calling the directive under this condition is undefined behaviour.
+ *
+ * * The directive shall not be called while the interrupt server entry is
+ * pending on or serviced by its current interrupt server. Calling the
+ * directive under these conditions is undefined behaviour.
+ * @endparblock
*/
void rtems_interrupt_server_action_prepend(
rtems_interrupt_server_entry *entry,
rtems_interrupt_server_action *action,
- rtems_interrupt_handler handler,
+ rtems_interrupt_handler routine,
void *arg
);
+/* Generated from spec:/rtems/intr/if/server-entry-destroy */
+
+/**
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Destroys the interrupt server entry.
+ *
+ * @param[in,out] entry is the interrupt server entry to destroy.
+ *
+ * @par Notes
+ * No error checking is performed by the directive.
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive shall not be called from within the context of an interrupt
+ * server. Calling the directive from within the context of an interrupt
+ * server is undefined behaviour.
+ *
+ * * The directive sends a request to another task and waits for a response.
+ * This may cause the calling task to be blocked and unblocked.
+ *
+ * * The interrupt server entry shall have been initialized by
+ * rtems_interrupt_server_entry_initialize() and further optional calls to
+ * rtems_interrupt_server_action_prepend().
+ * @endparblock
+ */
+void rtems_interrupt_server_entry_destroy(
+ rtems_interrupt_server_entry *entry
+);
+
+/* Generated from spec:/rtems/intr/if/server-entry-submit */
+
/**
- * @brief Submits the specified interrupt server entry so that its interrupt
- * server actions can be invoked by the specified interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Submits the interrupt server entry to be serviced by the interrupt
+ * server.
+ *
+ * @param entry is the interrupt server entry to submit.
+ *
+ * The directive appends the entry to the pending entries of the interrupt
+ * server. The interrupt server is notified that a new entry is pending. Once
+ * the interrupt server is scheduled it services the actions of all pending
+ * entries.
+ *
+ * @par Notes
+ * @parblock
+ * This directive may be used to do a two-step interrupt processing. The first
+ * step is done from within interrupt context by a call to this directive. The
+ * second step is then done from within the context of the interrupt server.
+ *
+ * No error checking is performed by the directive.
+ *
+ * A submitted entry may be destroyed by
+ * rtems_interrupt_server_entry_destroy().
+ * @endparblock
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within interrupt context.
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
*
- * This function may be used to do a two-step interrupt processing. The first
- * step is done in interrupt context which calls this function. The second
- * step is then done in the context of the interrupt server.
+ * * The directive may unblock a task. This may cause the calling task to be
+ * preempted.
*
- * This function may be called from thread or interrupt context. It does not
- * block. No error checking is performed.
+ * * The interrupt server entry shall have been initialized by
+ * rtems_interrupt_server_entry_initialize() and further optional calls to
+ * rtems_interrupt_server_action_prepend().
*
- * @param[in] entry The interrupt server entry must be initialized before the
- * first call to this function via rtems_interrupt_server_entry_initialize()
- * and rtems_interrupt_server_action_prepend(). The entry and its actions
- * must not be modified between calls to this function. Use
- * rtems_interrupt_server_entry_destroy() to destroy an entry in use.
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_action_prepend() with the same interrupt server
+ * entry. Calling the directive under this condition is undefined behaviour.
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_entry_move() with the same interrupt server entry.
+ * Calling the directive under this condition is undefined behaviour.
+ * @endparblock
*/
void rtems_interrupt_server_entry_submit(
rtems_interrupt_server_entry *entry
);
+/* Generated from spec:/rtems/intr/if/server-entry-move */
+
/**
- * @brief Moves the interrupt server entry to the specified destination
- * interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Moves the interrupt server entry to the interrupt server.
+ *
+ * @param entry is the interrupt server entry to move.
+ *
+ * @param server_index is the index of the destination interrupt server. The
+ * constant #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the
+ * default interrupt server.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``server_index``.
*
- * Calling this function concurrently with rtems_interrupt_server_entry_submit()
- * with the same entry or while the entry is enqueued on the previous interrupt
- * server is undefined behaviour.
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
*
- * @param[in,out] entry The interrupt server entry. It must have be initialized
- * before the call to this function.
- * @param destination_server_index The destination interrupt server index.
- * Use @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
+ * * The directive may be called from within device driver initialization
+ * context.
*
- * @retval RTEMS_SUCCESSFUL Successful operation
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID The destination interrupt server index is invalid.
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ *
+ * * The interrupt server entry shall have been initialized by
+ * rtems_interrupt_server_entry_initialize() and further optional calls to
+ * rtems_interrupt_server_action_prepend().
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_action_prepend() with the same interrupt server
+ * entry. Calling the directive under this condition is undefined behaviour.
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_entry_move() with the same interrupt server entry.
+ * Calling the directive under this condition is undefined behaviour.
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_entry_submit() with the same interrupt server
+ * entry. Calling the directive under this condition is undefined behaviour.
+ *
+ * * The directive shall not be called while the interrupt server entry is
+ * pending on or serviced by its current interrupt server. Calling the
+ * directive under these conditions is undefined behaviour.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_server_entry_move(
rtems_interrupt_server_entry *entry,
- uint32_t destination_server_index
+ uint32_t server_index
);
+/* Generated from spec:/rtems/intr/if/server-request */
+
/**
- * @brief Destroys the specified interrupt server entry.
+ * @ingroup RTEMSAPIClassicIntr
*
- * This function must be called from thread context. It may block. Calling
- * this function within the context of an interrupt server is undefined
- * behaviour. No error checking is performed.
+ * @brief This structure represents an interrupt server request.
*
- * @param[in] entry The interrupt server entry to destroy. It must have been
- * initialized via rtems_interrupt_server_entry_initialize().
+ * @par Notes
+ * This structure shall be treated as an opaque data type from the API point of
+ * view. Members shall not be accessed directly. A request is initialized by
+ * rtems_interrupt_server_request_initialize() and destroyed by
+ * rtems_interrupt_server_request_destroy(). The interrupt vector of the
+ * request can be set by rtems_interrupt_server_request_set_vector(). The
+ * request is submitted to be serviced by
+ * rtems_interrupt_server_request_submit().
*/
-void rtems_interrupt_server_entry_destroy(
- rtems_interrupt_server_entry *entry
-);
+typedef struct {
+ /**
+ * @brief This member is the interrupt server entry.
+ */
+ rtems_interrupt_server_entry entry;
+
+ /**
+ * @brief This member is the interrupt server action.
+ */
+ rtems_interrupt_server_action action;
+} rtems_interrupt_server_request;
+
+/* Generated from spec:/rtems/intr/if/server-request-initialize */
/**
- * @brief Initializes the specified interrupt server request.
+ * @ingroup RTEMSAPIClassicIntr
*
- * @param[in] server_index The interrupt server index. Use
- * @c RTEMS_INTERRUPT_SERVER_DEFAULT to specify the default server.
- * @param[in] request The interrupt server request to initialize.
- * @param[in] handler The interrupt handler for the request action.
- * @param[in] arg The interrupt handler argument for the request action.
+ * @brief Initializes the interrupt server request.
+ *
+ * @param server_index is the interrupt server index. The constant
+ * #RTEMS_INTERRUPT_SERVER_DEFAULT may be used to specify the default
+ * interrupt server.
*
- * @retval RTEMS_SUCCESSFUL Successful operation.
- * @retval RTEMS_INCORRECT_STATE The interrupt servers are not initialized.
- * @retval RTEMS_INVALID_ID If the interrupt server index is invalid.
+ * @param[out] request is the interrupt server request to initialize.
*
- * @see rtems_interrupt_server_request_set_vector().
+ * @param routine is the interrupt handler routine for the request action.
+ *
+ * @param arg is the interrupt handler argument for the request action.
+ *
+ * @retval ::RTEMS_SUCCESSFUL The requested operation was successful.
+ *
+ * @retval ::RTEMS_INVALID_ID There was no interrupt server associated with the
+ * index specified by ``server_index``.
+ *
+ * @par Notes
+ * An interrupt server requests consists of an interrupt server entry and
+ * exactly one interrupt server action. The interrupt vector of the request
+ * may be changed with rtems_interrupt_server_request_set_vector(). Interrupt
+ * server requests may be submitted to get serviced by the interrupt server
+ * with rtems_interrupt_server_request_submit(). Requests may be destroyed by
+ * rtems_interrupt_server_request_destroy().
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may obtain and release the object allocator mutex. This may
+ * cause the calling task to be preempted.
+ * @endparblock
*/
rtems_status_code rtems_interrupt_server_request_initialize(
uint32_t server_index,
rtems_interrupt_server_request *request,
- rtems_interrupt_handler handler,
+ rtems_interrupt_handler routine,
void *arg
);
+/* Generated from spec:/rtems/intr/if/server-request-set-vector */
+
/**
- * @brief Sets the interrupt vector in the specified interrupt server request.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Sets the interrupt vector in the interrupt server request.
+ *
+ * @param[in,out] request is the interrupt server request to change.
*
+ * @param vector is the interrupt vector number to be used by the request.
+ *
+ * @par Notes
+ * @parblock
* By default, the interrupt vector of an interrupt server request is set to a
* special value which is outside the range of vectors supported by the
* interrupt controller hardware.
@@ -743,13 +1544,40 @@ rtems_status_code rtems_interrupt_server_request_initialize(
* Calls to rtems_interrupt_server_request_submit() will disable the interrupt
* vector of the request. After processing of the request by the interrupt
* server the interrupt vector will be enabled again.
+ * @endparblock
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within interrupt context.
*
- * @param[in] request The initialized interrupt server request.
- * @param[in] vector The interrupt vector number.
+ * * The directive may be called from within device driver initialization
+ * context.
*
- * @see rtems_interrupt_server_request_initialize().
+ * * The directive may be called from within task context.
+ *
+ * * The directive will not cause the calling task to be preempted.
+ *
+ * * The interrupt server request shall have been initialized by
+ * rtems_interrupt_server_request_initialize().
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_request_set_vector() with the same interrupt server
+ * request. Calling the directive under this condition is undefined
+ * behaviour.
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_request_submit() with the same interrupt server
+ * request. Calling the directive under this condition is undefined
+ * behaviour.
+ *
+ * * The directive shall not be called while the interrupt server entry is
+ * pending on or serviced by its current interrupt server. Calling the
+ * directive under these conditions is undefined behaviour.
+ * @endparblock
*/
-RTEMS_INLINE_ROUTINE void rtems_interrupt_server_request_set_vector(
+static inline void rtems_interrupt_server_request_set_vector(
rtems_interrupt_server_request *request,
rtems_vector_number vector
)
@@ -757,51 +1585,101 @@ RTEMS_INLINE_ROUTINE void rtems_interrupt_server_request_set_vector(
request->entry.vector = vector;
}
+/* Generated from spec:/rtems/intr/if/server-request-destroy */
+
/**
- * @brief Submits the specified interrupt server request so that its interrupt
- * server action can be invoked by the specified interrupt server.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Destroys the interrupt server request.
*
- * This function may be used to do a two-step interrupt processing. The first
- * step is done in interrupt context which calls this function. The second
- * step is then done in the context of the interrupt server.
+ * @param[in,out] request is the interrupt server request to destroy.
*
- * This function may be called from thread or interrupt context. It does not
- * block. No error checking is performed.
+ * @par Notes
+ * No error checking is performed by the directive.
*
- * @param[in] request The interrupt server request must be initialized before the
- * first call to this function via
- * rtems_interrupt_server_request_initialize(). The request must not be
- * modified between calls to this function. Use
- * rtems_interrupt_server_request_destroy() to destroy a request in use.
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive shall not be called from within the context of an interrupt
+ * server. Calling the directive from within the context of an interrupt
+ * server is undefined behaviour.
+ *
+ * * The directive sends a request to another task and waits for a response.
+ * This may cause the calling task to be blocked and unblocked.
+ *
+ * * The interrupt server request shall have been initialized by
+ * rtems_interrupt_server_request_initialize().
+ * @endparblock
*/
-RTEMS_INLINE_ROUTINE void rtems_interrupt_server_request_submit(
+static inline void rtems_interrupt_server_request_destroy(
rtems_interrupt_server_request *request
)
{
- rtems_interrupt_server_entry_submit( &request->entry );
+ rtems_interrupt_server_entry_destroy( &request->entry );
}
+/* Generated from spec:/rtems/intr/if/server-request-submit */
+
/**
- * @brief Destroys the specified interrupt server request.
+ * @ingroup RTEMSAPIClassicIntr
+ *
+ * @brief Submits the interrupt server request to be serviced by the interrupt
+ * server.
+ *
+ * @param[in,out] request is the interrupt server request to submit.
+ *
+ * The directive appends the interrupt server entry of the request to the
+ * pending entries of the interrupt server. The interrupt server is notified
+ * that a new entry is pending. Once the interrupt server is scheduled it
+ * services the actions of all pending entries.
+ *
+ * @par Notes
+ * @parblock
+ * This directive may be used to do a two-step interrupt processing. The first
+ * step is done from within interrupt context by a call to this directive. The
+ * second step is then done from within the context of the interrupt server.
+ *
+ * No error checking is performed by the directive.
+ *
+ * A submitted request may be destroyed by
+ * rtems_interrupt_server_request_destroy().
+ * @endparblock
+ *
+ * @par Constraints
+ * @parblock
+ * The following constraints apply to this directive:
*
- * This function must be called from thread context. It may block. Calling
- * this function within the context of an interrupt server is undefined
- * behaviour. No error checking is performed.
+ * * The directive may be called from within interrupt context.
*
- * @param[in] request The interrupt server request to destroy. It must have
- * been initialized via rtems_interrupt_server_request_initialize().
+ * * The directive may be called from within device driver initialization
+ * context.
+ *
+ * * The directive may be called from within task context.
+ *
+ * * The directive may unblock a task. This may cause the calling task to be
+ * preempted.
+ *
+ * * The interrupt server request shall have been initialized by
+ * rtems_interrupt_server_request_initialize().
+ *
+ * * The directive shall not be called concurrently with
+ * rtems_interrupt_server_request_set_vector() with the same interrupt server
+ * request. Calling the directive under this condition is undefined
+ * behaviour.
+ * @endparblock
*/
-RTEMS_INLINE_ROUTINE void rtems_interrupt_server_request_destroy(
+static inline void rtems_interrupt_server_request_submit(
rtems_interrupt_server_request *request
)
{
- rtems_interrupt_server_entry_destroy( &request->entry );
+ rtems_interrupt_server_entry_submit( &request->entry );
}
-/** @} */
-
#ifdef __cplusplus
}
-#endif /* __cplusplus */
+#endif
-#endif /* RTEMS_IRQ_EXTENSION_H */
+#endif /* _RTEMS_IRQ_EXTENSION_H */
--
2.26.2
More information about the devel
mailing list