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