flash/stm32l4x: fix scan-build warnings
[openocd.git] / src / flash / nor / stm32l4x.c
index fa8924ed385e12dc144930e7ae37d49eb256f911..0a9d59ccf832f517fed193d71209f2bb3b5ea8e2 100644 (file)
@@ -1078,7 +1078,7 @@ static int stm32l4_get_all_wrpxy(struct flash_bank *bank, enum stm32_bank_id dev
        if (dev_bank_id != STM32_BANK1 && stm32l4_info->dual_bank_mode)
                wrp2y_sectors_offset = stm32l4_info->bank1_sectors;
 
-       if (wrp2y_sectors_offset > -1) {
+       if (wrp2y_sectors_offset >= 0) {
                /* get WRP2AR */
                ret = stm32l4_get_one_wrpxy(bank, &wrpxy[(*n_wrp)++], STM32_FLASH_WRP2AR_INDEX, wrp2y_sectors_offset);
                if (ret != ERROR_OK)
@@ -1220,49 +1220,11 @@ err_lock:
        return retval2;
 }
 
-static int stm32l4_protect(struct flash_bank *bank, int set, unsigned int first, unsigned int last)
+static int stm32l4_protect_same_bank(struct flash_bank *bank, enum stm32_bank_id bank_id, int set,
+               unsigned int first, unsigned int last)
 {
-       struct target *target = bank->target;
-       struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
-       int ret = ERROR_OK;
        unsigned int i;
 
-       if (stm32l4_is_otp(bank)) {
-               LOG_ERROR("cannot protect/unprotect OTP memory");
-               return ERROR_FLASH_OPER_UNSUPPORTED;
-       }
-
-       if (target->state != TARGET_HALTED) {
-               LOG_ERROR("Target not halted");
-               return ERROR_TARGET_NOT_HALTED;
-       }
-
-       /* the requested sectors could be located into bank1 and/or bank2 */
-       bool use_bank2 = false;
-       if (last >= stm32l4_info->bank1_sectors) {
-               if (first < stm32l4_info->bank1_sectors) {
-                       /* the requested sectors for (un)protection are shared between
-                        * bank 1 and 2, then split the operation */
-
-                       /*  1- deal with bank 1 sectors */
-                       LOG_DEBUG("The requested sectors for %s are shared between bank 1 and 2",
-                                       set ? "protection" : "unprotection");
-                       ret = stm32l4_protect(bank, set, first, stm32l4_info->bank1_sectors - 1);
-                       if (ret != ERROR_OK)
-                               return ret;
-
-                       /*  2- then continue with bank 2 sectors */
-                       first = stm32l4_info->bank1_sectors;
-               }
-
-               use_bank2 = true;
-       }
-
-       /* refresh the sectors' protection */
-       ret = stm32l4_protect_check(bank);
-       if (ret != ERROR_OK)
-               return ret;
-
        /* check if the desired protection is already configured */
        for (i = first; i <= last; i++) {
                if (bank->sectors[i].is_protected != set)
@@ -1278,7 +1240,7 @@ static int stm32l4_protect(struct flash_bank *bank, int set, unsigned int first,
        unsigned int n_wrp;
        struct stm32l4_wrp wrpxy[4];
 
-       ret = stm32l4_get_all_wrpxy(bank, use_bank2 ? STM32_BANK2 : STM32_BANK1, wrpxy, &n_wrp);
+       int ret = stm32l4_get_all_wrpxy(bank, bank_id, wrpxy, &n_wrp);
        if (ret != ERROR_OK)
                return ret;
 
@@ -1349,6 +1311,40 @@ static int stm32l4_protect(struct flash_bank *bank, int set, unsigned int first,
        return stm32l4_write_all_wrpxy(bank, wrpxy, n_wrp);
 }
 
+static int stm32l4_protect(struct flash_bank *bank, int set, unsigned int first, unsigned int last)
+{
+       struct target *target = bank->target;
+       struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
+
+       if (stm32l4_is_otp(bank)) {
+               LOG_ERROR("cannot protect/unprotect OTP memory");
+               return ERROR_FLASH_OPER_UNSUPPORTED;
+       }
+
+       if (target->state != TARGET_HALTED) {
+               LOG_ERROR("Target not halted");
+               return ERROR_TARGET_NOT_HALTED;
+       }
+
+       /* refresh the sectors' protection */
+       int ret = stm32l4_protect_check(bank);
+       if (ret != ERROR_OK)
+               return ret;
+
+       /* the requested sectors could be located into bank1 and/or bank2 */
+       if (last < stm32l4_info->bank1_sectors) {
+               return stm32l4_protect_same_bank(bank, STM32_BANK1, set, first, last);
+       } else if (first >= stm32l4_info->bank1_sectors) {
+               return stm32l4_protect_same_bank(bank, STM32_BANK2, set, first, last);
+       } else {
+               ret = stm32l4_protect_same_bank(bank, STM32_BANK1, set, first, stm32l4_info->bank1_sectors - 1);
+               if (ret != ERROR_OK)
+                       return ret;
+
+               return stm32l4_protect_same_bank(bank, STM32_BANK2, set, stm32l4_info->bank1_sectors, last);
+       }
+}
+
 /* count is the size divided by stm32l4_info->data_width */
 static int stm32l4_write_block(struct flash_bank *bank, const uint8_t *buffer,
        uint32_t offset, uint32_t count)
@@ -1632,7 +1628,7 @@ err_lock:
 
 static int stm32l4_read_idcode(struct flash_bank *bank, uint32_t *id)
 {
-       int retval;
+       int retval = ERROR_OK;
        struct target *target = bank->target;
 
        /* try reading possible IDCODE registers, in the following order */
@@ -1757,7 +1753,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 +1766,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;
@@ -1987,6 +1983,15 @@ static int stm32l4_probe(struct flash_bank *bank)
                return ERROR_FAIL;
        }
 
+       /* ensure that at least there is 1 flash sector / page */
+       if (num_pages == 0) {
+               if (stm32l4_info->user_bank_size)
+                       LOG_ERROR("The specified flash size is less than page size");
+
+               LOG_ERROR("Flash pages count cannot be zero");
+               return ERROR_FAIL;
+       }
+
        LOG_INFO("flash mode : %s-bank", stm32l4_info->dual_bank_mode ? "dual" : "single");
 
        const int gap_size_kb = stm32l4_info->hole_sectors * page_size_kb;
@@ -2046,8 +2051,19 @@ static int stm32l4_auto_probe(struct flash_bank *bank)
        if (stm32l4_info->probed) {
                uint32_t optr_cur;
 
+               /* save flash_regs_base */
+               uint32_t saved_flash_regs_base = stm32l4_info->flash_regs_base;
+
+               /* 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;
+
                /* 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 */
+               stm32l4_info->flash_regs_base = saved_flash_regs_base;
+
                if (retval != ERROR_OK)
                        return retval;
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)