This is an automated email from Gerrit. "Carlos Sanchez <carlossanc...@geotab.com>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/8008
-- gerrit commit af42fa6cc910b09c43be05d50ca74b6b04ae1f4a Author: Sven van Ashbrook <svenvanasbro...@geotab.com> Date: Fri Apr 29 11:03:13 2022 -0400 flash/nor/kinetis: Eliminate dependency on fcfg2 Prepare for introduction of S32K. Not every kinetis chip has the same FCFG2 layout. Eliminate kinetis.c's dependency on FCFG2 layout. Change-Id: I191b80f875d80b774b3304a4c7b1368cbd8b3b7f Signed-off-by: Sven van Ashbrook <svenvanasbro...@geotab.com> diff --git a/src/flash/nor/kinetis.c b/src/flash/nor/kinetis.c index f17f76766f..1fbfccac80 100644 --- a/src/flash/nor/kinetis.c +++ b/src/flash/nor/kinetis.c @@ -257,9 +257,8 @@ struct kinetis_chip { bool probed; uint32_t sim_fcfg1; - uint32_t sim_fcfg2; - uint32_t fcfg2_maxaddr0_shifted; - uint32_t fcfg2_maxaddr1_shifted; + uint32_t maxaddr0_shifted; + uint32_t maxaddr1_shifted; unsigned num_pflash_blocks, num_nvm_blocks; unsigned pflash_sector_size, nvm_sector_size; @@ -311,6 +310,7 @@ struct kinetis_chip { struct kinetis_flash_bank banks[KINETIS_MAX_BANKS]; int (*probe_chip)(struct kinetis_chip *k_chip); + int (*bank_verify_maxaddr)(struct flash_bank *bank); }; struct kinetis_type { @@ -394,6 +394,7 @@ static int kinetis_write_inner(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count); static int kinetis_probe_chip(struct kinetis_chip *k_chip); static int s32k_probe_chip(struct kinetis_chip *k_chip); +static int kinetis_bank_verify_maxaddr(struct flash_bank *bank); static int kinetis_auto_probe(struct flash_bank *bank); @@ -880,8 +881,10 @@ static int kinetis_chip_options(struct kinetis_chip *k_chip, int argc, const cha if (i + 1 < argc) k_chip->sim_base = strtoul(argv[++i], NULL, 0); } else if (strcmp(argv[i], "-chipname") == 0) { - if (i + 1 < argc && strcmp(argv[++i], "s32k") == 0) + if (i + 1 < argc && strcmp(argv[++i], "s32k") == 0) { k_chip->probe_chip = s32k_probe_chip; + k_chip->bank_verify_maxaddr = NULL; + } } else LOG_ERROR("Unsupported flash bank option %s", argv[i]); } @@ -911,6 +914,7 @@ FLASH_BANK_COMMAND_HANDLER(kinetis_flash_bank_command) k_chip->target = target; k_chip->probe_chip = kinetis_probe_chip; + k_chip->bank_verify_maxaddr = kinetis_bank_verify_maxaddr; /* only the first defined bank can define chip options */ retval = kinetis_chip_options(k_chip, CMD_ARGC - 6, CMD_ARGV + 6); @@ -2070,7 +2074,7 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) uint32_t ee_size = 0; uint32_t pflash_size_k, nvm_size_k, dflash_size_k; uint32_t pflash_size_m; - uint32_t sim_sdid; + uint32_t sim_sdid, sim_fcfg2; unsigned num_blocks = 0; unsigned maxaddr_shift = 13; struct target *target = k_chip->target; @@ -2518,30 +2522,30 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) if (result != ERROR_OK) return result; - result = target_read_u32(target, k_chip->sim_base + SIM_FCFG2_OFFSET, &k_chip->sim_fcfg2); + result = target_read_u32(target, k_chip->sim_base + SIM_FCFG2_OFFSET, &sim_fcfg2); if (result != ERROR_OK) return result; LOG_DEBUG("SDID: 0x%08" PRIX32 " FCFG1: 0x%08" PRIX32 " FCFG2: 0x%08" PRIX32, sim_sdid, - k_chip->sim_fcfg1, k_chip->sim_fcfg2); + k_chip->sim_fcfg1, sim_fcfg2); fcfg1_nvmsize = (uint8_t)((k_chip->sim_fcfg1 >> 28) & 0x0f); fcfg1_pfsize = (uint8_t)((k_chip->sim_fcfg1 >> 24) & 0x0f); fcfg1_eesize = (uint8_t)((k_chip->sim_fcfg1 >> 16) & 0x0f); fcfg1_depart = (uint8_t)((k_chip->sim_fcfg1 >> 8) & 0x0f); - fcfg2_pflsh = (uint8_t)((k_chip->sim_fcfg2 >> 23) & 0x01); - k_chip->fcfg2_maxaddr0_shifted = ((k_chip->sim_fcfg2 >> 24) & 0x7f) << maxaddr_shift; - k_chip->fcfg2_maxaddr1_shifted = ((k_chip->sim_fcfg2 >> 16) & 0x7f) << maxaddr_shift; + fcfg2_pflsh = (uint8_t)((sim_fcfg2 >> 23) & 0x01); + k_chip->maxaddr0_shifted = ((sim_fcfg2 >> 24) & 0x7f) << maxaddr_shift; + k_chip->maxaddr1_shifted = ((sim_fcfg2 >> 16) & 0x7f) << maxaddr_shift; if (num_blocks == 0) - num_blocks = k_chip->fcfg2_maxaddr1_shifted ? 2 : 1; - else if (k_chip->fcfg2_maxaddr1_shifted == 0 && num_blocks >= 2 && fcfg2_pflsh) { + num_blocks = k_chip->maxaddr1_shifted ? 2 : 1; + else if (k_chip->maxaddr1_shifted == 0 && num_blocks >= 2 && fcfg2_pflsh) { /* fcfg2_maxaddr1 may be zero due to partitioning whole NVM as EEPROM backup * Do not adjust block count in this case! */ num_blocks = 1; LOG_WARNING("MAXADDR1 is zero, number of flash banks adjusted to 1"); - } else if (k_chip->fcfg2_maxaddr1_shifted != 0 && num_blocks == 1) { + } else if (k_chip->maxaddr1_shifted != 0 && num_blocks == 1) { num_blocks = 2; LOG_WARNING("MAXADDR1 is non zero, number of flash banks adjusted to 2"); } @@ -2637,9 +2641,9 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) * Checking fcfg2_maxaddr0 in bank probe is pointless then */ if (fcfg2_pflsh) - k_chip->pflash_size = k_chip->fcfg2_maxaddr0_shifted * num_blocks; + k_chip->pflash_size = k_chip->maxaddr0_shifted * num_blocks; else - k_chip->pflash_size = k_chip->fcfg2_maxaddr0_shifted * num_blocks / 2; + k_chip->pflash_size = k_chip->maxaddr0_shifted * num_blocks / 2; if (k_chip->pflash_size != 2048<<10) LOG_WARNING("SIM_FCFG1 PFSIZE = 0xf: please check if pflash is %" PRIu32 " KB", k_chip->pflash_size>>10); @@ -2693,10 +2697,45 @@ static int kinetis_probe_chip(struct kinetis_chip *k_chip) return ERROR_OK; } +static int kinetis_bank_verify_maxaddr(struct flash_bank *bank) +{ + struct kinetis_flash_bank *k_bank = bank->driver_priv; + struct kinetis_chip *k_chip = k_bank->k_chip; + + uint8_t fcfg2_maxaddr0, fcfg2_pflsh, fcfg2_maxaddr1; + unsigned int first_nvm_bank = k_chip->num_pflash_blocks; + uint32_t sim_fcfg2; + int result; + + result = target_read_u32(k_chip->target, k_chip->sim_base + SIM_FCFG2_OFFSET, &sim_fcfg2); + if (result != ERROR_OK) + return result; + + fcfg2_pflsh = (uint8_t)((sim_fcfg2 >> 23) & 0x01); + fcfg2_maxaddr0 = (uint8_t)((sim_fcfg2 >> 24) & 0x7f); + fcfg2_maxaddr1 = (uint8_t)((sim_fcfg2 >> 16) & 0x7f); + + if (k_bank->bank_number == 0 && k_chip->maxaddr0_shifted != bank->size) + LOG_WARNING("MAXADDR0 0x%02" PRIx8 " check failed," + " please report to OpenOCD mailing list", fcfg2_maxaddr0); + + if (fcfg2_pflsh) { + if (k_bank->bank_number == 1 && k_chip->maxaddr1_shifted != bank->size) + LOG_WARNING("MAXADDR1 0x%02" PRIx8 " check failed," + " please report to OpenOCD mailing list", fcfg2_maxaddr1); + } else { + if (k_bank->bank_number == first_nvm_bank + && k_chip->maxaddr1_shifted != k_chip->dflash_size) + LOG_WARNING("FlexNVM MAXADDR1 0x%02" PRIx8 " check failed," + " please report to OpenOCD mailing list", fcfg2_maxaddr1); + } + + return ERROR_OK; +} + static int kinetis_probe(struct flash_bank *bank) { int result; - uint8_t fcfg2_maxaddr0, fcfg2_pflsh, fcfg2_maxaddr1; unsigned num_blocks, first_nvm_bank; uint32_t size_k; struct kinetis_flash_bank *k_bank = bank->driver_priv; @@ -2780,23 +2819,10 @@ static int kinetis_probe(struct flash_bank *bank) return ERROR_FLASH_BANK_INVALID; } - fcfg2_pflsh = (uint8_t)((k_chip->sim_fcfg2 >> 23) & 0x01); - fcfg2_maxaddr0 = (uint8_t)((k_chip->sim_fcfg2 >> 24) & 0x7f); - fcfg2_maxaddr1 = (uint8_t)((k_chip->sim_fcfg2 >> 16) & 0x7f); - - if (k_bank->bank_number == 0 && k_chip->fcfg2_maxaddr0_shifted != bank->size) - LOG_WARNING("MAXADDR0 0x%02" PRIx8 " check failed," - " please report to OpenOCD mailing list", fcfg2_maxaddr0); - - if (fcfg2_pflsh) { - if (k_bank->bank_number == 1 && k_chip->fcfg2_maxaddr1_shifted != bank->size) - LOG_WARNING("MAXADDR1 0x%02" PRIx8 " check failed," - " please report to OpenOCD mailing list", fcfg2_maxaddr1); - } else { - if (k_bank->bank_number == first_nvm_bank - && k_chip->fcfg2_maxaddr1_shifted != k_chip->dflash_size) - LOG_WARNING("FlexNVM MAXADDR1 0x%02" PRIx8 " check failed," - " please report to OpenOCD mailing list", fcfg2_maxaddr1); + if (k_chip->bank_verify_maxaddr) { + result = k_chip->bank_verify_maxaddr(bank); + if (result != ERROR_OK) + return result; } free(bank->sectors); --