2 * Copyright 2017 Benjamin Herrenschmidt, IBM Corporation
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License, version 2, as
6 * published by the Free Software Foundation.
9 #ifndef _KVM_PPC_BOOK3S_XIVE_H
10 #define _KVM_PPC_BOOK3S_XIVE_H
12 #ifdef CONFIG_KVM_XICS
13 #include "book3s_xics.h"
16 * State for one guest irq source.
18 * For each guest source we allocate a HW interrupt in the XIVE
19 * which we use for all SW triggers. It will be unused for
20 * pass-through but it's easier to keep around as the same
21 * guest interrupt can alternatively be emulated or pass-through
22 * if a physical device is hot unplugged and replaced with an
25 * This state structure is very similar to the XICS one with
26 * additional XIVE specific tracking.
28 struct kvmppc_xive_irq_state
{
29 bool valid
; /* Interrupt entry is valid */
31 u32 number
; /* Guest IRQ number */
32 u32 ipi_number
; /* XIVE IPI HW number */
33 struct xive_irq_data ipi_data
; /* XIVE IPI associated data */
34 u32 pt_number
; /* XIVE Pass-through number if any */
35 struct xive_irq_data
*pt_data
; /* XIVE Pass-through associated data */
37 /* Targetting as set by guest */
38 u8 guest_priority
; /* Guest set priority */
39 u8 saved_priority
; /* Saved priority when masking */
41 /* Actual targetting */
42 u32 act_server
; /* Actual server */
43 u8 act_priority
; /* Actual priority */
45 /* Various state bits */
46 bool in_eoi
; /* Synchronize with H_EOI */
47 bool old_p
; /* P bit state when masking */
48 bool old_q
; /* Q bit state when masking */
49 bool lsi
; /* level-sensitive interrupt */
50 bool asserted
; /* Only for emulated LSI: current state */
52 /* Saved for migration state */
59 /* Select the "right" interrupt (IPI vs. passthrough) */
60 static inline void kvmppc_xive_select_irq(struct kvmppc_xive_irq_state
*state
,
62 struct xive_irq_data
**out_xd
)
64 if (state
->pt_number
) {
66 *out_hw_irq
= state
->pt_number
;
68 *out_xd
= state
->pt_data
;
71 *out_hw_irq
= state
->ipi_number
;
73 *out_xd
= &state
->ipi_data
;
78 * This corresponds to an "ICS" in XICS terminology, we use it
79 * as a mean to break up source information into multiple structures.
81 struct kvmppc_xive_src_block
{
84 struct kvmppc_xive_irq_state irq_state
[KVMPPC_XICS_IRQ_PER_ICS
];
90 struct kvm_device
*dev
;
91 struct dentry
*dentry
;
93 /* VP block associated with the VM */
96 /* Blocks of sources */
97 struct kvmppc_xive_src_block
*src_blocks
[KVMPPC_XICS_MAX_ICS_ID
+ 1];
101 * For state save, we lazily scan the queues on the first interrupt
102 * being migrated. We don't have a clean way to reset that flags
103 * so we keep track of the number of valid sources and how many of
104 * them were migrated so we can reset when all of them have been
111 * Some irqs are delayed on restore until the source is created,
112 * keep track here of how many of them
116 /* Which queues (priorities) are in use by the guest */
124 u8 single_escalation
;
127 #define KVMPPC_XIVE_Q_COUNT 8
129 struct kvmppc_xive_vcpu
{
130 struct kvmppc_xive
*xive
;
131 struct kvm_vcpu
*vcpu
;
134 /* Server number. This is the HW CPU ID from a guest perspective */
138 * HW VP corresponding to this VCPU. This is the base of the VP
139 * block plus the server number.
145 /* IPI used for sending ... IPIs */
147 struct xive_irq_data vp_ipi_data
;
149 /* Local emulation state */
150 uint8_t cppr
; /* guest CPPR */
151 uint8_t hw_cppr
;/* Hardware CPPR */
155 /* Each VP has 8 queues though we only provision some */
156 struct xive_q queues
[KVMPPC_XIVE_Q_COUNT
];
157 u32 esc_virq
[KVMPPC_XIVE_Q_COUNT
];
158 char *esc_virq_names
[KVMPPC_XIVE_Q_COUNT
];
160 /* Stash a delayed irq on restore from migration (see set_icp) */
176 static inline struct kvm_vcpu
*kvmppc_xive_find_server(struct kvm
*kvm
, u32 nr
)
178 struct kvm_vcpu
*vcpu
= NULL
;
181 kvm_for_each_vcpu(i
, vcpu
, kvm
) {
182 if (vcpu
->arch
.xive_vcpu
&& nr
== vcpu
->arch
.xive_vcpu
->server_num
)
188 static inline struct kvmppc_xive_src_block
*kvmppc_xive_find_source(struct kvmppc_xive
*xive
,
189 u32 irq
, u16
*source
)
191 u32 bid
= irq
>> KVMPPC_XICS_ICS_SHIFT
;
192 u16 src
= irq
& KVMPPC_XICS_SRC_MASK
;
196 if (bid
> KVMPPC_XICS_MAX_ICS_ID
)
198 return xive
->src_blocks
[bid
];
202 * Mapping between guest priorities and host priorities
205 * Guest request for 0...6 are honored. Guest request for anything
206 * higher results in a priority of 6 being applied.
208 * Similar mapping is done for CPPR values
210 static inline u8
xive_prio_from_guest(u8 prio
)
212 if (prio
== 0xff || prio
< 6)
217 static inline u8
xive_prio_to_guest(u8 prio
)
222 static inline u32
__xive_read_eq(__be32
*qpage
, u32 msk
, u32
*idx
, u32
*toggle
)
228 cur
= be32_to_cpup(qpage
+ *idx
);
229 if ((cur
>> 31) == *toggle
)
231 *idx
= (*idx
+ 1) & msk
;
234 return cur
& 0x7fffffff;
237 extern unsigned long xive_rm_h_xirr(struct kvm_vcpu
*vcpu
);
238 extern unsigned long xive_rm_h_ipoll(struct kvm_vcpu
*vcpu
, unsigned long server
);
239 extern int xive_rm_h_ipi(struct kvm_vcpu
*vcpu
, unsigned long server
,
241 extern int xive_rm_h_cppr(struct kvm_vcpu
*vcpu
, unsigned long cppr
);
242 extern int xive_rm_h_eoi(struct kvm_vcpu
*vcpu
, unsigned long xirr
);
244 extern unsigned long (*__xive_vm_h_xirr
)(struct kvm_vcpu
*vcpu
);
245 extern unsigned long (*__xive_vm_h_ipoll
)(struct kvm_vcpu
*vcpu
, unsigned long server
);
246 extern int (*__xive_vm_h_ipi
)(struct kvm_vcpu
*vcpu
, unsigned long server
,
248 extern int (*__xive_vm_h_cppr
)(struct kvm_vcpu
*vcpu
, unsigned long cppr
);
249 extern int (*__xive_vm_h_eoi
)(struct kvm_vcpu
*vcpu
, unsigned long xirr
);
251 #endif /* CONFIG_KVM_XICS */
252 #endif /* _KVM_PPC_BOOK3S_XICS_H */