From fcde876250fcb4f6eb4f535aa158f25e1937ddd8 Mon Sep 17 00:00:00 2001 From: Bernhard Nortmann Date: Tue, 20 Dec 2016 18:38:19 +0100 Subject: [PATCH] fel: [Fixup] Use fel_get_sid_root_key() routine for SID retrieval The patch also introduces a "sid-register" command for diagnostic purposes. It allows to use/enforce the workaround method for other SoCs, to check if there are any inconsistencies with the values read from memory. Signed-off-by: Bernhard Nortmann --- fel.c | 67 +++++++++++++++++-------------------------------------- fel_lib.c | 2 +- 2 files changed, 21 insertions(+), 48 deletions(-) diff --git a/fel.c b/fel.c index 8385535..e15245e 100644 --- a/fel.c +++ b/fel.c @@ -276,58 +276,29 @@ void fel_writel(feldev_handle *dev, uint32_t addr, uint32_t val) fel_writel_n(dev, addr, &val, 1); } -#define EFUSE_PRCTL 0x40 -#define EFUSE_RDKEY 0x60 - -#define EFUSE_OP_LOCK 0xAC - -uint32_t aw_fel_efuse_read(feldev_handle *dev, uint32_t offset) +void aw_fel_print_sid(feldev_handle *dev, bool force_workaround) { + uint32_t key[4]; soc_info_t *soc_info = dev->soc_info; - uint32_t reg_val; - reg_val = fel_readl(dev, soc_info->sid_base + EFUSE_PRCTL); - reg_val &= ~(((0x1ff) << 16) | 0x3); - reg_val |= (offset << 16); - fel_writel(dev, soc_info->sid_base + EFUSE_PRCTL, reg_val); - - reg_val &= ~(((0xff) << 8) | 0x3); - reg_val |= (EFUSE_OP_LOCK << 8) | 0x2; - fel_writel(dev, soc_info->sid_base + EFUSE_PRCTL, reg_val); - - while (fel_readl(dev, soc_info->sid_base + EFUSE_PRCTL) & 0x2); - - reg_val &= ~(((0x1ff) << 16) | ((0xff) << 8) | 0x3); - fel_writel(dev, soc_info->sid_base + EFUSE_PRCTL, reg_val); - - return fel_readl(dev, soc_info->sid_base + EFUSE_RDKEY); -} - -void aw_fel_print_sid(feldev_handle *dev) -{ - soc_info_t *soc_info = dev->soc_info; - if (soc_info->sid_base) { - uint32_t sid_addr = soc_info->sid_base + soc_info->sid_offset; - pr_info("SID key (e-fuses) at 0x%08X\n", sid_addr); - - if (soc_info->sid_fix) { - pr_info("SID key needs fix due to silicon bug.\n"); - for (uint32_t i = 0; i < 0x10; i+=4) { - aw_fel_efuse_read(dev, i); - } - } - - uint32_t key[4]; - fel_readl_n(dev, sid_addr, key, 4); - - unsigned int i; - /* output SID in "xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx" format */ - for (i = 0; i <= 3; i++) - printf("%08x%c", key[i], i < 3 ? ':' : '\n'); - } else { + if (!soc_info->sid_base) { printf("SID registers for your SoC (%s) are unknown or inaccessible.\n", dev->soc_name); + return; } + + if (soc_info->sid_fix || force_workaround) { + pr_info("Read SID key via registers, base = 0x%08X\n", + soc_info->sid_base); + } else { + pr_info("SID key (e-fuses) at 0x%08X\n", + soc_info->sid_base + soc_info->sid_offset); + } + fel_get_sid_root_key(dev, key, force_workaround); + + /* output SID in "xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx" format */ + for (unsigned i = 0; i <= 3; i++) + printf("%08x%c", key[i], i < 3 ? ':' : '\n'); } void aw_enable_l2_cache(feldev_handle *dev, soc_info_t *soc_info) @@ -1136,7 +1107,9 @@ int main(int argc, char **argv) } else if (strncmp(argv[1], "ver", 3) == 0) { aw_fel_print_version(handle); } else if (strcmp(argv[1], "sid") == 0) { - aw_fel_print_sid(handle); + aw_fel_print_sid(handle, false); + } else if (strcmp(argv[1], "sid-registers") == 0) { + aw_fel_print_sid(handle, true); /* enforce register access */ } else if (strcmp(argv[1], "write") == 0 && argc > 3) { skip += 2 * file_upload(handle, 1, argc - 2, argv + 2, pflag_active ? progress_bar : NULL); diff --git a/fel_lib.c b/fel_lib.c index 9a02a2d..a484b4c 100644 --- a/fel_lib.c +++ b/fel_lib.c @@ -668,7 +668,7 @@ feldev_list_entry *list_fel_devices(size_t *count) strncpy(entry->soc_name, dev->soc_name, sizeof(soc_name_t)); /* retrieve SID bits */ - fel_get_root_key(dev, entry->SID, false); + fel_get_sid_root_key(dev, entry->SID, false); feldev_close(dev); free(dev);