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
99 #include <linux/mailbox_controller.h>
1010 #include <linux/soc/mediatek/mtk-cmdq.h>
1111
12−#define CMDQ_ARG_A_WRITE_MASK 0xffff
1312 #define CMDQ_WRITE_ENABLE_MASK BIT(0)
1413 #define CMDQ_EOC_IRQ_EN BIT(0)
1514 #define CMDQ_EOC_CMD ((u64)((CMDQ_CODE_EOC << CMDQ_OP_CODE_SHIFT)) \
1615 << 32 | CMDQ_EOC_IRQ_EN)
1716
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+
1830 static void cmdq_client_timeout(struct timer_list *t)
1931 {
2032 struct cmdq_client *client = from_timer(client, t, timer);
@@ -110,10 +122,10 @@ void cmdq_pkt_destroy(struct cmdq_pkt *pkt) · 89 unmodified lines
110122 }
111123 EXPORT_SYMBOL(cmdq_pkt_destroy);
112124
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)
115127 {
116− u64 *cmd_ptr;
128+ struct cmdq_instruction *cmd_ptr;
117129
118130 if (unlikely(pkt->cmd_buf_size + CMDQ_INST_SIZE > pkt->buf_size)) {
119131 /*
@@ -129,8 +141,9 @@ static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code, · 9 unmodified lines
129141 __func__, (u32)pkt->buf_size);
130142 return -ENOMEM;
131143 }
144+
132145 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;
134147 pkt->cmd_buf_size += CMDQ_INST_SIZE;
135148
136149 return 0;
@@ -138,21 +151,28 @@ static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code, · 1 unmodified line
138151
139152 int cmdq_pkt_write(struct cmdq_pkt *pkt, u8 subsys, u16 offset, u32 value)
140153 {
141− u32 arg_a = (offset & CMDQ_ARG_A_WRITE_MASK) |
142− (subsys << CMDQ_SUBSYS_SHIFT);
154+ struct cmdq_instruction inst;
143155
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);
145162 }
146163 EXPORT_SYMBOL(cmdq_pkt_write);
147164
148165 int cmdq_pkt_write_mask(struct cmdq_pkt *pkt, u8 subsys,
149166 u16 offset, u32 value, u32 mask)
150167 {
151− u32 offset_mask = offset;
168+ struct cmdq_instruction inst = { {0} };
169+ u16 offset_mask = offset;
152170 int err;
153171
154172 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);
156176 if (err < 0)
157177 return err;
158178
@@ -166,45 +186,50 @@ EXPORT_SYMBOL(cmdq_pkt_write_mask); · 7 unmodified lines
166186
167187 int cmdq_pkt_wfe(struct cmdq_pkt *pkt, u16 event)
168188 {
169− u32 arg_b;
189+ struct cmdq_instruction inst = { {0} };
170190
171191 if (event >= CMDQ_MAX_EVENT)
172192 return -EINVAL;
173193
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;
182197
183− return cmdq_pkt_append_command(pkt, CMDQ_CODE_WFE, event, arg_b);
198+ return cmdq_pkt_append_command(pkt, inst);
184199 }
185200 EXPORT_SYMBOL(cmdq_pkt_wfe);
186201
187202 int cmdq_pkt_clear_event(struct cmdq_pkt *pkt, u16 event)
188203 {
204+ struct cmdq_instruction inst = { {0} };
205+
189206 if (event >= CMDQ_MAX_EVENT)
190207 return -EINVAL;
191208
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);
194214 }
195215 EXPORT_SYMBOL(cmdq_pkt_clear_event);
196216
197217 static int cmdq_pkt_finalize(struct cmdq_pkt *pkt)
198218 {
219+ struct cmdq_instruction inst = { {0} };
199220 int err;
200221
201222 /* 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);
203226 if (err < 0)
204227 return err;
205228
206229 /* 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);
208233
209234 return err;
210235 }
include/linux/mailbox/mtk-cmdq-mailbox.h+10−0
@@ -20,6 +20,16 @@ · 19 unmodified lines
2020 #define CMDQ_WFE_WAIT BIT(15)
2121 #define CMDQ_WFE_WAIT_VALUE 0x1
2222
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+
2333 /** cmdq event maximum */
2434 #define CMDQ_MAX_EVENT 0x3ff
2535