This is an automated email from Gerrit.

"Tarek BOCHKATI <tarek.bouchk...@gmail.com>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/6864

-- gerrit

commit 6dd95a69e2ba983263bc3ac3d73212e6c51fd5c9
Author: Tarek BOCHKATI <tarek.bouchk...@gmail.com>
Date:   Mon Feb 28 13:55:26 2022 +0100

    flash/stm32l4x: fix auto-probe when RDP is promoted from 0 to 0.5
    
    Considering this use case: (using STM32 L5 or U5)
     1- first probe : TZEN enabled, RDP level 0
        flash_regs_base |= STM32L5_REGS_SEC_OFFSET => 0x50022000
     2- the user promotes the RDP to level 0.5
     3- the second probe, fails to read OPTR using secure flags_regs_base:
        used OPTR address is 0x50022040
    
    Step 3 fails because when RDP is level 0.5, we should use Non-Secure
    flash registers.
    To fix this, always use NS flash regs to read OPTR in probe functions.
    
    Fixes: 80d323c6e82b (flash/stm32l4x: introduce auto-probe when OPTR is 
changed)
    Change-Id: I296aa633972b0c410b927488c999584a07b912d3
    Signed-off-by: Tarek BOCHKATI <tarek.bouchk...@gmail.com>

diff --git a/src/flash/nor/stm32l4x.c b/src/flash/nor/stm32l4x.c
index fd0338899f..a1800c8aab 100644
--- a/src/flash/nor/stm32l4x.c
+++ b/src/flash/nor/stm32l4x.c
@@ -1757,7 +1757,7 @@ static int stm32l4_probe(struct flash_bank *bank)
         * Ask the flash infrastructure to ensure required alignment */
        bank->write_start_alignment = bank->write_end_alignment = 
stm32l4_info->data_width;
 
-       /* initialise the flash registers layout */
+       /* Initialize the flash registers layout */
        if (part_info->flags & F_HAS_L5_FLASH_REGS)
                stm32l4_info->flash_regs = stm32l5_ns_flash_regs;
        else
@@ -1770,7 +1770,7 @@ static int stm32l4_probe(struct flash_bank *bank)
 
        stm32l4_sync_rdp_tzen(bank);
 
-       /* for devices with trustzone, use flash secure registers when TZEN=1 
and RDP is LEVEL_0 */
+       /* for devices with TrustZone, use flash secure registers when TZEN=1 
and RDP is LEVEL_0 */
        if (stm32l4_info->tzen && (stm32l4_info->rdp == RDP_LEVEL_0)) {
                if (part_info->flags & F_HAS_L5_FLASH_REGS) {
                        stm32l4_info->flash_regs_base |= 
STM32L5_REGS_SEC_OFFSET;
@@ -2046,8 +2046,23 @@ static int stm32l4_auto_probe(struct flash_bank *bank)
        if (stm32l4_info->probed) {
                uint32_t optr_cur;
 
+               /* save flash regs_base and regs map */
+               uint32_t saved_flash_regs_base = stm32l4_info->flash_regs_base;
+               const uint32_t *saved_flash_regs = stm32l4_info->flash_regs;
+
+               /* for devices with TrustZone, use NS flash registers to read 
OPTR */
+               if (stm32l4_info->part_info->flags & F_HAS_L5_FLASH_REGS) {
+                       stm32l4_info->flash_regs_base &= 
~STM32L5_REGS_SEC_OFFSET;
+                       stm32l4_info->flash_regs = stm32l5_ns_flash_regs;
+               }
+
                /* read flash option register and re-probe if optr value is 
changed */
                int retval = stm32l4_read_flash_reg_by_index(bank, 
STM32_FLASH_OPTR_INDEX, &optr_cur);
+
+               /* restore saved flash regs_base and regs map */
+               stm32l4_info->flash_regs_base = saved_flash_regs_base;
+               stm32l4_info->flash_regs = saved_flash_regs;
+
                if (retval != ERROR_OK)
                        return retval;
 

-- 

Reply via email to