irqchip/gic-v4: Add VLPI configuration interface

Add the required interfaces to map, unmap and update a VLPI.

Reviewed-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>

+46
+42
drivers/irqchip/irq-gic-v4.c
··· 97 97 98 98 return its_send_vpe_cmd(vpe, &info); 99 99 } 100 + 101 + int its_map_vlpi(int irq, struct its_vlpi_map *map) 102 + { 103 + struct its_cmd_info info = { 104 + .cmd_type = MAP_VLPI, 105 + .map = map, 106 + }; 107 + 108 + /* 109 + * The host will never see that interrupt firing again, so it 110 + * is vital that we don't do any lazy masking. 111 + */ 112 + irq_set_status_flags(irq, IRQ_DISABLE_UNLAZY); 113 + 114 + return irq_set_vcpu_affinity(irq, &info); 115 + } 116 + 117 + int its_get_vlpi(int irq, struct its_vlpi_map *map) 118 + { 119 + struct its_cmd_info info = { 120 + .cmd_type = GET_VLPI, 121 + .map = map, 122 + }; 123 + 124 + return irq_set_vcpu_affinity(irq, &info); 125 + } 126 + 127 + int its_unmap_vlpi(int irq) 128 + { 129 + irq_clear_status_flags(irq, IRQ_DISABLE_UNLAZY); 130 + return irq_set_vcpu_affinity(irq, NULL); 131 + } 132 + 133 + int its_prop_update_vlpi(int irq, u8 config, bool inv) 134 + { 135 + struct its_cmd_info info = { 136 + .cmd_type = inv ? PROP_UPDATE_AND_INV_VLPI : PROP_UPDATE_VLPI, 137 + .config = config, 138 + }; 139 + 140 + return irq_set_vcpu_affinity(irq, &info); 141 + }
+4
include/linux/irqchip/arm-gic-v4.h
··· 95 95 void its_free_vcpu_irqs(struct its_vm *vm); 96 96 int its_schedule_vpe(struct its_vpe *vpe, bool on); 97 97 int its_invall_vpe(struct its_vpe *vpe); 98 + int its_map_vlpi(int irq, struct its_vlpi_map *map); 99 + int its_get_vlpi(int irq, struct its_vlpi_map *map); 100 + int its_unmap_vlpi(int irq); 101 + int its_prop_update_vlpi(int irq, u8 config, bool inv); 98 102 99 103 #endif