xref: /kvm-unit-tests/lib/arm64/gic-v3-its-cmd.c (revision db6767ba98792ccf483bd69a62db51ac25f895b0)
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