Skip to content

Commit 1f3605d

Browse files
de-nordiccarlescufi
authored andcommitted
drivers/flash/nrf: Workaround for nrf91 errata 7
Fix UICR read access. Signed-off-by: Dominik Ermel <[email protected]>
1 parent cc5766b commit 1f3605d

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

drivers/flash/soc_flash_nrf.c

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017-2018 Nordic Semiconductor ASA
2+
* Copyright (c) 2017-2023 Nordic Semiconductor ASA
33
* Copyright (c) 2016 Linaro Limited
44
* Copyright (c) 2016 Intel Corporation
55
*
@@ -116,6 +116,26 @@ static inline bool is_uicr_addr_valid(off_t addr, size_t len)
116116
#endif /* CONFIG_SOC_FLASH_NRF_UICR */
117117
}
118118

119+
#if CONFIG_SOC_FLASH_NRF_UICR && IS_ENABLED(NRF91_ERRATA_7_ENABLE_WORKAROUND)
120+
static inline void nrf91_errata_7_enter(void)
121+
{
122+
__disable_irq();
123+
}
124+
125+
static inline void nrf91_errata_7_exit(void)
126+
{
127+
__DSB();
128+
__enable_irq();
129+
}
130+
131+
static void nrf_buffer_read_91_uicr(void *data, off_t addr, size_t len)
132+
{
133+
nrf91_errata_7_enter();
134+
nrf_nvmc_buffer_read(data, (uint32_t)addr, len);
135+
nrf91_errata_7_exit();
136+
}
137+
#endif
138+
119139
static void nvmc_wait_ready(void)
120140
{
121141
while (!nrfx_nvmc_write_done_check()) {
@@ -125,9 +145,11 @@ static void nvmc_wait_ready(void)
125145
static int flash_nrf_read(const struct device *dev, off_t addr,
126146
void *data, size_t len)
127147
{
148+
const bool within_uicr = is_uicr_addr_valid(addr, len);
149+
128150
if (is_regular_addr_valid(addr, len)) {
129151
addr += DT_REG_ADDR(SOC_NV_FLASH_NODE);
130-
} else if (!is_uicr_addr_valid(addr, len)) {
152+
} else if (!within_uicr) {
131153
LOG_ERR("invalid address: 0x%08lx:%zu",
132154
(unsigned long)addr, len);
133155
return -EINVAL;
@@ -137,6 +159,13 @@ static int flash_nrf_read(const struct device *dev, off_t addr,
137159
return 0;
138160
}
139161

162+
#if CONFIG_SOC_FLASH_NRF_UICR && IS_ENABLED(NRF91_ERRATA_7_ENABLE_WORKAROUND)
163+
if (within_uicr) {
164+
nrf_buffer_read_91_uicr(data, (uint32_t)addr, len);
165+
return 0;
166+
}
167+
#endif
168+
140169
nrf_nvmc_buffer_read(data, (uint32_t)addr, len);
141170

142171
return 0;

0 commit comments

Comments
 (0)