|
54 | 54 | * - a bunch of shared interrupts (SPI) |
55 | 55 | */ |
56 | 56 | struct vgic_bitmap { |
57 | | - union { |
58 | | - u32 reg[VGIC_NR_PRIVATE_IRQS / 32]; |
59 | | - DECLARE_BITMAP(reg_ul, VGIC_NR_PRIVATE_IRQS); |
60 | | - } percpu[VGIC_MAX_CPUS]; |
61 | | - union { |
62 | | - u32 reg[VGIC_NR_SHARED_IRQS / 32]; |
63 | | - DECLARE_BITMAP(reg_ul, VGIC_NR_SHARED_IRQS); |
64 | | - } shared; |
| 57 | + /* |
| 58 | + * - One UL per VCPU for private interrupts (assumes UL is at |
| 59 | + * least 32 bits) |
| 60 | + * - As many UL as necessary for shared interrupts. |
| 61 | + * |
| 62 | + * The private interrupts are accessed via the "private" |
| 63 | + * field, one UL per vcpu (the state for vcpu n is in |
| 64 | + * private[n]). The shared interrupts are accessed via the |
| 65 | + * "shared" pointer (IRQn state is at bit n-32 in the bitmap). |
| 66 | + */ |
| 67 | + unsigned long *private; |
| 68 | + unsigned long *shared; |
65 | 69 | }; |
66 | 70 |
|
67 | 71 | struct vgic_bytemap { |
68 | | - u32 percpu[VGIC_MAX_CPUS][VGIC_NR_PRIVATE_IRQS / 4]; |
69 | | - u32 shared[VGIC_NR_SHARED_IRQS / 4]; |
| 72 | + /* |
| 73 | + * - 8 u32 per VCPU for private interrupts |
| 74 | + * - As many u32 as necessary for shared interrupts. |
| 75 | + * |
| 76 | + * The private interrupts are accessed via the "private" |
| 77 | + * field, (the state for vcpu n is in private[n*8] to |
| 78 | + * private[n*8 + 7]). The shared interrupts are accessed via |
| 79 | + * the "shared" pointer (IRQn state is at byte (n-32)%4 of the |
| 80 | + * shared[(n-32)/4] word). |
| 81 | + */ |
| 82 | + u32 *private; |
| 83 | + u32 *shared; |
70 | 84 | }; |
71 | 85 |
|
72 | 86 | struct kvm_vcpu; |
@@ -127,6 +141,9 @@ struct vgic_dist { |
127 | 141 | bool in_kernel; |
128 | 142 | bool ready; |
129 | 143 |
|
| 144 | + int nr_cpus; |
| 145 | + int nr_irqs; |
| 146 | + |
130 | 147 | /* Virtual control interface mapping */ |
131 | 148 | void __iomem *vctrl_base; |
132 | 149 |
|
@@ -166,15 +183,36 @@ struct vgic_dist { |
166 | 183 | /* Level/edge triggered */ |
167 | 184 | struct vgic_bitmap irq_cfg; |
168 | 185 |
|
169 | | - /* Source CPU per SGI and target CPU */ |
170 | | - u8 irq_sgi_sources[VGIC_MAX_CPUS][VGIC_NR_SGIS]; |
| 186 | + /* |
| 187 | + * Source CPU per SGI and target CPU: |
| 188 | + * |
| 189 | + * Each byte represent a SGI observable on a VCPU, each bit of |
| 190 | + * this byte indicating if the corresponding VCPU has |
| 191 | + * generated this interrupt. This is a GICv2 feature only. |
| 192 | + * |
| 193 | + * For VCPUn (n < 8), irq_sgi_sources[n*16] to [n*16 + 15] are |
| 194 | + * the SGIs observable on VCPUn. |
| 195 | + */ |
| 196 | + u8 *irq_sgi_sources; |
171 | 197 |
|
172 | | - /* Target CPU for each IRQ */ |
173 | | - u8 irq_spi_cpu[VGIC_NR_SHARED_IRQS]; |
174 | | - struct vgic_bitmap irq_spi_target[VGIC_MAX_CPUS]; |
| 198 | + /* |
| 199 | + * Target CPU for each SPI: |
| 200 | + * |
| 201 | + * Array of available SPI, each byte indicating the target |
| 202 | + * VCPU for SPI. IRQn (n >=32) is at irq_spi_cpu[n-32]. |
| 203 | + */ |
| 204 | + u8 *irq_spi_cpu; |
| 205 | + |
| 206 | + /* |
| 207 | + * Reverse lookup of irq_spi_cpu for faster compute pending: |
| 208 | + * |
| 209 | + * Array of bitmaps, one per VCPU, describing if IRQn is |
| 210 | + * routed to a particular VCPU. |
| 211 | + */ |
| 212 | + struct vgic_bitmap *irq_spi_target; |
175 | 213 |
|
176 | 214 | /* Bitmap indicating which CPU has something pending */ |
177 | | - unsigned long irq_pending_on_cpu; |
| 215 | + unsigned long *irq_pending_on_cpu; |
178 | 216 | #endif |
179 | 217 | }; |
180 | 218 |
|
@@ -204,11 +242,11 @@ struct vgic_v3_cpu_if { |
204 | 242 | struct vgic_cpu { |
205 | 243 | #ifdef CONFIG_KVM_ARM_VGIC |
206 | 244 | /* per IRQ to LR mapping */ |
207 | | - u8 vgic_irq_lr_map[VGIC_NR_IRQS]; |
| 245 | + u8 *vgic_irq_lr_map; |
208 | 246 |
|
209 | 247 | /* Pending interrupts on this VCPU */ |
210 | 248 | DECLARE_BITMAP( pending_percpu, VGIC_NR_PRIVATE_IRQS); |
211 | | - DECLARE_BITMAP( pending_shared, VGIC_NR_SHARED_IRQS); |
| 249 | + unsigned long *pending_shared; |
212 | 250 |
|
213 | 251 | /* Bitmap of used/free list registers */ |
214 | 252 | DECLARE_BITMAP( lr_used, VGIC_V2_MAX_LRS); |
@@ -239,7 +277,9 @@ int kvm_vgic_addr(struct kvm *kvm, unsigned long type, u64 *addr, bool write); |
239 | 277 | int kvm_vgic_hyp_init(void); |
240 | 278 | int kvm_vgic_init(struct kvm *kvm); |
241 | 279 | int kvm_vgic_create(struct kvm *kvm); |
| 280 | +void kvm_vgic_destroy(struct kvm *kvm); |
242 | 281 | int kvm_vgic_vcpu_init(struct kvm_vcpu *vcpu); |
| 282 | +void kvm_vgic_vcpu_destroy(struct kvm_vcpu *vcpu); |
243 | 283 | void kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu); |
244 | 284 | void kvm_vgic_sync_hwstate(struct kvm_vcpu *vcpu); |
245 | 285 | int kvm_vgic_inject_irq(struct kvm *kvm, int cpuid, unsigned int irq_num, |
|
0 commit comments