openocd/src/flash/nor
Doug Brunner aad8718058 flash/nor/efr32: fixed lockbits and user data
Changed flash driver to support writing to the user data page, as well as to any portion of the lockbits page above 512 bytes (the amount used for the actual page lock words). The top part of the lockbits page is used on at least the EFR32xG1 chips for the SiLabs bootloader encryption keys.

As presented to the user, the lockbits page is the same size as the other pages, but any attempt to write to its low 512 bytes is an error. To enforce this, efr32x_write is renamed to efm32x_priv_write and a wrapper function is provided in its place. If the user erases the lockbits page, the driver rewrites the cached lock words after the erase. When the driver erases the lockbits page in order to update the lock words, it first takes a copy of anything stored in the top part of the page, and re-programs it after the erase operation.

There are now multiple instances of flash_bank for each target, and the flash_bank instances must share their cached lock words to operate as intended. Therefore, when a bank is created, the global flash bank list is used to find any other banks that share the same target. Since some banks in the global list are invalid at the time free_driver_priv is called, reference counting is used to decide when to free driver_priv.

To avoid the need to find the lockbits flash_bank from another flash_bank, efm32x_priv_write and efm32x_erase_page now take an absolute address.

There didn't seem to be any reason to prohibit unprotecting individual flash pages, so that limitation is removed from efm32x_protect().

This addresses ticket #185.

Valgrind-clean, except for 2x 4kiB not freed/still reachable blocks that were allocated by libudev.
No new Clang analyzer warnings, no new sanitizer warnings.

Signed-off-by: Doug Brunner <doug.a.brunner@gmail.com>
Change-Id: Ifb22e6149939d893f386706e99b928691ec1d41b
Reviewed-on: https://review.openocd.org/c/openocd/+/6665
Tested-by: jenkins
Reviewed-by: Fredrik Hederstierna <fredrik.hederstierna@gmail.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
2022-01-05 17:57:08 +00:00
..
aduc702x.c flash: rename CamelCase symbols 2021-07-02 17:09:47 +01:00
aducm360.c flash: use proper format with uint32_t 2020-09-05 17:12:32 +01:00
ambiqmicro.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
at91sam3.c openocd: remove NULL comparisons with checkpatch [1/2] 2021-07-24 10:38:00 +01:00
at91sam4.c openocd: remove NULL comparisons with checkpatch [1/2] 2021-07-24 10:38:00 +01:00
at91sam4l.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
at91sam7.c openocd: remove NULL comparisons with checkpatch [1/2] 2021-07-24 10:38:00 +01:00
at91samd.c flash/nor/at91samd: remove 'at91samd info' command 2021-12-03 21:53:36 +00:00
ath79.c flash/nor: improved API of flash_driver.info & fixed buffer overruns 2021-06-13 19:58:28 +01:00
atsame5.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
atsamv.c flash/nor/atsamv: fixed "maybe uninitialized" compiler warning 2021-08-14 13:28:54 +01:00
avrf.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
bluenrg-x.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
bluenrg-x.h bluenrg-x: simplyfied the driver 2020-03-07 15:31:09 +00:00
cc26xx.c target,flash: allow target_free_working_area on NULL area pointer 2021-12-03 21:59:20 +00:00
cc26xx.h flash/nor: Add support for TI CC26xx/CC13xx flash 2018-06-15 20:06:25 +01:00
cc3220sf.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
cc3220sf.h flash/nor: Add support for TI CC3220SF internal flash 2018-06-06 15:38:25 +01:00
cfi.c target,flash: allow target_free_working_area on NULL area pointer 2021-12-03 21:59:20 +00:00
cfi.h flash/nor/cfi: fix CamelCase symbols in cfi_spansion_pri_ext 2021-07-02 17:08:40 +01:00
core.c openocd: remove NULL comparisons with checkpatch [2/2] 2021-07-24 10:38:11 +01:00
core.h openocd: fix doxygen parameters of functions 2021-01-13 11:33:53 +00:00
driver.h flash/nor: improved API of flash_driver.info & fixed buffer overruns 2021-06-13 19:58:28 +01:00
drivers.c flash/nor: add support for Nuvoton NPCX series flash 2021-09-02 06:42:54 +00:00
dsp5680xx_flash.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
efm32.c flash/nor/efr32: fixed lockbits and user data 2022-01-05 17:57:08 +00:00
em357.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
esirisc_flash.c flash/nor: improved API of flash_driver.info & fixed buffer overruns 2021-06-13 19:58:28 +01:00
faux.c openocd: fix simple cases of NULL comparison 2021-07-24 10:37:49 +01:00
fespi.c target,flash: allow target_free_working_area on NULL area pointer 2021-12-03 21:59:20 +00:00
fm3.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
fm4.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
imp.h Flash, FRAM and EEPROM driver for STM32 QUAD-/OCTOSPI interface 2020-11-08 22:46:00 +00:00
jtagspi.c jtagspi: fix build on MacOS 2021-11-13 22:36:03 +00:00
kinetis_ke.c flash/nor/kinetis_ke: remove 'kinetis mdm test_securing' cmd 2021-12-03 21:53:07 +00:00
kinetis.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
lpc288x.c flash: fix typos and duplicated words 2020-07-26 20:13:22 +01:00
lpc2000.c openocd: fix simple cases of Yoda condition 2021-07-20 14:55:24 +01:00
lpc2900.c openocd: fix simple cases of Yoda condition 2021-07-20 14:55:24 +01:00
lpcspifi.c openocd: fix simple cases of NULL comparison 2021-07-24 10:37:49 +01:00
Makefile.am flash/nor: add support for Nuvoton NPCX series flash 2021-09-02 06:42:54 +00:00
max32xxx.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
mdr.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
mrvlqspi.c openocd: fix simple cases of NULL comparison 2021-07-24 10:37:49 +01:00
msp432.c target,flash: allow target_free_working_area on NULL area pointer 2021-12-03 21:59:20 +00:00
msp432.h flash: fix some minor typo 2021-05-22 10:06:32 +01:00
niietcm4.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
non_cfi.c flash/nor/cfi: fix CamelCase symbols in cfi_spansion_pri_ext 2021-07-02 17:08:40 +01:00
non_cfi.h Make #include guard naming consistent 2016-05-24 22:30:55 +01:00
npcx.c target,flash: allow target_free_working_area on NULL area pointer 2021-12-03 21:59:20 +00:00
nrf5.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
numicro.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
ocl.c flash/nor: Use proper data types in driver API 2020-07-07 05:23:54 +01:00
ocl.h flash: fix typos and duplicated words 2020-07-26 20:13:22 +01:00
pic32mx.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
psoc4.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
psoc5lp.c openocd: fix simple cases of NULL comparison 2021-07-24 10:37:49 +01:00
psoc6.c target,flash: allow target_free_working_area on NULL area pointer 2021-12-03 21:59:20 +00:00
renesas_rpchf.c flash: use proper format with uint32_t 2020-09-05 17:12:32 +01:00
rp2040.c flash/rp2040: don't initialize to NULL fields in struct 2021-11-23 11:04:42 +00:00
sfdp.c openocd: fix simple cases of NULL comparison 2021-07-24 10:37:49 +01:00
sfdp.h Flash, FRAM and EEPROM driver for STM32 QUAD-/OCTOSPI interface 2020-11-08 22:46:00 +00:00
sh_qspi.c target,flash: allow target_free_working_area on NULL area pointer 2021-12-03 21:59:20 +00:00
sim3x.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
spi.c flash/nor/spi: add micron MT25QU01G 2021-12-11 17:49:46 +00:00
spi.h Flash, FRAM and EEPROM driver for STM32 QUAD-/OCTOSPI interface 2020-11-08 22:46:00 +00:00
stellaris.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
stm32f1x.c openocd: use unique name for struct command_registration 2021-11-23 11:04:02 +00:00
stm32f2x.c openocd: use unique name for struct command_registration 2021-11-23 11:04:02 +00:00
stm32h7x.c openocd: use unique name for struct command_registration 2021-11-23 11:04:02 +00:00
stm32l4x.c helper: Remove src/helper from include dirs 2021-10-02 13:18:15 +00:00
stm32l4x.h flash/stm32l4x: fix flash programming in 64-bit hosts 2021-09-12 14:26:31 +00:00
stm32lx.c flash/nor/stm32lx: fixed writes at high adapter speeds 2021-11-03 20:32:54 +00:00
stmqspi.c armv7m.h: relax dependency from 'arm_adi_v5.h' 2021-09-25 12:59:12 +00:00
stmqspi.h flash/stmqspi: minor fixes on coding style 2020-11-15 21:04:29 +00:00
stmsmi.c openocd: fix simple cases of NULL comparison 2021-07-24 10:37:49 +01:00
str7x.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
str9x.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
str9xpec.c openocd: fix simple cases of NULL comparison 2021-07-24 10:37:49 +01:00
swm050.c openocd: fix simple cases of Yoda condition 2021-07-20 14:55:24 +01:00
tcl.c openocd: use single line for register_commands*() 2021-11-23 11:03:38 +00:00
tms470.c openocd: fix Yoda conditions with checkpatch 2021-07-24 10:38:31 +01:00
virtual.c openocd: remove NULL comparisons with checkpatch [1/2] 2021-07-24 10:38:00 +01:00
w600.c flash/nor: improved API of flash_driver.info & fixed buffer overruns 2021-06-13 19:58:28 +01:00
xcf.c openocd: remove NULL comparisons with checkpatch [1/2] 2021-07-24 10:38:00 +01:00
xmc1xxx.c flash/nor: Do not update 'is_erased' 2021-08-14 13:32:07 +01:00
xmc4xxx.c flash/xmc4xxx: use COMMAND_PARSE_NUMBER in command handlers 2021-08-22 13:18:52 +00:00