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 | #include <linux/mailbox_controller.h> | 9 | #include <linux/mailbox_controller.h> |
| 10 | #include <linux/soc/mediatek/mtk-cmdq.h> | 10 | #include <linux/soc/mediatek/mtk-cmdq.h> |
| 11 | 11 | ||
| 12 | #define CMDQ_ARG_A_WRITE_MASK 0xffff | ||
| 13 | #define CMDQ_WRITE_ENABLE_MASK BIT(0) | 12 | #define CMDQ_WRITE_ENABLE_MASK BIT(0) |
| 14 | #define CMDQ_EOC_IRQ_EN BIT(0) | 13 | #define CMDQ_EOC_IRQ_EN BIT(0) |
| 15 | #define CMDQ_EOC_CMD ((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \ | 14 | #define CMDQ_EOC_CMD ((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \ |
| 16 | << 32 | CMDQ_EOC_IRQ_EN) | 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 | static void cmdq_client_timeout(struct timer_list *t) | 30 | static void cmdq_client_timeout(struct timer_list *t) |
| 19 | { | 31 | { |
| 20 | struct cmdq_client *client = from_timer(client, t, timer); | 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 | EXPORT_SYMBOL(cmdq_pkt_destroy); | 123 | EXPORT_SYMBOL(cmdq_pkt_destroy); |
| 112 | 124 | ||
| 113 | static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code, | 125 | static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, |
| 114 | u32 arg_a, u32 arg_b) | 126 | struct cmdq_instruction inst) |
| 115 | { | 127 | { |
| 116 | u64 *cmd_ptr; | 128 | struct cmdq_instruction *cmd_ptr; |
| 117 | 129 | ||
| 118 | if (unlikely(pkt->cmd_buf_size + CMDQ_INST_SIZE > pkt->buf_size)) { | 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 | __func__, (u32)pkt->buf_size); | 141 | __func__, (u32)pkt->buf_size); |
| 130 | return -ENOMEM; | 142 | return -ENOMEM; |
| 131 | } | 143 | } |
| 144 | |||
| 132 | cmd_ptr = pkt->va_base + pkt->cmd_buf_size; | 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 | pkt->cmd_buf_size += CMDQ_INST_SIZE; | 147 | pkt->cmd_buf_size += CMDQ_INST_SIZE; |
| 135 | 148 | ||
| 136 | return 0; | 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 | int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value) | 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) | | 154 | struct cmdq_instruction inst; |
| 142 | (subsys << CMDQ_SUBSYS_SHIFT); | ||
| 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 | EXPORT_SYMBOL(cmdq_pkt_write); | 163 | EXPORT_SYMBOL(cmdq_pkt_write); |
| 147 | 164 | ||
| 148 | int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys, | 165 | int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys, |
| 149 | u16 offset, u32 value, u32 mask) | 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 | int err; | 170 | int err; |
| 153 | 171 | ||
| 154 | if (mask != 0xffffffff) { | 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 | if (err < 0) | 176 | if (err < 0) |
| 157 | return err; | 177 | return err; |
| 158 | 178 | ||
| @@ -166,45 +186,50 @@ EXPORT_SYMBOL(cmdq_pkt_write_mask); · 7 unmodified lines | |||
| 166 | 186 | ||
| 167 | int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event) | 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 | if (event >= CMDQ_MAX_EVENT) | 191 | if (event >= CMDQ_MAX_EVENT) |
| 172 | return -EINVAL; | 192 | return -EINVAL; |
| 173 | 193 | ||
| 174 | /* | 194 | inst.op = CMDQ_CODE_WFE; |
| 175 | * WFE arg_b | 195 | inst.value = CMDQ_WFE_OPTION; |
| 176 | * bit 0-11: wait value | 196 | inst.event = event; |
| 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; | ||
| 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 | EXPORT_SYMBOL(cmdq_pkt_wfe); | 200 | EXPORT_SYMBOL(cmdq_pkt_wfe); |
| 186 | 201 | ||
| 187 | int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event) | 202 | int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event) |
| 188 | { | 203 | { |
| 204 | struct cmdq_instruction inst = { {0} }; | ||
| 205 | |||
| 189 | if (event >= CMDQ_MAX_EVENT) | 206 | if (event >= CMDQ_MAX_EVENT) |
| 190 | return -EINVAL; | 207 | return -EINVAL; |
| 191 | 208 | ||
| 192 | return cmdq_pkt_append_command(pkt, CMDQ_CODE_WFE, event, | 209 | inst.op = CMDQ_CODE_WFE; |
| 193 | CMDQ_WFE_UPDATE); | 210 | inst.value = CMDQ_WFE_UPDATE; |
| 211 | inst.event = event; | ||
| 212 | |||
| 213 | return cmdq_pkt_append_command(pkt, inst); | ||
| 194 | } | 214 | } |
| 195 | EXPORT_SYMBOL(cmdq_pkt_clear_event); | 215 | EXPORT_SYMBOL(cmdq_pkt_clear_event); |
| 196 | 216 | ||
| 197 | static int cmdq_pkt_finalize(struct cmdq_pkt *pkt) | 217 | static int cmdq_pkt_finalize(struct cmdq_pkt *pkt) |
| 198 | { | 218 | { |
| 219 | struct cmdq_instruction inst = { {0} }; | ||
| 199 | int err; | 220 | int err; |
| 200 | 221 | ||
| 201 | /* insert EOC and generate IRQ for each command iteration */ | 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 | if (err < 0) | 226 | if (err < 0) |
| 204 | return err; | 227 | return err; |
| 205 | 228 | ||
| 206 | /* JUMP to end */ | 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 | return err; | 234 | return err; |
| 210 | } | 235 | } |
| @@ -20,6 +20,16 @@ · 19 unmodified lines | |||
| 20 | #define CMDQ_WFE_WAIT BIT(15) | 20 | #define CMDQ_WFE_WAIT BIT(15) |
| 21 | #define CMDQ_WFE_WAIT_VALUE 0x1 | 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 | /** cmdq event maximum */ | 33 | /** cmdq event maximum */ |
| 24 | #define CMDQ_MAX_EVENT 0x3ff | 34 | #define CMDQ_MAX_EVENT 0x3ff |
| 25 | 35 | ||