From 1fd2a6c7f5cba7c5ec655e355e63dd31804bb900 Mon Sep 17 00:00:00 2001 From: Florian Fainelli Date: Tue, 6 Jul 2021 20:19:28 -0700 Subject: [PATCH] arm_adi_v5: add support for display Class 0x9 ROM tables ADI v5.1 and v6.0 permit the definition of CoreSight components (class 9 ROM entries). dap_rom_display() is refactored a bit such that we always end up with attempting to parse the ROM contents using the appropriate upper limit for class 1 and 9 ROM types. Change-Id: I4ba497b3807f1f11f06186eb6e61959ea3540c59 Signed-off-by: Florian Fainelli Signed-off-by: Antonio Borneo Reviewed-on: https://review.openocd.org/c/openocd/+/6359 Tested-by: jenkins --- src/target/arm_adi_v5.c | 69 ++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 22 deletions(-) diff --git a/src/target/arm_adi_v5.c b/src/target/arm_adi_v5.c index d886a765f9..99673f2335 100644 --- a/src/target/arm_adi_v5.c +++ b/src/target/arm_adi_v5.c @@ -928,8 +928,8 @@ static const struct { }; #define DEVARCH_ID_MASK (ARM_CS_C9_DEVARCH_ARCHITECT_MASK | ARM_CS_C9_DEVARCH_ARCHID_MASK) +#define DEVARCH_ROM_C_0X9 ARCH_ID(ARM_ID, 0x0AF7) -__attribute__((unused)) static const char *class0x9_devarch_description(uint32_t devarch) { if (!(devarch & ARM_CS_C9_DEVARCH_PRESENT)) @@ -1449,6 +1449,7 @@ static int dap_devtype_display(struct command_invocation *cmd, uint32_t devtype) static int dap_rom_display(struct command_invocation *cmd, struct adiv5_ap *ap, target_addr_t dbgbase, int depth) { + unsigned int rom_num_entries; int retval; uint64_t pid; uint32_t cid; @@ -1513,27 +1514,7 @@ static int dap_rom_display(struct command_invocation *cmd, else command_print(cmd, "\t\tMEMTYPE system memory not present: dedicated debug bus"); - /* Read ROM table entries from base address until we get 0x00000000 or reach the reserved area */ - for (uint16_t entry_offset = 0; entry_offset < 0xF00; entry_offset += 4) { - uint32_t romentry; - retval = mem_ap_read_atomic_u32(ap, base_addr | entry_offset, &romentry); - if (retval != ERROR_OK) - return retval; - command_print(cmd, "\t%sROMTABLE[0x%x] = 0x%" PRIx32 "", - tabs, entry_offset, romentry); - if (romentry & ARM_CS_ROMENTRY_PRESENT) { - /* Recurse. "romentry" is signed */ - retval = dap_rom_display(cmd, ap, base_addr + (int32_t)(romentry & ARM_CS_ROMENTRY_OFFSET_MASK), - depth + 1); - if (retval != ERROR_OK) - return retval; - } else if (romentry != 0) { - command_print(cmd, "\t\tComponent not present"); - } else { - command_print(cmd, "\t%s\tEnd of ROM table", tabs); - break; - } - } + rom_num_entries = 960; } else if (class == ARM_CS_CLASS_0X9_CS_COMPONENT) { uint32_t devtype; retval = mem_ap_read_atomic_u32(ap, base_addr + ARM_CS_C9_DEVTYPE, &devtype); @@ -1545,6 +1526,50 @@ static int dap_rom_display(struct command_invocation *cmd, return retval; /* REVISIT also show ARM_CS_C9_DEVID */ + + uint32_t devarch; + retval = mem_ap_read_atomic_u32(ap, base_addr + ARM_CS_C9_DEVARCH, &devarch); + if (retval != ERROR_OK) + return retval; + + if ((devarch & ARM_CS_C9_DEVARCH_PRESENT) == 0) + return ERROR_OK; + + unsigned int architect_id = (devarch & ARM_CS_C9_DEVARCH_ARCHITECT_MASK) >> ARM_CS_C9_DEVARCH_ARCHITECT_SHIFT; + unsigned int revision = (devarch & ARM_CS_C9_DEVARCH_REVISION_MASK) >> ARM_CS_C9_DEVARCH_REVISION_SHIFT; + command_print(cmd, "\t\tDev Arch is 0x%08" PRIx32 ", %s \"%s\" rev.%u", devarch, + jep106_manufacturer(architect_id), class0x9_devarch_description(devarch), + revision); + /* quit if not ROM table */ + if ((devarch & DEVARCH_ID_MASK) != DEVARCH_ROM_C_0X9) + return ERROR_OK; + + rom_num_entries = 512; + } else { + /* Class other than 0x1 and 0x9 */ + return ERROR_OK; + } + + /* Read ROM table entries from base address until we get 0x00000000 or reach the reserved area */ + for (unsigned int entry_offset = 0; entry_offset < 4 * rom_num_entries; entry_offset += 4) { + uint32_t romentry; + retval = mem_ap_read_atomic_u32(ap, base_addr + entry_offset, &romentry); + if (retval != ERROR_OK) + return retval; + command_print(cmd, "\t%sROMTABLE[0x%x] = 0x%08" PRIx32 "", + tabs, entry_offset, romentry); + if (romentry & ARM_CS_ROMENTRY_PRESENT) { + /* Recurse. "romentry" is signed */ + retval = dap_rom_display(cmd, ap, base_addr + (int32_t)(romentry & ARM_CS_ROMENTRY_OFFSET_MASK), + depth + 1); + if (retval != ERROR_OK) + return retval; + } else if (romentry != 0) { + command_print(cmd, "\t\tComponent not present"); + } else { + command_print(cmd, "\t%s\tEnd of ROM table", tabs); + break; + } } return ERROR_OK; -- 2.30.2