1 // SPDX-License-Identifier: BSD-2-Clause
2 /*
3  * Copyright 2021 NXP
4  *
5  * Scatter-gather entry management code for version 1
6  */
7 
8 #include <caam_common.h>
9 #include <caam_io.h>
10 #include <caam_utils_sgt.h>
11 
12 #define ENTRY_LEN(len) (((uint32_t)len) & GENMASK_32(29, 0))
13 #define BS_ENTRY_FINAL BIT32(30)
14 
sgt_entry_trace(unsigned int idx __maybe_unused,const struct caamsgtbuf * sgt __maybe_unused)15 void sgt_entry_trace(unsigned int idx __maybe_unused,
16 		     const struct caamsgtbuf *sgt __maybe_unused)
17 {
18 	SGT_TRACE("SGT[%d] (%p)", idx, &sgt->sgt[idx]);
19 	SGT_TRACE("SGT[%d]->data   = %p", idx, sgt->buf[idx].data);
20 	SGT_TRACE("SGT[%d]->length = %zu", idx, sgt->buf[idx].length);
21 	SGT_TRACE("SGT[%d]->paddr  = 0x%" PRIxPA, idx, sgt->buf[idx].paddr);
22 	SGT_TRACE("SGT[%d]->ptr_ms   = %" PRIx32, idx, sgt->sgt[idx].v1.ptr_ms);
23 	SGT_TRACE("SGT[%d]->ptr_ls   = %" PRIx32, idx, sgt->sgt[idx].v1.ptr_ls);
24 	SGT_TRACE("SGT[%d]->len_f_e  = %" PRIx32, idx,
25 		  sgt->sgt[idx].v1.len_f_e);
26 	SGT_TRACE("SGT[%d]->offset   = %" PRIx32, idx, sgt->sgt[idx].v1.offset);
27 }
28 
sgt_entry_offset(union caamsgt * sgt,unsigned int offset)29 void sgt_entry_offset(union caamsgt *sgt, unsigned int offset)
30 {
31 	uint32_t len_f_e = 0;
32 
33 	len_f_e = caam_read_val32(&sgt->v1.len_f_e);
34 
35 	/* Set the new length and keep the Final bit if set */
36 	len_f_e = (ENTRY_LEN(len_f_e) - offset) | (len_f_e & BS_ENTRY_FINAL);
37 
38 	caam_write_val32(&sgt->v1.len_f_e, len_f_e);
39 	caam_write_val32(&sgt->v1.offset, offset);
40 }
41 
caam_sgt_set_entry(union caamsgt * sgt,paddr_t paddr,size_t len,unsigned int offset,bool final_e)42 void caam_sgt_set_entry(union caamsgt *sgt, paddr_t paddr, size_t len,
43 			unsigned int offset, bool final_e)
44 {
45 	unsigned int len_f_e = 0;
46 
47 	caam_write_val32(&sgt->v1.ptr_ls, paddr);
48 #if defined(CFG_CAAM_64BIT) && defined(CFG_ARM64_core)
49 	caam_write_val32(&sgt->v1.ptr_ms, paddr >> 32);
50 #else
51 	caam_write_val32(&sgt->v1.ptr_ms, 0);
52 #endif
53 
54 	len_f_e = ENTRY_LEN(len);
55 	if (final_e)
56 		len_f_e |= BS_ENTRY_FINAL;
57 
58 	caam_write_val32(&sgt->v1.len_f_e, len_f_e);
59 	caam_write_val32(&sgt->v1.offset, offset);
60 }
61