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