]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - arch/arm/cpu/armv7/mx6/hab.c
iMX: adding parsing to hab_status command
[karo-tx-uboot.git] / arch / arm / cpu / armv7 / mx6 / hab.c
index 757096d356d886047cc93f86a4bc6e70c7aa663e..41c37ba15c5db63381f7be42b234a7edaa30b80e 100644 (file)
@@ -1,8 +1,9 @@
 /*
- * Copyright (C) 2010-2014 Freescale Semiconductor, Inc.
+ * Copyright (C) 2010-2015 Freescale Semiconductor, Inc.
  *
  * SPDX-License-Identifier:    GPL-2.0+
  */
+
 #include <common.h>
 #include <asm/io.h>
 #include <asm/system.h>
@@ -75,7 +76,154 @@ struct mx6_boot_data {
  * +------------+ + CSF_PAD_SIZE
  */
 
-static bool is_hab_enabled(void)
+#define MAX_RECORD_BYTES     (8*1024) /* 4 kbytes */
+
+struct record {
+       uint8_t  tag;                                           /* Tag */
+       uint8_t  len[2];                                        /* Length */
+       uint8_t  par;                                           /* Version */
+       uint8_t  contents[MAX_RECORD_BYTES];/* Record Data */
+       bool     any_rec_flag;
+};
+
+char *rsn_str[] = {"RSN = HAB_RSN_ANY (0x00)\n",
+                                  "RSN = HAB_ENG_FAIL (0x30)\n",
+                                  "RSN = HAB_INV_ADDRESS (0x22)\n",
+                                  "RSN = HAB_INV_ASSERTION (0x0C)\n",
+                                  "RSN = HAB_INV_CALL (0x28)\n",
+                                  "RSN = HAB_INV_CERTIFICATE (0x21)\n",
+                                  "RSN = HAB_INV_COMMAND (0x06)\n",
+                                  "RSN = HAB_INV_CSF (0x11)\n",
+                                  "RSN = HAB_INV_DCD (0x27)\n",
+                                  "RSN = HAB_INV_INDEX (0x0F)\n",
+                                  "RSN = HAB_INV_IVT (0x05)\n",
+                                  "RSN = HAB_INV_KEY (0x1D)\n",
+                                  "RSN = HAB_INV_RETURN (0x1E)\n",
+                                  "RSN = HAB_INV_SIGNATURE (0x18)\n",
+                                  "RSN = HAB_INV_SIZE (0x17)\n",
+                                  "RSN = HAB_MEM_FAIL (0x2E)\n",
+                                  "RSN = HAB_OVR_COUNT (0x2B)\n",
+                                  "RSN = HAB_OVR_STORAGE (0x2D)\n",
+                                  "RSN = HAB_UNS_ALGORITHM (0x12)\n",
+                                  "RSN = HAB_UNS_COMMAND (0x03)\n",
+                                  "RSN = HAB_UNS_ENGINE (0x0A)\n",
+                                  "RSN = HAB_UNS_ITEM (0x24)\n",
+                                  "RSN = HAB_UNS_KEY (0x1B)\n",
+                                  "RSN = HAB_UNS_PROTOCOL (0x14)\n",
+                                  "RSN = HAB_UNS_STATE (0x09)\n",
+                                  "RSN = INVALID\n",
+                                  NULL};
+
+char *sts_str[] = {"STS = HAB_SUCCESS (0xF0)\n",
+                                  "STS = HAB_FAILURE (0x33)\n",
+                                  "STS = HAB_WARNING (0x69)\n",
+                                  "STS = INVALID\n",
+                                  NULL};
+
+char *eng_str[] = {"ENG = HAB_ENG_ANY (0x00)\n",
+                                  "ENG = HAB_ENG_SCC (0x03)\n",
+                                  "ENG = HAB_ENG_RTIC (0x05)\n",
+                                  "ENG = HAB_ENG_SAHARA (0x06)\n",
+                                  "ENG = HAB_ENG_CSU (0x0A)\n",
+                                  "ENG = HAB_ENG_SRTC (0x0C)\n",
+                                  "ENG = HAB_ENG_DCP (0x1B)\n",
+                                  "ENG = HAB_ENG_CAAM (0x1D)\n",
+                                  "ENG = HAB_ENG_SNVS (0x1E)\n",
+                                  "ENG = HAB_ENG_OCOTP (0x21)\n",
+                                  "ENG = HAB_ENG_DTCP (0x22)\n",
+                                  "ENG = HAB_ENG_ROM (0x36)\n",
+                                  "ENG = HAB_ENG_HDCP (0x24)\n",
+                                  "ENG = HAB_ENG_RTL (0x77)\n",
+                                  "ENG = HAB_ENG_SW (0xFF)\n",
+                                  "ENG = INVALID\n",
+                                  NULL};
+
+char *ctx_str[] = {"CTX = HAB_CTX_ANY(0x00)\n",
+                                  "CTX = HAB_CTX_FAB (0xFF)\n",
+                                  "CTX = HAB_CTX_ENTRY (0xE1)\n",
+                                  "CTX = HAB_CTX_TARGET (0x33)\n",
+                                  "CTX = HAB_CTX_AUTHENTICATE (0x0A)\n",
+                                  "CTX = HAB_CTX_DCD (0xDD)\n",
+                                  "CTX = HAB_CTX_CSF (0xCF)\n",
+                                  "CTX = HAB_CTX_COMMAND (0xC0)\n",
+                                  "CTX = HAB_CTX_AUT_DAT (0xDB)\n",
+                                  "CTX = HAB_CTX_ASSERT (0xA0)\n",
+                                  "CTX = HAB_CTX_EXIT (0xEE)\n",
+                                  "CTX = INVALID\n",
+                                  NULL};
+
+uint8_t hab_statuses[5] = {
+       HAB_STS_ANY,
+       HAB_FAILURE,
+       HAB_WARNING,
+       HAB_SUCCESS,
+       -1
+};
+
+uint8_t hab_reasons[26] = {
+       HAB_RSN_ANY,
+       HAB_ENG_FAIL,
+       HAB_INV_ADDRESS,
+       HAB_INV_ASSERTION,
+       HAB_INV_CALL,
+       HAB_INV_CERTIFICATE,
+       HAB_INV_COMMAND,
+       HAB_INV_CSF,
+       HAB_INV_DCD,
+       HAB_INV_INDEX,
+       HAB_INV_IVT,
+       HAB_INV_KEY,
+       HAB_INV_RETURN,
+       HAB_INV_SIGNATURE,
+       HAB_INV_SIZE,
+       HAB_MEM_FAIL,
+       HAB_OVR_COUNT,
+       HAB_OVR_STORAGE,
+       HAB_UNS_ALGORITHM,
+       HAB_UNS_COMMAND,
+       HAB_UNS_ENGINE,
+       HAB_UNS_ITEM,
+       HAB_UNS_KEY,
+       HAB_UNS_PROTOCOL,
+       HAB_UNS_STATE,
+       -1
+};
+
+uint8_t hab_contexts[12] = {
+       HAB_CTX_ANY,
+       HAB_CTX_FAB,
+       HAB_CTX_ENTRY,
+       HAB_CTX_TARGET,
+       HAB_CTX_AUTHENTICATE,
+       HAB_CTX_DCD,
+       HAB_CTX_CSF,
+       HAB_CTX_COMMAND,
+       HAB_CTX_AUT_DAT,
+       HAB_CTX_ASSERT,
+       HAB_CTX_EXIT,
+       -1
+};
+
+uint8_t hab_engines[16] = {
+       HAB_ENG_ANY,
+       HAB_ENG_SCC,
+       HAB_ENG_RTIC,
+       HAB_ENG_SAHARA,
+       HAB_ENG_CSU,
+       HAB_ENG_SRTC,
+       HAB_ENG_DCP,
+       HAB_ENG_CAAM,
+       HAB_ENG_SNVS,
+       HAB_ENG_OCOTP,
+       HAB_ENG_DTCP,
+       HAB_ENG_ROM,
+       HAB_ENG_HDCP,
+       HAB_ENG_RTL,
+       HAB_ENG_SW,
+       -1
+};
+
+bool is_hab_enabled(void)
 {
        struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
        struct fuse_bank *bank = &ocotp->bank[0];
@@ -98,7 +246,29 @@ static bool is_hab_enabled(void)
        return (reg & 0x2) == 0x2;
 }
 
-static void display_event(uint8_t *event_data, size_t bytes)
+static inline uint8_t get_idx(uint8_t *list, uint8_t tgt)
+{
+       uint8_t idx = 0;
+       uint8_t element = list[idx];
+       while (element != -1) {
+               if (element == tgt)
+                       return idx;
+               element = list[++idx];
+       }
+       return -1;
+}
+
+void process_event_record(uint8_t *event_data, size_t bytes)
+{
+       struct record *rec = (struct record *)event_data;
+
+       printf("\n\n%s", sts_str[get_idx(hab_statuses, rec->contents[0])]);
+       printf("%s", rsn_str[get_idx(hab_reasons, rec->contents[1])]);
+       printf("%s", ctx_str[get_idx(hab_contexts, rec->contents[2])]);
+       printf("%s", eng_str[get_idx(hab_engines, rec->contents[3])]);
+}
+
+void display_event(uint8_t *event_data, size_t bytes)
 {
        uint32_t i;
 
@@ -113,6 +283,8 @@ static void display_event(uint8_t *event_data, size_t bytes)
                else
                        printf(" 0x%02x", event_data[i]);
        }
+
+       process_event_record(event_data, bytes);
 }
 
 int get_hab_status(void)