LCOV - code coverage report
Current view: top level - zephyr/arch - cache.h Hit Total Coverage
Test: new.info Lines: 19 46 41.3 %
Date: 2024-12-21 18:13:37

          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 1.14