1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (c) 2017-2019, IBM Corporation.
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun #define pr_fmt(fmt) "xive-kvm: " fmt
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/kernel.h>
9*4882a593Smuzhiyun #include <linux/kvm_host.h>
10*4882a593Smuzhiyun #include <linux/err.h>
11*4882a593Smuzhiyun #include <linux/gfp.h>
12*4882a593Smuzhiyun #include <linux/spinlock.h>
13*4882a593Smuzhiyun #include <linux/delay.h>
14*4882a593Smuzhiyun #include <linux/file.h>
15*4882a593Smuzhiyun #include <asm/uaccess.h>
16*4882a593Smuzhiyun #include <asm/kvm_book3s.h>
17*4882a593Smuzhiyun #include <asm/kvm_ppc.h>
18*4882a593Smuzhiyun #include <asm/hvcall.h>
19*4882a593Smuzhiyun #include <asm/xive.h>
20*4882a593Smuzhiyun #include <asm/xive-regs.h>
21*4882a593Smuzhiyun #include <asm/debug.h>
22*4882a593Smuzhiyun #include <asm/debugfs.h>
23*4882a593Smuzhiyun #include <asm/opal.h>
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #include <linux/debugfs.h>
26*4882a593Smuzhiyun #include <linux/seq_file.h>
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #include "book3s_xive.h"
29*4882a593Smuzhiyun
xive_vm_esb_load(struct xive_irq_data * xd,u32 offset)30*4882a593Smuzhiyun static u8 xive_vm_esb_load(struct xive_irq_data *xd, u32 offset)
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun u64 val;
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun /*
35*4882a593Smuzhiyun * The KVM XIVE native device does not use the XIVE_ESB_SET_PQ_10
36*4882a593Smuzhiyun * load operation, so there is no need to enforce load-after-store
37*4882a593Smuzhiyun * ordering.
38*4882a593Smuzhiyun */
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun if (xd->flags & XIVE_IRQ_FLAG_SHIFT_BUG)
41*4882a593Smuzhiyun offset |= offset << 4;
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun val = in_be64(xd->eoi_mmio + offset);
44*4882a593Smuzhiyun return (u8)val;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun
kvmppc_xive_native_cleanup_queue(struct kvm_vcpu * vcpu,int prio)47*4882a593Smuzhiyun static void kvmppc_xive_native_cleanup_queue(struct kvm_vcpu *vcpu, int prio)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
50*4882a593Smuzhiyun struct xive_q *q = &xc->queues[prio];
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun xive_native_disable_queue(xc->vp_id, q, prio);
53*4882a593Smuzhiyun if (q->qpage) {
54*4882a593Smuzhiyun put_page(virt_to_page(q->qpage));
55*4882a593Smuzhiyun q->qpage = NULL;
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
kvmppc_xive_native_configure_queue(u32 vp_id,struct xive_q * q,u8 prio,__be32 * qpage,u32 order,bool can_escalate)59*4882a593Smuzhiyun static int kvmppc_xive_native_configure_queue(u32 vp_id, struct xive_q *q,
60*4882a593Smuzhiyun u8 prio, __be32 *qpage,
61*4882a593Smuzhiyun u32 order, bool can_escalate)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun int rc;
64*4882a593Smuzhiyun __be32 *qpage_prev = q->qpage;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun rc = xive_native_configure_queue(vp_id, q, prio, qpage, order,
67*4882a593Smuzhiyun can_escalate);
68*4882a593Smuzhiyun if (rc)
69*4882a593Smuzhiyun return rc;
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun if (qpage_prev)
72*4882a593Smuzhiyun put_page(virt_to_page(qpage_prev));
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun return rc;
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
kvmppc_xive_native_cleanup_vcpu(struct kvm_vcpu * vcpu)77*4882a593Smuzhiyun void kvmppc_xive_native_cleanup_vcpu(struct kvm_vcpu *vcpu)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
80*4882a593Smuzhiyun int i;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun if (!kvmppc_xive_enabled(vcpu))
83*4882a593Smuzhiyun return;
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun if (!xc)
86*4882a593Smuzhiyun return;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun pr_devel("native_cleanup_vcpu(cpu=%d)\n", xc->server_num);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun /* Ensure no interrupt is still routed to that VP */
91*4882a593Smuzhiyun xc->valid = false;
92*4882a593Smuzhiyun kvmppc_xive_disable_vcpu_interrupts(vcpu);
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun /* Free escalations */
95*4882a593Smuzhiyun for (i = 0; i < KVMPPC_XIVE_Q_COUNT; i++) {
96*4882a593Smuzhiyun /* Free the escalation irq */
97*4882a593Smuzhiyun if (xc->esc_virq[i]) {
98*4882a593Smuzhiyun if (xc->xive->single_escalation)
99*4882a593Smuzhiyun xive_cleanup_single_escalation(vcpu, xc,
100*4882a593Smuzhiyun xc->esc_virq[i]);
101*4882a593Smuzhiyun free_irq(xc->esc_virq[i], vcpu);
102*4882a593Smuzhiyun irq_dispose_mapping(xc->esc_virq[i]);
103*4882a593Smuzhiyun kfree(xc->esc_virq_names[i]);
104*4882a593Smuzhiyun xc->esc_virq[i] = 0;
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun /* Disable the VP */
109*4882a593Smuzhiyun xive_native_disable_vp(xc->vp_id);
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun /* Clear the cam word so guest entry won't try to push context */
112*4882a593Smuzhiyun vcpu->arch.xive_cam_word = 0;
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun /* Free the queues */
115*4882a593Smuzhiyun for (i = 0; i < KVMPPC_XIVE_Q_COUNT; i++) {
116*4882a593Smuzhiyun kvmppc_xive_native_cleanup_queue(vcpu, i);
117*4882a593Smuzhiyun }
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun /* Free the VP */
120*4882a593Smuzhiyun kfree(xc);
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun /* Cleanup the vcpu */
123*4882a593Smuzhiyun vcpu->arch.irq_type = KVMPPC_IRQ_DEFAULT;
124*4882a593Smuzhiyun vcpu->arch.xive_vcpu = NULL;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
kvmppc_xive_native_connect_vcpu(struct kvm_device * dev,struct kvm_vcpu * vcpu,u32 server_num)127*4882a593Smuzhiyun int kvmppc_xive_native_connect_vcpu(struct kvm_device *dev,
128*4882a593Smuzhiyun struct kvm_vcpu *vcpu, u32 server_num)
129*4882a593Smuzhiyun {
130*4882a593Smuzhiyun struct kvmppc_xive *xive = dev->private;
131*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc = NULL;
132*4882a593Smuzhiyun int rc;
133*4882a593Smuzhiyun u32 vp_id;
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun pr_devel("native_connect_vcpu(server=%d)\n", server_num);
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun if (dev->ops != &kvm_xive_native_ops) {
138*4882a593Smuzhiyun pr_devel("Wrong ops !\n");
139*4882a593Smuzhiyun return -EPERM;
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun if (xive->kvm != vcpu->kvm)
142*4882a593Smuzhiyun return -EPERM;
143*4882a593Smuzhiyun if (vcpu->arch.irq_type != KVMPPC_IRQ_DEFAULT)
144*4882a593Smuzhiyun return -EBUSY;
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun mutex_lock(&xive->lock);
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun rc = kvmppc_xive_compute_vp_id(xive, server_num, &vp_id);
149*4882a593Smuzhiyun if (rc)
150*4882a593Smuzhiyun goto bail;
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun xc = kzalloc(sizeof(*xc), GFP_KERNEL);
153*4882a593Smuzhiyun if (!xc) {
154*4882a593Smuzhiyun rc = -ENOMEM;
155*4882a593Smuzhiyun goto bail;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun vcpu->arch.xive_vcpu = xc;
159*4882a593Smuzhiyun xc->xive = xive;
160*4882a593Smuzhiyun xc->vcpu = vcpu;
161*4882a593Smuzhiyun xc->server_num = server_num;
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun xc->vp_id = vp_id;
164*4882a593Smuzhiyun xc->valid = true;
165*4882a593Smuzhiyun vcpu->arch.irq_type = KVMPPC_IRQ_XIVE;
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun rc = xive_native_get_vp_info(xc->vp_id, &xc->vp_cam, &xc->vp_chip_id);
168*4882a593Smuzhiyun if (rc) {
169*4882a593Smuzhiyun pr_err("Failed to get VP info from OPAL: %d\n", rc);
170*4882a593Smuzhiyun goto bail;
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun /*
174*4882a593Smuzhiyun * Enable the VP first as the single escalation mode will
175*4882a593Smuzhiyun * affect escalation interrupts numbering
176*4882a593Smuzhiyun */
177*4882a593Smuzhiyun rc = xive_native_enable_vp(xc->vp_id, xive->single_escalation);
178*4882a593Smuzhiyun if (rc) {
179*4882a593Smuzhiyun pr_err("Failed to enable VP in OPAL: %d\n", rc);
180*4882a593Smuzhiyun goto bail;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun /* Configure VCPU fields for use by assembly push/pull */
184*4882a593Smuzhiyun vcpu->arch.xive_saved_state.w01 = cpu_to_be64(0xff000000);
185*4882a593Smuzhiyun vcpu->arch.xive_cam_word = cpu_to_be32(xc->vp_cam | TM_QW1W2_VO);
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun /* TODO: reset all queues to a clean state ? */
188*4882a593Smuzhiyun bail:
189*4882a593Smuzhiyun mutex_unlock(&xive->lock);
190*4882a593Smuzhiyun if (rc)
191*4882a593Smuzhiyun kvmppc_xive_native_cleanup_vcpu(vcpu);
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun return rc;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun /*
197*4882a593Smuzhiyun * Device passthrough support
198*4882a593Smuzhiyun */
kvmppc_xive_native_reset_mapped(struct kvm * kvm,unsigned long irq)199*4882a593Smuzhiyun static int kvmppc_xive_native_reset_mapped(struct kvm *kvm, unsigned long irq)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun struct kvmppc_xive *xive = kvm->arch.xive;
202*4882a593Smuzhiyun pgoff_t esb_pgoff = KVM_XIVE_ESB_PAGE_OFFSET + irq * 2;
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun if (irq >= KVMPPC_XIVE_NR_IRQS)
205*4882a593Smuzhiyun return -EINVAL;
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun /*
208*4882a593Smuzhiyun * Clear the ESB pages of the IRQ number being mapped (or
209*4882a593Smuzhiyun * unmapped) into the guest and let the the VM fault handler
210*4882a593Smuzhiyun * repopulate with the appropriate ESB pages (device or IC)
211*4882a593Smuzhiyun */
212*4882a593Smuzhiyun pr_debug("clearing esb pages for girq 0x%lx\n", irq);
213*4882a593Smuzhiyun mutex_lock(&xive->mapping_lock);
214*4882a593Smuzhiyun if (xive->mapping)
215*4882a593Smuzhiyun unmap_mapping_range(xive->mapping,
216*4882a593Smuzhiyun esb_pgoff << PAGE_SHIFT,
217*4882a593Smuzhiyun 2ull << PAGE_SHIFT, 1);
218*4882a593Smuzhiyun mutex_unlock(&xive->mapping_lock);
219*4882a593Smuzhiyun return 0;
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun static struct kvmppc_xive_ops kvmppc_xive_native_ops = {
223*4882a593Smuzhiyun .reset_mapped = kvmppc_xive_native_reset_mapped,
224*4882a593Smuzhiyun };
225*4882a593Smuzhiyun
xive_native_esb_fault(struct vm_fault * vmf)226*4882a593Smuzhiyun static vm_fault_t xive_native_esb_fault(struct vm_fault *vmf)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun struct vm_area_struct *vma = vmf->vma;
229*4882a593Smuzhiyun struct kvm_device *dev = vma->vm_file->private_data;
230*4882a593Smuzhiyun struct kvmppc_xive *xive = dev->private;
231*4882a593Smuzhiyun struct kvmppc_xive_src_block *sb;
232*4882a593Smuzhiyun struct kvmppc_xive_irq_state *state;
233*4882a593Smuzhiyun struct xive_irq_data *xd;
234*4882a593Smuzhiyun u32 hw_num;
235*4882a593Smuzhiyun u16 src;
236*4882a593Smuzhiyun u64 page;
237*4882a593Smuzhiyun unsigned long irq;
238*4882a593Smuzhiyun u64 page_offset;
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun /*
241*4882a593Smuzhiyun * Linux/KVM uses a two pages ESB setting, one for trigger and
242*4882a593Smuzhiyun * one for EOI
243*4882a593Smuzhiyun */
244*4882a593Smuzhiyun page_offset = vmf->pgoff - vma->vm_pgoff;
245*4882a593Smuzhiyun irq = page_offset / 2;
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun sb = kvmppc_xive_find_source(xive, irq, &src);
248*4882a593Smuzhiyun if (!sb) {
249*4882a593Smuzhiyun pr_devel("%s: source %lx not found !\n", __func__, irq);
250*4882a593Smuzhiyun return VM_FAULT_SIGBUS;
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun state = &sb->irq_state[src];
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun /* Some sanity checking */
256*4882a593Smuzhiyun if (!state->valid) {
257*4882a593Smuzhiyun pr_devel("%s: source %lx invalid !\n", __func__, irq);
258*4882a593Smuzhiyun return VM_FAULT_SIGBUS;
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun kvmppc_xive_select_irq(state, &hw_num, &xd);
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun arch_spin_lock(&sb->lock);
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun /*
266*4882a593Smuzhiyun * first/even page is for trigger
267*4882a593Smuzhiyun * second/odd page is for EOI and management.
268*4882a593Smuzhiyun */
269*4882a593Smuzhiyun page = page_offset % 2 ? xd->eoi_page : xd->trig_page;
270*4882a593Smuzhiyun arch_spin_unlock(&sb->lock);
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun if (WARN_ON(!page)) {
273*4882a593Smuzhiyun pr_err("%s: accessing invalid ESB page for source %lx !\n",
274*4882a593Smuzhiyun __func__, irq);
275*4882a593Smuzhiyun return VM_FAULT_SIGBUS;
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun vmf_insert_pfn(vma, vmf->address, page >> PAGE_SHIFT);
279*4882a593Smuzhiyun return VM_FAULT_NOPAGE;
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun static const struct vm_operations_struct xive_native_esb_vmops = {
283*4882a593Smuzhiyun .fault = xive_native_esb_fault,
284*4882a593Smuzhiyun };
285*4882a593Smuzhiyun
xive_native_tima_fault(struct vm_fault * vmf)286*4882a593Smuzhiyun static vm_fault_t xive_native_tima_fault(struct vm_fault *vmf)
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun struct vm_area_struct *vma = vmf->vma;
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun switch (vmf->pgoff - vma->vm_pgoff) {
291*4882a593Smuzhiyun case 0: /* HW - forbid access */
292*4882a593Smuzhiyun case 1: /* HV - forbid access */
293*4882a593Smuzhiyun return VM_FAULT_SIGBUS;
294*4882a593Smuzhiyun case 2: /* OS */
295*4882a593Smuzhiyun vmf_insert_pfn(vma, vmf->address, xive_tima_os >> PAGE_SHIFT);
296*4882a593Smuzhiyun return VM_FAULT_NOPAGE;
297*4882a593Smuzhiyun case 3: /* USER - TODO */
298*4882a593Smuzhiyun default:
299*4882a593Smuzhiyun return VM_FAULT_SIGBUS;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun static const struct vm_operations_struct xive_native_tima_vmops = {
304*4882a593Smuzhiyun .fault = xive_native_tima_fault,
305*4882a593Smuzhiyun };
306*4882a593Smuzhiyun
kvmppc_xive_native_mmap(struct kvm_device * dev,struct vm_area_struct * vma)307*4882a593Smuzhiyun static int kvmppc_xive_native_mmap(struct kvm_device *dev,
308*4882a593Smuzhiyun struct vm_area_struct *vma)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun struct kvmppc_xive *xive = dev->private;
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun /* We only allow mappings at fixed offset for now */
313*4882a593Smuzhiyun if (vma->vm_pgoff == KVM_XIVE_TIMA_PAGE_OFFSET) {
314*4882a593Smuzhiyun if (vma_pages(vma) > 4)
315*4882a593Smuzhiyun return -EINVAL;
316*4882a593Smuzhiyun vma->vm_ops = &xive_native_tima_vmops;
317*4882a593Smuzhiyun } else if (vma->vm_pgoff == KVM_XIVE_ESB_PAGE_OFFSET) {
318*4882a593Smuzhiyun if (vma_pages(vma) > KVMPPC_XIVE_NR_IRQS * 2)
319*4882a593Smuzhiyun return -EINVAL;
320*4882a593Smuzhiyun vma->vm_ops = &xive_native_esb_vmops;
321*4882a593Smuzhiyun } else {
322*4882a593Smuzhiyun return -EINVAL;
323*4882a593Smuzhiyun }
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun vma->vm_flags |= VM_IO | VM_PFNMAP;
326*4882a593Smuzhiyun vma->vm_page_prot = pgprot_noncached_wc(vma->vm_page_prot);
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun /*
329*4882a593Smuzhiyun * Grab the KVM device file address_space to be able to clear
330*4882a593Smuzhiyun * the ESB pages mapping when a device is passed-through into
331*4882a593Smuzhiyun * the guest.
332*4882a593Smuzhiyun */
333*4882a593Smuzhiyun xive->mapping = vma->vm_file->f_mapping;
334*4882a593Smuzhiyun return 0;
335*4882a593Smuzhiyun }
336*4882a593Smuzhiyun
kvmppc_xive_native_set_source(struct kvmppc_xive * xive,long irq,u64 addr)337*4882a593Smuzhiyun static int kvmppc_xive_native_set_source(struct kvmppc_xive *xive, long irq,
338*4882a593Smuzhiyun u64 addr)
339*4882a593Smuzhiyun {
340*4882a593Smuzhiyun struct kvmppc_xive_src_block *sb;
341*4882a593Smuzhiyun struct kvmppc_xive_irq_state *state;
342*4882a593Smuzhiyun u64 __user *ubufp = (u64 __user *) addr;
343*4882a593Smuzhiyun u64 val;
344*4882a593Smuzhiyun u16 idx;
345*4882a593Smuzhiyun int rc;
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun pr_devel("%s irq=0x%lx\n", __func__, irq);
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun if (irq < KVMPPC_XIVE_FIRST_IRQ || irq >= KVMPPC_XIVE_NR_IRQS)
350*4882a593Smuzhiyun return -E2BIG;
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun sb = kvmppc_xive_find_source(xive, irq, &idx);
353*4882a593Smuzhiyun if (!sb) {
354*4882a593Smuzhiyun pr_debug("No source, creating source block...\n");
355*4882a593Smuzhiyun sb = kvmppc_xive_create_src_block(xive, irq);
356*4882a593Smuzhiyun if (!sb) {
357*4882a593Smuzhiyun pr_err("Failed to create block...\n");
358*4882a593Smuzhiyun return -ENOMEM;
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun }
361*4882a593Smuzhiyun state = &sb->irq_state[idx];
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun if (get_user(val, ubufp)) {
364*4882a593Smuzhiyun pr_err("fault getting user info !\n");
365*4882a593Smuzhiyun return -EFAULT;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun arch_spin_lock(&sb->lock);
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun /*
371*4882a593Smuzhiyun * If the source doesn't already have an IPI, allocate
372*4882a593Smuzhiyun * one and get the corresponding data
373*4882a593Smuzhiyun */
374*4882a593Smuzhiyun if (!state->ipi_number) {
375*4882a593Smuzhiyun state->ipi_number = xive_native_alloc_irq();
376*4882a593Smuzhiyun if (state->ipi_number == 0) {
377*4882a593Smuzhiyun pr_err("Failed to allocate IRQ !\n");
378*4882a593Smuzhiyun rc = -ENXIO;
379*4882a593Smuzhiyun goto unlock;
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun xive_native_populate_irq_data(state->ipi_number,
382*4882a593Smuzhiyun &state->ipi_data);
383*4882a593Smuzhiyun pr_debug("%s allocated hw_irq=0x%x for irq=0x%lx\n", __func__,
384*4882a593Smuzhiyun state->ipi_number, irq);
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun /* Restore LSI state */
388*4882a593Smuzhiyun if (val & KVM_XIVE_LEVEL_SENSITIVE) {
389*4882a593Smuzhiyun state->lsi = true;
390*4882a593Smuzhiyun if (val & KVM_XIVE_LEVEL_ASSERTED)
391*4882a593Smuzhiyun state->asserted = true;
392*4882a593Smuzhiyun pr_devel(" LSI ! Asserted=%d\n", state->asserted);
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun /* Mask IRQ to start with */
396*4882a593Smuzhiyun state->act_server = 0;
397*4882a593Smuzhiyun state->act_priority = MASKED;
398*4882a593Smuzhiyun xive_vm_esb_load(&state->ipi_data, XIVE_ESB_SET_PQ_01);
399*4882a593Smuzhiyun xive_native_configure_irq(state->ipi_number, 0, MASKED, 0);
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun /* Increment the number of valid sources and mark this one valid */
402*4882a593Smuzhiyun if (!state->valid)
403*4882a593Smuzhiyun xive->src_count++;
404*4882a593Smuzhiyun state->valid = true;
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun rc = 0;
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun unlock:
409*4882a593Smuzhiyun arch_spin_unlock(&sb->lock);
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun return rc;
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun
kvmppc_xive_native_update_source_config(struct kvmppc_xive * xive,struct kvmppc_xive_src_block * sb,struct kvmppc_xive_irq_state * state,u32 server,u8 priority,bool masked,u32 eisn)414*4882a593Smuzhiyun static int kvmppc_xive_native_update_source_config(struct kvmppc_xive *xive,
415*4882a593Smuzhiyun struct kvmppc_xive_src_block *sb,
416*4882a593Smuzhiyun struct kvmppc_xive_irq_state *state,
417*4882a593Smuzhiyun u32 server, u8 priority, bool masked,
418*4882a593Smuzhiyun u32 eisn)
419*4882a593Smuzhiyun {
420*4882a593Smuzhiyun struct kvm *kvm = xive->kvm;
421*4882a593Smuzhiyun u32 hw_num;
422*4882a593Smuzhiyun int rc = 0;
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun arch_spin_lock(&sb->lock);
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun if (state->act_server == server && state->act_priority == priority &&
427*4882a593Smuzhiyun state->eisn == eisn)
428*4882a593Smuzhiyun goto unlock;
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun pr_devel("new_act_prio=%d new_act_server=%d mask=%d act_server=%d act_prio=%d\n",
431*4882a593Smuzhiyun priority, server, masked, state->act_server,
432*4882a593Smuzhiyun state->act_priority);
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun kvmppc_xive_select_irq(state, &hw_num, NULL);
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun if (priority != MASKED && !masked) {
437*4882a593Smuzhiyun rc = kvmppc_xive_select_target(kvm, &server, priority);
438*4882a593Smuzhiyun if (rc)
439*4882a593Smuzhiyun goto unlock;
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun state->act_priority = priority;
442*4882a593Smuzhiyun state->act_server = server;
443*4882a593Smuzhiyun state->eisn = eisn;
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun rc = xive_native_configure_irq(hw_num,
446*4882a593Smuzhiyun kvmppc_xive_vp(xive, server),
447*4882a593Smuzhiyun priority, eisn);
448*4882a593Smuzhiyun } else {
449*4882a593Smuzhiyun state->act_priority = MASKED;
450*4882a593Smuzhiyun state->act_server = 0;
451*4882a593Smuzhiyun state->eisn = 0;
452*4882a593Smuzhiyun
453*4882a593Smuzhiyun rc = xive_native_configure_irq(hw_num, 0, MASKED, 0);
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun
456*4882a593Smuzhiyun unlock:
457*4882a593Smuzhiyun arch_spin_unlock(&sb->lock);
458*4882a593Smuzhiyun return rc;
459*4882a593Smuzhiyun }
460*4882a593Smuzhiyun
kvmppc_xive_native_set_source_config(struct kvmppc_xive * xive,long irq,u64 addr)461*4882a593Smuzhiyun static int kvmppc_xive_native_set_source_config(struct kvmppc_xive *xive,
462*4882a593Smuzhiyun long irq, u64 addr)
463*4882a593Smuzhiyun {
464*4882a593Smuzhiyun struct kvmppc_xive_src_block *sb;
465*4882a593Smuzhiyun struct kvmppc_xive_irq_state *state;
466*4882a593Smuzhiyun u64 __user *ubufp = (u64 __user *) addr;
467*4882a593Smuzhiyun u16 src;
468*4882a593Smuzhiyun u64 kvm_cfg;
469*4882a593Smuzhiyun u32 server;
470*4882a593Smuzhiyun u8 priority;
471*4882a593Smuzhiyun bool masked;
472*4882a593Smuzhiyun u32 eisn;
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun sb = kvmppc_xive_find_source(xive, irq, &src);
475*4882a593Smuzhiyun if (!sb)
476*4882a593Smuzhiyun return -ENOENT;
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun state = &sb->irq_state[src];
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun if (!state->valid)
481*4882a593Smuzhiyun return -EINVAL;
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun if (get_user(kvm_cfg, ubufp))
484*4882a593Smuzhiyun return -EFAULT;
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun pr_devel("%s irq=0x%lx cfg=%016llx\n", __func__, irq, kvm_cfg);
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun priority = (kvm_cfg & KVM_XIVE_SOURCE_PRIORITY_MASK) >>
489*4882a593Smuzhiyun KVM_XIVE_SOURCE_PRIORITY_SHIFT;
490*4882a593Smuzhiyun server = (kvm_cfg & KVM_XIVE_SOURCE_SERVER_MASK) >>
491*4882a593Smuzhiyun KVM_XIVE_SOURCE_SERVER_SHIFT;
492*4882a593Smuzhiyun masked = (kvm_cfg & KVM_XIVE_SOURCE_MASKED_MASK) >>
493*4882a593Smuzhiyun KVM_XIVE_SOURCE_MASKED_SHIFT;
494*4882a593Smuzhiyun eisn = (kvm_cfg & KVM_XIVE_SOURCE_EISN_MASK) >>
495*4882a593Smuzhiyun KVM_XIVE_SOURCE_EISN_SHIFT;
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun if (priority != xive_prio_from_guest(priority)) {
498*4882a593Smuzhiyun pr_err("invalid priority for queue %d for VCPU %d\n",
499*4882a593Smuzhiyun priority, server);
500*4882a593Smuzhiyun return -EINVAL;
501*4882a593Smuzhiyun }
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun return kvmppc_xive_native_update_source_config(xive, sb, state, server,
504*4882a593Smuzhiyun priority, masked, eisn);
505*4882a593Smuzhiyun }
506*4882a593Smuzhiyun
kvmppc_xive_native_sync_source(struct kvmppc_xive * xive,long irq,u64 addr)507*4882a593Smuzhiyun static int kvmppc_xive_native_sync_source(struct kvmppc_xive *xive,
508*4882a593Smuzhiyun long irq, u64 addr)
509*4882a593Smuzhiyun {
510*4882a593Smuzhiyun struct kvmppc_xive_src_block *sb;
511*4882a593Smuzhiyun struct kvmppc_xive_irq_state *state;
512*4882a593Smuzhiyun struct xive_irq_data *xd;
513*4882a593Smuzhiyun u32 hw_num;
514*4882a593Smuzhiyun u16 src;
515*4882a593Smuzhiyun int rc = 0;
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun pr_devel("%s irq=0x%lx", __func__, irq);
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun sb = kvmppc_xive_find_source(xive, irq, &src);
520*4882a593Smuzhiyun if (!sb)
521*4882a593Smuzhiyun return -ENOENT;
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun state = &sb->irq_state[src];
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun rc = -EINVAL;
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun arch_spin_lock(&sb->lock);
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun if (state->valid) {
530*4882a593Smuzhiyun kvmppc_xive_select_irq(state, &hw_num, &xd);
531*4882a593Smuzhiyun xive_native_sync_source(hw_num);
532*4882a593Smuzhiyun rc = 0;
533*4882a593Smuzhiyun }
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun arch_spin_unlock(&sb->lock);
536*4882a593Smuzhiyun return rc;
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun
xive_native_validate_queue_size(u32 qshift)539*4882a593Smuzhiyun static int xive_native_validate_queue_size(u32 qshift)
540*4882a593Smuzhiyun {
541*4882a593Smuzhiyun /*
542*4882a593Smuzhiyun * We only support 64K pages for the moment. This is also
543*4882a593Smuzhiyun * advertised in the DT property "ibm,xive-eq-sizes"
544*4882a593Smuzhiyun */
545*4882a593Smuzhiyun switch (qshift) {
546*4882a593Smuzhiyun case 0: /* EQ reset */
547*4882a593Smuzhiyun case 16:
548*4882a593Smuzhiyun return 0;
549*4882a593Smuzhiyun case 12:
550*4882a593Smuzhiyun case 21:
551*4882a593Smuzhiyun case 24:
552*4882a593Smuzhiyun default:
553*4882a593Smuzhiyun return -EINVAL;
554*4882a593Smuzhiyun }
555*4882a593Smuzhiyun }
556*4882a593Smuzhiyun
kvmppc_xive_native_set_queue_config(struct kvmppc_xive * xive,long eq_idx,u64 addr)557*4882a593Smuzhiyun static int kvmppc_xive_native_set_queue_config(struct kvmppc_xive *xive,
558*4882a593Smuzhiyun long eq_idx, u64 addr)
559*4882a593Smuzhiyun {
560*4882a593Smuzhiyun struct kvm *kvm = xive->kvm;
561*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
562*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc;
563*4882a593Smuzhiyun void __user *ubufp = (void __user *) addr;
564*4882a593Smuzhiyun u32 server;
565*4882a593Smuzhiyun u8 priority;
566*4882a593Smuzhiyun struct kvm_ppc_xive_eq kvm_eq;
567*4882a593Smuzhiyun int rc;
568*4882a593Smuzhiyun __be32 *qaddr = 0;
569*4882a593Smuzhiyun struct page *page;
570*4882a593Smuzhiyun struct xive_q *q;
571*4882a593Smuzhiyun gfn_t gfn;
572*4882a593Smuzhiyun unsigned long page_size;
573*4882a593Smuzhiyun int srcu_idx;
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun /*
576*4882a593Smuzhiyun * Demangle priority/server tuple from the EQ identifier
577*4882a593Smuzhiyun */
578*4882a593Smuzhiyun priority = (eq_idx & KVM_XIVE_EQ_PRIORITY_MASK) >>
579*4882a593Smuzhiyun KVM_XIVE_EQ_PRIORITY_SHIFT;
580*4882a593Smuzhiyun server = (eq_idx & KVM_XIVE_EQ_SERVER_MASK) >>
581*4882a593Smuzhiyun KVM_XIVE_EQ_SERVER_SHIFT;
582*4882a593Smuzhiyun
583*4882a593Smuzhiyun if (copy_from_user(&kvm_eq, ubufp, sizeof(kvm_eq)))
584*4882a593Smuzhiyun return -EFAULT;
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun vcpu = kvmppc_xive_find_server(kvm, server);
587*4882a593Smuzhiyun if (!vcpu) {
588*4882a593Smuzhiyun pr_err("Can't find server %d\n", server);
589*4882a593Smuzhiyun return -ENOENT;
590*4882a593Smuzhiyun }
591*4882a593Smuzhiyun xc = vcpu->arch.xive_vcpu;
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun if (priority != xive_prio_from_guest(priority)) {
594*4882a593Smuzhiyun pr_err("Trying to restore invalid queue %d for VCPU %d\n",
595*4882a593Smuzhiyun priority, server);
596*4882a593Smuzhiyun return -EINVAL;
597*4882a593Smuzhiyun }
598*4882a593Smuzhiyun q = &xc->queues[priority];
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun pr_devel("%s VCPU %d priority %d fl:%x shift:%d addr:%llx g:%d idx:%d\n",
601*4882a593Smuzhiyun __func__, server, priority, kvm_eq.flags,
602*4882a593Smuzhiyun kvm_eq.qshift, kvm_eq.qaddr, kvm_eq.qtoggle, kvm_eq.qindex);
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun /* reset queue and disable queueing */
605*4882a593Smuzhiyun if (!kvm_eq.qshift) {
606*4882a593Smuzhiyun q->guest_qaddr = 0;
607*4882a593Smuzhiyun q->guest_qshift = 0;
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun rc = kvmppc_xive_native_configure_queue(xc->vp_id, q, priority,
610*4882a593Smuzhiyun NULL, 0, true);
611*4882a593Smuzhiyun if (rc) {
612*4882a593Smuzhiyun pr_err("Failed to reset queue %d for VCPU %d: %d\n",
613*4882a593Smuzhiyun priority, xc->server_num, rc);
614*4882a593Smuzhiyun return rc;
615*4882a593Smuzhiyun }
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun return 0;
618*4882a593Smuzhiyun }
619*4882a593Smuzhiyun
620*4882a593Smuzhiyun /*
621*4882a593Smuzhiyun * sPAPR specifies a "Unconditional Notify (n) flag" for the
622*4882a593Smuzhiyun * H_INT_SET_QUEUE_CONFIG hcall which forces notification
623*4882a593Smuzhiyun * without using the coalescing mechanisms provided by the
624*4882a593Smuzhiyun * XIVE END ESBs. This is required on KVM as notification
625*4882a593Smuzhiyun * using the END ESBs is not supported.
626*4882a593Smuzhiyun */
627*4882a593Smuzhiyun if (kvm_eq.flags != KVM_XIVE_EQ_ALWAYS_NOTIFY) {
628*4882a593Smuzhiyun pr_err("invalid flags %d\n", kvm_eq.flags);
629*4882a593Smuzhiyun return -EINVAL;
630*4882a593Smuzhiyun }
631*4882a593Smuzhiyun
632*4882a593Smuzhiyun rc = xive_native_validate_queue_size(kvm_eq.qshift);
633*4882a593Smuzhiyun if (rc) {
634*4882a593Smuzhiyun pr_err("invalid queue size %d\n", kvm_eq.qshift);
635*4882a593Smuzhiyun return rc;
636*4882a593Smuzhiyun }
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun if (kvm_eq.qaddr & ((1ull << kvm_eq.qshift) - 1)) {
639*4882a593Smuzhiyun pr_err("queue page is not aligned %llx/%llx\n", kvm_eq.qaddr,
640*4882a593Smuzhiyun 1ull << kvm_eq.qshift);
641*4882a593Smuzhiyun return -EINVAL;
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun srcu_idx = srcu_read_lock(&kvm->srcu);
645*4882a593Smuzhiyun gfn = gpa_to_gfn(kvm_eq.qaddr);
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun page_size = kvm_host_page_size(vcpu, gfn);
648*4882a593Smuzhiyun if (1ull << kvm_eq.qshift > page_size) {
649*4882a593Smuzhiyun srcu_read_unlock(&kvm->srcu, srcu_idx);
650*4882a593Smuzhiyun pr_warn("Incompatible host page size %lx!\n", page_size);
651*4882a593Smuzhiyun return -EINVAL;
652*4882a593Smuzhiyun }
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun page = gfn_to_page(kvm, gfn);
655*4882a593Smuzhiyun if (is_error_page(page)) {
656*4882a593Smuzhiyun srcu_read_unlock(&kvm->srcu, srcu_idx);
657*4882a593Smuzhiyun pr_err("Couldn't get queue page %llx!\n", kvm_eq.qaddr);
658*4882a593Smuzhiyun return -EINVAL;
659*4882a593Smuzhiyun }
660*4882a593Smuzhiyun
661*4882a593Smuzhiyun qaddr = page_to_virt(page) + (kvm_eq.qaddr & ~PAGE_MASK);
662*4882a593Smuzhiyun srcu_read_unlock(&kvm->srcu, srcu_idx);
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun /*
665*4882a593Smuzhiyun * Backup the queue page guest address to the mark EQ page
666*4882a593Smuzhiyun * dirty for migration.
667*4882a593Smuzhiyun */
668*4882a593Smuzhiyun q->guest_qaddr = kvm_eq.qaddr;
669*4882a593Smuzhiyun q->guest_qshift = kvm_eq.qshift;
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun /*
672*4882a593Smuzhiyun * Unconditional Notification is forced by default at the
673*4882a593Smuzhiyun * OPAL level because the use of END ESBs is not supported by
674*4882a593Smuzhiyun * Linux.
675*4882a593Smuzhiyun */
676*4882a593Smuzhiyun rc = kvmppc_xive_native_configure_queue(xc->vp_id, q, priority,
677*4882a593Smuzhiyun (__be32 *) qaddr, kvm_eq.qshift, true);
678*4882a593Smuzhiyun if (rc) {
679*4882a593Smuzhiyun pr_err("Failed to configure queue %d for VCPU %d: %d\n",
680*4882a593Smuzhiyun priority, xc->server_num, rc);
681*4882a593Smuzhiyun put_page(page);
682*4882a593Smuzhiyun return rc;
683*4882a593Smuzhiyun }
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun /*
686*4882a593Smuzhiyun * Only restore the queue state when needed. When doing the
687*4882a593Smuzhiyun * H_INT_SET_SOURCE_CONFIG hcall, it should not.
688*4882a593Smuzhiyun */
689*4882a593Smuzhiyun if (kvm_eq.qtoggle != 1 || kvm_eq.qindex != 0) {
690*4882a593Smuzhiyun rc = xive_native_set_queue_state(xc->vp_id, priority,
691*4882a593Smuzhiyun kvm_eq.qtoggle,
692*4882a593Smuzhiyun kvm_eq.qindex);
693*4882a593Smuzhiyun if (rc)
694*4882a593Smuzhiyun goto error;
695*4882a593Smuzhiyun }
696*4882a593Smuzhiyun
697*4882a593Smuzhiyun rc = kvmppc_xive_attach_escalation(vcpu, priority,
698*4882a593Smuzhiyun xive->single_escalation);
699*4882a593Smuzhiyun error:
700*4882a593Smuzhiyun if (rc)
701*4882a593Smuzhiyun kvmppc_xive_native_cleanup_queue(vcpu, priority);
702*4882a593Smuzhiyun return rc;
703*4882a593Smuzhiyun }
704*4882a593Smuzhiyun
kvmppc_xive_native_get_queue_config(struct kvmppc_xive * xive,long eq_idx,u64 addr)705*4882a593Smuzhiyun static int kvmppc_xive_native_get_queue_config(struct kvmppc_xive *xive,
706*4882a593Smuzhiyun long eq_idx, u64 addr)
707*4882a593Smuzhiyun {
708*4882a593Smuzhiyun struct kvm *kvm = xive->kvm;
709*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
710*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc;
711*4882a593Smuzhiyun struct xive_q *q;
712*4882a593Smuzhiyun void __user *ubufp = (u64 __user *) addr;
713*4882a593Smuzhiyun u32 server;
714*4882a593Smuzhiyun u8 priority;
715*4882a593Smuzhiyun struct kvm_ppc_xive_eq kvm_eq;
716*4882a593Smuzhiyun u64 qaddr;
717*4882a593Smuzhiyun u64 qshift;
718*4882a593Smuzhiyun u64 qeoi_page;
719*4882a593Smuzhiyun u32 escalate_irq;
720*4882a593Smuzhiyun u64 qflags;
721*4882a593Smuzhiyun int rc;
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun /*
724*4882a593Smuzhiyun * Demangle priority/server tuple from the EQ identifier
725*4882a593Smuzhiyun */
726*4882a593Smuzhiyun priority = (eq_idx & KVM_XIVE_EQ_PRIORITY_MASK) >>
727*4882a593Smuzhiyun KVM_XIVE_EQ_PRIORITY_SHIFT;
728*4882a593Smuzhiyun server = (eq_idx & KVM_XIVE_EQ_SERVER_MASK) >>
729*4882a593Smuzhiyun KVM_XIVE_EQ_SERVER_SHIFT;
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun vcpu = kvmppc_xive_find_server(kvm, server);
732*4882a593Smuzhiyun if (!vcpu) {
733*4882a593Smuzhiyun pr_err("Can't find server %d\n", server);
734*4882a593Smuzhiyun return -ENOENT;
735*4882a593Smuzhiyun }
736*4882a593Smuzhiyun xc = vcpu->arch.xive_vcpu;
737*4882a593Smuzhiyun
738*4882a593Smuzhiyun if (priority != xive_prio_from_guest(priority)) {
739*4882a593Smuzhiyun pr_err("invalid priority for queue %d for VCPU %d\n",
740*4882a593Smuzhiyun priority, server);
741*4882a593Smuzhiyun return -EINVAL;
742*4882a593Smuzhiyun }
743*4882a593Smuzhiyun q = &xc->queues[priority];
744*4882a593Smuzhiyun
745*4882a593Smuzhiyun memset(&kvm_eq, 0, sizeof(kvm_eq));
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun if (!q->qpage)
748*4882a593Smuzhiyun return 0;
749*4882a593Smuzhiyun
750*4882a593Smuzhiyun rc = xive_native_get_queue_info(xc->vp_id, priority, &qaddr, &qshift,
751*4882a593Smuzhiyun &qeoi_page, &escalate_irq, &qflags);
752*4882a593Smuzhiyun if (rc)
753*4882a593Smuzhiyun return rc;
754*4882a593Smuzhiyun
755*4882a593Smuzhiyun kvm_eq.flags = 0;
756*4882a593Smuzhiyun if (qflags & OPAL_XIVE_EQ_ALWAYS_NOTIFY)
757*4882a593Smuzhiyun kvm_eq.flags |= KVM_XIVE_EQ_ALWAYS_NOTIFY;
758*4882a593Smuzhiyun
759*4882a593Smuzhiyun kvm_eq.qshift = q->guest_qshift;
760*4882a593Smuzhiyun kvm_eq.qaddr = q->guest_qaddr;
761*4882a593Smuzhiyun
762*4882a593Smuzhiyun rc = xive_native_get_queue_state(xc->vp_id, priority, &kvm_eq.qtoggle,
763*4882a593Smuzhiyun &kvm_eq.qindex);
764*4882a593Smuzhiyun if (rc)
765*4882a593Smuzhiyun return rc;
766*4882a593Smuzhiyun
767*4882a593Smuzhiyun pr_devel("%s VCPU %d priority %d fl:%x shift:%d addr:%llx g:%d idx:%d\n",
768*4882a593Smuzhiyun __func__, server, priority, kvm_eq.flags,
769*4882a593Smuzhiyun kvm_eq.qshift, kvm_eq.qaddr, kvm_eq.qtoggle, kvm_eq.qindex);
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun if (copy_to_user(ubufp, &kvm_eq, sizeof(kvm_eq)))
772*4882a593Smuzhiyun return -EFAULT;
773*4882a593Smuzhiyun
774*4882a593Smuzhiyun return 0;
775*4882a593Smuzhiyun }
776*4882a593Smuzhiyun
kvmppc_xive_reset_sources(struct kvmppc_xive_src_block * sb)777*4882a593Smuzhiyun static void kvmppc_xive_reset_sources(struct kvmppc_xive_src_block *sb)
778*4882a593Smuzhiyun {
779*4882a593Smuzhiyun int i;
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
782*4882a593Smuzhiyun struct kvmppc_xive_irq_state *state = &sb->irq_state[i];
783*4882a593Smuzhiyun
784*4882a593Smuzhiyun if (!state->valid)
785*4882a593Smuzhiyun continue;
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun if (state->act_priority == MASKED)
788*4882a593Smuzhiyun continue;
789*4882a593Smuzhiyun
790*4882a593Smuzhiyun state->eisn = 0;
791*4882a593Smuzhiyun state->act_server = 0;
792*4882a593Smuzhiyun state->act_priority = MASKED;
793*4882a593Smuzhiyun xive_vm_esb_load(&state->ipi_data, XIVE_ESB_SET_PQ_01);
794*4882a593Smuzhiyun xive_native_configure_irq(state->ipi_number, 0, MASKED, 0);
795*4882a593Smuzhiyun if (state->pt_number) {
796*4882a593Smuzhiyun xive_vm_esb_load(state->pt_data, XIVE_ESB_SET_PQ_01);
797*4882a593Smuzhiyun xive_native_configure_irq(state->pt_number,
798*4882a593Smuzhiyun 0, MASKED, 0);
799*4882a593Smuzhiyun }
800*4882a593Smuzhiyun }
801*4882a593Smuzhiyun }
802*4882a593Smuzhiyun
kvmppc_xive_reset(struct kvmppc_xive * xive)803*4882a593Smuzhiyun static int kvmppc_xive_reset(struct kvmppc_xive *xive)
804*4882a593Smuzhiyun {
805*4882a593Smuzhiyun struct kvm *kvm = xive->kvm;
806*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
807*4882a593Smuzhiyun unsigned int i;
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun pr_devel("%s\n", __func__);
810*4882a593Smuzhiyun
811*4882a593Smuzhiyun mutex_lock(&xive->lock);
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
814*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
815*4882a593Smuzhiyun unsigned int prio;
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun if (!xc)
818*4882a593Smuzhiyun continue;
819*4882a593Smuzhiyun
820*4882a593Smuzhiyun kvmppc_xive_disable_vcpu_interrupts(vcpu);
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun for (prio = 0; prio < KVMPPC_XIVE_Q_COUNT; prio++) {
823*4882a593Smuzhiyun
824*4882a593Smuzhiyun /* Single escalation, no queue 7 */
825*4882a593Smuzhiyun if (prio == 7 && xive->single_escalation)
826*4882a593Smuzhiyun break;
827*4882a593Smuzhiyun
828*4882a593Smuzhiyun if (xc->esc_virq[prio]) {
829*4882a593Smuzhiyun free_irq(xc->esc_virq[prio], vcpu);
830*4882a593Smuzhiyun irq_dispose_mapping(xc->esc_virq[prio]);
831*4882a593Smuzhiyun kfree(xc->esc_virq_names[prio]);
832*4882a593Smuzhiyun xc->esc_virq[prio] = 0;
833*4882a593Smuzhiyun }
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun kvmppc_xive_native_cleanup_queue(vcpu, prio);
836*4882a593Smuzhiyun }
837*4882a593Smuzhiyun }
838*4882a593Smuzhiyun
839*4882a593Smuzhiyun for (i = 0; i <= xive->max_sbid; i++) {
840*4882a593Smuzhiyun struct kvmppc_xive_src_block *sb = xive->src_blocks[i];
841*4882a593Smuzhiyun
842*4882a593Smuzhiyun if (sb) {
843*4882a593Smuzhiyun arch_spin_lock(&sb->lock);
844*4882a593Smuzhiyun kvmppc_xive_reset_sources(sb);
845*4882a593Smuzhiyun arch_spin_unlock(&sb->lock);
846*4882a593Smuzhiyun }
847*4882a593Smuzhiyun }
848*4882a593Smuzhiyun
849*4882a593Smuzhiyun mutex_unlock(&xive->lock);
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun return 0;
852*4882a593Smuzhiyun }
853*4882a593Smuzhiyun
kvmppc_xive_native_sync_sources(struct kvmppc_xive_src_block * sb)854*4882a593Smuzhiyun static void kvmppc_xive_native_sync_sources(struct kvmppc_xive_src_block *sb)
855*4882a593Smuzhiyun {
856*4882a593Smuzhiyun int j;
857*4882a593Smuzhiyun
858*4882a593Smuzhiyun for (j = 0; j < KVMPPC_XICS_IRQ_PER_ICS; j++) {
859*4882a593Smuzhiyun struct kvmppc_xive_irq_state *state = &sb->irq_state[j];
860*4882a593Smuzhiyun struct xive_irq_data *xd;
861*4882a593Smuzhiyun u32 hw_num;
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun if (!state->valid)
864*4882a593Smuzhiyun continue;
865*4882a593Smuzhiyun
866*4882a593Smuzhiyun /*
867*4882a593Smuzhiyun * The struct kvmppc_xive_irq_state reflects the state
868*4882a593Smuzhiyun * of the EAS configuration and not the state of the
869*4882a593Smuzhiyun * source. The source is masked setting the PQ bits to
870*4882a593Smuzhiyun * '-Q', which is what is being done before calling
871*4882a593Smuzhiyun * the KVM_DEV_XIVE_EQ_SYNC control.
872*4882a593Smuzhiyun *
873*4882a593Smuzhiyun * If a source EAS is configured, OPAL syncs the XIVE
874*4882a593Smuzhiyun * IC of the source and the XIVE IC of the previous
875*4882a593Smuzhiyun * target if any.
876*4882a593Smuzhiyun *
877*4882a593Smuzhiyun * So it should be fine ignoring MASKED sources as
878*4882a593Smuzhiyun * they have been synced already.
879*4882a593Smuzhiyun */
880*4882a593Smuzhiyun if (state->act_priority == MASKED)
881*4882a593Smuzhiyun continue;
882*4882a593Smuzhiyun
883*4882a593Smuzhiyun kvmppc_xive_select_irq(state, &hw_num, &xd);
884*4882a593Smuzhiyun xive_native_sync_source(hw_num);
885*4882a593Smuzhiyun xive_native_sync_queue(hw_num);
886*4882a593Smuzhiyun }
887*4882a593Smuzhiyun }
888*4882a593Smuzhiyun
kvmppc_xive_native_vcpu_eq_sync(struct kvm_vcpu * vcpu)889*4882a593Smuzhiyun static int kvmppc_xive_native_vcpu_eq_sync(struct kvm_vcpu *vcpu)
890*4882a593Smuzhiyun {
891*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
892*4882a593Smuzhiyun unsigned int prio;
893*4882a593Smuzhiyun int srcu_idx;
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun if (!xc)
896*4882a593Smuzhiyun return -ENOENT;
897*4882a593Smuzhiyun
898*4882a593Smuzhiyun for (prio = 0; prio < KVMPPC_XIVE_Q_COUNT; prio++) {
899*4882a593Smuzhiyun struct xive_q *q = &xc->queues[prio];
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun if (!q->qpage)
902*4882a593Smuzhiyun continue;
903*4882a593Smuzhiyun
904*4882a593Smuzhiyun /* Mark EQ page dirty for migration */
905*4882a593Smuzhiyun srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
906*4882a593Smuzhiyun mark_page_dirty(vcpu->kvm, gpa_to_gfn(q->guest_qaddr));
907*4882a593Smuzhiyun srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx);
908*4882a593Smuzhiyun }
909*4882a593Smuzhiyun return 0;
910*4882a593Smuzhiyun }
911*4882a593Smuzhiyun
kvmppc_xive_native_eq_sync(struct kvmppc_xive * xive)912*4882a593Smuzhiyun static int kvmppc_xive_native_eq_sync(struct kvmppc_xive *xive)
913*4882a593Smuzhiyun {
914*4882a593Smuzhiyun struct kvm *kvm = xive->kvm;
915*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
916*4882a593Smuzhiyun unsigned int i;
917*4882a593Smuzhiyun
918*4882a593Smuzhiyun pr_devel("%s\n", __func__);
919*4882a593Smuzhiyun
920*4882a593Smuzhiyun mutex_lock(&xive->lock);
921*4882a593Smuzhiyun for (i = 0; i <= xive->max_sbid; i++) {
922*4882a593Smuzhiyun struct kvmppc_xive_src_block *sb = xive->src_blocks[i];
923*4882a593Smuzhiyun
924*4882a593Smuzhiyun if (sb) {
925*4882a593Smuzhiyun arch_spin_lock(&sb->lock);
926*4882a593Smuzhiyun kvmppc_xive_native_sync_sources(sb);
927*4882a593Smuzhiyun arch_spin_unlock(&sb->lock);
928*4882a593Smuzhiyun }
929*4882a593Smuzhiyun }
930*4882a593Smuzhiyun
931*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
932*4882a593Smuzhiyun kvmppc_xive_native_vcpu_eq_sync(vcpu);
933*4882a593Smuzhiyun }
934*4882a593Smuzhiyun mutex_unlock(&xive->lock);
935*4882a593Smuzhiyun
936*4882a593Smuzhiyun return 0;
937*4882a593Smuzhiyun }
938*4882a593Smuzhiyun
kvmppc_xive_native_set_attr(struct kvm_device * dev,struct kvm_device_attr * attr)939*4882a593Smuzhiyun static int kvmppc_xive_native_set_attr(struct kvm_device *dev,
940*4882a593Smuzhiyun struct kvm_device_attr *attr)
941*4882a593Smuzhiyun {
942*4882a593Smuzhiyun struct kvmppc_xive *xive = dev->private;
943*4882a593Smuzhiyun
944*4882a593Smuzhiyun switch (attr->group) {
945*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_CTRL:
946*4882a593Smuzhiyun switch (attr->attr) {
947*4882a593Smuzhiyun case KVM_DEV_XIVE_RESET:
948*4882a593Smuzhiyun return kvmppc_xive_reset(xive);
949*4882a593Smuzhiyun case KVM_DEV_XIVE_EQ_SYNC:
950*4882a593Smuzhiyun return kvmppc_xive_native_eq_sync(xive);
951*4882a593Smuzhiyun case KVM_DEV_XIVE_NR_SERVERS:
952*4882a593Smuzhiyun return kvmppc_xive_set_nr_servers(xive, attr->addr);
953*4882a593Smuzhiyun }
954*4882a593Smuzhiyun break;
955*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_SOURCE:
956*4882a593Smuzhiyun return kvmppc_xive_native_set_source(xive, attr->attr,
957*4882a593Smuzhiyun attr->addr);
958*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_SOURCE_CONFIG:
959*4882a593Smuzhiyun return kvmppc_xive_native_set_source_config(xive, attr->attr,
960*4882a593Smuzhiyun attr->addr);
961*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_EQ_CONFIG:
962*4882a593Smuzhiyun return kvmppc_xive_native_set_queue_config(xive, attr->attr,
963*4882a593Smuzhiyun attr->addr);
964*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_SOURCE_SYNC:
965*4882a593Smuzhiyun return kvmppc_xive_native_sync_source(xive, attr->attr,
966*4882a593Smuzhiyun attr->addr);
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun return -ENXIO;
969*4882a593Smuzhiyun }
970*4882a593Smuzhiyun
kvmppc_xive_native_get_attr(struct kvm_device * dev,struct kvm_device_attr * attr)971*4882a593Smuzhiyun static int kvmppc_xive_native_get_attr(struct kvm_device *dev,
972*4882a593Smuzhiyun struct kvm_device_attr *attr)
973*4882a593Smuzhiyun {
974*4882a593Smuzhiyun struct kvmppc_xive *xive = dev->private;
975*4882a593Smuzhiyun
976*4882a593Smuzhiyun switch (attr->group) {
977*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_EQ_CONFIG:
978*4882a593Smuzhiyun return kvmppc_xive_native_get_queue_config(xive, attr->attr,
979*4882a593Smuzhiyun attr->addr);
980*4882a593Smuzhiyun }
981*4882a593Smuzhiyun return -ENXIO;
982*4882a593Smuzhiyun }
983*4882a593Smuzhiyun
kvmppc_xive_native_has_attr(struct kvm_device * dev,struct kvm_device_attr * attr)984*4882a593Smuzhiyun static int kvmppc_xive_native_has_attr(struct kvm_device *dev,
985*4882a593Smuzhiyun struct kvm_device_attr *attr)
986*4882a593Smuzhiyun {
987*4882a593Smuzhiyun switch (attr->group) {
988*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_CTRL:
989*4882a593Smuzhiyun switch (attr->attr) {
990*4882a593Smuzhiyun case KVM_DEV_XIVE_RESET:
991*4882a593Smuzhiyun case KVM_DEV_XIVE_EQ_SYNC:
992*4882a593Smuzhiyun case KVM_DEV_XIVE_NR_SERVERS:
993*4882a593Smuzhiyun return 0;
994*4882a593Smuzhiyun }
995*4882a593Smuzhiyun break;
996*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_SOURCE:
997*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_SOURCE_CONFIG:
998*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_SOURCE_SYNC:
999*4882a593Smuzhiyun if (attr->attr >= KVMPPC_XIVE_FIRST_IRQ &&
1000*4882a593Smuzhiyun attr->attr < KVMPPC_XIVE_NR_IRQS)
1001*4882a593Smuzhiyun return 0;
1002*4882a593Smuzhiyun break;
1003*4882a593Smuzhiyun case KVM_DEV_XIVE_GRP_EQ_CONFIG:
1004*4882a593Smuzhiyun return 0;
1005*4882a593Smuzhiyun }
1006*4882a593Smuzhiyun return -ENXIO;
1007*4882a593Smuzhiyun }
1008*4882a593Smuzhiyun
1009*4882a593Smuzhiyun /*
1010*4882a593Smuzhiyun * Called when device fd is closed. kvm->lock is held.
1011*4882a593Smuzhiyun */
kvmppc_xive_native_release(struct kvm_device * dev)1012*4882a593Smuzhiyun static void kvmppc_xive_native_release(struct kvm_device *dev)
1013*4882a593Smuzhiyun {
1014*4882a593Smuzhiyun struct kvmppc_xive *xive = dev->private;
1015*4882a593Smuzhiyun struct kvm *kvm = xive->kvm;
1016*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
1017*4882a593Smuzhiyun int i;
1018*4882a593Smuzhiyun
1019*4882a593Smuzhiyun pr_devel("Releasing xive native device\n");
1020*4882a593Smuzhiyun
1021*4882a593Smuzhiyun /*
1022*4882a593Smuzhiyun * Clear the KVM device file address_space which is used to
1023*4882a593Smuzhiyun * unmap the ESB pages when a device is passed-through.
1024*4882a593Smuzhiyun */
1025*4882a593Smuzhiyun mutex_lock(&xive->mapping_lock);
1026*4882a593Smuzhiyun xive->mapping = NULL;
1027*4882a593Smuzhiyun mutex_unlock(&xive->mapping_lock);
1028*4882a593Smuzhiyun
1029*4882a593Smuzhiyun /*
1030*4882a593Smuzhiyun * Since this is the device release function, we know that
1031*4882a593Smuzhiyun * userspace does not have any open fd or mmap referring to
1032*4882a593Smuzhiyun * the device. Therefore there can not be any of the
1033*4882a593Smuzhiyun * device attribute set/get, mmap, or page fault functions
1034*4882a593Smuzhiyun * being executed concurrently, and similarly, the
1035*4882a593Smuzhiyun * connect_vcpu and set/clr_mapped functions also cannot
1036*4882a593Smuzhiyun * be being executed.
1037*4882a593Smuzhiyun */
1038*4882a593Smuzhiyun
1039*4882a593Smuzhiyun debugfs_remove(xive->dentry);
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun /*
1042*4882a593Smuzhiyun * We should clean up the vCPU interrupt presenters first.
1043*4882a593Smuzhiyun */
1044*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
1045*4882a593Smuzhiyun /*
1046*4882a593Smuzhiyun * Take vcpu->mutex to ensure that no one_reg get/set ioctl
1047*4882a593Smuzhiyun * (i.e. kvmppc_xive_native_[gs]et_vp) can be being done.
1048*4882a593Smuzhiyun * Holding the vcpu->mutex also means that the vcpu cannot
1049*4882a593Smuzhiyun * be executing the KVM_RUN ioctl, and therefore it cannot
1050*4882a593Smuzhiyun * be executing the XIVE push or pull code or accessing
1051*4882a593Smuzhiyun * the XIVE MMIO regions.
1052*4882a593Smuzhiyun */
1053*4882a593Smuzhiyun mutex_lock(&vcpu->mutex);
1054*4882a593Smuzhiyun kvmppc_xive_native_cleanup_vcpu(vcpu);
1055*4882a593Smuzhiyun mutex_unlock(&vcpu->mutex);
1056*4882a593Smuzhiyun }
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun /*
1059*4882a593Smuzhiyun * Now that we have cleared vcpu->arch.xive_vcpu, vcpu->arch.irq_type
1060*4882a593Smuzhiyun * and vcpu->arch.xive_esc_[vr]addr on each vcpu, we are safe
1061*4882a593Smuzhiyun * against xive code getting called during vcpu execution or
1062*4882a593Smuzhiyun * set/get one_reg operations.
1063*4882a593Smuzhiyun */
1064*4882a593Smuzhiyun kvm->arch.xive = NULL;
1065*4882a593Smuzhiyun
1066*4882a593Smuzhiyun for (i = 0; i <= xive->max_sbid; i++) {
1067*4882a593Smuzhiyun if (xive->src_blocks[i])
1068*4882a593Smuzhiyun kvmppc_xive_free_sources(xive->src_blocks[i]);
1069*4882a593Smuzhiyun kfree(xive->src_blocks[i]);
1070*4882a593Smuzhiyun xive->src_blocks[i] = NULL;
1071*4882a593Smuzhiyun }
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun if (xive->vp_base != XIVE_INVALID_VP)
1074*4882a593Smuzhiyun xive_native_free_vp_block(xive->vp_base);
1075*4882a593Smuzhiyun
1076*4882a593Smuzhiyun /*
1077*4882a593Smuzhiyun * A reference of the kvmppc_xive pointer is now kept under
1078*4882a593Smuzhiyun * the xive_devices struct of the machine for reuse. It is
1079*4882a593Smuzhiyun * freed when the VM is destroyed for now until we fix all the
1080*4882a593Smuzhiyun * execution paths.
1081*4882a593Smuzhiyun */
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun kfree(dev);
1084*4882a593Smuzhiyun }
1085*4882a593Smuzhiyun
1086*4882a593Smuzhiyun /*
1087*4882a593Smuzhiyun * Create a XIVE device. kvm->lock is held.
1088*4882a593Smuzhiyun */
kvmppc_xive_native_create(struct kvm_device * dev,u32 type)1089*4882a593Smuzhiyun static int kvmppc_xive_native_create(struct kvm_device *dev, u32 type)
1090*4882a593Smuzhiyun {
1091*4882a593Smuzhiyun struct kvmppc_xive *xive;
1092*4882a593Smuzhiyun struct kvm *kvm = dev->kvm;
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun pr_devel("Creating xive native device\n");
1095*4882a593Smuzhiyun
1096*4882a593Smuzhiyun if (kvm->arch.xive)
1097*4882a593Smuzhiyun return -EEXIST;
1098*4882a593Smuzhiyun
1099*4882a593Smuzhiyun xive = kvmppc_xive_get_device(kvm, type);
1100*4882a593Smuzhiyun if (!xive)
1101*4882a593Smuzhiyun return -ENOMEM;
1102*4882a593Smuzhiyun
1103*4882a593Smuzhiyun dev->private = xive;
1104*4882a593Smuzhiyun xive->dev = dev;
1105*4882a593Smuzhiyun xive->kvm = kvm;
1106*4882a593Smuzhiyun mutex_init(&xive->mapping_lock);
1107*4882a593Smuzhiyun mutex_init(&xive->lock);
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun /* VP allocation is delayed to the first call to connect_vcpu */
1110*4882a593Smuzhiyun xive->vp_base = XIVE_INVALID_VP;
1111*4882a593Smuzhiyun /* KVM_MAX_VCPUS limits the number of VMs to roughly 64 per sockets
1112*4882a593Smuzhiyun * on a POWER9 system.
1113*4882a593Smuzhiyun */
1114*4882a593Smuzhiyun xive->nr_servers = KVM_MAX_VCPUS;
1115*4882a593Smuzhiyun
1116*4882a593Smuzhiyun xive->single_escalation = xive_native_has_single_escalation();
1117*4882a593Smuzhiyun xive->ops = &kvmppc_xive_native_ops;
1118*4882a593Smuzhiyun
1119*4882a593Smuzhiyun kvm->arch.xive = xive;
1120*4882a593Smuzhiyun return 0;
1121*4882a593Smuzhiyun }
1122*4882a593Smuzhiyun
1123*4882a593Smuzhiyun /*
1124*4882a593Smuzhiyun * Interrupt Pending Buffer (IPB) offset
1125*4882a593Smuzhiyun */
1126*4882a593Smuzhiyun #define TM_IPB_SHIFT 40
1127*4882a593Smuzhiyun #define TM_IPB_MASK (((u64) 0xFF) << TM_IPB_SHIFT)
1128*4882a593Smuzhiyun
kvmppc_xive_native_get_vp(struct kvm_vcpu * vcpu,union kvmppc_one_reg * val)1129*4882a593Smuzhiyun int kvmppc_xive_native_get_vp(struct kvm_vcpu *vcpu, union kvmppc_one_reg *val)
1130*4882a593Smuzhiyun {
1131*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
1132*4882a593Smuzhiyun u64 opal_state;
1133*4882a593Smuzhiyun int rc;
1134*4882a593Smuzhiyun
1135*4882a593Smuzhiyun if (!kvmppc_xive_enabled(vcpu))
1136*4882a593Smuzhiyun return -EPERM;
1137*4882a593Smuzhiyun
1138*4882a593Smuzhiyun if (!xc)
1139*4882a593Smuzhiyun return -ENOENT;
1140*4882a593Smuzhiyun
1141*4882a593Smuzhiyun /* Thread context registers. We only care about IPB and CPPR */
1142*4882a593Smuzhiyun val->xive_timaval[0] = vcpu->arch.xive_saved_state.w01;
1143*4882a593Smuzhiyun
1144*4882a593Smuzhiyun /* Get the VP state from OPAL */
1145*4882a593Smuzhiyun rc = xive_native_get_vp_state(xc->vp_id, &opal_state);
1146*4882a593Smuzhiyun if (rc)
1147*4882a593Smuzhiyun return rc;
1148*4882a593Smuzhiyun
1149*4882a593Smuzhiyun /*
1150*4882a593Smuzhiyun * Capture the backup of IPB register in the NVT structure and
1151*4882a593Smuzhiyun * merge it in our KVM VP state.
1152*4882a593Smuzhiyun */
1153*4882a593Smuzhiyun val->xive_timaval[0] |= cpu_to_be64(opal_state & TM_IPB_MASK);
1154*4882a593Smuzhiyun
1155*4882a593Smuzhiyun pr_devel("%s NSR=%02x CPPR=%02x IBP=%02x PIPR=%02x w01=%016llx w2=%08x opal=%016llx\n",
1156*4882a593Smuzhiyun __func__,
1157*4882a593Smuzhiyun vcpu->arch.xive_saved_state.nsr,
1158*4882a593Smuzhiyun vcpu->arch.xive_saved_state.cppr,
1159*4882a593Smuzhiyun vcpu->arch.xive_saved_state.ipb,
1160*4882a593Smuzhiyun vcpu->arch.xive_saved_state.pipr,
1161*4882a593Smuzhiyun vcpu->arch.xive_saved_state.w01,
1162*4882a593Smuzhiyun (u32) vcpu->arch.xive_cam_word, opal_state);
1163*4882a593Smuzhiyun
1164*4882a593Smuzhiyun return 0;
1165*4882a593Smuzhiyun }
1166*4882a593Smuzhiyun
kvmppc_xive_native_set_vp(struct kvm_vcpu * vcpu,union kvmppc_one_reg * val)1167*4882a593Smuzhiyun int kvmppc_xive_native_set_vp(struct kvm_vcpu *vcpu, union kvmppc_one_reg *val)
1168*4882a593Smuzhiyun {
1169*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
1170*4882a593Smuzhiyun struct kvmppc_xive *xive = vcpu->kvm->arch.xive;
1171*4882a593Smuzhiyun
1172*4882a593Smuzhiyun pr_devel("%s w01=%016llx vp=%016llx\n", __func__,
1173*4882a593Smuzhiyun val->xive_timaval[0], val->xive_timaval[1]);
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun if (!kvmppc_xive_enabled(vcpu))
1176*4882a593Smuzhiyun return -EPERM;
1177*4882a593Smuzhiyun
1178*4882a593Smuzhiyun if (!xc || !xive)
1179*4882a593Smuzhiyun return -ENOENT;
1180*4882a593Smuzhiyun
1181*4882a593Smuzhiyun /* We can't update the state of a "pushed" VCPU */
1182*4882a593Smuzhiyun if (WARN_ON(vcpu->arch.xive_pushed))
1183*4882a593Smuzhiyun return -EBUSY;
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun /*
1186*4882a593Smuzhiyun * Restore the thread context registers. IPB and CPPR should
1187*4882a593Smuzhiyun * be the only ones that matter.
1188*4882a593Smuzhiyun */
1189*4882a593Smuzhiyun vcpu->arch.xive_saved_state.w01 = val->xive_timaval[0];
1190*4882a593Smuzhiyun
1191*4882a593Smuzhiyun /*
1192*4882a593Smuzhiyun * There is no need to restore the XIVE internal state (IPB
1193*4882a593Smuzhiyun * stored in the NVT) as the IPB register was merged in KVM VP
1194*4882a593Smuzhiyun * state when captured.
1195*4882a593Smuzhiyun */
1196*4882a593Smuzhiyun return 0;
1197*4882a593Smuzhiyun }
1198*4882a593Smuzhiyun
kvmppc_xive_native_supported(void)1199*4882a593Smuzhiyun bool kvmppc_xive_native_supported(void)
1200*4882a593Smuzhiyun {
1201*4882a593Smuzhiyun return xive_native_has_queue_state_support();
1202*4882a593Smuzhiyun }
1203*4882a593Smuzhiyun
xive_native_debug_show(struct seq_file * m,void * private)1204*4882a593Smuzhiyun static int xive_native_debug_show(struct seq_file *m, void *private)
1205*4882a593Smuzhiyun {
1206*4882a593Smuzhiyun struct kvmppc_xive *xive = m->private;
1207*4882a593Smuzhiyun struct kvm *kvm = xive->kvm;
1208*4882a593Smuzhiyun struct kvm_vcpu *vcpu;
1209*4882a593Smuzhiyun unsigned int i;
1210*4882a593Smuzhiyun
1211*4882a593Smuzhiyun if (!kvm)
1212*4882a593Smuzhiyun return 0;
1213*4882a593Smuzhiyun
1214*4882a593Smuzhiyun seq_puts(m, "=========\nVCPU state\n=========\n");
1215*4882a593Smuzhiyun
1216*4882a593Smuzhiyun kvm_for_each_vcpu(i, vcpu, kvm) {
1217*4882a593Smuzhiyun struct kvmppc_xive_vcpu *xc = vcpu->arch.xive_vcpu;
1218*4882a593Smuzhiyun
1219*4882a593Smuzhiyun if (!xc)
1220*4882a593Smuzhiyun continue;
1221*4882a593Smuzhiyun
1222*4882a593Smuzhiyun seq_printf(m, "cpu server %#x VP=%#x NSR=%02x CPPR=%02x IBP=%02x PIPR=%02x w01=%016llx w2=%08x\n",
1223*4882a593Smuzhiyun xc->server_num, xc->vp_id,
1224*4882a593Smuzhiyun vcpu->arch.xive_saved_state.nsr,
1225*4882a593Smuzhiyun vcpu->arch.xive_saved_state.cppr,
1226*4882a593Smuzhiyun vcpu->arch.xive_saved_state.ipb,
1227*4882a593Smuzhiyun vcpu->arch.xive_saved_state.pipr,
1228*4882a593Smuzhiyun vcpu->arch.xive_saved_state.w01,
1229*4882a593Smuzhiyun (u32) vcpu->arch.xive_cam_word);
1230*4882a593Smuzhiyun
1231*4882a593Smuzhiyun kvmppc_xive_debug_show_queues(m, vcpu);
1232*4882a593Smuzhiyun }
1233*4882a593Smuzhiyun
1234*4882a593Smuzhiyun return 0;
1235*4882a593Smuzhiyun }
1236*4882a593Smuzhiyun
1237*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(xive_native_debug);
1238*4882a593Smuzhiyun
xive_native_debugfs_init(struct kvmppc_xive * xive)1239*4882a593Smuzhiyun static void xive_native_debugfs_init(struct kvmppc_xive *xive)
1240*4882a593Smuzhiyun {
1241*4882a593Smuzhiyun char *name;
1242*4882a593Smuzhiyun
1243*4882a593Smuzhiyun name = kasprintf(GFP_KERNEL, "kvm-xive-%p", xive);
1244*4882a593Smuzhiyun if (!name) {
1245*4882a593Smuzhiyun pr_err("%s: no memory for name\n", __func__);
1246*4882a593Smuzhiyun return;
1247*4882a593Smuzhiyun }
1248*4882a593Smuzhiyun
1249*4882a593Smuzhiyun xive->dentry = debugfs_create_file(name, 0444, powerpc_debugfs_root,
1250*4882a593Smuzhiyun xive, &xive_native_debug_fops);
1251*4882a593Smuzhiyun
1252*4882a593Smuzhiyun pr_debug("%s: created %s\n", __func__, name);
1253*4882a593Smuzhiyun kfree(name);
1254*4882a593Smuzhiyun }
1255*4882a593Smuzhiyun
kvmppc_xive_native_init(struct kvm_device * dev)1256*4882a593Smuzhiyun static void kvmppc_xive_native_init(struct kvm_device *dev)
1257*4882a593Smuzhiyun {
1258*4882a593Smuzhiyun struct kvmppc_xive *xive = (struct kvmppc_xive *)dev->private;
1259*4882a593Smuzhiyun
1260*4882a593Smuzhiyun /* Register some debug interfaces */
1261*4882a593Smuzhiyun xive_native_debugfs_init(xive);
1262*4882a593Smuzhiyun }
1263*4882a593Smuzhiyun
1264*4882a593Smuzhiyun struct kvm_device_ops kvm_xive_native_ops = {
1265*4882a593Smuzhiyun .name = "kvm-xive-native",
1266*4882a593Smuzhiyun .create = kvmppc_xive_native_create,
1267*4882a593Smuzhiyun .init = kvmppc_xive_native_init,
1268*4882a593Smuzhiyun .release = kvmppc_xive_native_release,
1269*4882a593Smuzhiyun .set_attr = kvmppc_xive_native_set_attr,
1270*4882a593Smuzhiyun .get_attr = kvmppc_xive_native_get_attr,
1271*4882a593Smuzhiyun .has_attr = kvmppc_xive_native_has_attr,
1272*4882a593Smuzhiyun .mmap = kvmppc_xive_native_mmap,
1273*4882a593Smuzhiyun };
1274*4882a593Smuzhiyun
kvmppc_xive_native_init_module(void)1275*4882a593Smuzhiyun void kvmppc_xive_native_init_module(void)
1276*4882a593Smuzhiyun {
1277*4882a593Smuzhiyun ;
1278*4882a593Smuzhiyun }
1279*4882a593Smuzhiyun
kvmppc_xive_native_exit_module(void)1280*4882a593Smuzhiyun void kvmppc_xive_native_exit_module(void)
1281*4882a593Smuzhiyun {
1282*4882a593Smuzhiyun ;
1283*4882a593Smuzhiyun }
1284