Skip to content

Commit 5c8b718

Browse files
BibbyHsiehmbgg
authored andcommitted
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. Signed-off-by: Bibby Hsieh <[email protected]> Reviewed-by: CK Hu <[email protected]> Signed-off-by: Matthias Brugger <[email protected]>
1 parent 01d1b40 commit 5c8b718

File tree

2 files changed

+59
-24
lines changed

2 files changed

+59
-24
lines changed

drivers/soc/mediatek/mtk-cmdq-helper.c

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,24 @@
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)
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,30 +141,38 @@ static int cmdq_pkt_append_command(struct cmdq_pkt *pkt, enum cmdq_code code,
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;
137150
}
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);
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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@
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

0 commit comments

Comments
 (0)