LCOV - code coverage report
Current view: top level - zephyr/drivers - cache.h Hit Total Coverage
Test: new.info Lines: 1 1 100.0 %
Date: 2024-12-22 00:14:23

          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 1.14