Branch data Line data Source code
1 : : /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0) 2 : : * 3 : : * Copyright 2008-2016 Freescale Semiconductor Inc. 4 : : * Copyright 2016,2019 NXP 5 : : */ 6 : : 7 : : #ifndef __RTA_SEQ_IN_OUT_PTR_CMD_H__ 8 : : #define __RTA_SEQ_IN_OUT_PTR_CMD_H__ 9 : : 10 : : extern enum rta_sec_era rta_sec_era; 11 : : 12 : : /* Allowed SEQ IN PTR flags for each SEC Era. */ 13 : : static const uint32_t seq_in_ptr_flags[] = { 14 : : RBS | INL | SGF | PRE | EXT | RTO, 15 : : RBS | INL | SGF | PRE | EXT | RTO | RJD, 16 : : RBS | INL | SGF | PRE | EXT | RTO | RJD, 17 : : RBS | INL | SGF | PRE | EXT | RTO | RJD, 18 : : RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP, 19 : : RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP, 20 : : RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP, 21 : : RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP, 22 : : RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP, 23 : : RBS | INL | SGF | PRE | EXT | RTO | RJD | SOP 24 : : }; 25 : : 26 : : /* Allowed SEQ OUT PTR flags for each SEC Era. */ 27 : : static const uint32_t seq_out_ptr_flags[] = { 28 : : SGF | PRE | EXT, 29 : : SGF | PRE | EXT | RTO, 30 : : SGF | PRE | EXT | RTO, 31 : : SGF | PRE | EXT | RTO, 32 : : SGF | PRE | EXT | RTO | RST | EWS, 33 : : SGF | PRE | EXT | RTO | RST | EWS, 34 : : SGF | PRE | EXT | RTO | RST | EWS, 35 : : SGF | PRE | EXT | RTO | RST | EWS, 36 : : SGF | PRE | EXT | RTO | RST | EWS, 37 : : SGF | PRE | EXT | RTO | RST | EWS 38 : : }; 39 : : 40 : : static inline int 41 : 0 : rta_seq_in_ptr(struct program *program, uint64_t src, 42 : : uint32_t length, uint32_t flags) 43 : : { 44 : : uint32_t opcode = CMD_SEQ_IN_PTR; 45 : 0 : unsigned int start_pc = program->current_pc; 46 : : int ret = -EINVAL; 47 : : 48 : : /* Parameters checking */ 49 [ # # ]: 0 : if ((flags & RTO) && (flags & PRE)) { 50 : 0 : pr_err("SEQ IN PTR: Invalid usage of RTO and PRE flags\n"); 51 : 0 : goto err; 52 : : } 53 [ # # ]: 0 : if (flags & ~seq_in_ptr_flags[rta_sec_era]) { 54 : 0 : pr_err("SEQ IN PTR: Flag(s) not supported by SEC Era %d\n", 55 : : USER_SEC_ERA(rta_sec_era)); 56 : 0 : goto err; 57 : : } 58 [ # # ]: 0 : if ((flags & INL) && (flags & RJD)) { 59 : 0 : pr_err("SEQ IN PTR: Invalid usage of INL and RJD flags\n"); 60 : 0 : goto err; 61 : : } 62 [ # # # # ]: 0 : if ((src) && (flags & (SOP | RTO | PRE))) { 63 : 0 : pr_err("SEQ IN PTR: Invalid usage of RTO or PRE flag\n"); 64 : 0 : goto err; 65 : : } 66 [ # # # # ]: 0 : if ((flags & SOP) && (flags & (RBS | PRE | RTO | EXT))) { 67 : 0 : pr_err("SEQ IN PTR: Invalid usage of SOP and (RBS or PRE or RTO or EXT) flags\n"); 68 : 0 : goto err; 69 : : } 70 : : 71 : : /* write flag fields */ 72 [ # # ]: 0 : if (flags & RBS) 73 : : opcode |= SQIN_RBS; 74 [ # # ]: 0 : if (flags & INL) 75 : 0 : opcode |= SQIN_INL; 76 [ # # ]: 0 : if (flags & SGF) 77 : 0 : opcode |= SQIN_SGF; 78 [ # # ]: 0 : if (flags & PRE) 79 : 0 : opcode |= SQIN_PRE; 80 [ # # ]: 0 : if (flags & RTO) 81 : 0 : opcode |= SQIN_RTO; 82 [ # # ]: 0 : if (flags & RJD) 83 : 0 : opcode |= SQIN_RJD; 84 [ # # ]: 0 : if (flags & SOP) 85 : 0 : opcode |= SQIN_SOP; 86 [ # # # # ]: 0 : if ((length >> 16) || (flags & EXT)) { 87 [ # # ]: 0 : if (flags & SOP) { 88 : 0 : pr_err("SEQ IN PTR: Invalid usage of SOP and EXT flags\n"); 89 : 0 : goto err; 90 : : } 91 : : 92 : 0 : opcode |= SQIN_EXT; 93 : : } else { 94 : 0 : opcode |= length & SQIN_LEN_MASK; 95 : : } 96 : : 97 : 0 : __rta_out32(program, opcode); 98 : 0 : program->current_instruction++; 99 : : 100 : : /* write pointer or immediate data field */ 101 [ # # ]: 0 : if (!(opcode & (SQIN_PRE | SQIN_RTO | SQIN_SOP))) 102 : 0 : __rta_out64(program, program->ps, src); 103 : : 104 : : /* write extended length field */ 105 [ # # ]: 0 : if (opcode & SQIN_EXT) 106 : 0 : __rta_out32(program, length); 107 : : 108 : 0 : return (int)start_pc; 109 : : 110 : 0 : err: 111 : 0 : program->first_error_pc = start_pc; 112 : 0 : program->current_instruction++; 113 : 0 : return ret; 114 : : } 115 : : 116 : : static inline int 117 : : rta_seq_out_ptr(struct program *program, uint64_t dst, 118 : : uint32_t length, uint32_t flags) 119 : : { 120 : : uint32_t opcode = CMD_SEQ_OUT_PTR; 121 : : unsigned int start_pc = program->current_pc; 122 : : int ret = -EINVAL; 123 : : 124 : : /* Parameters checking */ 125 : : if (flags & ~seq_out_ptr_flags[rta_sec_era]) { 126 : : pr_err("SEQ OUT PTR: Flag(s) not supported by SEC Era %d\n", 127 : : USER_SEC_ERA(rta_sec_era)); 128 : : goto err; 129 : : } 130 : : if ((flags & RTO) && (flags & PRE)) { 131 : : pr_err("SEQ OUT PTR: Invalid usage of RTO and PRE flags\n"); 132 : : goto err; 133 : : } 134 : : if ((dst) && (flags & (RTO | PRE))) { 135 : : pr_err("SEQ OUT PTR: Invalid usage of RTO or PRE flag\n"); 136 : : goto err; 137 : : } 138 : : if ((flags & RST) && !(flags & RTO)) { 139 : : pr_err("SEQ OUT PTR: RST flag must be used with RTO flag\n"); 140 : : goto err; 141 : : } 142 : : 143 : : /* write flag fields */ 144 : : if (flags & SGF) 145 : : opcode |= SQOUT_SGF; 146 : : if (flags & PRE) 147 : : opcode |= SQOUT_PRE; 148 : : if (flags & RTO) 149 : : opcode |= SQOUT_RTO; 150 : : if (flags & RST) 151 : : opcode |= SQOUT_RST; 152 : : if (flags & EWS) 153 : : opcode |= SQOUT_EWS; 154 : : if ((length >> 16) || (flags & EXT)) 155 : : opcode |= SQOUT_EXT; 156 : : else 157 : : opcode |= length & SQOUT_LEN_MASK; 158 : : 159 : : __rta_out32(program, opcode); 160 : : program->current_instruction++; 161 : : 162 : : /* write pointer or immediate data field */ 163 : : if (!(opcode & (SQOUT_PRE | SQOUT_RTO))) 164 : : __rta_out64(program, program->ps, dst); 165 : : 166 : : /* write extended length field */ 167 : : if (opcode & SQOUT_EXT) 168 : : __rta_out32(program, length); 169 : : 170 : : return (int)start_pc; 171 : : 172 : : err: 173 : : program->first_error_pc = start_pc; 174 : : program->current_instruction++; 175 : : return ret; 176 : : } 177 : : 178 : : #endif /* __RTA_SEQ_IN_OUT_PTR_CMD_H__ */