History

soc: mediatek: cmdq: define the instruction struct

Define an instruction structure for gce driver to append command. This structure can make the client's code more readability.

Bibby Hsieh committed 6 years ago

Commit 5c8b7181 parent 01d1b402 files · +59 −24Browse files

Unified · Split

2 files
  1. drivers/soc/mediatek/mtk-cmdq-helper.c +49 −24
  2. include/linux/mailbox/mtk-cmdq-mailbox.h +10 −0
drivers/soc/mediatek/mtk-cmdq-helper.c+49−24
@@ -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
17struct 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
18static void cmdq_client_timeout(struct timer_list *t)30static 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}
111EXPORT_SYMBOL(cmdq_pkt_destroy);123EXPORT_SYMBOL(cmdq_pkt_destroy);
112 124
113static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code,125static 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
139int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value)152int 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}
146EXPORT_SYMBOL(cmdq_pkt_write);163EXPORT_SYMBOL(cmdq_pkt_write);
147 164
148int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,165int 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
167int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)187int 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_b195 inst.value = CMDQ_WFE_OPTION;
176 * bit 0-11: wait value196 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}
185EXPORT_SYMBOL(cmdq_pkt_wfe);200EXPORT_SYMBOL(cmdq_pkt_wfe);
186 201
187int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event)202int 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}
195EXPORT_SYMBOL(cmdq_pkt_clear_event);215EXPORT_SYMBOL(cmdq_pkt_clear_event);
196 216
197static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)217static 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}
include/linux/mailbox/mtk-cmdq-mailbox.h+10−0
@@ -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 0x121#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 0x3ff34#define CMDQ_MAX_EVENT 0x3ff
25 35