Skip to content

Commit d1398e9

Browse files
henrikbrixandersentpambor
authored andcommitted
drivers: retained_mem: retained_mem_zephyr_ram: flush d-cache if enabled
Flush the data cache if cache management is enabled. Flushing the data cache is required to ensure data retention across system resets. Signed-off-by: Henrik Brix Andersen <[email protected]>
1 parent b7fd272 commit d1398e9

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

drivers/retained_mem/retained_mem_zephyr_ram.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#define DT_DRV_COMPAT zephyr_retained_ram
88

99
#include <string.h>
10+
#include <zephyr/cache.h>
1011
#include <zephyr/device.h>
1112
#include <zephyr/devicetree.h>
1213
#include <zephyr/drivers/retained_mem.h>
@@ -85,27 +86,37 @@ static int zephyr_retained_mem_ram_write(const struct device *dev, off_t offset,
8586
const uint8_t *buffer, size_t size)
8687
{
8788
const struct zephyr_retained_mem_ram_config *config = dev->config;
89+
int err = 0;
8890

8991
zephyr_retained_mem_ram_lock_take(dev);
9092

9193
memcpy((config->address + offset), buffer, size);
9294

95+
#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
96+
err = sys_cache_data_flush_range(config->address + offset, size);
97+
#endif /* defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
98+
9399
zephyr_retained_mem_ram_lock_release(dev);
94100

95-
return 0;
101+
return err;
96102
}
97103

98104
static int zephyr_retained_mem_ram_clear(const struct device *dev)
99105
{
100106
const struct zephyr_retained_mem_ram_config *config = dev->config;
107+
int err = 0;
101108

102109
zephyr_retained_mem_ram_lock_take(dev);
103110

104111
memset(config->address, 0, config->size);
105112

113+
#if defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE)
114+
err = sys_cache_data_flush_range(config->address, config->size);
115+
#endif /* defined(CONFIG_CACHE_MANAGEMENT) && defined(CONFIG_DCACHE) */
116+
106117
zephyr_retained_mem_ram_lock_release(dev);
107118

108-
return 0;
119+
return err;
109120
}
110121

111122
static DEVICE_API(retained_mem, zephyr_retained_mem_ram_api) = {

0 commit comments

Comments
 (0)