1d62ae917SEric Auger /*
2d62ae917SEric Auger * Copyright (C) 2020, Red Hat Inc, Eric Auger <eric.auger@redhat.com>
3d62ae917SEric Auger *
4d62ae917SEric Auger * Most of the code is copy-pasted from:
5d62ae917SEric Auger * drivers/irqchip/irq-gic-v3-its.c
6d62ae917SEric Auger * This work is licensed under the terms of the GNU LGPL, version 2.
7d62ae917SEric Auger */
8d62ae917SEric Auger #include <asm/io.h>
9d62ae917SEric Auger #include <asm/gic.h>
10d62ae917SEric Auger
11d62ae917SEric Auger #define ITS_ITT_ALIGN SZ_256
12d62ae917SEric Auger
13d62ae917SEric Auger static const char * const its_cmd_string[] = {
14d62ae917SEric Auger [GITS_CMD_MAPD] = "MAPD",
15d62ae917SEric Auger [GITS_CMD_MAPC] = "MAPC",
16d62ae917SEric Auger [GITS_CMD_MAPTI] = "MAPTI",
17d62ae917SEric Auger [GITS_CMD_MAPI] = "MAPI",
18d62ae917SEric Auger [GITS_CMD_MOVI] = "MOVI",
19d62ae917SEric Auger [GITS_CMD_DISCARD] = "DISCARD",
20d62ae917SEric Auger [GITS_CMD_INV] = "INV",
21d62ae917SEric Auger [GITS_CMD_MOVALL] = "MOVALL",
22d62ae917SEric Auger [GITS_CMD_INVALL] = "INVALL",
23d62ae917SEric Auger [GITS_CMD_INT] = "INT",
24d62ae917SEric Auger [GITS_CMD_CLEAR] = "CLEAR",
25d62ae917SEric Auger [GITS_CMD_SYNC] = "SYNC",
26d62ae917SEric Auger };
27d62ae917SEric Auger
28d62ae917SEric Auger struct its_cmd_desc {
29d62ae917SEric Auger union {
30d62ae917SEric Auger struct {
31d62ae917SEric Auger struct its_device *dev;
32d62ae917SEric Auger u32 event_id;
33d62ae917SEric Auger } its_inv_cmd;
34d62ae917SEric Auger
35d62ae917SEric Auger struct {
36d62ae917SEric Auger struct its_device *dev;
37d62ae917SEric Auger u32 event_id;
38d62ae917SEric Auger } its_int_cmd;
39d62ae917SEric Auger
40d62ae917SEric Auger struct {
41d62ae917SEric Auger struct its_device *dev;
42d62ae917SEric Auger bool valid;
43d62ae917SEric Auger } its_mapd_cmd;
44d62ae917SEric Auger
45d62ae917SEric Auger struct {
46d62ae917SEric Auger struct its_collection *col;
47d62ae917SEric Auger bool valid;
48d62ae917SEric Auger } its_mapc_cmd;
49d62ae917SEric Auger
50d62ae917SEric Auger struct {
51d62ae917SEric Auger struct its_device *dev;
52d62ae917SEric Auger u32 phys_id;
53d62ae917SEric Auger u32 event_id;
54d62ae917SEric Auger u32 col_id;
55d62ae917SEric Auger } its_mapti_cmd;
56d62ae917SEric Auger
57d62ae917SEric Auger struct {
58d62ae917SEric Auger struct its_device *dev;
59d62ae917SEric Auger struct its_collection *col;
60d62ae917SEric Auger u32 event_id;
61d62ae917SEric Auger } its_movi_cmd;
62d62ae917SEric Auger
63d62ae917SEric Auger struct {
64d62ae917SEric Auger struct its_device *dev;
65d62ae917SEric Auger u32 event_id;
66d62ae917SEric Auger } its_discard_cmd;
67d62ae917SEric Auger
68d62ae917SEric Auger struct {
69d62ae917SEric Auger struct its_device *dev;
70d62ae917SEric Auger u32 event_id;
71d62ae917SEric Auger } its_clear_cmd;
72d62ae917SEric Auger
73d62ae917SEric Auger struct {
74d62ae917SEric Auger struct its_collection *col;
75d62ae917SEric Auger } its_invall_cmd;
76d62ae917SEric Auger
77d62ae917SEric Auger struct {
78d62ae917SEric Auger struct its_collection *col;
79d62ae917SEric Auger } its_sync_cmd;
80d62ae917SEric Auger };
81d62ae917SEric Auger bool verbose;
82d62ae917SEric Auger };
83d62ae917SEric Auger
84d62ae917SEric Auger typedef void (*its_cmd_builder_t)(struct its_cmd_block *,
85d62ae917SEric Auger struct its_cmd_desc *);
86d62ae917SEric Auger
87d62ae917SEric Auger /* ITS COMMANDS */
88d62ae917SEric Auger
its_mask_encode(u64 * raw_cmd,u64 val,int h,int l)89d62ae917SEric Auger static void its_mask_encode(u64 *raw_cmd, u64 val, int h, int l)
90d62ae917SEric Auger {
91d62ae917SEric Auger u64 mask = GENMASK_ULL(h, l);
92d62ae917SEric Auger *raw_cmd &= ~mask;
93d62ae917SEric Auger *raw_cmd |= (val << l) & mask;
94d62ae917SEric Auger }
95d62ae917SEric Auger
its_encode_cmd(struct its_cmd_block * cmd,u8 cmd_nr)96d62ae917SEric Auger static void its_encode_cmd(struct its_cmd_block *cmd, u8 cmd_nr)
97d62ae917SEric Auger {
98d62ae917SEric Auger its_mask_encode(&cmd->raw_cmd[0], cmd_nr, 7, 0);
99d62ae917SEric Auger }
100d62ae917SEric Auger
its_encode_devid(struct its_cmd_block * cmd,u32 devid)101d62ae917SEric Auger static void its_encode_devid(struct its_cmd_block *cmd, u32 devid)
102d62ae917SEric Auger {
103d62ae917SEric Auger its_mask_encode(&cmd->raw_cmd[0], devid, 63, 32);
104d62ae917SEric Auger }
105d62ae917SEric Auger
its_encode_event_id(struct its_cmd_block * cmd,u32 id)106d62ae917SEric Auger static void its_encode_event_id(struct its_cmd_block *cmd, u32 id)
107d62ae917SEric Auger {
108d62ae917SEric Auger its_mask_encode(&cmd->raw_cmd[1], id, 31, 0);
109d62ae917SEric Auger }
110d62ae917SEric Auger
its_encode_phys_id(struct its_cmd_block * cmd,u32 phys_id)111d62ae917SEric Auger static void its_encode_phys_id(struct its_cmd_block *cmd, u32 phys_id)
112d62ae917SEric Auger {
113d62ae917SEric Auger its_mask_encode(&cmd->raw_cmd[1], phys_id, 63, 32);
114d62ae917SEric Auger }
115d62ae917SEric Auger
its_encode_size(struct its_cmd_block * cmd,u8 size)116d62ae917SEric Auger static void its_encode_size(struct its_cmd_block *cmd, u8 size)
117d62ae917SEric Auger {
118d62ae917SEric Auger its_mask_encode(&cmd->raw_cmd[1], size, 4, 0);
119d62ae917SEric Auger }
120d62ae917SEric Auger
its_encode_itt(struct its_cmd_block * cmd,u64 itt_addr)121d62ae917SEric Auger static void its_encode_itt(struct its_cmd_block *cmd, u64 itt_addr)
122d62ae917SEric Auger {
123d62ae917SEric Auger its_mask_encode(&cmd->raw_cmd[2], itt_addr >> 8, 50, 8);
124d62ae917SEric Auger }
125d62ae917SEric Auger
its_encode_valid(struct its_cmd_block * cmd,int valid)126d62ae917SEric Auger static void its_encode_valid(struct its_cmd_block *cmd, int valid)
127d62ae917SEric Auger {
128d62ae917SEric Auger its_mask_encode(&cmd->raw_cmd[2], !!valid, 63, 63);
129d62ae917SEric Auger }
130d62ae917SEric Auger
its_encode_target(struct its_cmd_block * cmd,u64 target_addr)131d62ae917SEric Auger static void its_encode_target(struct its_cmd_block *cmd, u64 target_addr)
132d62ae917SEric Auger {
133d62ae917SEric Auger its_mask_encode(&cmd->raw_cmd[2], target_addr >> 16, 50, 16);
134d62ae917SEric Auger }
135d62ae917SEric Auger
its_encode_collection(struct its_cmd_block * cmd,u16 col)136d62ae917SEric Auger static void its_encode_collection(struct its_cmd_block *cmd, u16 col)
137d62ae917SEric Auger {
138d62ae917SEric Auger its_mask_encode(&cmd->raw_cmd[2], col, 15, 0);
139d62ae917SEric Auger }
140d62ae917SEric Auger
its_fixup_cmd(struct its_cmd_block * cmd)141d62ae917SEric Auger static inline void its_fixup_cmd(struct its_cmd_block *cmd)
142d62ae917SEric Auger {
143d62ae917SEric Auger /* Let's fixup BE commands */
144d62ae917SEric Auger cmd->raw_cmd[0] = cpu_to_le64(cmd->raw_cmd[0]);
145d62ae917SEric Auger cmd->raw_cmd[1] = cpu_to_le64(cmd->raw_cmd[1]);
146d62ae917SEric Auger cmd->raw_cmd[2] = cpu_to_le64(cmd->raw_cmd[2]);
147d62ae917SEric Auger cmd->raw_cmd[3] = cpu_to_le64(cmd->raw_cmd[3]);
148d62ae917SEric Auger }
149d62ae917SEric Auger
its_cmd_ptr_to_offset(struct its_cmd_block * ptr)150d62ae917SEric Auger static u64 its_cmd_ptr_to_offset(struct its_cmd_block *ptr)
151d62ae917SEric Auger {
152d62ae917SEric Auger return (ptr - its_data.cmd_base) * sizeof(*ptr);
153d62ae917SEric Auger }
154d62ae917SEric Auger
its_post_commands(void)155d62ae917SEric Auger static struct its_cmd_block *its_post_commands(void)
156d62ae917SEric Auger {
157d62ae917SEric Auger u64 wr = its_cmd_ptr_to_offset(its_data.cmd_write);
158d62ae917SEric Auger
159d62ae917SEric Auger writeq(wr, its_data.base + GITS_CWRITER);
160d62ae917SEric Auger return its_data.cmd_write;
161d62ae917SEric Auger }
162d62ae917SEric Auger
its_allocate_entry(void)163d62ae917SEric Auger static struct its_cmd_block *its_allocate_entry(void)
164d62ae917SEric Auger {
165d62ae917SEric Auger struct its_cmd_block *cmd;
166d62ae917SEric Auger
167d62ae917SEric Auger cmd = its_data.cmd_write++;
168*db6767baSJingyi Wang if ((u64)its_data.cmd_write == (u64)its_data.cmd_base + SZ_64K)
169*db6767baSJingyi Wang its_data.cmd_write = its_data.cmd_base;
170d62ae917SEric Auger return cmd;
171d62ae917SEric Auger }
172d62ae917SEric Auger
its_wait_for_range_completion(struct its_cmd_block * from,struct its_cmd_block * to)173d62ae917SEric Auger static void its_wait_for_range_completion(struct its_cmd_block *from,
174d62ae917SEric Auger struct its_cmd_block *to)
175d62ae917SEric Auger {
176d62ae917SEric Auger u64 rd_idx, from_idx, to_idx;
177d62ae917SEric Auger u32 count = 1000000; /* 1s! */
178d62ae917SEric Auger
179d62ae917SEric Auger from_idx = its_cmd_ptr_to_offset(from);
180d62ae917SEric Auger to_idx = its_cmd_ptr_to_offset(to);
181d62ae917SEric Auger while (1) {
182d62ae917SEric Auger rd_idx = readq(its_data.base + GITS_CREADR);
183d62ae917SEric Auger if (rd_idx >= to_idx || rd_idx < from_idx)
184d62ae917SEric Auger break;
185d62ae917SEric Auger
186d62ae917SEric Auger count--;
187d62ae917SEric Auger if (!count) {
188d62ae917SEric Auger unsigned int cmd_id = from->raw_cmd[0] & 0xFF;
189d62ae917SEric Auger
190d62ae917SEric Auger assert_msg(false, "%s timeout!",
191d62ae917SEric Auger cmd_id <= 0xF ? its_cmd_string[cmd_id] :
192d62ae917SEric Auger "Unexpected");
193d62ae917SEric Auger }
194d62ae917SEric Auger udelay(1);
195d62ae917SEric Auger }
196d62ae917SEric Auger }
197d62ae917SEric Auger
its_send_single_command(its_cmd_builder_t builder,struct its_cmd_desc * desc)198d62ae917SEric Auger static void its_send_single_command(its_cmd_builder_t builder,
199d62ae917SEric Auger struct its_cmd_desc *desc)
200d62ae917SEric Auger {
201d62ae917SEric Auger struct its_cmd_block *cmd, *next_cmd;
202d62ae917SEric Auger
203d62ae917SEric Auger cmd = its_allocate_entry();
204d62ae917SEric Auger builder(cmd, desc);
205d62ae917SEric Auger next_cmd = its_post_commands();
206d62ae917SEric Auger
207d62ae917SEric Auger its_wait_for_range_completion(cmd, next_cmd);
208d62ae917SEric Auger }
209d62ae917SEric Auger
its_build_mapd_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)210d62ae917SEric Auger static void its_build_mapd_cmd(struct its_cmd_block *cmd,
211d62ae917SEric Auger struct its_cmd_desc *desc)
212d62ae917SEric Auger {
213d62ae917SEric Auger unsigned long itt_addr;
214d62ae917SEric Auger u8 size = desc->its_mapd_cmd.dev->nr_ites;
215d62ae917SEric Auger
216d62ae917SEric Auger itt_addr = (unsigned long)(virt_to_phys(desc->its_mapd_cmd.dev->itt));
217d62ae917SEric Auger itt_addr = ALIGN(itt_addr, ITS_ITT_ALIGN);
218d62ae917SEric Auger
219d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_MAPD);
220d62ae917SEric Auger its_encode_devid(cmd, desc->its_mapd_cmd.dev->device_id);
221d62ae917SEric Auger its_encode_size(cmd, size - 1);
222d62ae917SEric Auger its_encode_itt(cmd, itt_addr);
223d62ae917SEric Auger its_encode_valid(cmd, desc->its_mapd_cmd.valid);
224d62ae917SEric Auger its_fixup_cmd(cmd);
225d62ae917SEric Auger if (desc->verbose)
226d62ae917SEric Auger printf("ITS: MAPD devid=%d size = 0x%x itt=0x%lx valid=%d\n",
227d62ae917SEric Auger desc->its_mapd_cmd.dev->device_id,
228d62ae917SEric Auger size, itt_addr, desc->its_mapd_cmd.valid);
229d62ae917SEric Auger }
230d62ae917SEric Auger
its_build_mapc_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)231d62ae917SEric Auger static void its_build_mapc_cmd(struct its_cmd_block *cmd,
232d62ae917SEric Auger struct its_cmd_desc *desc)
233d62ae917SEric Auger {
234d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_MAPC);
235d62ae917SEric Auger its_encode_collection(cmd, desc->its_mapc_cmd.col->col_id);
236d62ae917SEric Auger its_encode_target(cmd, desc->its_mapc_cmd.col->target_address);
237d62ae917SEric Auger its_encode_valid(cmd, desc->its_mapc_cmd.valid);
238d62ae917SEric Auger its_fixup_cmd(cmd);
239d62ae917SEric Auger if (desc->verbose)
240d62ae917SEric Auger printf("MAPC col_id=%d target_addr = 0x%lx valid=%d\n",
241d62ae917SEric Auger desc->its_mapc_cmd.col->col_id,
242d62ae917SEric Auger desc->its_mapc_cmd.col->target_address,
243d62ae917SEric Auger desc->its_mapc_cmd.valid);
244d62ae917SEric Auger }
245d62ae917SEric Auger
its_build_mapti_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)246d62ae917SEric Auger static void its_build_mapti_cmd(struct its_cmd_block *cmd,
247d62ae917SEric Auger struct its_cmd_desc *desc)
248d62ae917SEric Auger {
249d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_MAPTI);
250d62ae917SEric Auger its_encode_devid(cmd, desc->its_mapti_cmd.dev->device_id);
251d62ae917SEric Auger its_encode_event_id(cmd, desc->its_mapti_cmd.event_id);
252d62ae917SEric Auger its_encode_phys_id(cmd, desc->its_mapti_cmd.phys_id);
253d62ae917SEric Auger its_encode_collection(cmd, desc->its_mapti_cmd.col_id);
254d62ae917SEric Auger its_fixup_cmd(cmd);
255d62ae917SEric Auger if (desc->verbose)
256d62ae917SEric Auger printf("MAPTI dev_id=%d event_id=%d -> phys_id=%d, col_id=%d\n",
257d62ae917SEric Auger desc->its_mapti_cmd.dev->device_id,
258d62ae917SEric Auger desc->its_mapti_cmd.event_id,
259d62ae917SEric Auger desc->its_mapti_cmd.phys_id,
260d62ae917SEric Auger desc->its_mapti_cmd.col_id);
261d62ae917SEric Auger }
262d62ae917SEric Auger
its_build_invall_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)263d62ae917SEric Auger static void its_build_invall_cmd(struct its_cmd_block *cmd,
264d62ae917SEric Auger struct its_cmd_desc *desc)
265d62ae917SEric Auger {
266d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_INVALL);
267d62ae917SEric Auger its_encode_collection(cmd, desc->its_invall_cmd.col->col_id);
268d62ae917SEric Auger its_fixup_cmd(cmd);
269d62ae917SEric Auger if (desc->verbose)
270d62ae917SEric Auger printf("INVALL col_id=%d\n", desc->its_invall_cmd.col->col_id);
271d62ae917SEric Auger }
272d62ae917SEric Auger
its_build_clear_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)273d62ae917SEric Auger static void its_build_clear_cmd(struct its_cmd_block *cmd,
274d62ae917SEric Auger struct its_cmd_desc *desc)
275d62ae917SEric Auger {
276d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_CLEAR);
277d62ae917SEric Auger its_encode_devid(cmd, desc->its_clear_cmd.dev->device_id);
278d62ae917SEric Auger its_encode_event_id(cmd, desc->its_clear_cmd.event_id);
279d62ae917SEric Auger its_fixup_cmd(cmd);
280d62ae917SEric Auger if (desc->verbose)
281d62ae917SEric Auger printf("CLEAR dev_id=%d event_id=%d\n", desc->its_clear_cmd.dev->device_id, desc->its_clear_cmd.event_id);
282d62ae917SEric Auger }
283d62ae917SEric Auger
its_build_discard_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)284d62ae917SEric Auger static void its_build_discard_cmd(struct its_cmd_block *cmd,
285d62ae917SEric Auger struct its_cmd_desc *desc)
286d62ae917SEric Auger {
287d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_DISCARD);
288d62ae917SEric Auger its_encode_devid(cmd, desc->its_discard_cmd.dev->device_id);
289d62ae917SEric Auger its_encode_event_id(cmd, desc->its_discard_cmd.event_id);
290d62ae917SEric Auger its_fixup_cmd(cmd);
291d62ae917SEric Auger if (desc->verbose)
292d62ae917SEric Auger printf("DISCARD dev_id=%d event_id=%d\n",
293d62ae917SEric Auger desc->its_clear_cmd.dev->device_id, desc->its_clear_cmd.event_id);
294d62ae917SEric Auger }
295d62ae917SEric Auger
its_build_inv_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)296d62ae917SEric Auger static void its_build_inv_cmd(struct its_cmd_block *cmd,
297d62ae917SEric Auger struct its_cmd_desc *desc)
298d62ae917SEric Auger {
299d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_INV);
300d62ae917SEric Auger its_encode_devid(cmd, desc->its_inv_cmd.dev->device_id);
301d62ae917SEric Auger its_encode_event_id(cmd, desc->its_inv_cmd.event_id);
302d62ae917SEric Auger its_fixup_cmd(cmd);
303d62ae917SEric Auger if (desc->verbose)
304d62ae917SEric Auger printf("INV dev_id=%d event_id=%d\n",
305d62ae917SEric Auger desc->its_inv_cmd.dev->device_id,
306d62ae917SEric Auger desc->its_inv_cmd.event_id);
307d62ae917SEric Auger }
308d62ae917SEric Auger
its_build_int_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)309d62ae917SEric Auger static void its_build_int_cmd(struct its_cmd_block *cmd,
310d62ae917SEric Auger struct its_cmd_desc *desc)
311d62ae917SEric Auger {
312d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_INT);
313d62ae917SEric Auger its_encode_devid(cmd, desc->its_int_cmd.dev->device_id);
314d62ae917SEric Auger its_encode_event_id(cmd, desc->its_int_cmd.event_id);
315d62ae917SEric Auger its_fixup_cmd(cmd);
316d62ae917SEric Auger if (desc->verbose)
317d62ae917SEric Auger printf("INT dev_id=%d event_id=%d\n",
318d62ae917SEric Auger desc->its_int_cmd.dev->device_id,
319d62ae917SEric Auger desc->its_int_cmd.event_id);
320d62ae917SEric Auger }
321d62ae917SEric Auger
its_build_sync_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)322d62ae917SEric Auger static void its_build_sync_cmd(struct its_cmd_block *cmd,
323d62ae917SEric Auger struct its_cmd_desc *desc)
324d62ae917SEric Auger {
325d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_SYNC);
326d62ae917SEric Auger its_encode_target(cmd, desc->its_sync_cmd.col->target_address);
327d62ae917SEric Auger its_fixup_cmd(cmd);
328d62ae917SEric Auger if (desc->verbose)
329d62ae917SEric Auger printf("SYNC target_addr = 0x%lx\n",
330d62ae917SEric Auger desc->its_sync_cmd.col->target_address);
331d62ae917SEric Auger }
332d62ae917SEric Auger
its_build_movi_cmd(struct its_cmd_block * cmd,struct its_cmd_desc * desc)333d62ae917SEric Auger static void its_build_movi_cmd(struct its_cmd_block *cmd,
334d62ae917SEric Auger struct its_cmd_desc *desc)
335d62ae917SEric Auger {
336d62ae917SEric Auger its_encode_cmd(cmd, GITS_CMD_MOVI);
337d62ae917SEric Auger its_encode_devid(cmd, desc->its_movi_cmd.dev->device_id);
338d62ae917SEric Auger its_encode_event_id(cmd, desc->its_movi_cmd.event_id);
339d62ae917SEric Auger its_encode_collection(cmd, desc->its_movi_cmd.col->col_id);
340d62ae917SEric Auger its_fixup_cmd(cmd);
341d62ae917SEric Auger if (desc->verbose)
342d62ae917SEric Auger printf("MOVI dev_id=%d event_id = %d col_id=%d\n",
343d62ae917SEric Auger desc->its_movi_cmd.dev->device_id,
344d62ae917SEric Auger desc->its_movi_cmd.event_id,
345d62ae917SEric Auger desc->its_movi_cmd.col->col_id);
346d62ae917SEric Auger }
347d62ae917SEric Auger
__its_send_mapd(struct its_device * dev,int valid,bool verbose)348d62ae917SEric Auger void __its_send_mapd(struct its_device *dev, int valid, bool verbose)
349d62ae917SEric Auger {
350d62ae917SEric Auger struct its_cmd_desc desc;
351d62ae917SEric Auger
352d62ae917SEric Auger desc.its_mapd_cmd.dev = dev;
353d62ae917SEric Auger desc.its_mapd_cmd.valid = !!valid;
354d62ae917SEric Auger desc.verbose = verbose;
355d62ae917SEric Auger
356d62ae917SEric Auger its_send_single_command(its_build_mapd_cmd, &desc);
357d62ae917SEric Auger }
358d62ae917SEric Auger
__its_send_mapc(struct its_collection * col,int valid,bool verbose)359d62ae917SEric Auger void __its_send_mapc(struct its_collection *col, int valid, bool verbose)
360d62ae917SEric Auger {
361d62ae917SEric Auger struct its_cmd_desc desc;
362d62ae917SEric Auger
363d62ae917SEric Auger desc.its_mapc_cmd.col = col;
364d62ae917SEric Auger desc.its_mapc_cmd.valid = !!valid;
365d62ae917SEric Auger desc.verbose = verbose;
366d62ae917SEric Auger
367d62ae917SEric Auger its_send_single_command(its_build_mapc_cmd, &desc);
368d62ae917SEric Auger }
369d62ae917SEric Auger
__its_send_mapti(struct its_device * dev,u32 irq_id,u32 event_id,struct its_collection * col,bool verbose)370d62ae917SEric Auger void __its_send_mapti(struct its_device *dev, u32 irq_id,
371d62ae917SEric Auger u32 event_id, struct its_collection *col, bool verbose)
372d62ae917SEric Auger {
373d62ae917SEric Auger struct its_cmd_desc desc;
374d62ae917SEric Auger
375d62ae917SEric Auger desc.its_mapti_cmd.dev = dev;
376d62ae917SEric Auger desc.its_mapti_cmd.phys_id = irq_id;
377d62ae917SEric Auger desc.its_mapti_cmd.event_id = event_id;
378d62ae917SEric Auger desc.its_mapti_cmd.col_id = col->col_id;
379d62ae917SEric Auger desc.verbose = verbose;
380d62ae917SEric Auger
381d62ae917SEric Auger its_send_single_command(its_build_mapti_cmd, &desc);
382d62ae917SEric Auger }
383d62ae917SEric Auger
__its_send_int(struct its_device * dev,u32 event_id,bool verbose)384d62ae917SEric Auger void __its_send_int(struct its_device *dev, u32 event_id, bool verbose)
385d62ae917SEric Auger {
386d62ae917SEric Auger struct its_cmd_desc desc;
387d62ae917SEric Auger
388d62ae917SEric Auger desc.its_int_cmd.dev = dev;
389d62ae917SEric Auger desc.its_int_cmd.event_id = event_id;
390d62ae917SEric Auger desc.verbose = verbose;
391d62ae917SEric Auger
392d62ae917SEric Auger its_send_single_command(its_build_int_cmd, &desc);
393d62ae917SEric Auger }
394d62ae917SEric Auger
__its_send_movi(struct its_device * dev,struct its_collection * col,u32 id,bool verbose)395d62ae917SEric Auger void __its_send_movi(struct its_device *dev, struct its_collection *col,
396d62ae917SEric Auger u32 id, bool verbose)
397d62ae917SEric Auger {
398d62ae917SEric Auger struct its_cmd_desc desc;
399d62ae917SEric Auger
400d62ae917SEric Auger desc.its_movi_cmd.dev = dev;
401d62ae917SEric Auger desc.its_movi_cmd.col = col;
402d62ae917SEric Auger desc.its_movi_cmd.event_id = id;
403d62ae917SEric Auger desc.verbose = verbose;
404d62ae917SEric Auger
405d62ae917SEric Auger its_send_single_command(its_build_movi_cmd, &desc);
406d62ae917SEric Auger }
407d62ae917SEric Auger
__its_send_invall(struct its_collection * col,bool verbose)408d62ae917SEric Auger void __its_send_invall(struct its_collection *col, bool verbose)
409d62ae917SEric Auger {
410d62ae917SEric Auger struct its_cmd_desc desc;
411d62ae917SEric Auger
412d62ae917SEric Auger desc.its_invall_cmd.col = col;
413d62ae917SEric Auger desc.verbose = verbose;
414d62ae917SEric Auger
415d62ae917SEric Auger its_send_single_command(its_build_invall_cmd, &desc);
416d62ae917SEric Auger }
417d62ae917SEric Auger
__its_send_inv(struct its_device * dev,u32 event_id,bool verbose)418d62ae917SEric Auger void __its_send_inv(struct its_device *dev, u32 event_id, bool verbose)
419d62ae917SEric Auger {
420d62ae917SEric Auger struct its_cmd_desc desc;
421d62ae917SEric Auger
422d62ae917SEric Auger desc.its_inv_cmd.dev = dev;
423d62ae917SEric Auger desc.its_inv_cmd.event_id = event_id;
424d62ae917SEric Auger desc.verbose = verbose;
425d62ae917SEric Auger
426d62ae917SEric Auger its_send_single_command(its_build_inv_cmd, &desc);
427d62ae917SEric Auger }
428d62ae917SEric Auger
__its_send_discard(struct its_device * dev,u32 event_id,bool verbose)429d62ae917SEric Auger void __its_send_discard(struct its_device *dev, u32 event_id, bool verbose)
430d62ae917SEric Auger {
431d62ae917SEric Auger struct its_cmd_desc desc;
432d62ae917SEric Auger
433d62ae917SEric Auger desc.its_discard_cmd.dev = dev;
434d62ae917SEric Auger desc.its_discard_cmd.event_id = event_id;
435d62ae917SEric Auger desc.verbose = verbose;
436d62ae917SEric Auger
437d62ae917SEric Auger its_send_single_command(its_build_discard_cmd, &desc);
438d62ae917SEric Auger }
439d62ae917SEric Auger
__its_send_clear(struct its_device * dev,u32 event_id,bool verbose)440d62ae917SEric Auger void __its_send_clear(struct its_device *dev, u32 event_id, bool verbose)
441d62ae917SEric Auger {
442d62ae917SEric Auger struct its_cmd_desc desc;
443d62ae917SEric Auger
444d62ae917SEric Auger desc.its_clear_cmd.dev = dev;
445d62ae917SEric Auger desc.its_clear_cmd.event_id = event_id;
446d62ae917SEric Auger desc.verbose = verbose;
447d62ae917SEric Auger
448d62ae917SEric Auger its_send_single_command(its_build_clear_cmd, &desc);
449d62ae917SEric Auger }
450d62ae917SEric Auger
__its_send_sync(struct its_collection * col,bool verbose)451d62ae917SEric Auger void __its_send_sync(struct its_collection *col, bool verbose)
452d62ae917SEric Auger {
453d62ae917SEric Auger struct its_cmd_desc desc;
454d62ae917SEric Auger
455d62ae917SEric Auger desc.its_sync_cmd.col = col;
456d62ae917SEric Auger desc.verbose = verbose;
457d62ae917SEric Auger
458d62ae917SEric Auger its_send_single_command(its_build_sync_cmd, &desc);
459d62ae917SEric Auger }
460d62ae917SEric Auger
461