/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @brief This header file defines the Cache Manager API.
*/
/*
* Copyright (C) 2016 Pavel Pisa
* Copyright (C) 2014, 2021 embedded brains GmbH (http://www.embedded-brains.de)
* Copyright (C) 2000, 2008 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.
*/
/*
* 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
*
* 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:
*
* https://docs.rtems.org
*/
/* Generated from spec:/rtems/cache/if/header */
#ifndef _RTEMS_RTEMS_CACHE_H
#define _RTEMS_RTEMS_CACHE_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Generated from spec:/rtems/cache/if/group */
/**
* @defgroup RTEMSAPIClassicCache Cache Manager
*
* @ingroup RTEMSAPIClassic
*
* @brief The Cache Manager provides functions to perform maintenance
* operations for data and instruction caches.
*
* The actual actions of the Cache Manager operations depend on the hardware
* and the implementation provided by the CPU architecture port or a board
* support package. Cache implementations tend to be highly hardware
* dependent.
*/
/* Generated from spec:/rtems/cache/if/coherent-add-area */
/**
* @brief Adds a cache coherent memory area to the cache coherent allocator.
*
* @param begin is the begin address of the cache coherent memory area to add.
*
* @param size is the size in bytes of the cache coherent memory area to add.
*
* @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
*/
void rtems_cache_coherent_add_area( void *begin, uintptr_t size );
/* Generated from spec:/rtems/cache/if/coherent-allocate */
/**
* @brief Allocates a memory area from cache coherent memory.
*
* @param size is the requested size in bytes of the memory area to allocate.
*
* @param alignment is the requested alignment in bytes of the memory area to
* allocate. If the alignment parameter is not equal to zero, the allocated
* memory area will begin at an address aligned by this value.
*
* @param boundary is the requested boundary in bytes of the memory area to
* allocate. If the boundary parameter is not equal to zero, the allocated
* memory area will comply with a boundary constraint. The boundary value
* specifies the set of addresses which are aligned by the boundary value.
* The interior of the allocated memory area will not contain an element of
* this set. The begin or end address of the area may be a member of the
* set.
*
* @retval NULL There is not enough memory available to satisfy the allocation
* request.
*
* @return Returns the begin address of the allocated memory.
*
* @par Notes
* @parblock
* A size value of zero will return a unique address which may be freed with
* rtems_cache_coherent_free().
*
* The memory allocated by the directive may be released with a call to
* rtems_cache_coherent_free().
*
* By default the C Program Heap allocator is used. In case special memory
* areas must be used, then the BSP or the application should add cache
* coherent memory areas for the allocator via rtems_cache_coherent_add_area().
* @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
*/
void *rtems_cache_coherent_allocate(
size_t size,
uintptr_t alignment,
uintptr_t boundary
);
/* Generated from spec:/rtems/cache/if/coherent-free */
/**
* @brief Frees memory allocated by rtems_cache_coherent_allocate().
*
* @param ptr is a pointer returned by rtems_cache_coherent_allocate().
*
* @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
*/
void rtems_cache_coherent_free( void *ptr );
/* Generated from spec:/rtems/cache/if/freeze-data */
/**
* @brief Freezes the data caches.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_freeze_data( void );
/* Generated from spec:/rtems/cache/if/freeze-instruction */
/**
* @brief Freezes the instruction caches.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_freeze_instruction( void );
/* Generated from spec:/rtems/cache/if/unfreeze-data */
/**
* @brief Unfreezes the data cache.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_unfreeze_data( void );
/* Generated from spec:/rtems/cache/if/unfreeze-instruction */
/**
* @brief Unfreezes the instruction cache.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_unfreeze_instruction( void );
/* Generated from spec:/rtems/cache/if/flush-multiple-data-lines */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Flushes the data cache lines covering the memory area.
*
* @param begin is the begin address of the memory area to flush.
*
* @param size is the size in bytes of the memory area to flush.
*
* Dirty data cache lines covering the area are transfered to memory.
* Depending on the cache implementation this may mark the lines as invalid.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_flush_multiple_data_lines( const void *begin, size_t size );
/* Generated from spec:/rtems/cache/if/invalidate-multiple-data-lines */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Invalidates the data cache lines covering the memory area.
*
* @param begin is the begin address of the memory area to invalidate.
*
* @param size is the size in bytes of the memory area to invalidate.
*
* The cache lines covering the area are marked as invalid. A later read
* access in the area will load the data from memory.
*
* @par Notes
* @parblock
* In case the area is not aligned on cache line boundaries, then this
* operation may destroy unrelated data.
*
* On some systems, the cache lines may be flushed before they are invalidated.
* @endparblock
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_invalidate_multiple_data_lines(
const void *begin,
size_t size
);
/* Generated from spec:/rtems/cache/if/invalidate-multiple-instruction-lines */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Invalidates the instruction cache lines covering the memory area.
*
* @param begin is the begin address of the memory area to invalidate.
*
* @param size is the size in bytes of the memory area to invalidate.
*
* The cache lines covering the area are marked as invalid. A later
* instruction fetch from the area will result in a load from memory.
*
* @par Notes
* In SMP configurations, on processors without instruction cache snooping,
* this operation will invalidate the instruction cache lines on all
* processors.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_invalidate_multiple_instruction_lines(
const void *begin,
size_t size
);
/* Generated from spec:/rtems/cache/if/instruction-sync-after-code-change */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Ensures necessary synchronization required after code changes.
*
* @param begin is the begin address of the code area to synchronize.
*
* @param size is the size in bytes of the code area to synchronize.
*
* @par Notes
* When code is loaded or modified, then most systems require synchronization
* instructions to update the instruction caches so that the loaded or modified
* code is fetched. For example, systems with separate data and instruction
* caches or systems without instruction cache snooping. The directives should
* be used by run time loader for example.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_instruction_sync_after_code_change(
const void *begin,
size_t size
);
/* Generated from spec:/rtems/cache/if/get-maximal-line-size */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Gets the maximal cache line size in bytes of all caches (data,
* instruction, or unified).
*
* @retval 0 There is no cache present.
*
* @return Returns the maximal cache line size in bytes of all caches (data,
* instruction, or unified).
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
size_t rtems_cache_get_maximal_line_size( void );
/* Generated from spec:/rtems/cache/if/get-data-line-size */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Gets the data cache line size in bytes.
*
* @retval 0 There is no data cache present.
*
* @return Returns the data cache line size in bytes. For multi-level caches
* this is the maximum of the cache line sizes of all levels.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
size_t rtems_cache_get_data_line_size( void );
/* Generated from spec:/rtems/cache/if/get-instruction-line-size */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Gets the instruction cache line size in bytes.
*
* @retval 0 There is no instruction cache present.
*
* @return Returns the instruction cache line size in bytes. For multi-level
* caches this is the maximum of the cache line sizes of all levels.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
size_t rtems_cache_get_instruction_line_size( void );
/* Generated from spec:/rtems/cache/if/get-data-size */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Gets the data cache size in bytes for the cache level.
*
* @param level is the requested data cache level. The cache level zero
* specifies the entire data cache.
*
* @retval 0 There is no data cache present at the requested cache level.
*
* @return Returns the data cache size in bytes of the requested cache level.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
size_t rtems_cache_get_data_cache_size( uint32_t level );
/* Generated from spec:/rtems/cache/if/get-instruction-size */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Gets the instruction cache size in bytes for the cache level.
*
* @param level is the requested instruction cache level. The cache level zero
* specifies the entire instruction cache.
*
* @retval 0 There is no instruction cache present at the requested cache
* level.
*
* @return Returns the instruction cache size in bytes of the requested cache
* level.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
size_t rtems_cache_get_instruction_cache_size( uint32_t level );
/* Generated from spec:/rtems/cache/if/flush-entire-data */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Flushes the entire data cache.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_flush_entire_data( void );
/* Generated from spec:/rtems/cache/if/invalidate-entire-data */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Invalidates the entire data cache.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_invalidate_entire_data( void );
/* Generated from spec:/rtems/cache/if/invalidate-entire-instruction */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Invalidates the entire instruction cache.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_invalidate_entire_instruction( void );
/* Generated from spec:/rtems/cache/if/enable-data */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Enables the data cache.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_enable_data( void );
/* Generated from spec:/rtems/cache/if/disable-data */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Disables the data cache.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_disable_data( void );
/* Generated from spec:/rtems/cache/if/enable-instruction */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Enables the instruction cache.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_enable_instruction( void );
/* Generated from spec:/rtems/cache/if/disable-instruction */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Disables the instruction cache.
*
* @par Constraints
* @parblock
* The following constraints apply to this directive:
*
* * The directive may be called from within any runtime context.
*
* * The directive will not cause the calling task to be preempted.
* @endparblock
*/
void rtems_cache_disable_instruction( void );
/* Generated from spec:/rtems/cache/if/aligned-malloc */
/**
* @ingroup RTEMSAPIClassicCache
*
* @brief Allocates memory from the C Program Heap which begins at a cache line
* boundary.
*
* @param size is the size in bytes of the memory area to allocate.
*
* @retval NULL There is not enough memory available to satisfy the allocation
* request.
*
* @return Returns the begin address of the allocated memory. The begin
* address is on a cache line boundary.
*
* @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
*/
void *rtems_cache_aligned_malloc( size_t size );
#ifdef __cplusplus
}
#endif
#endif /* _RTEMS_RTEMS_CACHE_H */