xref: /linux-6.15/drivers/crypto/caam/error.c (revision 96aef9a8)
18e8ec596SKim Phillips /*
28e8ec596SKim Phillips  * CAAM Error Reporting
38e8ec596SKim Phillips  *
48e8ec596SKim Phillips  * Copyright 2009-2011 Freescale Semiconductor, Inc.
58e8ec596SKim Phillips  */
68e8ec596SKim Phillips 
78e8ec596SKim Phillips #include "compat.h"
88e8ec596SKim Phillips #include "regs.h"
98e8ec596SKim Phillips #include "intern.h"
108e8ec596SKim Phillips #include "desc.h"
118e8ec596SKim Phillips #include "jr.h"
128e8ec596SKim Phillips #include "error.h"
138e8ec596SKim Phillips 
148e8ec596SKim Phillips #define SPRINTFCAT(str, format, param, max_alloc)		\
158e8ec596SKim Phillips {								\
168e8ec596SKim Phillips 	char *tmp;						\
178e8ec596SKim Phillips 								\
188e8ec596SKim Phillips 	tmp = kmalloc(sizeof(format) + max_alloc, GFP_ATOMIC);	\
198e8ec596SKim Phillips 	sprintf(tmp, format, param);				\
208e8ec596SKim Phillips 	strcat(str, tmp);					\
218e8ec596SKim Phillips 	kfree(tmp);						\
228e8ec596SKim Phillips }
238e8ec596SKim Phillips 
248e8ec596SKim Phillips static void report_jump_idx(u32 status, char *outstr)
258e8ec596SKim Phillips {
268e8ec596SKim Phillips 	u8 idx = (status & JRSTA_DECOERR_INDEX_MASK) >>
278e8ec596SKim Phillips 		  JRSTA_DECOERR_INDEX_SHIFT;
288e8ec596SKim Phillips 
298e8ec596SKim Phillips 	if (status & JRSTA_DECOERR_JUMP)
308e8ec596SKim Phillips 		strcat(outstr, "jump tgt desc idx ");
318e8ec596SKim Phillips 	else
328e8ec596SKim Phillips 		strcat(outstr, "desc idx ");
338e8ec596SKim Phillips 
348e8ec596SKim Phillips 	SPRINTFCAT(outstr, "%d: ", idx, sizeof("255"));
358e8ec596SKim Phillips }
368e8ec596SKim Phillips 
378e8ec596SKim Phillips static void report_ccb_status(u32 status, char *outstr)
388e8ec596SKim Phillips {
39*96aef9a8SKim Phillips 	static const char * const cha_id_list[] = {
408e8ec596SKim Phillips 		"",
418e8ec596SKim Phillips 		"AES",
42281922a1SKim Phillips 		"DES",
438e8ec596SKim Phillips 		"ARC4",
44281922a1SKim Phillips 		"MDHA",
458e8ec596SKim Phillips 		"RNG",
468e8ec596SKim Phillips 		"SNOW f8",
47281922a1SKim Phillips 		"Kasumi f8/9",
48281922a1SKim Phillips 		"PKHA",
49281922a1SKim Phillips 		"CRCA",
508e8ec596SKim Phillips 		"SNOW f9",
51281922a1SKim Phillips 		"ZUCE",
52281922a1SKim Phillips 		"ZUCA",
538e8ec596SKim Phillips 	};
54*96aef9a8SKim Phillips 	static const char * const err_id_list[] = {
55281922a1SKim Phillips 		"No error.",
568e8ec596SKim Phillips 		"Mode error.",
578e8ec596SKim Phillips 		"Data size error.",
588e8ec596SKim Phillips 		"Key size error.",
598e8ec596SKim Phillips 		"PKHA A memory size error.",
608e8ec596SKim Phillips 		"PKHA B memory size error.",
618e8ec596SKim Phillips 		"Data arrived out of sequence error.",
628e8ec596SKim Phillips 		"PKHA divide-by-zero error.",
638e8ec596SKim Phillips 		"PKHA modulus even error.",
648e8ec596SKim Phillips 		"DES key parity error.",
658e8ec596SKim Phillips 		"ICV check failed.",
668e8ec596SKim Phillips 		"Hardware error.",
678e8ec596SKim Phillips 		"Unsupported CCM AAD size.",
688e8ec596SKim Phillips 		"Class 1 CHA is not reset",
698e8ec596SKim Phillips 		"Invalid CHA combination was selected",
708e8ec596SKim Phillips 		"Invalid CHA selected.",
718e8ec596SKim Phillips 	};
72*96aef9a8SKim Phillips 	static const char * const rng_err_id_list[] = {
73281922a1SKim Phillips 		"",
74281922a1SKim Phillips 		"",
75281922a1SKim Phillips 		"",
76281922a1SKim Phillips 		"Instantiate",
77281922a1SKim Phillips 		"Not instantiated",
78281922a1SKim Phillips 		"Test instantiate",
79281922a1SKim Phillips 		"Prediction resistance",
80281922a1SKim Phillips 		"Prediction resistance and test request",
81281922a1SKim Phillips 		"Uninstantiate",
82281922a1SKim Phillips 		"Secure key generation",
83281922a1SKim Phillips 	};
848e8ec596SKim Phillips 	u8 cha_id = (status & JRSTA_CCBERR_CHAID_MASK) >>
858e8ec596SKim Phillips 		    JRSTA_CCBERR_CHAID_SHIFT;
868e8ec596SKim Phillips 	u8 err_id = status & JRSTA_CCBERR_ERRID_MASK;
878e8ec596SKim Phillips 
888e8ec596SKim Phillips 	report_jump_idx(status, outstr);
898e8ec596SKim Phillips 
906d00376aSDan Carpenter 	if (cha_id < ARRAY_SIZE(cha_id_list)) {
918e8ec596SKim Phillips 		SPRINTFCAT(outstr, "%s: ", cha_id_list[cha_id],
928e8ec596SKim Phillips 			   strlen(cha_id_list[cha_id]));
938e8ec596SKim Phillips 	} else {
948e8ec596SKim Phillips 		SPRINTFCAT(outstr, "unidentified cha_id value 0x%02x: ",
958e8ec596SKim Phillips 			   cha_id, sizeof("ff"));
968e8ec596SKim Phillips 	}
978e8ec596SKim Phillips 
98281922a1SKim Phillips 	if ((cha_id << JRSTA_CCBERR_CHAID_SHIFT) == JRSTA_CCBERR_CHAID_RNG &&
99281922a1SKim Phillips 	    err_id < ARRAY_SIZE(rng_err_id_list) &&
100281922a1SKim Phillips 	    strlen(rng_err_id_list[err_id])) {
101281922a1SKim Phillips 		/* RNG-only error */
102281922a1SKim Phillips 		SPRINTFCAT(outstr, "%s", rng_err_id_list[err_id],
103281922a1SKim Phillips 			   strlen(rng_err_id_list[err_id]));
104281922a1SKim Phillips 	} else if (err_id < ARRAY_SIZE(err_id_list)) {
1058e8ec596SKim Phillips 		SPRINTFCAT(outstr, "%s", err_id_list[err_id],
1068e8ec596SKim Phillips 			   strlen(err_id_list[err_id]));
1078e8ec596SKim Phillips 	} else {
1088e8ec596SKim Phillips 		SPRINTFCAT(outstr, "unidentified err_id value 0x%02x",
1098e8ec596SKim Phillips 			   err_id, sizeof("ff"));
1108e8ec596SKim Phillips 	}
1118e8ec596SKim Phillips }
1128e8ec596SKim Phillips 
1138e8ec596SKim Phillips static void report_jump_status(u32 status, char *outstr)
1148e8ec596SKim Phillips {
1158e8ec596SKim Phillips 	SPRINTFCAT(outstr, "%s() not implemented", __func__, sizeof(__func__));
1168e8ec596SKim Phillips }
1178e8ec596SKim Phillips 
1188e8ec596SKim Phillips static void report_deco_status(u32 status, char *outstr)
1198e8ec596SKim Phillips {
120*96aef9a8SKim Phillips 	static const struct {
1218e8ec596SKim Phillips 		u8 value;
1228e8ec596SKim Phillips 		char *error_text;
1238e8ec596SKim Phillips 	} desc_error_list[] = {
124281922a1SKim Phillips 		{ 0x00, "No error." },
1258e8ec596SKim Phillips 		{ 0x01, "SGT Length Error. The descriptor is trying to read "
1268e8ec596SKim Phillips 			"more data than is contained in the SGT table." },
127281922a1SKim Phillips 		{ 0x02, "SGT Null Entry Error." },
1288e8ec596SKim Phillips 		{ 0x03, "Job Ring Control Error. There is a bad value in the "
1298e8ec596SKim Phillips 			"Job Ring Control register." },
1308e8ec596SKim Phillips 		{ 0x04, "Invalid Descriptor Command. The Descriptor Command "
1318e8ec596SKim Phillips 			"field is invalid." },
1328e8ec596SKim Phillips 		{ 0x05, "Reserved." },
1338e8ec596SKim Phillips 		{ 0x06, "Invalid KEY Command" },
1348e8ec596SKim Phillips 		{ 0x07, "Invalid LOAD Command" },
1358e8ec596SKim Phillips 		{ 0x08, "Invalid STORE Command" },
1368e8ec596SKim Phillips 		{ 0x09, "Invalid OPERATION Command" },
1378e8ec596SKim Phillips 		{ 0x0A, "Invalid FIFO LOAD Command" },
1388e8ec596SKim Phillips 		{ 0x0B, "Invalid FIFO STORE Command" },
139281922a1SKim Phillips 		{ 0x0C, "Invalid MOVE/MOVE_LEN Command" },
1408e8ec596SKim Phillips 		{ 0x0D, "Invalid JUMP Command. A nonlocal JUMP Command is "
1418e8ec596SKim Phillips 			"invalid because the target is not a Job Header "
1428e8ec596SKim Phillips 			"Command, or the jump is from a Trusted Descriptor to "
1438e8ec596SKim Phillips 			"a Job Descriptor, or because the target Descriptor "
1448e8ec596SKim Phillips 			"contains a Shared Descriptor." },
1458e8ec596SKim Phillips 		{ 0x0E, "Invalid MATH Command" },
1468e8ec596SKim Phillips 		{ 0x0F, "Invalid SIGNATURE Command" },
1478e8ec596SKim Phillips 		{ 0x10, "Invalid Sequence Command. A SEQ IN PTR OR SEQ OUT PTR "
1488e8ec596SKim Phillips 			"Command is invalid or a SEQ KEY, SEQ LOAD, SEQ FIFO "
1498e8ec596SKim Phillips 			"LOAD, or SEQ FIFO STORE decremented the input or "
1508e8ec596SKim Phillips 			"output sequence length below 0. This error may result "
1518e8ec596SKim Phillips 			"if a built-in PROTOCOL Command has encountered a "
1528e8ec596SKim Phillips 			"malformed PDU." },
1538e8ec596SKim Phillips 		{ 0x11, "Skip data type invalid. The type must be 0xE or 0xF."},
1548e8ec596SKim Phillips 		{ 0x12, "Shared Descriptor Header Error" },
1558e8ec596SKim Phillips 		{ 0x13, "Header Error. Invalid length or parity, or certain "
1568e8ec596SKim Phillips 			"other problems." },
1578e8ec596SKim Phillips 		{ 0x14, "Burster Error. Burster has gotten to an illegal "
1588e8ec596SKim Phillips 			"state" },
1598e8ec596SKim Phillips 		{ 0x15, "Context Register Length Error. The descriptor is "
1608e8ec596SKim Phillips 			"trying to read or write past the end of the Context "
1618e8ec596SKim Phillips 			"Register. A SEQ LOAD or SEQ STORE with the VLF bit "
1628e8ec596SKim Phillips 			"set was executed with too large a length in the "
1638e8ec596SKim Phillips 			"variable length register (VSOL for SEQ STORE or VSIL "
1648e8ec596SKim Phillips 			"for SEQ LOAD)." },
1658e8ec596SKim Phillips 		{ 0x16, "DMA Error" },
1668e8ec596SKim Phillips 		{ 0x17, "Reserved." },
1678e8ec596SKim Phillips 		{ 0x1A, "Job failed due to JR reset" },
1688e8ec596SKim Phillips 		{ 0x1B, "Job failed due to Fail Mode" },
1698e8ec596SKim Phillips 		{ 0x1C, "DECO Watchdog timer timeout error" },
1708e8ec596SKim Phillips 		{ 0x1D, "DECO tried to copy a key from another DECO but the "
1718e8ec596SKim Phillips 			"other DECO's Key Registers were locked" },
1728e8ec596SKim Phillips 		{ 0x1E, "DECO attempted to copy data from a DECO that had an "
1738e8ec596SKim Phillips 			"unmasked Descriptor error" },
1748e8ec596SKim Phillips 		{ 0x1F, "LIODN error. DECO was trying to share from itself or "
1758e8ec596SKim Phillips 			"from another DECO but the two Non-SEQ LIODN values "
1768e8ec596SKim Phillips 			"didn't match or the 'shared from' DECO's Descriptor "
1778e8ec596SKim Phillips 			"required that the SEQ LIODNs be the same and they "
1788e8ec596SKim Phillips 			"aren't." },
1798e8ec596SKim Phillips 		{ 0x20, "DECO has completed a reset initiated via the DRR "
1808e8ec596SKim Phillips 			"register" },
1818e8ec596SKim Phillips 		{ 0x21, "Nonce error. When using EKT (CCM) key encryption "
1828e8ec596SKim Phillips 			"option in the FIFO STORE Command, the Nonce counter "
1838e8ec596SKim Phillips 			"reached its maximum value and this encryption mode "
1848e8ec596SKim Phillips 			"can no longer be used." },
1858e8ec596SKim Phillips 		{ 0x22, "Meta data is too large (> 511 bytes) for TLS decap "
1868e8ec596SKim Phillips 			"(input frame; block ciphers) and IPsec decap (output "
1878e8ec596SKim Phillips 			"frame, when doing the next header byte update) and "
1888e8ec596SKim Phillips 			"DCRC (output frame)." },
189281922a1SKim Phillips 		{ 0x23, "Read Input Frame error" },
190281922a1SKim Phillips 		{ 0x24, "JDKEK, TDKEK or TDSK not loaded error" },
1918e8ec596SKim Phillips 		{ 0x80, "DNR (do not run) error" },
1928e8ec596SKim Phillips 		{ 0x81, "undefined protocol command" },
1938e8ec596SKim Phillips 		{ 0x82, "invalid setting in PDB" },
1948e8ec596SKim Phillips 		{ 0x83, "Anti-replay LATE error" },
1958e8ec596SKim Phillips 		{ 0x84, "Anti-replay REPLAY error" },
1968e8ec596SKim Phillips 		{ 0x85, "Sequence number overflow" },
1978e8ec596SKim Phillips 		{ 0x86, "Sigver invalid signature" },
1988e8ec596SKim Phillips 		{ 0x87, "DSA Sign Illegal test descriptor" },
1998e8ec596SKim Phillips 		{ 0x88, "Protocol Format Error - A protocol has seen an error "
2008e8ec596SKim Phillips 			"in the format of data received. When running RSA, "
2018e8ec596SKim Phillips 			"this means that formatting with random padding was "
2028e8ec596SKim Phillips 			"used, and did not follow the form: 0x00, 0x02, 8-to-N "
2038e8ec596SKim Phillips 			"bytes of non-zero pad, 0x00, F data." },
2048e8ec596SKim Phillips 		{ 0x89, "Protocol Size Error - A protocol has seen an error in "
2058e8ec596SKim Phillips 			"size. When running RSA, pdb size N < (size of F) when "
2068e8ec596SKim Phillips 			"no formatting is used; or pdb size N < (F + 11) when "
2078e8ec596SKim Phillips 			"formatting is used." },
2088e8ec596SKim Phillips 		{ 0xC1, "Blob Command error: Undefined mode" },
2098e8ec596SKim Phillips 		{ 0xC2, "Blob Command error: Secure Memory Blob mode error" },
2108e8ec596SKim Phillips 		{ 0xC4, "Blob Command error: Black Blob key or input size "
2118e8ec596SKim Phillips 			"error" },
2128e8ec596SKim Phillips 		{ 0xC5, "Blob Command error: Invalid key destination" },
2138e8ec596SKim Phillips 		{ 0xC8, "Blob Command error: Trusted/Secure mode error" },
2148e8ec596SKim Phillips 		{ 0xF0, "IPsec TTL or hop limit field either came in as 0, "
2158e8ec596SKim Phillips 			"or was decremented to 0" },
2168e8ec596SKim Phillips 		{ 0xF1, "3GPP HFN matches or exceeds the Threshold" },
2178e8ec596SKim Phillips 	};
2188e8ec596SKim Phillips 	u8 desc_error = status & JRSTA_DECOERR_ERROR_MASK;
2198e8ec596SKim Phillips 	int i;
2208e8ec596SKim Phillips 
2218e8ec596SKim Phillips 	report_jump_idx(status, outstr);
2228e8ec596SKim Phillips 
2236d00376aSDan Carpenter 	for (i = 0; i < ARRAY_SIZE(desc_error_list); i++)
2248e8ec596SKim Phillips 		if (desc_error_list[i].value == desc_error)
2258e8ec596SKim Phillips 			break;
2268e8ec596SKim Phillips 
2276d00376aSDan Carpenter 	if (i != ARRAY_SIZE(desc_error_list) && desc_error_list[i].error_text) {
2288e8ec596SKim Phillips 		SPRINTFCAT(outstr, "%s", desc_error_list[i].error_text,
2298e8ec596SKim Phillips 			   strlen(desc_error_list[i].error_text));
2308e8ec596SKim Phillips 	} else {
2318e8ec596SKim Phillips 		SPRINTFCAT(outstr, "unidentified error value 0x%02x",
2328e8ec596SKim Phillips 			   desc_error, sizeof("ff"));
2338e8ec596SKim Phillips 	}
2348e8ec596SKim Phillips }
2358e8ec596SKim Phillips 
2368e8ec596SKim Phillips static void report_jr_status(u32 status, char *outstr)
2378e8ec596SKim Phillips {
2388e8ec596SKim Phillips 	SPRINTFCAT(outstr, "%s() not implemented", __func__, sizeof(__func__));
2398e8ec596SKim Phillips }
2408e8ec596SKim Phillips 
2418e8ec596SKim Phillips static void report_cond_code_status(u32 status, char *outstr)
2428e8ec596SKim Phillips {
2438e8ec596SKim Phillips 	SPRINTFCAT(outstr, "%s() not implemented", __func__, sizeof(__func__));
2448e8ec596SKim Phillips }
2458e8ec596SKim Phillips 
2468e8ec596SKim Phillips char *caam_jr_strstatus(char *outstr, u32 status)
2478e8ec596SKim Phillips {
248*96aef9a8SKim Phillips 	static const struct stat_src {
2498e8ec596SKim Phillips 		void (*report_ssed)(u32 status, char *outstr);
2508e8ec596SKim Phillips 		char *error;
2518e8ec596SKim Phillips 	} status_src[] = {
2528e8ec596SKim Phillips 		{ NULL, "No error" },
2538e8ec596SKim Phillips 		{ NULL, NULL },
2548e8ec596SKim Phillips 		{ report_ccb_status, "CCB" },
2558e8ec596SKim Phillips 		{ report_jump_status, "Jump" },
2568e8ec596SKim Phillips 		{ report_deco_status, "DECO" },
2578e8ec596SKim Phillips 		{ NULL, NULL },
2588e8ec596SKim Phillips 		{ report_jr_status, "Job Ring" },
2598e8ec596SKim Phillips 		{ report_cond_code_status, "Condition Code" },
2608e8ec596SKim Phillips 	};
2618e8ec596SKim Phillips 	u32 ssrc = status >> JRSTA_SSRC_SHIFT;
2628e8ec596SKim Phillips 
2638e8ec596SKim Phillips 	sprintf(outstr, "%s: ", status_src[ssrc].error);
2648e8ec596SKim Phillips 
2658e8ec596SKim Phillips 	if (status_src[ssrc].report_ssed)
2668e8ec596SKim Phillips 		status_src[ssrc].report_ssed(status, outstr);
2678e8ec596SKim Phillips 
2688e8ec596SKim Phillips 	return outstr;
2698e8ec596SKim Phillips }
2708e8ec596SKim Phillips EXPORT_SYMBOL(caam_jr_strstatus);
271