1 /* 2 * Copyright (C) 2016,2017 ARM Limited, All Rights Reserved. 3 * Author: Marc Zyngier <marc.zyngier@arm.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License version 2 as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 #ifndef __LINUX_IRQCHIP_ARM_GIC_V4_H 19 #define __LINUX_IRQCHIP_ARM_GIC_V4_H 20 21 struct its_vpe; 22 23 /* 24 * Maximum number of ITTs when GITS_TYPER.VMOVP == 0, using the 25 * ITSList mechanism to perform inter-ITS synchronization. 26 */ 27 #define GICv4_ITS_LIST_MAX 16 28 29 /* Embedded in kvm.arch */ 30 struct its_vm { 31 struct fwnode_handle *fwnode; 32 struct irq_domain *domain; 33 struct page *vprop_page; 34 struct its_vpe **vpes; 35 int nr_vpes; 36 irq_hw_number_t db_lpi_base; 37 unsigned long *db_bitmap; 38 int nr_db_lpis; 39 u32 vlpi_count[GICv4_ITS_LIST_MAX]; 40 }; 41 42 /* Embedded in kvm_vcpu.arch */ 43 struct its_vpe { 44 struct page *vpt_page; 45 struct its_vm *its_vm; 46 /* Doorbell interrupt */ 47 int irq; 48 irq_hw_number_t vpe_db_lpi; 49 /* VPE proxy mapping */ 50 int vpe_proxy_event; 51 /* 52 * This collection ID is used to indirect the target 53 * redistributor for this VPE. The ID itself isn't involved in 54 * programming of the ITS. 55 */ 56 u16 col_idx; 57 /* Unique (system-wide) VPE identifier */ 58 u16 vpe_id; 59 /* Implementation Defined Area Invalid */ 60 bool idai; 61 /* Pending VLPIs on schedule out? */ 62 bool pending_last; 63 }; 64 65 /* 66 * struct its_vlpi_map: structure describing the mapping of a 67 * VLPI. Only to be interpreted in the context of a physical interrupt 68 * it complements. To be used as the vcpu_info passed to 69 * irq_set_vcpu_affinity(). 70 * 71 * @vm: Pointer to the GICv4 notion of a VM 72 * @vpe: Pointer to the GICv4 notion of a virtual CPU (VPE) 73 * @vintid: Virtual LPI number 74 * @properties: Priority and enable bits (as written in the prop table) 75 * @db_enabled: Is the VPE doorbell to be generated? 76 */ 77 struct its_vlpi_map { 78 struct its_vm *vm; 79 struct its_vpe *vpe; 80 u32 vintid; 81 u8 properties; 82 bool db_enabled; 83 }; 84 85 enum its_vcpu_info_cmd_type { 86 MAP_VLPI, 87 GET_VLPI, 88 PROP_UPDATE_VLPI, 89 PROP_UPDATE_AND_INV_VLPI, 90 SCHEDULE_VPE, 91 DESCHEDULE_VPE, 92 INVALL_VPE, 93 }; 94 95 struct its_cmd_info { 96 enum its_vcpu_info_cmd_type cmd_type; 97 union { 98 struct its_vlpi_map *map; 99 u8 config; 100 }; 101 }; 102 103 int its_alloc_vcpu_irqs(struct its_vm *vm); 104 void its_free_vcpu_irqs(struct its_vm *vm); 105 int its_schedule_vpe(struct its_vpe *vpe, bool on); 106 int its_invall_vpe(struct its_vpe *vpe); 107 int its_map_vlpi(int irq, struct its_vlpi_map *map); 108 int its_get_vlpi(int irq, struct its_vlpi_map *map); 109 int its_unmap_vlpi(int irq); 110 int its_prop_update_vlpi(int irq, u8 config, bool inv); 111 112 struct irq_domain_ops; 113 int its_init_v4(struct irq_domain *domain, const struct irq_domain_ops *ops); 114 115 #endif 116