LCOV - code coverage report
Current view: top level - zephyr/drivers - cache.h Coverage Total Hit
Test: new.info Lines: 100.0 % 1 1
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            1 : /*
       2              :  * Copyright 2021 Carlo Caione <ccaione@baylibre.com>
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : 
       7              : /**
       8              :  * @file
       9              :  * Public APIs for external cache controller drivers
      10              :  */
      11              : 
      12              : #ifndef ZEPHYR_INCLUDE_DRIVERS_CACHE_H_
      13              : #define ZEPHYR_INCLUDE_DRIVERS_CACHE_H_
      14              : 
      15              : #include <stddef.h>
      16              : 
      17              : /**
      18              :  * @brief External Cache Controller Interface
      19              :  * @defgroup cache_external_interface External Cache Controller Interface
      20              :  * @ingroup io_interfaces
      21              :  * @{
      22              :  */
      23              : 
      24              : #ifdef __cplusplus
      25              : extern "C" {
      26              : #endif
      27              : 
      28              : #if defined(CONFIG_DCACHE)
      29              : 
      30              : /**
      31              :  * @brief Enable the d-cache
      32              :  *
      33              :  * Enable the data cache.
      34              :  */
      35              : void cache_data_enable(void);
      36              : 
      37              : /**
      38              :  * @brief Disable the d-cache
      39              :  *
      40              :  * Disable the data cache.
      41              :  */
      42              : void cache_data_disable(void);
      43              : 
      44              : /**
      45              :  * @brief Flush the d-cache
      46              :  *
      47              :  * Flush the whole data cache.
      48              :  *
      49              :  * @retval 0 If succeeded.
      50              :  * @retval -ENOTSUP If not supported.
      51              :  * @retval -errno Negative errno for other failures.
      52              :  */
      53              : int cache_data_flush_all(void);
      54              : 
      55              : /**
      56              :  * @brief Invalidate the d-cache
      57              :  *
      58              :  * Invalidate the whole data cache.
      59              :  *
      60              :  * @retval 0 If succeeded.
      61              :  * @retval -ENOTSUP If not supported.
      62              :  * @retval -errno Negative errno for other failures.
      63              :  */
      64              : int cache_data_invd_all(void);
      65              : 
      66              : /**
      67              :  * @brief Flush and Invalidate the d-cache
      68              :  *
      69              :  * Flush and Invalidate the whole data cache.
      70              :  *
      71              :  * @retval 0 If succeeded.
      72              :  * @retval -ENOTSUP If not supported.
      73              :  * @retval -errno Negative errno for other failures.
      74              :  */
      75              : int cache_data_flush_and_invd_all(void);
      76              : 
      77              : /**
      78              :  * @brief Flush an address range in the d-cache
      79              :  *
      80              :  * Flush the specified address range of the data cache.
      81              :  *
      82              :  * @note the cache operations act on cache line. When multiple data structures
      83              :  *       share the same cache line being flushed, all the portions of the
      84              :  *       data structures sharing the same line will be flushed. This is usually
      85              :  *       not a problem because writing back is a non-destructive process that
      86              :  *       could be triggered by hardware at any time, so having an aligned
      87              :  *       @p addr or a padded @p size is not strictly necessary.
      88              :  *
      89              :  * @param addr Starting address to flush.
      90              :  * @param size Range size.
      91              :  *
      92              :  * @retval 0 If succeeded.
      93              :  * @retval -ENOTSUP If not supported.
      94              :  * @retval -errno Negative errno for other failures.
      95              :  */
      96              : int cache_data_flush_range(void *addr, size_t size);
      97              : 
      98              : /**
      99              :  * @brief Invalidate an address range in the d-cache
     100              :  *
     101              :  * Invalidate the specified address range of the data cache.
     102              :  *
     103              :  * @note the cache operations act on cache line. When multiple data structures
     104              :  *       share the same cache line being invalidated, all the portions of the
     105              :  *       non-read-only data structures sharing the same line will be
     106              :  *       invalidated as well. This is a destructive process that could lead to
     107              :  *       data loss and/or corruption. When @p addr is not aligned to the cache
     108              :  *       line and/or @p size is not a multiple of the cache line size the
     109              :  *       behaviour is undefined.
     110              :  *
     111              :  * @param addr Starting address to invalidate.
     112              :  * @param size Range size.
     113              :  *
     114              :  * @retval 0 If succeeded.
     115              :  * @retval -ENOTSUP If not supported.
     116              :  * @retval -errno Negative errno for other failures.
     117              :  */
     118              : int cache_data_invd_range(void *addr, size_t size);
     119              : 
     120              : /**
     121              :  * @brief Flush and Invalidate an address range in the d-cache
     122              :  *
     123              :  * Flush and Invalidate the specified address range of the data cache.
     124              :  *
     125              :  * @note the cache operations act on cache line. When multiple data structures
     126              :  *       share the same cache line being flushed, all the portions of the
     127              :  *       data structures sharing the same line will be flushed before being
     128              :  *       invalidated. This is usually not a problem because writing back is a
     129              :  *       non-destructive process that could be triggered by hardware at any
     130              :  *       time, so having an aligned @p addr or a padded @p size is not strictly
     131              :  *       necessary.
     132              :  *
     133              :  * @param addr Starting address to flush and invalidate.
     134              :  * @param size Range size.
     135              :  *
     136              :  * @retval 0 If succeeded.
     137              :  * @retval -ENOTSUP If not supported.
     138              :  * @retval -errno Negative errno for other failures.
     139              :  */
     140              : int cache_data_flush_and_invd_range(void *addr, size_t size);
     141              : 
     142              : #if defined(CONFIG_DCACHE_LINE_SIZE_DETECT)
     143              : /**
     144              :  *
     145              :  * @brief Get the d-cache line size.
     146              :  *
     147              :  * The API is provided to dynamically detect the data cache line size at run
     148              :  * time.
     149              :  *
     150              :  * The function must be implemented only when CONFIG_DCACHE_LINE_SIZE_DETECT is
     151              :  * defined.
     152              :  *
     153              :  * @retval size Size of the d-cache line.
     154              :  * @retval 0 If the d-cache is not enabled.
     155              :  */
     156              : size_t cache_data_line_size_get(void);
     157              : 
     158              : #endif /* CONFIG_DCACHE_LINE_SIZE_DETECT */
     159              : 
     160              : #endif /* CONFIG_DCACHE */
     161              : 
     162              : #if defined(CONFIG_ICACHE)
     163              : 
     164              : /**
     165              :  * @brief Enable the i-cache
     166              :  *
     167              :  * Enable the instruction cache.
     168              :  */
     169              : void cache_instr_enable(void);
     170              : 
     171              : /**
     172              :  * @brief Disable the i-cache
     173              :  *
     174              :  * Disable the instruction cache.
     175              :  */
     176              : void cache_instr_disable(void);
     177              : 
     178              : /**
     179              :  * @brief Flush the i-cache
     180              :  *
     181              :  * Flush the whole instruction cache.
     182              :  *
     183              :  * @retval 0 If succeeded.
     184              :  * @retval -ENOTSUP If not supported.
     185              :  * @retval -errno Negative errno for other failures.
     186              :  */
     187              : int cache_instr_flush_all(void);
     188              : 
     189              : /**
     190              :  * @brief Invalidate the i-cache
     191              :  *
     192              :  * Invalidate the whole instruction cache.
     193              :  *
     194              :  * @retval 0 If succeeded.
     195              :  * @retval -ENOTSUP If not supported.
     196              :  * @retval -errno Negative errno for other failures.
     197              :  */
     198              : int cache_instr_invd_all(void);
     199              : 
     200              : /**
     201              :  * @brief Flush and Invalidate the i-cache
     202              :  *
     203              :  * Flush and Invalidate the whole instruction cache.
     204              :  *
     205              :  * @retval 0 If succeeded.
     206              :  * @retval -ENOTSUP If not supported.
     207              :  * @retval -errno Negative errno for other failures.
     208              :  */
     209              : int cache_instr_flush_and_invd_all(void);
     210              : 
     211              : /**
     212              :  * @brief Flush an address range in the i-cache
     213              :  *
     214              :  * Flush the specified address range of the instruction cache.
     215              :  *
     216              :  * @note the cache operations act on cache line. When multiple data structures
     217              :  *       share the same cache line being flushed, all the portions of the
     218              :  *       data structures sharing the same line will be flushed. This is usually
     219              :  *       not a problem because writing back is a non-destructive process that
     220              :  *       could be triggered by hardware at any time, so having an aligned
     221              :  *       @p addr or a padded @p size is not strictly necessary.
     222              :  *
     223              :  * @param addr Starting address to flush.
     224              :  * @param size Range size.
     225              :  *
     226              :  * @retval 0 If succeeded.
     227              :  * @retval -ENOTSUP If not supported.
     228              :  * @retval -errno Negative errno for other failures.
     229              :  */
     230              : int cache_instr_flush_range(void *addr, size_t size);
     231              : 
     232              : /**
     233              :  * @brief Invalidate an address range in the i-cache
     234              :  *
     235              :  * Invalidate the specified address range of the instruction cache.
     236              :  *
     237              :  * @note the cache operations act on cache line. When multiple data structures
     238              :  *       share the same cache line being invalidated, all the portions of the
     239              :  *       non-read-only data structures sharing the same line will be
     240              :  *       invalidated as well. This is a destructive process that could lead to
     241              :  *       data loss and/or corruption. When @p addr is not aligned to the cache
     242              :  *       line and/or @p size is not a multiple of the cache line size the
     243              :  *       behaviour is undefined.
     244              :  *
     245              :  * @param addr Starting address to invalidate.
     246              :  * @param size Range size.
     247              :  *
     248              :  * @retval 0 If succeeded.
     249              :  * @retval -ENOTSUP If not supported.
     250              :  * @retval -errno Negative errno for other failures.
     251              :  */
     252              : int cache_instr_invd_range(void *addr, size_t size);
     253              : 
     254              : /**
     255              :  * @brief Flush and Invalidate an address range in the i-cache
     256              :  *
     257              :  * Flush and Invalidate the specified address range of the instruction cache.
     258              :  *
     259              :  * @note the cache operations act on cache line. When multiple data structures
     260              :  *       share the same cache line being flushed, all the portions of the
     261              :  *       data structures sharing the same line will be flushed before being
     262              :  *       invalidated. This is usually not a problem because writing back is a
     263              :  *       non-destructive process that could be triggered by hardware at any
     264              :  *       time, so having an aligned @p addr or a padded @p size is not strictly
     265              :  *       necessary.
     266              :  *
     267              :  * @param addr Starting address to flush and invalidate.
     268              :  * @param size Range size.
     269              :  *
     270              :  * @retval 0 If succeeded.
     271              :  * @retval -ENOTSUP If not supported.
     272              :  * @retval -errno Negative errno for other failures.
     273              :  */
     274              : int cache_instr_flush_and_invd_range(void *addr, size_t size);
     275              : 
     276              : #ifdef CONFIG_ICACHE_LINE_SIZE_DETECT
     277              : /**
     278              :  *
     279              :  * @brief Get the i-cache line size.
     280              :  *
     281              :  * The API is provided to dynamically detect the instruction cache line size at
     282              :  * run time.
     283              :  *
     284              :  * The function must be implemented only when CONFIG_ICACHE_LINE_SIZE_DETECT is
     285              :  * defined.
     286              :  *
     287              :  * @retval size Size of the d-cache line.
     288              :  * @retval 0 If the d-cache is not enabled.
     289              :  */
     290              : size_t cache_instr_line_size_get(void);
     291              : 
     292              : #endif /* CONFIG_ICACHE_LINE_SIZE_DETECT */
     293              : 
     294              : #endif /* CONFIG_ICACHE */
     295              : 
     296              : #ifdef __cplusplus
     297              : }
     298              : #endif
     299              : 
     300              : /**
     301              :  * @}
     302              :  */
     303              : 
     304              : #endif /* ZEPHYR_INCLUDE_DRIVERS_CACHE_H_ */
        

Generated by: LCOV version 2.0-1