LCOV - code coverage report
Current view: top level - zephyr/arch - cache.h Coverage Total Hit
Test: new.info Lines: 41.3 % 46 19
Test Date: 2025-09-05 20:47:19

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

Generated by: LCOV version 2.0-1