1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2012-2015 Freescale Semiconductor, Inc. All Rights Reserved. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __SECURE_MX6Q_H__ 9*4882a593Smuzhiyun #define __SECURE_MX6Q_H__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/types.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* -------- start of HAB API updates ------------*/ 14*4882a593Smuzhiyun /* The following are taken from HAB4 SIS */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* Status definitions */ 17*4882a593Smuzhiyun enum hab_status { 18*4882a593Smuzhiyun HAB_STS_ANY = 0x00, 19*4882a593Smuzhiyun HAB_FAILURE = 0x33, 20*4882a593Smuzhiyun HAB_WARNING = 0x69, 21*4882a593Smuzhiyun HAB_SUCCESS = 0xf0 22*4882a593Smuzhiyun }; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* Security Configuration definitions */ 25*4882a593Smuzhiyun enum hab_config { 26*4882a593Smuzhiyun HAB_CFG_RETURN = 0x33, /* < Field Return IC */ 27*4882a593Smuzhiyun HAB_CFG_OPEN = 0xf0, /* < Non-secure IC */ 28*4882a593Smuzhiyun HAB_CFG_CLOSED = 0xcc /* < Secure IC */ 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* State definitions */ 32*4882a593Smuzhiyun enum hab_state { 33*4882a593Smuzhiyun HAB_STATE_INITIAL = 0x33, /* Initialising state (transitory) */ 34*4882a593Smuzhiyun HAB_STATE_CHECK = 0x55, /* Check state (non-secure) */ 35*4882a593Smuzhiyun HAB_STATE_NONSECURE = 0x66, /* Non-secure state */ 36*4882a593Smuzhiyun HAB_STATE_TRUSTED = 0x99, /* Trusted state */ 37*4882a593Smuzhiyun HAB_STATE_SECURE = 0xaa, /* Secure state */ 38*4882a593Smuzhiyun HAB_STATE_FAIL_SOFT = 0xcc, /* Soft fail state */ 39*4882a593Smuzhiyun HAB_STATE_FAIL_HARD = 0xff, /* Hard fail state (terminal) */ 40*4882a593Smuzhiyun HAB_STATE_NONE = 0xf0, /* No security state machine */ 41*4882a593Smuzhiyun HAB_STATE_MAX 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun enum hab_reason { 45*4882a593Smuzhiyun HAB_RSN_ANY = 0x00, /* Match any reason */ 46*4882a593Smuzhiyun HAB_ENG_FAIL = 0x30, /* Engine failure */ 47*4882a593Smuzhiyun HAB_INV_ADDRESS = 0x22, /* Invalid address: access denied */ 48*4882a593Smuzhiyun HAB_INV_ASSERTION = 0x0c, /* Invalid assertion */ 49*4882a593Smuzhiyun HAB_INV_CALL = 0x28, /* Function called out of sequence */ 50*4882a593Smuzhiyun HAB_INV_CERTIFICATE = 0x21, /* Invalid certificate */ 51*4882a593Smuzhiyun HAB_INV_COMMAND = 0x06, /* Invalid command: command malformed */ 52*4882a593Smuzhiyun HAB_INV_CSF = 0x11, /* Invalid csf */ 53*4882a593Smuzhiyun HAB_INV_DCD = 0x27, /* Invalid dcd */ 54*4882a593Smuzhiyun HAB_INV_INDEX = 0x0f, /* Invalid index: access denied */ 55*4882a593Smuzhiyun HAB_INV_IVT = 0x05, /* Invalid ivt */ 56*4882a593Smuzhiyun HAB_INV_KEY = 0x1d, /* Invalid key */ 57*4882a593Smuzhiyun HAB_INV_RETURN = 0x1e, /* Failed callback function */ 58*4882a593Smuzhiyun HAB_INV_SIGNATURE = 0x18, /* Invalid signature */ 59*4882a593Smuzhiyun HAB_INV_SIZE = 0x17, /* Invalid data size */ 60*4882a593Smuzhiyun HAB_MEM_FAIL = 0x2e, /* Memory failure */ 61*4882a593Smuzhiyun HAB_OVR_COUNT = 0x2b, /* Expired poll count */ 62*4882a593Smuzhiyun HAB_OVR_STORAGE = 0x2d, /* Exhausted storage region */ 63*4882a593Smuzhiyun HAB_UNS_ALGORITHM = 0x12, /* Unsupported algorithm */ 64*4882a593Smuzhiyun HAB_UNS_COMMAND = 0x03, /* Unsupported command */ 65*4882a593Smuzhiyun HAB_UNS_ENGINE = 0x0a, /* Unsupported engine */ 66*4882a593Smuzhiyun HAB_UNS_ITEM = 0x24, /* Unsupported configuration item */ 67*4882a593Smuzhiyun HAB_UNS_KEY = 0x1b, /* Unsupported key type/parameters */ 68*4882a593Smuzhiyun HAB_UNS_PROTOCOL = 0x14, /* Unsupported protocol */ 69*4882a593Smuzhiyun HAB_UNS_STATE = 0x09, /* Unsuitable state */ 70*4882a593Smuzhiyun HAB_RSN_MAX 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun enum hab_context { 74*4882a593Smuzhiyun HAB_CTX_ANY = 0x00, /* Match any context */ 75*4882a593Smuzhiyun HAB_CTX_FAB = 0xff, /* Event logged in hab_fab_test() */ 76*4882a593Smuzhiyun HAB_CTX_ENTRY = 0xe1, /* Event logged in hab_rvt.entry() */ 77*4882a593Smuzhiyun HAB_CTX_TARGET = 0x33, /* Event logged in hab_rvt.check_target() */ 78*4882a593Smuzhiyun HAB_CTX_AUTHENTICATE = 0x0a,/* Logged in hab_rvt.authenticate_image() */ 79*4882a593Smuzhiyun HAB_CTX_DCD = 0xdd, /* Event logged in hab_rvt.run_dcd() */ 80*4882a593Smuzhiyun HAB_CTX_CSF = 0xcf, /* Event logged in hab_rvt.run_csf() */ 81*4882a593Smuzhiyun HAB_CTX_COMMAND = 0xc0, /* Event logged executing csf/dcd command */ 82*4882a593Smuzhiyun HAB_CTX_AUT_DAT = 0xdb, /* Authenticated data block */ 83*4882a593Smuzhiyun HAB_CTX_ASSERT = 0xa0, /* Event logged in hab_rvt.assert() */ 84*4882a593Smuzhiyun HAB_CTX_EXIT = 0xee, /* Event logged in hab_rvt.exit() */ 85*4882a593Smuzhiyun HAB_CTX_MAX 86*4882a593Smuzhiyun }; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun struct imx_sec_config_fuse_t { 89*4882a593Smuzhiyun int bank; 90*4882a593Smuzhiyun int word; 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #if defined(CONFIG_SECURE_BOOT) 94*4882a593Smuzhiyun extern struct imx_sec_config_fuse_t const imx_sec_config_fuse; 95*4882a593Smuzhiyun #endif 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /*Function prototype description*/ 98*4882a593Smuzhiyun typedef enum hab_status hab_rvt_report_event_t(enum hab_status, uint32_t, 99*4882a593Smuzhiyun uint8_t* , size_t*); 100*4882a593Smuzhiyun typedef enum hab_status hab_rvt_report_status_t(enum hab_config *, 101*4882a593Smuzhiyun enum hab_state *); 102*4882a593Smuzhiyun typedef enum hab_status hab_loader_callback_f_t(void**, size_t*, const void*); 103*4882a593Smuzhiyun typedef enum hab_status hab_rvt_entry_t(void); 104*4882a593Smuzhiyun typedef enum hab_status hab_rvt_exit_t(void); 105*4882a593Smuzhiyun typedef void *hab_rvt_authenticate_image_t(uint8_t, ptrdiff_t, 106*4882a593Smuzhiyun void **, size_t *, hab_loader_callback_f_t); 107*4882a593Smuzhiyun typedef void hapi_clock_init_t(void); 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun #define HAB_ENG_ANY 0x00 /* Select first compatible engine */ 110*4882a593Smuzhiyun #define HAB_ENG_SCC 0x03 /* Security controller */ 111*4882a593Smuzhiyun #define HAB_ENG_RTIC 0x05 /* Run-time integrity checker */ 112*4882a593Smuzhiyun #define HAB_ENG_SAHARA 0x06 /* Crypto accelerator */ 113*4882a593Smuzhiyun #define HAB_ENG_CSU 0x0a /* Central Security Unit */ 114*4882a593Smuzhiyun #define HAB_ENG_SRTC 0x0c /* Secure clock */ 115*4882a593Smuzhiyun #define HAB_ENG_DCP 0x1b /* Data Co-Processor */ 116*4882a593Smuzhiyun #define HAB_ENG_CAAM 0x1d /* CAAM */ 117*4882a593Smuzhiyun #define HAB_ENG_SNVS 0x1e /* Secure Non-Volatile Storage */ 118*4882a593Smuzhiyun #define HAB_ENG_OCOTP 0x21 /* Fuse controller */ 119*4882a593Smuzhiyun #define HAB_ENG_DTCP 0x22 /* DTCP co-processor */ 120*4882a593Smuzhiyun #define HAB_ENG_ROM 0x36 /* Protected ROM area */ 121*4882a593Smuzhiyun #define HAB_ENG_HDCP 0x24 /* HDCP co-processor */ 122*4882a593Smuzhiyun #define HAB_ENG_RTL 0x77 /* RTL simulation engine */ 123*4882a593Smuzhiyun #define HAB_ENG_SW 0xff /* Software engine */ 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun #ifdef CONFIG_ROM_UNIFIED_SECTIONS 126*4882a593Smuzhiyun #define HAB_RVT_BASE 0x00000100 127*4882a593Smuzhiyun #else 128*4882a593Smuzhiyun #define HAB_RVT_BASE 0x00000094 129*4882a593Smuzhiyun #endif 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define HAB_RVT_ENTRY (*(uint32_t *)(HAB_RVT_BASE + 0x04)) 132*4882a593Smuzhiyun #define HAB_RVT_EXIT (*(uint32_t *)(HAB_RVT_BASE + 0x08)) 133*4882a593Smuzhiyun #define HAB_RVT_AUTHENTICATE_IMAGE (*(uint32_t *)(HAB_RVT_BASE + 0x10)) 134*4882a593Smuzhiyun #define HAB_RVT_REPORT_EVENT (*(uint32_t *)(HAB_RVT_BASE + 0x20)) 135*4882a593Smuzhiyun #define HAB_RVT_REPORT_STATUS (*(uint32_t *)(HAB_RVT_BASE + 0x24)) 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define HAB_RVT_REPORT_EVENT_NEW (*(uint32_t *)0x000000B8) 138*4882a593Smuzhiyun #define HAB_RVT_REPORT_STATUS_NEW (*(uint32_t *)0x000000BC) 139*4882a593Smuzhiyun #define HAB_RVT_AUTHENTICATE_IMAGE_NEW (*(uint32_t *)0x000000A8) 140*4882a593Smuzhiyun #define HAB_RVT_ENTRY_NEW (*(uint32_t *)0x0000009C) 141*4882a593Smuzhiyun #define HAB_RVT_EXIT_NEW (*(uint32_t *)0x000000A0) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define HAB_CID_ROM 0 /**< ROM Caller ID */ 144*4882a593Smuzhiyun #define HAB_CID_UBOOT 1 /**< UBOOT Caller ID*/ 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun /* ----------- end of HAB API updates ------------*/ 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun uint32_t authenticate_image(uint32_t ddr_start, uint32_t image_size); 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun #endif 151