xref: /optee_os/core/drivers/crypto/caam/caam_desc.c (revision b78d011500497339b11b805ef94f26a9d22a2f10)
12d7a8964SCedric Neveux // SPDX-License-Identifier: BSD-2-Clause
22d7a8964SCedric Neveux /*
338923d48SCedric Neveux  * Copyright 2019, 2021 NXP
42d7a8964SCedric Neveux  *
52d7a8964SCedric Neveux  * Brief   Descriptor construction functions.
62d7a8964SCedric Neveux  */
72d7a8964SCedric Neveux #include <caam_desc_helper.h>
82d7a8964SCedric Neveux #include <caam_io.h>
92d7a8964SCedric Neveux #include <trace.h>
102d7a8964SCedric Neveux #include <types_ext.h>
112d7a8964SCedric Neveux 
122d7a8964SCedric Neveux struct ptr_addr {
132d7a8964SCedric Neveux #ifdef CFG_CAAM_BIG_ENDIAN
142d7a8964SCedric Neveux 	uint32_t high;
152d7a8964SCedric Neveux 	uint32_t low;
162d7a8964SCedric Neveux #else
172d7a8964SCedric Neveux 	uint32_t low;
182d7a8964SCedric Neveux 	uint32_t high;
192d7a8964SCedric Neveux #endif /* CFG_CAAM_BIG_ENDIAN */
202d7a8964SCedric Neveux };
212d7a8964SCedric Neveux 
caam_desc_get_len(uint32_t * desc)222d7a8964SCedric Neveux uint32_t caam_desc_get_len(uint32_t *desc)
232d7a8964SCedric Neveux {
242d7a8964SCedric Neveux 	return GET_JD_DESCLEN(caam_read_val32((void *)desc));
252d7a8964SCedric Neveux }
262d7a8964SCedric Neveux 
caam_desc_init(uint32_t * desc)272d7a8964SCedric Neveux void caam_desc_init(uint32_t *desc)
282d7a8964SCedric Neveux {
292d7a8964SCedric Neveux 	*desc = 0;
302d7a8964SCedric Neveux }
312d7a8964SCedric Neveux 
caam_desc_update_hdr(uint32_t * desc,uint32_t word)322d7a8964SCedric Neveux void caam_desc_update_hdr(uint32_t *desc, uint32_t word)
332d7a8964SCedric Neveux {
342d7a8964SCedric Neveux 	/* Update first word of desc */
352d7a8964SCedric Neveux 	caam_write_val32((void *)desc, word);
362d7a8964SCedric Neveux }
372d7a8964SCedric Neveux 
caam_desc_add_word(uint32_t * desc,uint32_t word)382d7a8964SCedric Neveux void caam_desc_add_word(uint32_t *desc, uint32_t word)
392d7a8964SCedric Neveux {
402d7a8964SCedric Neveux 	uint32_t len = caam_desc_get_len(desc);
412d7a8964SCedric Neveux 	uint32_t *last = desc + len;
422d7a8964SCedric Neveux 
432d7a8964SCedric Neveux 	/* Add Word at Last */
442d7a8964SCedric Neveux 	caam_write_val32((void *)last, word);
452d7a8964SCedric Neveux 
462d7a8964SCedric Neveux 	/* Increase the length */
472d7a8964SCedric Neveux 	caam_write_val32((void *)desc, caam_read_val32((void *)desc) + 1);
482d7a8964SCedric Neveux }
492d7a8964SCedric Neveux 
caam_desc_add_ptr(uint32_t * desc,paddr_t ptr)502d7a8964SCedric Neveux void caam_desc_add_ptr(uint32_t *desc, paddr_t ptr)
512d7a8964SCedric Neveux {
522d7a8964SCedric Neveux 	uint32_t len = caam_desc_get_len(desc);
532d7a8964SCedric Neveux 	uint32_t *last = desc + len;
542d7a8964SCedric Neveux 	uint32_t inc = 1;
552d7a8964SCedric Neveux 
562d7a8964SCedric Neveux 	/* Add Word at Last */
572d7a8964SCedric Neveux #ifdef CFG_CAAM_64BIT
582d7a8964SCedric Neveux 	struct ptr_addr *ptr_addr = (struct ptr_addr *)(uintptr_t)last;
592d7a8964SCedric Neveux 
6038923d48SCedric Neveux #ifdef CFG_ARM64_core
612d7a8964SCedric Neveux 	caam_write_val32(&ptr_addr->high, ptr >> 32);
6238923d48SCedric Neveux #else
6338923d48SCedric Neveux 	caam_write_val32(&ptr_addr->high, 0);
6438923d48SCedric Neveux #endif /* CFG_ARM64_core */
652d7a8964SCedric Neveux 	caam_write_val32(&ptr_addr->low, ptr);
662d7a8964SCedric Neveux 	inc++;
672d7a8964SCedric Neveux #else
682d7a8964SCedric Neveux 	caam_write_val32((void *)last, ptr);
692d7a8964SCedric Neveux #endif /* CFG_CAAM_64BIT */
702d7a8964SCedric Neveux 
712d7a8964SCedric Neveux 	/* Increase the length */
722d7a8964SCedric Neveux 	caam_write_val32((void *)desc, caam_read_val32((void *)desc) + inc);
732d7a8964SCedric Neveux }
742d7a8964SCedric Neveux 
752d7a8964SCedric Neveux #ifdef CFG_CAAM_64BIT
caam_desc_push(struct caam_inring_entry * in_entry,paddr_t paddr)766a16bb35SClement Faure void caam_desc_push(struct caam_inring_entry *in_entry, paddr_t paddr)
772d7a8964SCedric Neveux {
782d7a8964SCedric Neveux #ifdef CFG_CAAM_BIG_ENDIAN
796a16bb35SClement Faure 	put_be64(&in_entry->desc, paddr);
802d7a8964SCedric Neveux #else
816a16bb35SClement Faure 	put_le64(&in_entry->desc, paddr);
822d7a8964SCedric Neveux #endif /* CFG_CAAM_BIG_ENDIAN */
832d7a8964SCedric Neveux }
842d7a8964SCedric Neveux 
caam_desc_pop(struct caam_outring_entry * out_entry)856a16bb35SClement Faure paddr_t caam_desc_pop(struct caam_outring_entry *out_entry)
862d7a8964SCedric Neveux {
8738923d48SCedric Neveux 	const uintptr_t v_desc = (uintptr_t)&out_entry->desc;
8838923d48SCedric Neveux 	const uint32_t *a32 = (const uint32_t *)v_desc;
89282c1a86SRuchika Gupta 
902d7a8964SCedric Neveux #ifdef CFG_CAAM_BIG_ENDIAN
91282c1a86SRuchika Gupta 	return SHIFT_U64(get_be32(&a32[0]), 32) | get_be32(&a32[1]);
922d7a8964SCedric Neveux #else
93282c1a86SRuchika Gupta 	return SHIFT_U64(a32[1], 32) | a32[0];
942d7a8964SCedric Neveux #endif /* CFG_CAAM_BIG_ENDIAN */
952d7a8964SCedric Neveux }
962d7a8964SCedric Neveux #else /* CFG_CAAM_64BIT */
caam_desc_push(struct caam_inring_entry * in_entry,paddr_t paddr)976a16bb35SClement Faure void caam_desc_push(struct caam_inring_entry *in_entry, paddr_t paddr)
982d7a8964SCedric Neveux {
996a16bb35SClement Faure 	caam_write_val32(&in_entry->desc, paddr);
1002d7a8964SCedric Neveux }
1012d7a8964SCedric Neveux 
caam_desc_pop(struct caam_outring_entry * out_entry)1026a16bb35SClement Faure paddr_t caam_desc_pop(struct caam_outring_entry *out_entry)
1032d7a8964SCedric Neveux {
1046a16bb35SClement Faure 	return caam_read_val32(&out_entry->desc);
1052d7a8964SCedric Neveux }
1062d7a8964SCedric Neveux #endif /* CFG_CAAM_64BIT */
1072d7a8964SCedric Neveux 
caam_read_jobstatus(struct caam_outring_entry * out)1086a16bb35SClement Faure uint32_t caam_read_jobstatus(struct caam_outring_entry *out)
1092d7a8964SCedric Neveux {
1106a16bb35SClement Faure 	return caam_read_val32(&out->status);
1112d7a8964SCedric Neveux }
11253d714dfSCedric Neveux 
caam_desc_add_dmaobj(uint32_t * desc,struct caamdmaobj * data,unsigned int pre_op)11353d714dfSCedric Neveux void caam_desc_add_dmaobj(uint32_t *desc, struct caamdmaobj *data,
11453d714dfSCedric Neveux 			  unsigned int pre_op)
11553d714dfSCedric Neveux {
11653d714dfSCedric Neveux 	uint32_t operation = pre_op;
11753d714dfSCedric Neveux 	size_t op_length = 0;
11853d714dfSCedric Neveux 	uint32_t op_ext_length = 0;
11953d714dfSCedric Neveux 
12053d714dfSCedric Neveux 	if (data->sgtbuf.sgt_type)
12153d714dfSCedric Neveux 		operation |= CMD_SGT;
12253d714dfSCedric Neveux 
12353d714dfSCedric Neveux 	/* Check the operation length to set extension length or not */
12453d714dfSCedric Neveux 	switch (GET_CMD_TYPE(pre_op)) {
12553d714dfSCedric Neveux 	case CMD_FIFO_LOAD_TYPE:
12653d714dfSCedric Neveux 		op_length = FIFO_LOAD_LENGTH(data->sgtbuf.length);
12753d714dfSCedric Neveux 		op_ext_length = FIFO_LOAD_EXT;
12853d714dfSCedric Neveux 		break;
12953d714dfSCedric Neveux 
13053d714dfSCedric Neveux 	case CMD_STORE_TYPE:
13153d714dfSCedric Neveux 		/* Note: there is extension length for the STORE command */
13253d714dfSCedric Neveux 		op_length = STORE_LENGTH(data->sgtbuf.length);
13353d714dfSCedric Neveux 		break;
13453d714dfSCedric Neveux 
13553d714dfSCedric Neveux 	case CMD_FIFO_STORE_TYPE:
13653d714dfSCedric Neveux 		op_length = FIFO_STORE_LENGTH(data->sgtbuf.length);
13753d714dfSCedric Neveux 		op_ext_length = FIFO_STORE_EXT;
13853d714dfSCedric Neveux 		break;
13953d714dfSCedric Neveux 
14053d714dfSCedric Neveux 	case CMD_KEY_TYPE:
14153d714dfSCedric Neveux 		/* Note: there is extension length for the KEY command */
14253d714dfSCedric Neveux 		op_length = KEY_LENGTH(data->sgtbuf.length);
14353d714dfSCedric Neveux 		break;
14453d714dfSCedric Neveux 
145*b78d0115SOlivier Masse 	case CMD_SEQ_IN_TYPE:
14653d714dfSCedric Neveux 	case CMD_SEQ_OUT_TYPE:
14753d714dfSCedric Neveux 		op_length = SEQ_LENGTH(data->sgtbuf.length);
14853d714dfSCedric Neveux 		op_ext_length = SEQ_EXT;
14953d714dfSCedric Neveux 		break;
15053d714dfSCedric Neveux 
15153d714dfSCedric Neveux 	default:
15253d714dfSCedric Neveux 		break;
15353d714dfSCedric Neveux 	}
15453d714dfSCedric Neveux 
15553d714dfSCedric Neveux 	if (op_length == data->sgtbuf.length)
15653d714dfSCedric Neveux 		operation |= op_length;
15753d714dfSCedric Neveux 	else
15853d714dfSCedric Neveux 		operation |= op_ext_length;
15953d714dfSCedric Neveux 
16053d714dfSCedric Neveux 	caam_desc_add_word(desc, operation);
16153d714dfSCedric Neveux 	caam_desc_add_ptr(desc, data->sgtbuf.paddr);
16253d714dfSCedric Neveux 
16353d714dfSCedric Neveux 	if (op_length != data->sgtbuf.length)
16453d714dfSCedric Neveux 		caam_desc_add_word(desc, data->sgtbuf.length);
16553d714dfSCedric Neveux }
166