projects
/
fw
/
openocd
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
add armv7a_cache handlers
[fw/openocd]
/
src
/
target
/
armv7a.c
diff --git
a/src/target/armv7a.c
b/src/target/armv7a.c
index de8a8cbbcbfe3c0a120384b48182a58881cb2373..8219932a22a74a885091b7463f0bd769028076ce 100644
(file)
--- a/
src/target/armv7a.c
+++ b/
src/target/armv7a.c
@@
-647,15
+647,28
@@
int armv7a_identify_cache(struct target *target)
int retval = ERROR_FAIL;
struct armv7a_common *armv7a = target_to_armv7a(target);
struct arm_dpm *dpm = armv7a->arm.dpm;
int retval = ERROR_FAIL;
struct armv7a_common *armv7a = target_to_armv7a(target);
struct arm_dpm *dpm = armv7a->arm.dpm;
- uint32_t cache_selected, clidr;
+ uint32_t cache_selected, clidr
, ctr
;
uint32_t cache_i_reg, cache_d_reg;
struct armv7a_cache_common *cache = &(armv7a->armv7a_mmu.armv7a_cache);
if (!armv7a->is_armv7r)
armv7a_read_ttbcr(target);
retval = dpm->prepare(dpm);
uint32_t cache_i_reg, cache_d_reg;
struct armv7a_cache_common *cache = &(armv7a->armv7a_mmu.armv7a_cache);
if (!armv7a->is_armv7r)
armv7a_read_ttbcr(target);
retval = dpm->prepare(dpm);
+ if (retval != ERROR_OK)
+ goto done;
+ /* retrieve CTR
+ * mrc p15, 0, r0, c0, c0, 1 @ read ctr */
+ retval = dpm->instr_read_data_r0(dpm,
+ ARMV4_5_MRC(15, 0, 0, 0, 0, 1),
+ &ctr);
if (retval != ERROR_OK)
goto done;
if (retval != ERROR_OK)
goto done;
+
+ cache->iminline = 4UL << (ctr & 0xf);
+ cache->dminline = 4UL << ((ctr & 0xf0000) >> 16);
+ LOG_DEBUG("ctr %" PRIx32 " ctr.iminline %" PRId32 " ctr.dminline %" PRId32,
+ ctr, cache->iminline, cache->dminline);
+
/* retrieve CLIDR
* mrc p15, 1, r0, c0, c0, 1 @ read clidr */
retval = dpm->instr_read_data_r0(dpm,
/* retrieve CLIDR
* mrc p15, 1, r0, c0, c0, 1 @ read clidr */
retval = dpm->instr_read_data_r0(dpm,
@@
-806,6
+819,7
@@
int armv7a_init_arch_info(struct target *target, struct armv7a_common *armv7a)
armv7a->armv7a_mmu.armv7a_cache.ctype = -1;
armv7a->armv7a_mmu.armv7a_cache.flush_all_data_cache = NULL;
armv7a->armv7a_mmu.armv7a_cache.display_cache_info = NULL;
armv7a->armv7a_mmu.armv7a_cache.ctype = -1;
armv7a->armv7a_mmu.armv7a_cache.flush_all_data_cache = NULL;
armv7a->armv7a_mmu.armv7a_cache.display_cache_info = NULL;
+ armv7a->armv7a_mmu.armv7a_cache.auto_cache_enabled = 1;
return ERROR_OK;
}
return ERROR_OK;
}
@@
-869,7
+883,6
@@
const struct command_registration l2x_cache_command_handlers[] = {
COMMAND_REGISTRATION_DONE
};
COMMAND_REGISTRATION_DONE
};
-
const struct command_registration armv7a_command_handlers[] = {
{
.chain = dap_command_handlers,
const struct command_registration armv7a_command_handlers[] = {
{
.chain = dap_command_handlers,
@@
-877,5
+890,8
@@
const struct command_registration armv7a_command_handlers[] = {
{
.chain = l2x_cache_command_handlers,
},
{
.chain = l2x_cache_command_handlers,
},
+ {
+ .chain = arm7a_cache_command_handlers,
+ },
COMMAND_REGISTRATION_DONE
};
COMMAND_REGISTRATION_DONE
};