openocd: fix SPDX tag format for files .c
[fw/openocd] / src / flash / nor / sim3x.c
index 4628e68ed23822c439eb77f47410c4b6d3c73fac..42550d06bc7fa9a9a9f21334bf885c03bcbe10a6 100644 (file)
@@ -1,19 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 /***************************************************************************
- *   Copyright (C) 2014 by Ladislav Bábel                                  *
+ *   Copyright (C) 2014 by Ladislav Bábel                                  *
  *   ladababel@seznam.cz                                                   *
  *                                                                         *
  *   Copyright (C) 2015 by Andreas Bomholtz                                *
  *   andreas@seluxit.com                                                   *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
  ***************************************************************************/
 
 #ifdef HAVE_CONFIG_H
@@ -24,6 +16,7 @@
 #include <helper/binarybuffer.h>
 #include <helper/time_support.h>
 #include <target/algorithm.h>
+#include <target/arm_adi_v5.h>
 #include <target/cortex_m.h>
 
 /* SI32_DEVICEID0 */
@@ -247,7 +240,7 @@ static int sim3x_erase_page(struct flash_bank *bank, uint32_t addr)
                        if (ret != ERROR_OK)
                                return ret;
 
-                       /* Write the inital unlock value to KEY */
+                       /* Write the initial unlock value to KEY */
                        ret = target_write_u32(target, FLASHCTRL0_KEY,
                        FLASHCTRL0_KEY_INITIAL_UNLOCK);
                        if (ret != ERROR_OK)
@@ -274,9 +267,10 @@ static int sim3x_erase_page(struct flash_bank *bank, uint32_t addr)
        return ERROR_FAIL;
 }
 
-static int sim3x_flash_erase(struct flash_bank *bank, int first, int last)
+static int sim3x_flash_erase(struct flash_bank *bank, unsigned int first,
+               unsigned int last)
 {
-       int ret, i;
+       int ret;
        uint32_t temp;
        struct sim3x_info *sim3x_info;
        struct target *target;
@@ -299,7 +293,7 @@ static int sim3x_flash_erase(struct flash_bank *bank, int first, int last)
        }
 
        /* erase pages */
-       for (i = first; i <= last; i++) {
+       for (unsigned int i = first; i <= last; i++) {
                ret = sim3x_erase_page(bank, bank->sectors[i].offset);
                if (ret != ERROR_OK)
                        return ret;
@@ -308,7 +302,7 @@ static int sim3x_flash_erase(struct flash_bank *bank, int first, int last)
        target = bank->target;
 
        /* Wait until busy */
-       for (i = 0; i < FLASH_BUSY_TIMEOUT; i++) {
+       for (unsigned int i = 0; i < FLASH_BUSY_TIMEOUT; i++) {
                ret = target_read_u32(target, FLASHCTRL0_CONFIG_ALL, &temp);
                if (ret != ERROR_OK)
                        return ret;
@@ -468,7 +462,7 @@ static int sim3x_write_block(struct flash_bank *bank, const uint8_t *buf,
        return ret;
 }
 
-static int sim3x_flash_write(struct flash_bank *bank, const uint8_t * buffer, uint32_t offset, uint32_t count)
+static int sim3x_flash_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
 {
        int ret;
        struct target *target;
@@ -486,7 +480,7 @@ static int sim3x_flash_write(struct flash_bank *bank, const uint8_t * buffer, ui
        sim3x_info = bank->driver_priv;
 
        if (sim3x_info->flash_locked) {
-               LOG_ERROR("Falsh is locked");
+               LOG_ERROR("Flash is locked");
                return ERROR_FAIL;
        }
 
@@ -507,13 +501,13 @@ static int sim3x_flash_write(struct flash_bank *bank, const uint8_t * buffer, ui
                count++;
                new_buffer = malloc(count);
 
-               if (new_buffer == NULL) {
+               if (!new_buffer) {
                        LOG_ERROR("odd number of bytes to write and no memory "
                                        "for padding buffer");
                        return ERROR_FAIL;
                }
-               LOG_INFO("odd number of bytes to write (%d), extending to %d "
-                               "and padding with 0xff", old_count, count);
+               LOG_INFO("odd number of bytes to write (%" PRIu32 "), extending to %" PRIu32
+                               " and padding with 0xff", old_count, count);
 
                new_buffer[count - 1] = 0xff;
                buffer = memcpy(new_buffer, buffer, old_count);
@@ -544,7 +538,7 @@ static int sim3x_flash_lock_check(struct flash_bank *bank)
 
 static int sim3x_flash_protect_check(struct flash_bank *bank)
 {
-       int ret, i;
+       int ret;
        struct sim3x_info *sim3x_info;
 
        /* Check if target is halted */
@@ -559,13 +553,14 @@ static int sim3x_flash_protect_check(struct flash_bank *bank)
 
        sim3x_info = bank->driver_priv;
 
-       for (i = 0; i < bank->num_sectors; i++)
+       for (unsigned int i = 0; i < bank->num_sectors; i++)
                bank->sectors[i].is_protected = sim3x_info->flash_locked;
 
        return ERROR_OK;
 }
 
-static int sim3x_flash_protect(struct flash_bank *bank, int set, int first, int last)
+static int sim3x_flash_protect(struct flash_bank *bank, int set,
+               unsigned int first, unsigned int last)
 {
        int ret;
        uint8_t lock_word[4];
@@ -748,7 +743,7 @@ static int sim3x_read_info(struct flash_bank *bank)
        }
 
        if (((cpuid >> 4) & 0xfff) != 0xc23) {
-               LOG_ERROR("Target is not CortexM3");
+               LOG_ERROR("Target is not Cortex-M3");
                return ERROR_FAIL;
        }
 
@@ -796,10 +791,7 @@ static int sim3x_probe(struct flash_bank *bank)
        if (ret != ERROR_OK)
                return ret;
 
-       if (bank->sectors) {
-               free(bank->sectors);
-               bank->sectors = NULL;
-       }
+       free(bank->sectors);
 
        bank->base = FLASH_BASE_ADDRESS;
        bank->size = sim3x_info->flash_size_kb * SIM3X_FLASH_PAGE_SIZE;
@@ -832,56 +824,32 @@ static int sim3x_auto_probe(struct flash_bank *bank)
        }
 }
 
-static int sim3x_flash_info(struct flash_bank *bank, char *buf, int buf_size)
+static int sim3x_flash_info(struct flash_bank *bank, struct command_invocation *cmd)
 {
-       int ret;
-       int printed = 0;
        struct sim3x_info *sim3x_info;
 
        sim3x_info = bank->driver_priv;
 
        /* Read info about chip */
-       ret = sim3x_read_info(bank);
+       int ret = sim3x_read_info(bank);
        if (ret != ERROR_OK)
                return ret;
 
        /* Part */
        if (sim3x_info->part_family && sim3x_info->part_number) {
-               printed = snprintf(buf, buf_size, "SiM3%c%d", sim3x_info->part_family, sim3x_info->part_number);
-               buf += printed;
-               buf_size -= printed;
-
-               if (buf_size <= 0)
-                       return ERROR_BUF_TOO_SMALL;
+               command_print_sameline(cmd, "SiM3%c%d", sim3x_info->part_family, sim3x_info->part_number);
 
                /* Revision */
                if (sim3x_info->device_revision && sim3x_info->device_revision <= 'Z' - 'A') {
-                       printed = snprintf(buf, buf_size, "-%c", sim3x_info->device_revision + 'A');
-                       buf += printed;
-                       buf_size -= printed;
-
-                       if (buf_size <= 0)
-                               return ERROR_BUF_TOO_SMALL;
+                       command_print_sameline(cmd, "-%c", sim3x_info->device_revision + 'A');
 
                        /* Package */
-                       if (sim3x_info->device_package) {
-                               printed = snprintf(buf, buf_size, "-G%s", sim3x_info->device_package);
-                               buf += printed;
-                               buf_size -= printed;
-
-                               if (buf_size <= 0)
-                                       return ERROR_BUF_TOO_SMALL;
-                       }
+                       command_print_sameline(cmd, "-G%s", sim3x_info->device_package);
                }
        }
 
        /* Print flash size */
-       printed = snprintf(buf, buf_size, " flash_size = %dKB", sim3x_info->flash_size_kb);
-       buf += printed;
-       buf_size -= printed;
-
-       if (buf_size <= 0)
-               return ERROR_BUF_TOO_SMALL;
+       command_print_sameline(cmd, " flash_size = %dKB", sim3x_info->flash_size_kb);
 
        return ERROR_OK;
 }
@@ -893,16 +861,23 @@ static int sim3x_flash_info(struct flash_bank *bank, char *buf, int buf_size)
  */
 static int ap_write_register(struct adiv5_dap *dap, unsigned reg, uint32_t value)
 {
-       int retval;
        LOG_DEBUG("DAP_REG[0x%02x] <- %08" PRIX32, reg, value);
 
-       retval = dap_queue_ap_write(dap, reg, value);
+       struct adiv5_ap *ap = dap_get_ap(dap, SIM3X_AP);
+       if (!ap) {
+               LOG_DEBUG("DAP: failed to get AP");
+               return ERROR_FAIL;
+       }
+
+       int retval = dap_queue_ap_write(ap, reg, value);
        if (retval != ERROR_OK) {
                LOG_DEBUG("DAP: failed to queue a write request");
+               dap_put_ap(ap);
                return retval;
        }
 
        retval = dap_run(dap);
+       dap_put_ap(ap);
        if (retval != ERROR_OK) {
                LOG_DEBUG("DAP: dap_run failed");
                return retval;
@@ -913,14 +888,21 @@ static int ap_write_register(struct adiv5_dap *dap, unsigned reg, uint32_t value
 
 static int ap_read_register(struct adiv5_dap *dap, unsigned reg, uint32_t *result)
 {
-       int retval;
-       retval = dap_queue_ap_read(dap, reg, result);
+       struct adiv5_ap *ap = dap_get_ap(dap, SIM3X_AP);
+       if (!ap) {
+               LOG_DEBUG("DAP: failed to get AP");
+               return ERROR_FAIL;
+       }
+
+       int retval = dap_queue_ap_read(ap, reg, result);
        if (retval != ERROR_OK) {
                LOG_DEBUG("DAP: failed to queue a read request");
+               dap_put_ap(ap);
                return retval;
        }
 
        retval = dap_run(dap);
+       dap_put_ap(ap);
        if (retval != ERROR_OK) {
                LOG_DEBUG("DAP: dap_run failed");
                return retval;
@@ -956,15 +938,12 @@ COMMAND_HANDLER(sim3x_mass_erase)
        struct cortex_m_common *cortex_m = target_to_cm(target);
        struct adiv5_dap *dap = cortex_m->armv7m.arm.dap;
 
-       if (dap == NULL) {
+       if (!dap) {
                /* Used debug interface doesn't support direct DAP access */
                LOG_ERROR("mass_erase can't be used by this debug interface");
                return ERROR_FAIL;
        }
 
-       const uint8_t origninal_ap = dap->ap_current >> 24;
-       dap_ap_select(dap, SIM3X_AP);
-
        ret = ap_read_register(dap, SIM3X_AP_ID, &val);
        if (ret != ERROR_OK)
                return ret;
@@ -991,8 +970,6 @@ COMMAND_HANDLER(sim3x_mass_erase)
        if (ret != ERROR_OK)
                return ret;
 
-       dap_ap_select(dap, origninal_ap);
-
        LOG_INFO("Mass erase success");
        return ERROR_OK;
 }
@@ -1006,9 +983,9 @@ COMMAND_HANDLER(sim3x_lock)
        struct cortex_m_common *cortex_m = target_to_cm(target);
        struct adiv5_dap *dap = cortex_m->armv7m.arm.dap;
 
-       if (dap == NULL) {
+       if (!dap) {
                /* Used debug interface doesn't support direct DAP access */
-               LOG_INFO("Target can't by unlocked by this debug interface");
+               LOG_INFO("Target can't be unlocked by this debug interface");
 
                /* Core check */
                ret = target_read_u32(target, CPUID, &val);
@@ -1016,13 +993,10 @@ COMMAND_HANDLER(sim3x_lock)
                        return ret;
 
                if ((val & CPUID_CHECK_VALUE_MASK) != CPUID_CHECK_VALUE) {
-                       LOG_ERROR("Target is not ARM CortexM3 or is already locked");
+                       LOG_ERROR("Target is not ARM Cortex-M3 or is already locked");
                        return ERROR_FAIL;
                }
        } else {
-               const uint8_t origninal_ap = dap->ap_current >> 24;
-               dap_ap_select(dap, SIM3X_AP);
-
                /* check SIM3X_AP_ID */
                ret = ap_read_register(dap, SIM3X_AP_ID, &val);
                if (ret != ERROR_OK)
@@ -1037,13 +1011,11 @@ COMMAND_HANDLER(sim3x_lock)
                ret = target_read_u32(target, CPUID, &val);
                /* if correct value is read, then it will continue */
                if (ret != ERROR_OK || (val & CPUID_CHECK_VALUE_MASK) != CPUID_CHECK_VALUE) {
-                       /* if correct value is'n read, then it will check SIM3X_AP_INIT_STAT register */
+                       /* if correct value isn't read, then it will check SIM3X_AP_INIT_STAT register */
                        ret = ap_read_register(dap, SIM3X_AP_INIT_STAT, &val);
                        if (ret != ERROR_OK)
                                return ret;
 
-                       dap_ap_select(dap, origninal_ap);
-
                        if (val & SIM3X_AP_INIT_STAT_LOCK) {
                                LOG_INFO("Target is already locked");
                                return ERROR_OK;
@@ -1052,8 +1024,6 @@ COMMAND_HANDLER(sim3x_lock)
                                return ERROR_FAIL;
                        }
                }
-
-               dap_ap_select(dap, origninal_ap);
        }
 
        ret = target_read_u32(target, LOCK_WORD_ADDRESS, &val);
@@ -1072,7 +1042,7 @@ COMMAND_HANDLER(sim3x_lock)
                        return retval;
 
                ret = sim3x_flash_write(bank, lock_word, LOCK_WORD_ADDRESS, 4);
-               if (ERROR_OK != ret)
+               if (ret != ERROR_OK)
                        return ret;
 
                LOG_INFO("Target is successfully locked");
@@ -1085,7 +1055,7 @@ COMMAND_HANDLER(sim3x_lock)
                LOG_ERROR("Unexpected lock word value");
 
                /* SIM3X_AP_ID_VALUE is not checked */
-               if (dap == NULL)
+               if (!dap)
                        LOG_INFO("Maybe this isn't a SiM3x MCU");
 
                return ERROR_FAIL;
@@ -1121,7 +1091,7 @@ static const struct command_registration sim3x_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-struct flash_driver sim3x_flash = {
+const struct flash_driver sim3x_flash = {
        .name = "sim3x",
        .commands = sim3x_command_handlers,
        .flash_bank_command = sim3x_flash_bank_command,
@@ -1133,5 +1103,6 @@ struct flash_driver sim3x_flash = {
        .auto_probe = sim3x_auto_probe,
        .erase_check = default_flash_blank_check,
        .protect_check = sim3x_flash_protect_check,
-       .info = sim3x_flash_info
+       .info = sim3x_flash_info,
+       .free_driver_priv = default_flash_free_driver_priv,
 };