]>
Commit | Line | Data |
---|---|---|
caab277b | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
de29faa0 MZ |
2 | /* |
3 | * Copyright (C) 2016,2017 ARM Limited, All Rights Reserved. | |
4 | * Author: Marc Zyngier <marc.zyngier@arm.com> | |
de29faa0 MZ |
5 | */ |
6 | ||
7 | #ifndef __LINUX_IRQCHIP_ARM_GIC_V4_H | |
8 | #define __LINUX_IRQCHIP_ARM_GIC_V4_H | |
9 | ||
10 | struct its_vpe; | |
11 | ||
ab60491e MZ |
12 | /* |
13 | * Maximum number of ITTs when GITS_TYPER.VMOVP == 0, using the | |
14 | * ITSList mechanism to perform inter-ITS synchronization. | |
15 | */ | |
16 | #define GICv4_ITS_LIST_MAX 16 | |
17 | ||
de29faa0 MZ |
18 | /* Embedded in kvm.arch */ |
19 | struct its_vm { | |
20 | struct fwnode_handle *fwnode; | |
21 | struct irq_domain *domain; | |
22 | struct page *vprop_page; | |
23 | struct its_vpe **vpes; | |
24 | int nr_vpes; | |
25 | irq_hw_number_t db_lpi_base; | |
26 | unsigned long *db_bitmap; | |
27 | int nr_db_lpis; | |
2247e1bf | 28 | u32 vlpi_count[GICv4_ITS_LIST_MAX]; |
de29faa0 MZ |
29 | }; |
30 | ||
31 | /* Embedded in kvm_vcpu.arch */ | |
32 | struct its_vpe { | |
33 | struct page *vpt_page; | |
34 | struct its_vm *its_vm; | |
5bd90b09 MZ |
35 | /* per-vPE VLPI tracking */ |
36 | atomic_t vlpi_count; | |
de29faa0 MZ |
37 | /* Doorbell interrupt */ |
38 | int irq; | |
39 | irq_hw_number_t vpe_db_lpi; | |
8e01d9a3 MZ |
40 | /* VPE resident */ |
41 | bool resident; | |
64edfaa9 MZ |
42 | union { |
43 | /* GICv4.0 implementations */ | |
44 | struct { | |
45 | /* VPE proxy mapping */ | |
46 | int vpe_proxy_event; | |
47 | /* Implementation Defined Area Invalid */ | |
48 | bool idai; | |
49 | }; | |
50 | /* GICv4.1 implementations */ | |
51 | struct { | |
6d31b6ff MZ |
52 | struct fwnode_handle *fwnode; |
53 | struct irq_domain *sgi_domain; | |
166cba71 MZ |
54 | struct { |
55 | u8 priority; | |
56 | bool enabled; | |
57 | bool group; | |
58 | } sgi_config[16]; | |
64edfaa9 MZ |
59 | atomic_t vmapp_count; |
60 | }; | |
61 | }; | |
62 | ||
f3a05921 MZ |
63 | /* |
64 | * Ensures mutual exclusion between affinity setting of the | |
65 | * vPE and vLPI operations using vpe->col_idx. | |
66 | */ | |
67 | raw_spinlock_t vpe_lock; | |
de29faa0 MZ |
68 | /* |
69 | * This collection ID is used to indirect the target | |
70 | * redistributor for this VPE. The ID itself isn't involved in | |
71 | * programming of the ITS. | |
72 | */ | |
73 | u16 col_idx; | |
74 | /* Unique (system-wide) VPE identifier */ | |
75 | u16 vpe_id; | |
de29faa0 MZ |
76 | /* Pending VLPIs on schedule out? */ |
77 | bool pending_last; | |
78 | }; | |
79 | ||
80 | /* | |
81 | * struct its_vlpi_map: structure describing the mapping of a | |
82 | * VLPI. Only to be interpreted in the context of a physical interrupt | |
83 | * it complements. To be used as the vcpu_info passed to | |
84 | * irq_set_vcpu_affinity(). | |
85 | * | |
86 | * @vm: Pointer to the GICv4 notion of a VM | |
87 | * @vpe: Pointer to the GICv4 notion of a virtual CPU (VPE) | |
88 | * @vintid: Virtual LPI number | |
d4d7b4ad | 89 | * @properties: Priority and enable bits (as written in the prop table) |
de29faa0 MZ |
90 | * @db_enabled: Is the VPE doorbell to be generated? |
91 | */ | |
92 | struct its_vlpi_map { | |
93 | struct its_vm *vm; | |
94 | struct its_vpe *vpe; | |
95 | u32 vintid; | |
d4d7b4ad | 96 | u8 properties; |
de29faa0 MZ |
97 | bool db_enabled; |
98 | }; | |
99 | ||
100 | enum its_vcpu_info_cmd_type { | |
101 | MAP_VLPI, | |
102 | GET_VLPI, | |
103 | PROP_UPDATE_VLPI, | |
104 | PROP_UPDATE_AND_INV_VLPI, | |
105 | SCHEDULE_VPE, | |
106 | DESCHEDULE_VPE, | |
107 | INVALL_VPE, | |
05d32df1 | 108 | PROP_UPDATE_VSGI, |
de29faa0 MZ |
109 | }; |
110 | ||
111 | struct its_cmd_info { | |
112 | enum its_vcpu_info_cmd_type cmd_type; | |
113 | union { | |
114 | struct its_vlpi_map *map; | |
115 | u8 config; | |
91bf6395 MZ |
116 | bool req_db; |
117 | struct { | |
118 | bool g0en; | |
119 | bool g1en; | |
120 | }; | |
05d32df1 MZ |
121 | struct { |
122 | u8 priority; | |
123 | bool group; | |
124 | }; | |
de29faa0 MZ |
125 | }; |
126 | }; | |
127 | ||
7de5c0af MZ |
128 | int its_alloc_vcpu_irqs(struct its_vm *vm); |
129 | void its_free_vcpu_irqs(struct its_vm *vm); | |
ae699ad3 MZ |
130 | int its_make_vpe_resident(struct its_vpe *vpe, bool g0en, bool g1en); |
131 | int its_make_vpe_non_resident(struct its_vpe *vpe, bool db); | |
eab84318 | 132 | int its_invall_vpe(struct its_vpe *vpe); |
f2eac75d MZ |
133 | int its_map_vlpi(int irq, struct its_vlpi_map *map); |
134 | int its_get_vlpi(int irq, struct its_vlpi_map *map); | |
135 | int its_unmap_vlpi(int irq); | |
136 | int its_prop_update_vlpi(int irq, u8 config, bool inv); | |
d50676f5 | 137 | int its_prop_update_vsgi(int irq, u8 priority, bool group); |
7de5c0af | 138 | |
47f9d0bf | 139 | struct irq_domain_ops; |
166cba71 MZ |
140 | int its_init_v4(struct irq_domain *domain, |
141 | const struct irq_domain_ops *vpe_ops, | |
142 | const struct irq_domain_ops *sgi_ops); | |
3d63cb53 | 143 | |
de29faa0 | 144 | #endif |