diff options
author | Marek Vasut <marek.vasut@gmail.com> | 2010-12-30 04:54:24 +0100 |
---|---|---|
committer | Øyvind Harboe <oyvind.harboe@zylin.com> | 2010-12-30 08:19:47 +0100 |
commit | 0136977c40e41cdaab5d775c4e370763006ad99c (patch) | |
tree | 6d799420d9c1b800843b99a07c0f1e55751b6b32 /src | |
parent | 50e79d60ce148f86bc93cc3248c3f6f0f81b3c3e (diff) | |
download | riscv-openocd-0136977c40e41cdaab5d775c4e370763006ad99c.zip riscv-openocd-0136977c40e41cdaab5d775c4e370763006ad99c.tar.gz riscv-openocd-0136977c40e41cdaab5d775c4e370763006ad99c.tar.bz2 |
CORTEX A8: Fix broken CPU identification
This patch fixes the issue where the OMAP CPU (and possibly others) was mistaken
for iMX51 and therefore had misadjusted debug base.
Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/target/arm_adi_v5.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c index 69a3ce7..7df0d4f 100644 --- a/src/target/arm_adi_v5.c +++ b/src/target/arm_adi_v5.c @@ -1013,10 +1013,11 @@ is_dap_cid_ok(uint32_t cid3, uint32_t cid2, uint32_t cid1, uint32_t cid0) struct broken_cpu { uint32_t dbgbase; uint32_t apid; + uint32_t idcode; uint32_t correct_dbgbase; char *model; } broken_cpus[] = { - { 0x80000000, 0x04770002, 0x60000000, "imx51" }, + { 0x80000000, 0x04770002, 0x1ba00477, 0x60000000, "imx51" }, }; int dap_get_debugbase(struct adiv5_dap *dap, int apsel, @@ -1025,7 +1026,7 @@ int dap_get_debugbase(struct adiv5_dap *dap, int apsel, uint32_t apselold; int retval; unsigned int i; - uint32_t dbgbase, apid; + uint32_t dbgbase, apid, idcode; /* AP address is in bits 31:24 of DP_SELECT */ if (apsel >= 256) @@ -1044,10 +1045,23 @@ int dap_get_debugbase(struct adiv5_dap *dap, int apsel, if (retval != ERROR_OK) return retval; + /* Excavate the device ID code */ + struct jtag_tap *tap = dap->jtag_info->tap; + while (tap != NULL) { + if (tap->hasidcode) { + idcode = tap->idcode; + break; + } + tap = tap->next_tap; + } + if (tap == NULL || !tap->hasidcode) + return ERROR_OK; + /* Some CPUs are messed up, so fixup if needed. */ for (i = 0; i < sizeof(broken_cpus)/sizeof(struct broken_cpu); i++) if (broken_cpus[i].dbgbase == dbgbase && - broken_cpus[i].apid == apid) { + broken_cpus[i].apid == apid && + broken_cpus[i].idcode == idcode) { LOG_WARNING("Found broken CPU (%s), trying to fixup " "ROM Table location from 0x%08x to 0x%08x", broken_cpus[i].model, dbgbase, |