1*b9eebfadSRuchika Gupta /* 2*b9eebfadSRuchika Gupta * CAAM Error Reporting 3*b9eebfadSRuchika Gupta * 4*b9eebfadSRuchika Gupta * Copyright 2009-2014 Freescale Semiconductor, Inc. 5*b9eebfadSRuchika Gupta * 6*b9eebfadSRuchika Gupta * SPDX-License-Identifier: GPL-2.0+ 7*b9eebfadSRuchika Gupta * 8*b9eebfadSRuchika Gupta * Derived from error.c file in linux drivers/crypto/caam 9*b9eebfadSRuchika Gupta */ 10*b9eebfadSRuchika Gupta 11*b9eebfadSRuchika Gupta #include <common.h> 12*b9eebfadSRuchika Gupta #include <malloc.h> 13*b9eebfadSRuchika Gupta #include "desc.h" 14*b9eebfadSRuchika Gupta #include "jr.h" 15*b9eebfadSRuchika Gupta 16*b9eebfadSRuchika Gupta #define CAAM_ERROR_STR_MAX 302 17*b9eebfadSRuchika Gupta 18*b9eebfadSRuchika Gupta #define JRSTA_SSRC_SHIFT 28 19*b9eebfadSRuchika Gupta #define JRSTA_CCBERR_CHAID_MASK 0x00f0 20*b9eebfadSRuchika Gupta #define JRSTA_CCBERR_CHAID_SHIFT 4 21*b9eebfadSRuchika Gupta #define JRSTA_CCBERR_ERRID_MASK 0x000 22*b9eebfadSRuchika Gupta #define JRSTA_CCBERR_CHAID_RNG (0x05 << JRSTA_CCBERR_CHAID_SHIFT) 23*b9eebfadSRuchika Gupta 24*b9eebfadSRuchika Gupta #define JRSTA_DECOERR_JUMP 0x08000000 25*b9eebfadSRuchika Gupta #define JRSTA_DECOERR_INDEX_SHIFT 8 26*b9eebfadSRuchika Gupta #define JRSTA_DECOERR_INDEX_MASK 0xff00 27*b9eebfadSRuchika Gupta #define JRSTA_DECOERR_ERROR_MASK 0x00ff 28*b9eebfadSRuchika Gupta 29*b9eebfadSRuchika Gupta 30*b9eebfadSRuchika Gupta static const struct { 31*b9eebfadSRuchika Gupta u8 value; 32*b9eebfadSRuchika Gupta const char *error_text; 33*b9eebfadSRuchika Gupta } desc_error_list[] = { 34*b9eebfadSRuchika Gupta { 0x00, "No error." }, 35*b9eebfadSRuchika Gupta { 0x01, "SGT Length Error. The descriptor is trying to read" \ 36*b9eebfadSRuchika Gupta " more data than is contained in the SGT table." }, 37*b9eebfadSRuchika Gupta { 0x02, "SGT Null Entry Error." }, 38*b9eebfadSRuchika Gupta { 0x03, "Job Ring Control Error. Bad value in Job Ring Control reg." }, 39*b9eebfadSRuchika Gupta { 0x04, "Invalid Descriptor Command." }, 40*b9eebfadSRuchika Gupta { 0x05, "Reserved." }, 41*b9eebfadSRuchika Gupta { 0x06, "Invalid KEY Command" }, 42*b9eebfadSRuchika Gupta { 0x07, "Invalid LOAD Command" }, 43*b9eebfadSRuchika Gupta { 0x08, "Invalid STORE Command" }, 44*b9eebfadSRuchika Gupta { 0x09, "Invalid OPERATION Command" }, 45*b9eebfadSRuchika Gupta { 0x0A, "Invalid FIFO LOAD Command" }, 46*b9eebfadSRuchika Gupta { 0x0B, "Invalid FIFO STORE Command" }, 47*b9eebfadSRuchika Gupta { 0x0C, "Invalid MOVE/MOVE_LEN Command" }, 48*b9eebfadSRuchika Gupta { 0x0D, "Invalid JUMP Command" }, 49*b9eebfadSRuchika Gupta { 0x0E, "Invalid MATH Command" }, 50*b9eebfadSRuchika Gupta { 0x0F, "Invalid SIGNATURE Command" }, 51*b9eebfadSRuchika Gupta { 0x10, "Invalid Sequence Command" }, 52*b9eebfadSRuchika Gupta { 0x11, "Skip data type invalid. The type must be 0xE or 0xF."}, 53*b9eebfadSRuchika Gupta { 0x12, "Shared Descriptor Header Error" }, 54*b9eebfadSRuchika Gupta { 0x13, "Header Error. Invalid length or parity, or other problems." }, 55*b9eebfadSRuchika Gupta { 0x14, "Burster Error. Burster has gotten to an illegal state" }, 56*b9eebfadSRuchika Gupta { 0x15, "Context Register Length Error" }, 57*b9eebfadSRuchika Gupta { 0x16, "DMA Error" }, 58*b9eebfadSRuchika Gupta { 0x17, "Reserved." }, 59*b9eebfadSRuchika Gupta { 0x1A, "Job failed due to JR reset" }, 60*b9eebfadSRuchika Gupta { 0x1B, "Job failed due to Fail Mode" }, 61*b9eebfadSRuchika Gupta { 0x1C, "DECO Watchdog timer timeout error" }, 62*b9eebfadSRuchika Gupta { 0x1D, "DECO tried to copy a key from another DECO but" \ 63*b9eebfadSRuchika Gupta " the other DECO's Key Registers were locked" }, 64*b9eebfadSRuchika Gupta { 0x1E, "DECO attempted to copy data from a DECO" \ 65*b9eebfadSRuchika Gupta "that had an unmasked Descriptor error" }, 66*b9eebfadSRuchika Gupta { 0x1F, "LIODN error" }, 67*b9eebfadSRuchika Gupta { 0x20, "DECO has completed a reset initiated via the DRR register" }, 68*b9eebfadSRuchika Gupta { 0x21, "Nonce error" }, 69*b9eebfadSRuchika Gupta { 0x22, "Meta data is too large (> 511 bytes) for TLS decap" }, 70*b9eebfadSRuchika Gupta { 0x23, "Read Input Frame error" }, 71*b9eebfadSRuchika Gupta { 0x24, "JDKEK, TDKEK or TDSK not loaded error" }, 72*b9eebfadSRuchika Gupta { 0x80, "DNR (do not run) error" }, 73*b9eebfadSRuchika Gupta { 0x81, "undefined protocol command" }, 74*b9eebfadSRuchika Gupta { 0x82, "invalid setting in PDB" }, 75*b9eebfadSRuchika Gupta { 0x83, "Anti-replay LATE error" }, 76*b9eebfadSRuchika Gupta { 0x84, "Anti-replay REPLAY error" }, 77*b9eebfadSRuchika Gupta { 0x85, "Sequence number overflow" }, 78*b9eebfadSRuchika Gupta { 0x86, "Sigver invalid signature" }, 79*b9eebfadSRuchika Gupta { 0x87, "DSA Sign Illegal test descriptor" }, 80*b9eebfadSRuchika Gupta { 0x88, "Protocol Format Error" }, 81*b9eebfadSRuchika Gupta { 0x89, "Protocol Size Error" }, 82*b9eebfadSRuchika Gupta { 0xC1, "Blob Command error: Undefined mode" }, 83*b9eebfadSRuchika Gupta { 0xC2, "Blob Command error: Secure Memory Blob mode error" }, 84*b9eebfadSRuchika Gupta { 0xC4, "Blob Command error: Black Blob key or input size error" }, 85*b9eebfadSRuchika Gupta { 0xC5, "Blob Command error: Invalid key destination" }, 86*b9eebfadSRuchika Gupta { 0xC8, "Blob Command error: Trusted/Secure mode error" }, 87*b9eebfadSRuchika Gupta { 0xF0, "IPsec TTL or hop limit field is 0, or was decremented to 0" }, 88*b9eebfadSRuchika Gupta { 0xF1, "3GPP HFN matches or exceeds the Threshold" }, 89*b9eebfadSRuchika Gupta }; 90*b9eebfadSRuchika Gupta 91*b9eebfadSRuchika Gupta static const char * const cha_id_list[] = { 92*b9eebfadSRuchika Gupta "", 93*b9eebfadSRuchika Gupta "AES", 94*b9eebfadSRuchika Gupta "DES", 95*b9eebfadSRuchika Gupta "ARC4", 96*b9eebfadSRuchika Gupta "MDHA", 97*b9eebfadSRuchika Gupta "RNG", 98*b9eebfadSRuchika Gupta "SNOW f8", 99*b9eebfadSRuchika Gupta "Kasumi f8/9", 100*b9eebfadSRuchika Gupta "PKHA", 101*b9eebfadSRuchika Gupta "CRCA", 102*b9eebfadSRuchika Gupta "SNOW f9", 103*b9eebfadSRuchika Gupta "ZUCE", 104*b9eebfadSRuchika Gupta "ZUCA", 105*b9eebfadSRuchika Gupta }; 106*b9eebfadSRuchika Gupta 107*b9eebfadSRuchika Gupta static const char * const err_id_list[] = { 108*b9eebfadSRuchika Gupta "No error.", 109*b9eebfadSRuchika Gupta "Mode error.", 110*b9eebfadSRuchika Gupta "Data size error.", 111*b9eebfadSRuchika Gupta "Key size error.", 112*b9eebfadSRuchika Gupta "PKHA A memory size error.", 113*b9eebfadSRuchika Gupta "PKHA B memory size error.", 114*b9eebfadSRuchika Gupta "Data arrived out of sequence error.", 115*b9eebfadSRuchika Gupta "PKHA divide-by-zero error.", 116*b9eebfadSRuchika Gupta "PKHA modulus even error.", 117*b9eebfadSRuchika Gupta "DES key parity error.", 118*b9eebfadSRuchika Gupta "ICV check failed.", 119*b9eebfadSRuchika Gupta "Hardware error.", 120*b9eebfadSRuchika Gupta "Unsupported CCM AAD size.", 121*b9eebfadSRuchika Gupta "Class 1 CHA is not reset", 122*b9eebfadSRuchika Gupta "Invalid CHA combination was selected", 123*b9eebfadSRuchika Gupta "Invalid CHA selected.", 124*b9eebfadSRuchika Gupta }; 125*b9eebfadSRuchika Gupta 126*b9eebfadSRuchika Gupta static const char * const rng_err_id_list[] = { 127*b9eebfadSRuchika Gupta "", 128*b9eebfadSRuchika Gupta "", 129*b9eebfadSRuchika Gupta "", 130*b9eebfadSRuchika Gupta "Instantiate", 131*b9eebfadSRuchika Gupta "Not instantiated", 132*b9eebfadSRuchika Gupta "Test instantiate", 133*b9eebfadSRuchika Gupta "Prediction resistance", 134*b9eebfadSRuchika Gupta "Prediction resistance and test request", 135*b9eebfadSRuchika Gupta "Uninstantiate", 136*b9eebfadSRuchika Gupta "Secure key generation", 137*b9eebfadSRuchika Gupta }; 138*b9eebfadSRuchika Gupta 139*b9eebfadSRuchika Gupta static void report_ccb_status(const u32 status, 140*b9eebfadSRuchika Gupta const char *error) 141*b9eebfadSRuchika Gupta { 142*b9eebfadSRuchika Gupta u8 cha_id = (status & JRSTA_CCBERR_CHAID_MASK) >> 143*b9eebfadSRuchika Gupta JRSTA_CCBERR_CHAID_SHIFT; 144*b9eebfadSRuchika Gupta u8 err_id = status & JRSTA_CCBERR_ERRID_MASK; 145*b9eebfadSRuchika Gupta u8 idx = (status & JRSTA_DECOERR_INDEX_MASK) >> 146*b9eebfadSRuchika Gupta JRSTA_DECOERR_INDEX_SHIFT; 147*b9eebfadSRuchika Gupta char *idx_str; 148*b9eebfadSRuchika Gupta const char *cha_str = "unidentified cha_id value 0x"; 149*b9eebfadSRuchika Gupta char cha_err_code[3] = { 0 }; 150*b9eebfadSRuchika Gupta const char *err_str = "unidentified err_id value 0x"; 151*b9eebfadSRuchika Gupta char err_err_code[3] = { 0 }; 152*b9eebfadSRuchika Gupta 153*b9eebfadSRuchika Gupta if (status & JRSTA_DECOERR_JUMP) 154*b9eebfadSRuchika Gupta idx_str = "jump tgt desc idx"; 155*b9eebfadSRuchika Gupta else 156*b9eebfadSRuchika Gupta idx_str = "desc idx"; 157*b9eebfadSRuchika Gupta 158*b9eebfadSRuchika Gupta if (cha_id < ARRAY_SIZE(cha_id_list)) 159*b9eebfadSRuchika Gupta cha_str = cha_id_list[cha_id]; 160*b9eebfadSRuchika Gupta else 161*b9eebfadSRuchika Gupta snprintf(cha_err_code, sizeof(cha_err_code), "%02x", cha_id); 162*b9eebfadSRuchika Gupta 163*b9eebfadSRuchika Gupta if ((cha_id << JRSTA_CCBERR_CHAID_SHIFT) == JRSTA_CCBERR_CHAID_RNG && 164*b9eebfadSRuchika Gupta err_id < ARRAY_SIZE(rng_err_id_list) && 165*b9eebfadSRuchika Gupta strlen(rng_err_id_list[err_id])) { 166*b9eebfadSRuchika Gupta /* RNG-only error */ 167*b9eebfadSRuchika Gupta err_str = rng_err_id_list[err_id]; 168*b9eebfadSRuchika Gupta } else if (err_id < ARRAY_SIZE(err_id_list)) { 169*b9eebfadSRuchika Gupta err_str = err_id_list[err_id]; 170*b9eebfadSRuchika Gupta } else { 171*b9eebfadSRuchika Gupta snprintf(err_err_code, sizeof(err_err_code), "%02x", err_id); 172*b9eebfadSRuchika Gupta } 173*b9eebfadSRuchika Gupta 174*b9eebfadSRuchika Gupta debug("%08x: %s: %s %d: %s%s: %s%s\n", 175*b9eebfadSRuchika Gupta status, error, idx_str, idx, 176*b9eebfadSRuchika Gupta cha_str, cha_err_code, 177*b9eebfadSRuchika Gupta err_str, err_err_code); 178*b9eebfadSRuchika Gupta } 179*b9eebfadSRuchika Gupta 180*b9eebfadSRuchika Gupta static void report_jump_status(const u32 status, 181*b9eebfadSRuchika Gupta const char *error) 182*b9eebfadSRuchika Gupta { 183*b9eebfadSRuchika Gupta debug("%08x: %s: %s() not implemented\n", 184*b9eebfadSRuchika Gupta status, error, __func__); 185*b9eebfadSRuchika Gupta } 186*b9eebfadSRuchika Gupta 187*b9eebfadSRuchika Gupta static void report_deco_status(const u32 status, 188*b9eebfadSRuchika Gupta const char *error) 189*b9eebfadSRuchika Gupta { 190*b9eebfadSRuchika Gupta u8 err_id = status & JRSTA_DECOERR_ERROR_MASK; 191*b9eebfadSRuchika Gupta u8 idx = (status & JRSTA_DECOERR_INDEX_MASK) >> 192*b9eebfadSRuchika Gupta JRSTA_DECOERR_INDEX_SHIFT; 193*b9eebfadSRuchika Gupta char *idx_str; 194*b9eebfadSRuchika Gupta const char *err_str = "unidentified error value 0x"; 195*b9eebfadSRuchika Gupta char err_err_code[3] = { 0 }; 196*b9eebfadSRuchika Gupta int i; 197*b9eebfadSRuchika Gupta 198*b9eebfadSRuchika Gupta if (status & JRSTA_DECOERR_JUMP) 199*b9eebfadSRuchika Gupta idx_str = "jump tgt desc idx"; 200*b9eebfadSRuchika Gupta else 201*b9eebfadSRuchika Gupta idx_str = "desc idx"; 202*b9eebfadSRuchika Gupta 203*b9eebfadSRuchika Gupta for (i = 0; i < ARRAY_SIZE(desc_error_list); i++) 204*b9eebfadSRuchika Gupta if (desc_error_list[i].value == err_id) 205*b9eebfadSRuchika Gupta break; 206*b9eebfadSRuchika Gupta 207*b9eebfadSRuchika Gupta if (i != ARRAY_SIZE(desc_error_list) && desc_error_list[i].error_text) 208*b9eebfadSRuchika Gupta err_str = desc_error_list[i].error_text; 209*b9eebfadSRuchika Gupta else 210*b9eebfadSRuchika Gupta snprintf(err_err_code, sizeof(err_err_code), "%02x", err_id); 211*b9eebfadSRuchika Gupta 212*b9eebfadSRuchika Gupta debug("%08x: %s: %s %d: %s%s\n", 213*b9eebfadSRuchika Gupta status, error, idx_str, idx, err_str, err_err_code); 214*b9eebfadSRuchika Gupta } 215*b9eebfadSRuchika Gupta 216*b9eebfadSRuchika Gupta static void report_jr_status(const u32 status, 217*b9eebfadSRuchika Gupta const char *error) 218*b9eebfadSRuchika Gupta { 219*b9eebfadSRuchika Gupta debug("%08x: %s: %s() not implemented\n", 220*b9eebfadSRuchika Gupta status, error, __func__); 221*b9eebfadSRuchika Gupta } 222*b9eebfadSRuchika Gupta 223*b9eebfadSRuchika Gupta static void report_cond_code_status(const u32 status, 224*b9eebfadSRuchika Gupta const char *error) 225*b9eebfadSRuchika Gupta { 226*b9eebfadSRuchika Gupta debug("%08x: %s: %s() not implemented\n", 227*b9eebfadSRuchika Gupta status, error, __func__); 228*b9eebfadSRuchika Gupta } 229*b9eebfadSRuchika Gupta 230*b9eebfadSRuchika Gupta void caam_jr_strstatus(u32 status) 231*b9eebfadSRuchika Gupta { 232*b9eebfadSRuchika Gupta static const struct stat_src { 233*b9eebfadSRuchika Gupta void (*report_ssed)(const u32 status, 234*b9eebfadSRuchika Gupta const char *error); 235*b9eebfadSRuchika Gupta const char *error; 236*b9eebfadSRuchika Gupta } status_src[] = { 237*b9eebfadSRuchika Gupta { NULL, "No error" }, 238*b9eebfadSRuchika Gupta { NULL, NULL }, 239*b9eebfadSRuchika Gupta { report_ccb_status, "CCB" }, 240*b9eebfadSRuchika Gupta { report_jump_status, "Jump" }, 241*b9eebfadSRuchika Gupta { report_deco_status, "DECO" }, 242*b9eebfadSRuchika Gupta { NULL, NULL }, 243*b9eebfadSRuchika Gupta { report_jr_status, "Job Ring" }, 244*b9eebfadSRuchika Gupta { report_cond_code_status, "Condition Code" }, 245*b9eebfadSRuchika Gupta }; 246*b9eebfadSRuchika Gupta u32 ssrc = status >> JRSTA_SSRC_SHIFT; 247*b9eebfadSRuchika Gupta const char *error = status_src[ssrc].error; 248*b9eebfadSRuchika Gupta 249*b9eebfadSRuchika Gupta /* 250*b9eebfadSRuchika Gupta * If there is no further error handling function, just 251*b9eebfadSRuchika Gupta * print the error code, error string and exit. Otherwise 252*b9eebfadSRuchika Gupta * call the handler function. 253*b9eebfadSRuchika Gupta */ 254*b9eebfadSRuchika Gupta if (!status_src[ssrc].report_ssed) 255*b9eebfadSRuchika Gupta debug("%08x: %s:\n", status, status_src[ssrc].error); 256*b9eebfadSRuchika Gupta else 257*b9eebfadSRuchika Gupta status_src[ssrc].report_ssed(status, error); 258*b9eebfadSRuchika Gupta } 259