Define an instruction structure for gce driver to append command. This structure can make the client's code more readability.
Unified · Split
| @@ -9,12 +9,24 @@ · 8 unmodified lines | ||
| 9 | 9 | #include <linux/mailbox_controller.h> |
| 10 | 10 | #include <linux/soc/mediatek/mtk-cmdq.h> |
| 11 | 11 | |
| 12 | −#define CMDQ_ARG_A_WRITE_MASK 0xffff | |
| 13 | 12 | #define CMDQ_WRITE_ENABLE_MASK BIT(0) |
| 14 | 13 | #define CMDQ_EOC_IRQ_EN BIT(0) |
| 15 | 14 | #define CMDQ_EOC_CMD ((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \ |
| 16 | 15 | << 32 | CMDQ_EOC_IRQ_EN) |
| 17 | 16 | |
| 17 | +struct cmdq_instruction { | |
| 18 | + union { | |
| 19 | + u32 value; | |
| 20 | + u32 mask; | |
| 21 | + }; | |
| 22 | + union { | |
| 23 | + u16 offset; | |
| 24 | + u16 event; | |
| 25 | + }; | |
| 26 | + u8 subsys; | |
| 27 | + u8 op; | |
| 28 | +}; | |
| 29 | + | |
| 18 | 30 | static void cmdq_client_timeout(struct timer_list *t) |
| 19 | 31 | { |
| 20 | 32 | struct cmdq_client *client = from_timer(client, t, timer); |
| @@ -110,10 +122,10 @@ void cmdq_pkt_destroy(struct cmdq_pkt *pkt) · 89 unmodified lines | ||
| 110 | 122 | } |
| 111 | 123 | EXPORT_SYMBOL(cmdq_pkt_destroy); |
| 112 | 124 | |
| 113 | −static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code, | |
| 114 | − u32 arg_a, u32 arg_b) | |
| 125 | +static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, | |
| 126 | + struct cmdq_instruction inst) | |
| 115 | 127 | { |
| 116 | − u64 *cmd_ptr; | |
| 128 | + struct cmdq_instruction *cmd_ptr; | |
| 117 | 129 | |
| 118 | 130 | if (unlikely(pkt->cmd_buf_size + CMDQ_INST_SIZE > pkt->buf_size)) { |
| 119 | 131 | /* |
| @@ -129,8 +141,9 @@ static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code, · 9 unmodified lines | ||
| 129 | 141 | __func__, (u32)pkt->buf_size); |
| 130 | 142 | return -ENOMEM; |
| 131 | 143 | } |
| 144 | + | |
| 132 | 145 | cmd_ptr = pkt->va_base + pkt->cmd_buf_size; |
| 133 | − (*cmd_ptr) = (u64)((code << CMDQ_OP_CODE_SHIFT) | arg_a) << 32 | arg_b; | |
| 146 | + *cmd_ptr = inst; | |
| 134 | 147 | pkt->cmd_buf_size += CMDQ_INST_SIZE; |
| 135 | 148 | |
| 136 | 149 | return 0; |
| @@ -138,21 +151,28 @@ static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code, · 1 unmodified line | ||
| 138 | 151 | |
| 139 | 152 | int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value) |
| 140 | 153 | { |
| 141 | − u32 arg_a = (offset & CMDQ_ARG_A_WRITE_MASK) | | |
| 142 | − (subsys << CMDQ_SUBSYS_SHIFT); | |
| 154 | + struct cmdq_instruction inst; | |
| 143 | 155 | |
| 144 | − return cmdq_pkt_append_command(pkt, CMDQ_CODE_WRITE, arg_a, value); | |
| 156 | + inst.op = CMDQ_CODE_WRITE; | |
| 157 | + inst.value = value; | |
| 158 | + inst.offset = offset; | |
| 159 | + inst.subsys = subsys; | |
| 160 | + | |
| 161 | + return cmdq_pkt_append_command(pkt, inst); | |
| 145 | 162 | } |
| 146 | 163 | EXPORT_SYMBOL(cmdq_pkt_write); |
| 147 | 164 | |
| 148 | 165 | int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys, |
| 149 | 166 | u16 offset, u32 value, u32 mask) |
| 150 | 167 | { |
| 151 | − u32 offset_mask = offset; | |
| 168 | + struct cmdq_instruction inst = { {0} }; | |
| 169 | + u16 offset_mask = offset; | |
| 152 | 170 | int err; |
| 153 | 171 | |
| 154 | 172 | if (mask != 0xffffffff) { |
| 155 | − err = cmdq_pkt_append_command(pkt, CMDQ_CODE_MASK, 0, ~mask); | |
| 173 | + inst.op = CMDQ_CODE_MASK; | |
| 174 | + inst.mask = ~mask; | |
| 175 | + err = cmdq_pkt_append_command(pkt, inst); | |
| 156 | 176 | if (err < 0) |
| 157 | 177 | return err; |
| 158 | 178 | |
| @@ -166,45 +186,50 @@ EXPORT_SYMBOL(cmdq_pkt_write_mask); · 7 unmodified lines | ||
| 166 | 186 | |
| 167 | 187 | int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event) |
| 168 | 188 | { |
| 169 | − u32 arg_b; | |
| 189 | + struct cmdq_instruction inst = { {0} }; | |
| 170 | 190 | |
| 171 | 191 | if (event >= CMDQ_MAX_EVENT) |
| 172 | 192 | return -EINVAL; |
| 173 | 193 | |
| 174 | − /* | |
| 175 | − * WFE arg_b | |
| 176 | − * bit 0-11: wait value | |
| 177 | − * bit 15: 1 - wait, 0 - no wait | |
| 178 | − * bit 16-27: update value | |
| 179 | − * bit 31: 1 - update, 0 - no update | |
| 180 | − */ | |
| 181 | − arg_b = CMDQ_WFE_UPDATE | CMDQ_WFE_WAIT | CMDQ_WFE_WAIT_VALUE; | |
| 194 | + inst.op = CMDQ_CODE_WFE; | |
| 195 | + inst.value = CMDQ_WFE_OPTION; | |
| 196 | + inst.event = event; | |
| 182 | 197 | |
| 183 | − return cmdq_pkt_append_command(pkt, CMDQ_CODE_WFE, event, arg_b); | |
| 198 | + return cmdq_pkt_append_command(pkt, inst); | |
| 184 | 199 | } |
| 185 | 200 | EXPORT_SYMBOL(cmdq_pkt_wfe); |
| 186 | 201 | |
| 187 | 202 | int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event) |
| 188 | 203 | { |
| 204 | + struct cmdq_instruction inst = { {0} }; | |
| 205 | + | |
| 189 | 206 | if (event >= CMDQ_MAX_EVENT) |
| 190 | 207 | return -EINVAL; |
| 191 | 208 | |
| 192 | − return cmdq_pkt_append_command(pkt, CMDQ_CODE_WFE, event, | |
| 193 | − CMDQ_WFE_UPDATE); | |
| 209 | + inst.op = CMDQ_CODE_WFE; | |
| 210 | + inst.value = CMDQ_WFE_UPDATE; | |
| 211 | + inst.event = event; | |
| 212 | + | |
| 213 | + return cmdq_pkt_append_command(pkt, inst); | |
| 194 | 214 | } |
| 195 | 215 | EXPORT_SYMBOL(cmdq_pkt_clear_event); |
| 196 | 216 | |
| 197 | 217 | static int cmdq_pkt_finalize(struct cmdq_pkt *pkt) |
| 198 | 218 | { |
| 219 | + struct cmdq_instruction inst = { {0} }; | |
| 199 | 220 | int err; |
| 200 | 221 | |
| 201 | 222 | /* insert EOC and generate IRQ for each command iteration */ |
| 202 | − err = cmdq_pkt_append_command(pkt, CMDQ_CODE_EOC, 0, CMDQ_EOC_IRQ_EN); | |
| 223 | + inst.op = CMDQ_CODE_EOC; | |
| 224 | + inst.value = CMDQ_EOC_IRQ_EN; | |
| 225 | + err = cmdq_pkt_append_command(pkt, inst); | |
| 203 | 226 | if (err < 0) |
| 204 | 227 | return err; |
| 205 | 228 | |
| 206 | 229 | /* JUMP to end */ |
| 207 | − err = cmdq_pkt_append_command(pkt, CMDQ_CODE_JUMP, 0, CMDQ_JUMP_PASS); | |
| 230 | + inst.op = CMDQ_CODE_JUMP; | |
| 231 | + inst.value = CMDQ_JUMP_PASS; | |
| 232 | + err = cmdq_pkt_append_command(pkt, inst); | |
| 208 | 233 | |
| 209 | 234 | return err; |
| 210 | 235 | } |
| @@ -20,6 +20,16 @@ · 19 unmodified lines | ||
| 20 | 20 | #define CMDQ_WFE_WAIT BIT(15) |
| 21 | 21 | #define CMDQ_WFE_WAIT_VALUE 0x1 |
| 22 | 22 | |
| 23 | +/* | |
| 24 | + * WFE arg_b | |
| 25 | + * bit 0-11: wait value | |
| 26 | + * bit 15: 1 - wait, 0 - no wait | |
| 27 | + * bit 16-27: update value | |
| 28 | + * bit 31: 1 - update, 0 - no update | |
| 29 | + */ | |
| 30 | +#define CMDQ_WFE_OPTION (CMDQ_WFE_UPDATE | CMDQ_WFE_WAIT | \ | |
| 31 | + CMDQ_WFE_WAIT_VALUE) | |
| 32 | + | |
| 23 | 33 | /** cmdq event maximum */ |
| 24 | 34 | #define CMDQ_MAX_EVENT 0x3ff |
| 25 | 35 | |