flash/nor: Do not update 'is_erased'
[fw/openocd] / src / flash / nor / stm32l4x.c
index 594bce03930c926e5a56ec8c55aeaa80dee71b94..7d6c900283b14eae3d91147a8f795c1092c4f479 100644 (file)
@@ -24,6 +24,7 @@
 #endif
 
 #include "imp.h"
+#include <helper/align.h>
 #include <helper/binarybuffer.h>
 #include <target/algorithm.h>
 #include <target/armv7m.h>
@@ -1001,8 +1002,6 @@ static int stm32l4_erase(struct flash_bank *bank, unsigned int first,
                retval = stm32l4_wait_status_busy(bank, FLASH_ERASE_TIMEOUT);
                if (retval != ERROR_OK)
                        break;
-
-               bank->sectors[i].is_erased = 1;
        }
 
 err_lock:
@@ -1320,10 +1319,10 @@ static int stm32l4_read_idcode(struct flash_bank *bank, uint32_t *id)
        int retval;
 
        /* try reading possible IDCODE registers, in the following order */
-       uint32_t DBGMCU_IDCODE[] = {DBGMCU_IDCODE_L4_G4, DBGMCU_IDCODE_G0, DBGMCU_IDCODE_L5};
+       uint32_t dbgmcu_idcode[] = {DBGMCU_IDCODE_L4_G4, DBGMCU_IDCODE_G0, DBGMCU_IDCODE_L5};
 
-       for (unsigned int i = 0; i < ARRAY_SIZE(DBGMCU_IDCODE); i++) {
-               retval = target_read_u32(bank->target, DBGMCU_IDCODE[i], id);
+       for (unsigned int i = 0; i < ARRAY_SIZE(dbgmcu_idcode); i++) {
+               retval = target_read_u32(bank->target, dbgmcu_idcode[i], id);
                if ((retval == ERROR_OK) && ((*id & 0xfff) != 0) && ((*id & 0xfff) != 0xfff))
                        return ERROR_OK;
        }
@@ -1332,13 +1331,35 @@ static int stm32l4_read_idcode(struct flash_bank *bank, uint32_t *id)
        return (retval == ERROR_OK) ? ERROR_FAIL : retval;
 }
 
+static const char *get_stm32l4_rev_str(struct flash_bank *bank)
+{
+       struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
+       const struct stm32l4_part_info *part_info = stm32l4_info->part_info;
+       assert(part_info);
+
+       const uint16_t rev_id = stm32l4_info->idcode >> 16;
+       for (unsigned int i = 0; i < part_info->num_revs; i++) {
+               if (rev_id == part_info->revs[i].rev)
+                       return part_info->revs[i].str;
+       }
+       return "'unknown'";
+}
+
+static const char *get_stm32l4_bank_type_str(struct flash_bank *bank)
+{
+       struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
+       assert(stm32l4_info->part_info);
+       return stm32l4_is_otp(bank) ? "OTP" :
+                       stm32l4_info->dual_bank_mode ? "Flash dual" :
+                       "Flash single";
+}
+
 static int stm32l4_probe(struct flash_bank *bank)
 {
        struct target *target = bank->target;
        struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
        const struct stm32l4_part_info *part_info;
        uint16_t flash_size_kb = 0xffff;
-       uint32_t device_id;
        uint32_t options;
 
        stm32l4_info->probed = false;
@@ -1348,11 +1369,13 @@ static int stm32l4_probe(struct flash_bank *bank)
        if (retval != ERROR_OK)
                return retval;
 
-       device_id = stm32l4_info->idcode & 0xFFF;
+       const uint32_t device_id = stm32l4_info->idcode & 0xFFF;
 
        for (unsigned int n = 0; n < ARRAY_SIZE(stm32l4_parts); n++) {
-               if (device_id == stm32l4_parts[n].id)
+               if (device_id == stm32l4_parts[n].id) {
                        stm32l4_info->part_info = &stm32l4_parts[n];
+                       break;
+               }
        }
 
        if (!stm32l4_info->part_info) {
@@ -1361,14 +1384,14 @@ static int stm32l4_probe(struct flash_bank *bank)
        }
 
        part_info = stm32l4_info->part_info;
-       stm32l4_info->flash_regs = stm32l4_info->part_info->default_flash_regs;
+       const char *rev_str = get_stm32l4_rev_str(bank);
+       const uint16_t rev_id = stm32l4_info->idcode >> 16;
 
-       char device_info[1024];
-       retval = bank->driver->info(bank, device_info, sizeof(device_info));
-       if (retval != ERROR_OK)
-               return retval;
+       LOG_INFO("device idcode = 0x%08" PRIx32 " (%s - Rev %s : 0x%04x - %s-bank)",
+                       stm32l4_info->idcode, part_info->device_str, rev_str, rev_id,
+                       get_stm32l4_bank_type_str(bank));
 
-       LOG_INFO("device idcode = 0x%08" PRIx32 " (%s)", stm32l4_info->idcode, device_info);
+       stm32l4_info->flash_regs = stm32l4_info->part_info->default_flash_regs;
 
        /* read flash option register */
        retval = stm32l4_read_flash_reg_by_index(bank, STM32_FLASH_OPTR_INDEX, &options);
@@ -1567,7 +1590,7 @@ static int stm32l4_probe(struct flash_bank *bank)
         * max_flash_size is always power of two, so max_pages too
         */
        uint32_t max_pages = stm32l4_info->part_info->max_flash_size_kb / page_size_kb;
-       assert((max_pages & (max_pages - 1)) == 0);
+       assert(IS_PWR_OF_2(max_pages));
 
        /* in dual bank mode number of pages is doubled, but extra bit is bank selection */
        stm32l4_info->wrpxxr_mask = ((max_pages >> (stm32l4_info->dual_bank_mode ? 1 : 0)) - 1);
@@ -1579,7 +1602,7 @@ static int stm32l4_probe(struct flash_bank *bank)
        bank->size = (flash_size_kb + gap_size_kb) * 1024;
        bank->num_sectors = num_pages;
        bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
-       if (bank->sectors == NULL) {
+       if (!bank->sectors) {
                LOG_ERROR("failed to allocate bank sectors");
                return ERROR_FAIL;
        }
@@ -1608,33 +1631,19 @@ static int stm32l4_auto_probe(struct flash_bank *bank)
        return stm32l4_probe(bank);
 }
 
-static int get_stm32l4_info(struct flash_bank *bank, char *buf, int buf_size)
+static int get_stm32l4_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
        struct stm32l4_flash_bank *stm32l4_info = bank->driver_priv;
        const struct stm32l4_part_info *part_info = stm32l4_info->part_info;
 
        if (part_info) {
-               const char *rev_str = NULL;
-               uint16_t rev_id = stm32l4_info->idcode >> 16;
-               for (unsigned int i = 0; i < part_info->num_revs; i++) {
-                       if (rev_id == part_info->revs[i].rev) {
-                               rev_str = part_info->revs[i].str;
-                               break;
-                       }
-               }
-
-               int buf_len = snprintf(buf, buf_size, "%s - Rev %s : 0x%04x",
-                               part_info->device_str, rev_str ? rev_str : "'unknown'", rev_id);
-
+               const uint16_t rev_id = stm32l4_info->idcode >> 16;
+               command_print_sameline(cmd, "%s - Rev %s : 0x%04x", part_info->device_str,
+                               get_stm32l4_rev_str(bank), rev_id);
                if (stm32l4_info->probed)
-                       snprintf(buf + buf_len, buf_size - buf_len, " - %s-bank",
-                                       stm32l4_is_otp(bank) ? "OTP" :
-                                       stm32l4_info->dual_bank_mode ? "Flash dual" : "Flash single");
-
-               return ERROR_OK;
+                       command_print_sameline(cmd, " - %s-bank", get_stm32l4_bank_type_str(bank));
        } else {
-               snprintf(buf, buf_size, "Cannot identify target as an %s device", device_families);
-               return ERROR_FAIL;
+               command_print_sameline(cmd, "Cannot identify target as an %s device", device_families);
        }
 
        return ERROR_OK;
@@ -1698,19 +1707,14 @@ COMMAND_HANDLER(stm32l4_handle_mass_erase_command)
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        retval = stm32l4_mass_erase(bank);
-       if (retval == ERROR_OK) {
-               /* set all sectors as erased */
-               for (unsigned int i = 0; i < bank->num_sectors; i++)
-                       bank->sectors[i].is_erased = 1;
-
+       if (retval == ERROR_OK)
                command_print(CMD, "stm32l4x mass erase complete");
-       } else {
+       else
                command_print(CMD, "stm32l4x mass erase failed");
-       }
 
        return retval;
 }
@@ -1724,7 +1728,7 @@ COMMAND_HANDLER(stm32l4_handle_option_read_command)
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        uint32_t reg_offset, reg_addr;
@@ -1734,7 +1738,7 @@ COMMAND_HANDLER(stm32l4_handle_option_read_command)
        reg_addr = stm32l4_get_flash_reg(bank, reg_offset);
 
        retval = stm32l4_read_flash_reg(bank, reg_offset, &value);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        command_print(CMD, "Option Register: <0x%" PRIx32 "> = 0x%" PRIx32 "", reg_addr, value);
@@ -1751,7 +1755,7 @@ COMMAND_HANDLER(stm32l4_handle_option_write_command)
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        uint32_t reg_offset;
@@ -1778,15 +1782,15 @@ COMMAND_HANDLER(stm32l4_handle_option_load_command)
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        retval = stm32l4_unlock_reg(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        retval = stm32l4_unlock_option_reg(bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        /* Set OBL_LAUNCH bit in CR -> system reset and option bytes reload,
@@ -1814,7 +1818,7 @@ COMMAND_HANDLER(stm32l4_handle_lock_command)
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        if (stm32l4_is_otp(bank)) {
@@ -1849,7 +1853,7 @@ COMMAND_HANDLER(stm32l4_handle_unlock_command)
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        if (stm32l4_is_otp(bank)) {
@@ -1881,7 +1885,7 @@ COMMAND_HANDLER(stm32l4_handle_wrp_info_command)
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        if (stm32l4_is_otp(bank)) {
@@ -1953,7 +1957,7 @@ COMMAND_HANDLER(stm32l4_handle_otp_command)
 
        struct flash_bank *bank;
        int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
-       if (ERROR_OK != retval)
+       if (retval != ERROR_OK)
                return retval;
 
        if (!stm32l4_is_otp(bank)) {