diff options
author | Kevin Yang <kangyang@google.com> | 2020-09-02 20:15:31 -0700 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2020-10-11 15:53:43 +0100 |
commit | 63d3640add4c024864b18d021f626fd377b1165c (patch) | |
tree | 21a76ac7e07ed0e08ffb021e8db42e1b4517707e /src/target/aarch64.c | |
parent | 9a877a83a1c8b1f105cdc0de46c5cbc4d9e8799e (diff) | |
download | riscv-openocd-63d3640add4c024864b18d021f626fd377b1165c.zip riscv-openocd-63d3640add4c024864b18d021f626fd377b1165c.tar.gz riscv-openocd-63d3640add4c024864b18d021f626fd377b1165c.tar.bz2 |
target/aarch64: Use apnum setting
Change aarch64 to use ap-num setting if provided. Fall back to original
behavior of using first AP when ap-num is invalid.
Change-Id: I0d3624f75c86ba5fd5a322ac60856dbbb6e71eaf
Signed-off-by: Kevin Yang <kangyang@google.com>
Reviewed-on: http://openocd.zylin.com/5831
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Diffstat (limited to 'src/target/aarch64.c')
-rw-r--r-- | src/target/aarch64.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/src/target/aarch64.c b/src/target/aarch64.c index dee16d1..8d23bca 100644 --- a/src/target/aarch64.c +++ b/src/target/aarch64.c @@ -2248,7 +2248,7 @@ static int aarch64_examine_first(struct target *target) struct aarch64_common *aarch64 = target_to_aarch64(target); struct armv8_common *armv8 = &aarch64->armv8_common; struct adiv5_dap *swjdp = armv8->arm.dap; - struct aarch64_private_config *pc; + struct aarch64_private_config *pc = target->private_config; int i; int retval = ERROR_OK; uint64_t debug, ttypr; @@ -2256,11 +2256,18 @@ static int aarch64_examine_first(struct target *target) uint32_t tmp0, tmp1, tmp2, tmp3; debug = ttypr = cpuid = 0; - /* Search for the APB-AB - it is needed for access to debug registers */ - retval = dap_find_ap(swjdp, AP_TYPE_APB_AP, &armv8->debug_ap); - if (retval != ERROR_OK) { - LOG_ERROR("Could not find APB-AP for debug access"); - return retval; + if (pc == NULL) + return ERROR_FAIL; + + if (pc->adiv5_config.ap_num == DP_APSEL_INVALID) { + /* Search for the APB-AB */ + retval = dap_find_ap(swjdp, AP_TYPE_APB_AP, &armv8->debug_ap); + if (retval != ERROR_OK) { + LOG_ERROR("Could not find APB-AP for debug access"); + return retval; + } + } else { + armv8->debug_ap = dap_ap(swjdp, pc->adiv5_config.ap_num); } retval = mem_ap_init(armv8->debug_ap); @@ -2335,10 +2342,6 @@ static int aarch64_examine_first(struct target *target) LOG_DEBUG("ttypr = 0x%08" PRIx64, ttypr); LOG_DEBUG("debug = 0x%08" PRIx64, debug); - if (target->private_config == NULL) - return ERROR_FAIL; - - pc = (struct aarch64_private_config *)target->private_config; if (pc->cti == NULL) return ERROR_FAIL; @@ -2491,6 +2494,7 @@ static int aarch64_jim_configure(struct target *target, Jim_GetOptInfo *goi) pc = (struct aarch64_private_config *)target->private_config; if (pc == NULL) { pc = calloc(1, sizeof(struct aarch64_private_config)); + pc->adiv5_config.ap_num = DP_APSEL_INVALID; target->private_config = pc; } |