aarch64: speed up first examination

Don't use atomic dap operations when not necessary. Also remove
loop trying to set core power request, didn't find a platform
where it actually worked and it's slowing examination down.

Change-Id: I44e5c2f289f951b8f4579f08a841172404a52053
Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
Reviewed-on: http://openocd.zylin.com/4143
Tested-by: jenkins
Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
This commit is contained in:
Matthias Welwarsky 2017-04-06 09:49:37 +02:00 committed by Matthias Welwarsky
parent 1482c26a4e
commit 685cdf86ea
1 changed files with 20 additions and 40 deletions

View File

@ -180,7 +180,7 @@ static int aarch64_init_debug_access(struct target *target)
int retval; int retval;
uint32_t dummy; uint32_t dummy;
LOG_DEBUG(" "); LOG_DEBUG("%s", target_name(target));
retval = mem_ap_write_atomic_u32(armv8->debug_ap, retval = mem_ap_write_atomic_u32(armv8->debug_ap,
armv8->debug_base + CPUV8_DBG_OSLAR, 0); armv8->debug_base + CPUV8_DBG_OSLAR, 0);
@ -2173,7 +2173,7 @@ static int aarch64_examine_first(struct target *target)
int retval = ERROR_OK; int retval = ERROR_OK;
uint64_t debug, ttypr; uint64_t debug, ttypr;
uint32_t cpuid; uint32_t cpuid;
uint32_t tmp0, tmp1; uint32_t tmp0, tmp1, tmp2, tmp3;
debug = ttypr = cpuid = 0; debug = ttypr = cpuid = 0;
retval = dap_dp_init(swjdp); retval = dap_dp_init(swjdp);
@ -2213,32 +2213,6 @@ static int aarch64_examine_first(struct target *target)
} else } else
armv8->debug_base = target->dbgbase; armv8->debug_base = target->dbgbase;
uint32_t prsr;
int64_t then = timeval_ms();
do {
retval = mem_ap_read_atomic_u32(armv8->debug_ap,
armv8->debug_base + CPUV8_DBG_PRSR, &prsr);
if (retval == ERROR_OK) {
retval = mem_ap_write_atomic_u32(armv8->debug_ap,
armv8->debug_base + CPUV8_DBG_PRCR, PRCR_COREPURQ|PRCR_CORENPDRQ);
if (retval != ERROR_OK) {
LOG_DEBUG("write to PRCR failed");
break;
}
}
if (timeval_ms() > then + 1000) {
retval = ERROR_TARGET_TIMEOUT;
break;
}
} while ((prsr & PRSR_PU) == 0);
if (retval != ERROR_OK) {
LOG_ERROR("target %s: failed to set power state of the core.", target_name(target));
return retval;
}
retval = mem_ap_write_atomic_u32(armv8->debug_ap, retval = mem_ap_write_atomic_u32(armv8->debug_ap,
armv8->debug_base + CPUV8_DBG_OSLAR, 0); armv8->debug_base + CPUV8_DBG_OSLAR, 0);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
@ -2246,34 +2220,40 @@ static int aarch64_examine_first(struct target *target)
return retval; return retval;
} }
retval = mem_ap_read_atomic_u32(armv8->debug_ap, retval = mem_ap_read_u32(armv8->debug_ap,
armv8->debug_base + CPUV8_DBG_MAINID0, &cpuid); armv8->debug_base + CPUV8_DBG_MAINID0, &cpuid);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
LOG_DEBUG("Examine %s failed", "CPUID"); LOG_DEBUG("Examine %s failed", "CPUID");
return retval; return retval;
} }
retval = mem_ap_read_atomic_u32(armv8->debug_ap, retval = mem_ap_read_u32(armv8->debug_ap,
armv8->debug_base + CPUV8_DBG_MEMFEATURE0, &tmp0); armv8->debug_base + CPUV8_DBG_MEMFEATURE0, &tmp0);
retval += mem_ap_read_atomic_u32(armv8->debug_ap, retval += mem_ap_read_u32(armv8->debug_ap,
armv8->debug_base + CPUV8_DBG_MEMFEATURE0 + 4, &tmp1); armv8->debug_base + CPUV8_DBG_MEMFEATURE0 + 4, &tmp1);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
LOG_DEBUG("Examine %s failed", "Memory Model Type"); LOG_DEBUG("Examine %s failed", "Memory Model Type");
return retval; return retval;
} }
ttypr |= tmp1; retval = mem_ap_read_u32(armv8->debug_ap,
ttypr = (ttypr << 32) | tmp0; armv8->debug_base + CPUV8_DBG_DBGFEATURE0, &tmp2);
retval += mem_ap_read_u32(armv8->debug_ap,
retval = mem_ap_read_atomic_u32(armv8->debug_ap, armv8->debug_base + CPUV8_DBG_DBGFEATURE0 + 4, &tmp3);
armv8->debug_base + CPUV8_DBG_DBGFEATURE0, &tmp0);
retval += mem_ap_read_atomic_u32(armv8->debug_ap,
armv8->debug_base + CPUV8_DBG_DBGFEATURE0 + 4, &tmp1);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
LOG_DEBUG("Examine %s failed", "ID_AA64DFR0_EL1"); LOG_DEBUG("Examine %s failed", "ID_AA64DFR0_EL1");
return retval; return retval;
} }
debug |= tmp1;
debug = (debug << 32) | tmp0; retval = dap_run(armv8->debug_ap->dap);
if (retval != ERROR_OK) {
LOG_ERROR("%s: examination failed\n", target_name(target));
return retval;
}
ttypr |= tmp1;
ttypr = (ttypr << 32) | tmp0;
debug |= tmp3;
debug = (debug << 32) | tmp2;
LOG_DEBUG("cpuid = 0x%08" PRIx32, cpuid); LOG_DEBUG("cpuid = 0x%08" PRIx32, cpuid);
LOG_DEBUG("ttypr = 0x%08" PRIx64, ttypr); LOG_DEBUG("ttypr = 0x%08" PRIx64, ttypr);