1 // SPDX-License-Identifier: BSD-2-Clause 2 /* 3 * Copyright 2019 NXP 4 * 5 * Brief Descriptor construction functions. 6 */ 7 #include <caam_desc_helper.h> 8 #include <caam_io.h> 9 #include <trace.h> 10 #include <types_ext.h> 11 12 struct ptr_addr { 13 #ifdef CFG_CAAM_BIG_ENDIAN 14 uint32_t high; 15 uint32_t low; 16 #else 17 uint32_t low; 18 uint32_t high; 19 #endif /* CFG_CAAM_BIG_ENDIAN */ 20 }; 21 22 uint32_t caam_desc_get_len(uint32_t *desc) 23 { 24 return GET_JD_DESCLEN(caam_read_val32((void *)desc)); 25 } 26 27 void caam_desc_init(uint32_t *desc) 28 { 29 *desc = 0; 30 } 31 32 void caam_desc_update_hdr(uint32_t *desc, uint32_t word) 33 { 34 /* Update first word of desc */ 35 caam_write_val32((void *)desc, word); 36 } 37 38 void caam_desc_add_word(uint32_t *desc, uint32_t word) 39 { 40 uint32_t len = caam_desc_get_len(desc); 41 uint32_t *last = desc + len; 42 43 /* Add Word at Last */ 44 caam_write_val32((void *)last, word); 45 46 /* Increase the length */ 47 caam_write_val32((void *)desc, caam_read_val32((void *)desc) + 1); 48 } 49 50 void caam_desc_add_ptr(uint32_t *desc, paddr_t ptr) 51 { 52 uint32_t len = caam_desc_get_len(desc); 53 uint32_t *last = desc + len; 54 uint32_t inc = 1; 55 56 /* Add Word at Last */ 57 #ifdef CFG_CAAM_64BIT 58 struct ptr_addr *ptr_addr = (struct ptr_addr *)(uintptr_t)last; 59 60 caam_write_val32(&ptr_addr->high, ptr >> 32); 61 caam_write_val32(&ptr_addr->low, ptr); 62 inc++; 63 #else 64 caam_write_val32((void *)last, ptr); 65 #endif /* CFG_CAAM_64BIT */ 66 67 /* Increase the length */ 68 caam_write_val32((void *)desc, caam_read_val32((void *)desc) + inc); 69 } 70 71 #ifdef CFG_CAAM_64BIT 72 void caam_desc_push(struct caam_inring_entry *in_entry, paddr_t paddr) 73 { 74 #ifdef CFG_CAAM_BIG_ENDIAN 75 put_be64(&in_entry->desc, paddr); 76 #else 77 put_le64(&in_entry->desc, paddr); 78 #endif /* CFG_CAAM_BIG_ENDIAN */ 79 } 80 81 paddr_t caam_desc_pop(struct caam_outring_entry *out_entry) 82 { 83 const uint32_t *a32 = (const uint32_t *)(&out_entry->desc); 84 85 #ifdef CFG_CAAM_BIG_ENDIAN 86 return SHIFT_U64(get_be32(&a32[0]), 32) | get_be32(&a32[1]); 87 #else 88 return SHIFT_U64(a32[1], 32) | a32[0]; 89 #endif /* CFG_CAAM_BIG_ENDIAN */ 90 } 91 #else /* CFG_CAAM_64BIT */ 92 void caam_desc_push(struct caam_inring_entry *in_entry, paddr_t paddr) 93 { 94 caam_write_val32(&in_entry->desc, paddr); 95 } 96 97 paddr_t caam_desc_pop(struct caam_outring_entry *out_entry) 98 { 99 return caam_read_val32(&out_entry->desc); 100 } 101 #endif /* CFG_CAAM_64BIT */ 102 103 uint32_t caam_read_jobstatus(struct caam_outring_entry *out) 104 { 105 return caam_read_val32(&out->status); 106 } 107