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