aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kvm/book3s_xics.c
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2013-04-17 16:30:26 -0400
committerAlexander Graf <agraf@suse.de>2013-04-26 14:27:30 -0400
commitbc5ad3f3701116e7db57268e6f89010ec714697e (patch)
tree21a00d1213598eab4dc0ae3fb03bb7ba3344185a /arch/powerpc/kvm/book3s_xics.c
parent8e591cb7204739efa8e15967ea334eb367039dde (diff)
KVM: PPC: Book3S: Add kernel emulation for the XICS interrupt controller
This adds in-kernel emulation of the XICS (eXternal Interrupt Controller Specification) interrupt controller specified by PAPR, for both HV and PR KVM guests. The XICS emulation supports up to 1048560 interrupt sources. Interrupt source numbers below 16 are reserved; 0 is used to mean no interrupt and 2 is used for IPIs. Internally these are represented in blocks of 1024, called ICS (interrupt controller source) entities, but that is not visible to userspace. Each vcpu gets one ICP (interrupt controller presentation) entity, used to store the per-vcpu state such as vcpu priority, pending interrupt state, IPI request, etc. This does not include any API or any way to connect vcpus to their ICP state; that will be added in later patches. This is based on an initial implementation by Michael Ellerman <michael@ellerman.id.au> reworked by Benjamin Herrenschmidt and Paul Mackerras. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org> [agraf: fix typo, add dependency on !KVM_MPIC] Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'arch/powerpc/kvm/book3s_xics.c')
-rw-r--r--arch/powerpc/kvm/book3s_xics.c946
1 files changed, 946 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/book3s_xics.c b/arch/powerpc/kvm/book3s_xics.c
new file mode 100644
index 000000000000..53af848116f2
--- /dev/null
+++ b/arch/powerpc/kvm/book3s_xics.c
@@ -0,0 +1,946 @@
1/*
2 * Copyright 2012 Michael Ellerman, IBM Corporation.
3 * Copyright 2012 Benjamin Herrenschmidt, IBM Corporation.
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
10#include <linux/kernel.h>
11#include <linux/kvm_host.h>
12#include <linux/err.h>
13#include <linux/gfp.h>
14
15#include <asm/uaccess.h>
16#include <asm/kvm_book3s.h>
17#include <asm/kvm_ppc.h>
18#include <asm/hvcall.h>
19#include <asm/xics.h>
20#include <asm/debug.h>
21
22#include <linux/debugfs.h>
23#include <linux/seq_file.h>
24
25#include "book3s_xics.h"
26
27#if 1
28#define XICS_DBG(fmt...) do { } while (0)
29#else
30#define XICS_DBG(fmt...) trace_printk(fmt)
31#endif
32
33/*
34 * LOCKING
35 * =======
36 *
37 * Each ICS has a mutex protecting the information about the IRQ
38 * sources and avoiding simultaneous deliveries if the same interrupt.
39 *
40 * ICP operations are done via a single compare & swap transaction
41 * (most ICP state fits in the union kvmppc_icp_state)
42 */
43
44/*
45 * TODO
46 * ====
47 *
48 * - To speed up resends, keep a bitmap of "resend" set bits in the
49 * ICS
50 *
51 * - Speed up server# -> ICP lookup (array ? hash table ?)
52 *
53 * - Make ICS lockless as well, or at least a per-interrupt lock or hashed
54 * locks array to improve scalability
55 *
56 * - ioctl's to save/restore the entire state for snapshot & migration
57 */
58
59/* -- ICS routines -- */
60
61static void icp_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
62 u32 new_irq);
63
64static int ics_deliver_irq(struct kvmppc_xics *xics, u32 irq, u32 level)
65{
66 struct ics_irq_state *state;
67 struct kvmppc_ics *ics;
68 u16 src;
69
70 XICS_DBG("ics deliver %#x (level: %d)\n", irq, level);
71
72 ics = kvmppc_xics_find_ics(xics, irq, &src);
73 if (!ics) {
74 XICS_DBG("ics_deliver_irq: IRQ 0x%06x not found !\n", irq);
75 return -EINVAL;
76 }
77 state = &ics->irq_state[src];
78 if (!state->exists)
79 return -EINVAL;
80
81 /*
82 * We set state->asserted locklessly. This should be fine as
83 * we are the only setter, thus concurrent access is undefined
84 * to begin with.
85 */
86 if (level == KVM_INTERRUPT_SET_LEVEL)
87 state->asserted = 1;
88 else if (level == KVM_INTERRUPT_UNSET) {
89 state->asserted = 0;
90 return 0;
91 }
92
93 /* Attempt delivery */
94 icp_deliver_irq(xics, NULL, irq);
95
96 return 0;
97}
98
99static void ics_check_resend(struct kvmppc_xics *xics, struct kvmppc_ics *ics,
100 struct kvmppc_icp *icp)
101{
102 int i;
103
104 mutex_lock(&ics->lock);
105
106 for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
107 struct ics_irq_state *state = &ics->irq_state[i];
108
109 if (!state->resend)
110 continue;
111
112 XICS_DBG("resend %#x prio %#x\n", state->number,
113 state->priority);
114
115 mutex_unlock(&ics->lock);
116 icp_deliver_irq(xics, icp, state->number);
117 mutex_lock(&ics->lock);
118 }
119
120 mutex_unlock(&ics->lock);
121}
122
123int kvmppc_xics_set_xive(struct kvm *kvm, u32 irq, u32 server, u32 priority)
124{
125 struct kvmppc_xics *xics = kvm->arch.xics;
126 struct kvmppc_icp *icp;
127 struct kvmppc_ics *ics;
128 struct ics_irq_state *state;
129 u16 src;
130 bool deliver;
131
132 if (!xics)
133 return -ENODEV;
134
135 ics = kvmppc_xics_find_ics(xics, irq, &src);
136 if (!ics)
137 return -EINVAL;
138 state = &ics->irq_state[src];
139
140 icp = kvmppc_xics_find_server(kvm, server);
141 if (!icp)
142 return -EINVAL;
143
144 mutex_lock(&ics->lock);
145
146 XICS_DBG("set_xive %#x server %#x prio %#x MP:%d RS:%d\n",
147 irq, server, priority,
148 state->masked_pending, state->resend);
149
150 state->server = server;
151 state->priority = priority;
152 deliver = false;
153 if ((state->masked_pending || state->resend) && priority != MASKED) {
154 state->masked_pending = 0;
155 deliver = true;
156 }
157
158 mutex_unlock(&ics->lock);
159
160 if (deliver)
161 icp_deliver_irq(xics, icp, irq);
162
163 return 0;
164}
165
166int kvmppc_xics_get_xive(struct kvm *kvm, u32 irq, u32 *server, u32 *priority)
167{
168 struct kvmppc_xics *xics = kvm->arch.xics;
169 struct kvmppc_ics *ics;
170 struct ics_irq_state *state;
171 u16 src;
172
173 if (!xics)
174 return -ENODEV;
175
176 ics = kvmppc_xics_find_ics(xics, irq, &src);
177 if (!ics)
178 return -EINVAL;
179 state = &ics->irq_state[src];
180
181 mutex_lock(&ics->lock);
182 *server = state->server;
183 *priority = state->priority;
184 mutex_unlock(&ics->lock);
185
186 return 0;
187}
188
189/* -- ICP routines, including hcalls -- */
190
191static inline bool icp_try_update(struct kvmppc_icp *icp,
192 union kvmppc_icp_state old,
193 union kvmppc_icp_state new,
194 bool change_self)
195{
196 bool success;
197
198 /* Calculate new output value */
199 new.out_ee = (new.xisr && (new.pending_pri < new.cppr));
200
201 /* Attempt atomic update */
202 success = cmpxchg64(&icp->state.raw, old.raw, new.raw) == old.raw;
203 if (!success)
204 goto bail;
205
206 XICS_DBG("UPD [%04x] - C:%02x M:%02x PP: %02x PI:%06x R:%d O:%d\n",
207 icp->server_num,
208 old.cppr, old.mfrr, old.pending_pri, old.xisr,
209 old.need_resend, old.out_ee);
210 XICS_DBG("UPD - C:%02x M:%02x PP: %02x PI:%06x R:%d O:%d\n",
211 new.cppr, new.mfrr, new.pending_pri, new.xisr,
212 new.need_resend, new.out_ee);
213 /*
214 * Check for output state update
215 *
216 * Note that this is racy since another processor could be updating
217 * the state already. This is why we never clear the interrupt output
218 * here, we only ever set it. The clear only happens prior to doing
219 * an update and only by the processor itself. Currently we do it
220 * in Accept (H_XIRR) and Up_Cppr (H_XPPR).
221 *
222 * We also do not try to figure out whether the EE state has changed,
223 * we unconditionally set it if the new state calls for it for the
224 * same reason.
225 */
226 if (new.out_ee) {
227 kvmppc_book3s_queue_irqprio(icp->vcpu,
228 BOOK3S_INTERRUPT_EXTERNAL_LEVEL);
229 if (!change_self)
230 kvm_vcpu_kick(icp->vcpu);
231 }
232 bail:
233 return success;
234}
235
236static void icp_check_resend(struct kvmppc_xics *xics,
237 struct kvmppc_icp *icp)
238{
239 u32 icsid;
240
241 /* Order this load with the test for need_resend in the caller */
242 smp_rmb();
243 for_each_set_bit(icsid, icp->resend_map, xics->max_icsid + 1) {
244 struct kvmppc_ics *ics = xics->ics[icsid];
245
246 if (!test_and_clear_bit(icsid, icp->resend_map))
247 continue;
248 if (!ics)
249 continue;
250 ics_check_resend(xics, ics, icp);
251 }
252}
253
254static bool icp_try_to_deliver(struct kvmppc_icp *icp, u32 irq, u8 priority,
255 u32 *reject)
256{
257 union kvmppc_icp_state old_state, new_state;
258 bool success;
259
260 XICS_DBG("try deliver %#x(P:%#x) to server %#x\n", irq, priority,
261 icp->server_num);
262
263 do {
264 old_state = new_state = ACCESS_ONCE(icp->state);
265
266 *reject = 0;
267
268 /* See if we can deliver */
269 success = new_state.cppr > priority &&
270 new_state.mfrr > priority &&
271 new_state.pending_pri > priority;
272
273 /*
274 * If we can, check for a rejection and perform the
275 * delivery
276 */
277 if (success) {
278 *reject = new_state.xisr;
279 new_state.xisr = irq;
280 new_state.pending_pri = priority;
281 } else {
282 /*
283 * If we failed to deliver we set need_resend
284 * so a subsequent CPPR state change causes us
285 * to try a new delivery.
286 */
287 new_state.need_resend = true;
288 }
289
290 } while (!icp_try_update(icp, old_state, new_state, false));
291
292 return success;
293}
294
295static void icp_deliver_irq(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
296 u32 new_irq)
297{
298 struct ics_irq_state *state;
299 struct kvmppc_ics *ics;
300 u32 reject;
301 u16 src;
302
303 /*
304 * This is used both for initial delivery of an interrupt and
305 * for subsequent rejection.
306 *
307 * Rejection can be racy vs. resends. We have evaluated the
308 * rejection in an atomic ICP transaction which is now complete,
309 * so potentially the ICP can already accept the interrupt again.
310 *
311 * So we need to retry the delivery. Essentially the reject path
312 * boils down to a failed delivery. Always.
313 *
314 * Now the interrupt could also have moved to a different target,
315 * thus we may need to re-do the ICP lookup as well
316 */
317
318 again:
319 /* Get the ICS state and lock it */
320 ics = kvmppc_xics_find_ics(xics, new_irq, &src);
321 if (!ics) {
322 XICS_DBG("icp_deliver_irq: IRQ 0x%06x not found !\n", new_irq);
323 return;
324 }
325 state = &ics->irq_state[src];
326
327 /* Get a lock on the ICS */
328 mutex_lock(&ics->lock);
329
330 /* Get our server */
331 if (!icp || state->server != icp->server_num) {
332 icp = kvmppc_xics_find_server(xics->kvm, state->server);
333 if (!icp) {
334 pr_warn("icp_deliver_irq: IRQ 0x%06x server 0x%x not found !\n",
335 new_irq, state->server);
336 goto out;
337 }
338 }
339
340 /* Clear the resend bit of that interrupt */
341 state->resend = 0;
342
343 /*
344 * If masked, bail out
345 *
346 * Note: PAPR doesn't mention anything about masked pending
347 * when doing a resend, only when doing a delivery.
348 *
349 * However that would have the effect of losing a masked
350 * interrupt that was rejected and isn't consistent with
351 * the whole masked_pending business which is about not
352 * losing interrupts that occur while masked.
353 *
354 * I don't differenciate normal deliveries and resends, this
355 * implementation will differ from PAPR and not lose such
356 * interrupts.
357 */
358 if (state->priority == MASKED) {
359 XICS_DBG("irq %#x masked pending\n", new_irq);
360 state->masked_pending = 1;
361 goto out;
362 }
363
364 /*
365 * Try the delivery, this will set the need_resend flag
366 * in the ICP as part of the atomic transaction if the
367 * delivery is not possible.
368 *
369 * Note that if successful, the new delivery might have itself
370 * rejected an interrupt that was "delivered" before we took the
371 * icp mutex.
372 *
373 * In this case we do the whole sequence all over again for the
374 * new guy. We cannot assume that the rejected interrupt is less
375 * favored than the new one, and thus doesn't need to be delivered,
376 * because by the time we exit icp_try_to_deliver() the target
377 * processor may well have alrady consumed & completed it, and thus
378 * the rejected interrupt might actually be already acceptable.
379 */
380 if (icp_try_to_deliver(icp, new_irq, state->priority, &reject)) {
381 /*
382 * Delivery was successful, did we reject somebody else ?
383 */
384 if (reject && reject != XICS_IPI) {
385 mutex_unlock(&ics->lock);
386 new_irq = reject;
387 goto again;
388 }
389 } else {
390 /*
391 * We failed to deliver the interrupt we need to set the
392 * resend map bit and mark the ICS state as needing a resend
393 */
394 set_bit(ics->icsid, icp->resend_map);
395 state->resend = 1;
396
397 /*
398 * If the need_resend flag got cleared in the ICP some time
399 * between icp_try_to_deliver() atomic update and now, then
400 * we know it might have missed the resend_map bit. So we
401 * retry
402 */
403 smp_mb();
404 if (!icp->state.need_resend) {
405 mutex_unlock(&ics->lock);
406 goto again;
407 }
408 }
409 out:
410 mutex_unlock(&ics->lock);
411}
412
413static void icp_down_cppr(struct kvmppc_xics *xics, struct kvmppc_icp *icp,
414 u8 new_cppr)
415{
416 union kvmppc_icp_state old_state, new_state;
417 bool resend;
418
419 /*
420 * This handles several related states in one operation:
421 *
422 * ICP State: Down_CPPR
423 *
424 * Load CPPR with new value and if the XISR is 0
425 * then check for resends:
426 *
427 * ICP State: Resend
428 *
429 * If MFRR is more favored than CPPR, check for IPIs
430 * and notify ICS of a potential resend. This is done
431 * asynchronously (when used in real mode, we will have
432 * to exit here).
433 *
434 * We do not handle the complete Check_IPI as documented
435 * here. In the PAPR, this state will be used for both
436 * Set_MFRR and Down_CPPR. However, we know that we aren't
437 * changing the MFRR state here so we don't need to handle
438 * the case of an MFRR causing a reject of a pending irq,
439 * this will have been handled when the MFRR was set in the
440 * first place.
441 *
442 * Thus we don't have to handle rejects, only resends.
443 *
444 * When implementing real mode for HV KVM, resend will lead to
445 * a H_TOO_HARD return and the whole transaction will be handled
446 * in virtual mode.
447 */
448 do {
449 old_state = new_state = ACCESS_ONCE(icp->state);
450
451 /* Down_CPPR */
452 new_state.cppr = new_cppr;
453
454 /*
455 * Cut down Resend / Check_IPI / IPI
456 *
457 * The logic is that we cannot have a pending interrupt
458 * trumped by an IPI at this point (see above), so we
459 * know that either the pending interrupt is already an
460 * IPI (in which case we don't care to override it) or
461 * it's either more favored than us or non existent
462 */
463 if (new_state.mfrr < new_cppr &&
464 new_state.mfrr <= new_state.pending_pri) {
465 WARN_ON(new_state.xisr != XICS_IPI &&
466 new_state.xisr != 0);
467 new_state.pending_pri = new_state.mfrr;
468 new_state.xisr = XICS_IPI;
469 }
470
471 /* Latch/clear resend bit */
472 resend = new_state.need_resend;
473 new_state.need_resend = 0;
474
475 } while (!icp_try_update(icp, old_state, new_state, true));
476
477 /*
478 * Now handle resend checks. Those are asynchronous to the ICP
479 * state update in HW (ie bus transactions) so we can handle them
480 * separately here too
481 */
482 if (resend)
483 icp_check_resend(xics, icp);
484}
485
486static noinline unsigned long h_xirr(struct kvm_vcpu *vcpu)
487{
488 union kvmppc_icp_state old_state, new_state;
489 struct kvmppc_icp *icp = vcpu->arch.icp;
490 u32 xirr;
491
492 /* First, remove EE from the processor */
493 kvmppc_book3s_dequeue_irqprio(icp->vcpu,
494 BOOK3S_INTERRUPT_EXTERNAL_LEVEL);
495
496 /*
497 * ICP State: Accept_Interrupt
498 *
499 * Return the pending interrupt (if any) along with the
500 * current CPPR, then clear the XISR & set CPPR to the
501 * pending priority
502 */
503 do {
504 old_state = new_state = ACCESS_ONCE(icp->state);
505
506 xirr = old_state.xisr | (((u32)old_state.cppr) << 24);
507 if (!old_state.xisr)
508 break;
509 new_state.cppr = new_state.pending_pri;
510 new_state.pending_pri = 0xff;
511 new_state.xisr = 0;
512
513 } while (!icp_try_update(icp, old_state, new_state, true));
514
515 XICS_DBG("h_xirr vcpu %d xirr %#x\n", vcpu->vcpu_id, xirr);
516
517 return xirr;
518}
519
520static noinline int h_ipi(struct kvm_vcpu *vcpu, unsigned long server,
521 unsigned long mfrr)
522{
523 union kvmppc_icp_state old_state, new_state;
524 struct kvmppc_xics *xics = vcpu->kvm->arch.xics;
525 struct kvmppc_icp *icp;
526 u32 reject;
527 bool resend;
528 bool local;
529
530 XICS_DBG("h_ipi vcpu %d to server %lu mfrr %#lx\n",
531 vcpu->vcpu_id, server, mfrr);
532
533 icp = vcpu->arch.icp;
534 local = icp->server_num == server;
535 if (!local) {
536 icp = kvmppc_xics_find_server(vcpu->kvm, server);
537 if (!icp)
538 return H_PARAMETER;
539 }
540
541 /*
542 * ICP state: Set_MFRR
543 *
544 * If the CPPR is more favored than the new MFRR, then
545 * nothing needs to be rejected as there can be no XISR to
546 * reject. If the MFRR is being made less favored then
547 * there might be a previously-rejected interrupt needing
548 * to be resent.
549 *
550 * If the CPPR is less favored, then we might be replacing
551 * an interrupt, and thus need to possibly reject it as in
552 *
553 * ICP state: Check_IPI
554 */
555 do {
556 old_state = new_state = ACCESS_ONCE(icp->state);
557
558 /* Set_MFRR */
559 new_state.mfrr = mfrr;
560
561 /* Check_IPI */
562 reject = 0;
563 resend = false;
564 if (mfrr < new_state.cppr) {
565 /* Reject a pending interrupt if not an IPI */
566 if (mfrr <= new_state.pending_pri)
567 reject = new_state.xisr;
568 new_state.pending_pri = mfrr;
569 new_state.xisr = XICS_IPI;
570 }
571
572 if (mfrr > old_state.mfrr && mfrr > new_state.cppr) {
573 resend = new_state.need_resend;
574 new_state.need_resend = 0;
575 }
576 } while (!icp_try_update(icp, old_state, new_state, local));
577
578 /* Handle reject */
579 if (reject && reject != XICS_IPI)
580 icp_deliver_irq(xics, icp, reject);
581
582 /* Handle resend */
583 if (resend)
584 icp_check_resend(xics, icp);
585
586 return H_SUCCESS;
587}
588
589static noinline void h_cppr(struct kvm_vcpu *vcpu, unsigned long cppr)
590{
591 union kvmppc_icp_state old_state, new_state;
592 struct kvmppc_xics *xics = vcpu->kvm->arch.xics;
593 struct kvmppc_icp *icp = vcpu->arch.icp;
594 u32 reject;
595
596 XICS_DBG("h_cppr vcpu %d cppr %#lx\n", vcpu->vcpu_id, cppr);
597
598 /*
599 * ICP State: Set_CPPR
600 *
601 * We can safely compare the new value with the current
602 * value outside of the transaction as the CPPR is only
603 * ever changed by the processor on itself
604 */
605 if (cppr > icp->state.cppr)
606 icp_down_cppr(xics, icp, cppr);
607 else if (cppr == icp->state.cppr)
608 return;
609
610 /*
611 * ICP State: Up_CPPR
612 *
613 * The processor is raising its priority, this can result
614 * in a rejection of a pending interrupt:
615 *
616 * ICP State: Reject_Current
617 *
618 * We can remove EE from the current processor, the update
619 * transaction will set it again if needed
620 */
621 kvmppc_book3s_dequeue_irqprio(icp->vcpu,
622 BOOK3S_INTERRUPT_EXTERNAL_LEVEL);
623
624 do {
625 old_state = new_state = ACCESS_ONCE(icp->state);
626
627 reject = 0;
628 new_state.cppr = cppr;
629
630 if (cppr <= new_state.pending_pri) {
631 reject = new_state.xisr;
632 new_state.xisr = 0;
633 new_state.pending_pri = 0xff;
634 }
635
636 } while (!icp_try_update(icp, old_state, new_state, true));
637
638 /*
639 * Check for rejects. They are handled by doing a new delivery
640 * attempt (see comments in icp_deliver_irq).
641 */
642 if (reject && reject != XICS_IPI)
643 icp_deliver_irq(xics, icp, reject);
644}
645
646static noinline int h_eoi(struct kvm_vcpu *vcpu, unsigned long xirr)
647{
648 struct kvmppc_xics *xics = vcpu->kvm->arch.xics;
649 struct kvmppc_icp *icp = vcpu->arch.icp;
650 struct kvmppc_ics *ics;
651 struct ics_irq_state *state;
652 u32 irq = xirr & 0x00ffffff;
653 u16 src;
654
655 XICS_DBG("h_eoi vcpu %d eoi %#lx\n", vcpu->vcpu_id, xirr);
656
657 /*
658 * ICP State: EOI
659 *
660 * Note: If EOI is incorrectly used by SW to lower the CPPR
661 * value (ie more favored), we do not check for rejection of
662 * a pending interrupt, this is a SW error and PAPR sepcifies
663 * that we don't have to deal with it.
664 *
665 * The sending of an EOI to the ICS is handled after the
666 * CPPR update
667 *
668 * ICP State: Down_CPPR which we handle
669 * in a separate function as it's shared with H_CPPR.
670 */
671 icp_down_cppr(xics, icp, xirr >> 24);
672
673 /* IPIs have no EOI */
674 if (irq == XICS_IPI)
675 return H_SUCCESS;
676 /*
677 * EOI handling: If the interrupt is still asserted, we need to
678 * resend it. We can take a lockless "peek" at the ICS state here.
679 *
680 * "Message" interrupts will never have "asserted" set
681 */
682 ics = kvmppc_xics_find_ics(xics, irq, &src);
683 if (!ics) {
684 XICS_DBG("h_eoi: IRQ 0x%06x not found !\n", irq);
685 return H_PARAMETER;
686 }
687 state = &ics->irq_state[src];
688
689 /* Still asserted, resend it */
690 if (state->asserted)
691 icp_deliver_irq(xics, icp, irq);
692
693 return H_SUCCESS;
694}
695
696int kvmppc_xics_hcall(struct kvm_vcpu *vcpu, u32 req)
697{
698 unsigned long res;
699 int rc = H_SUCCESS;
700
701 /* Check if we have an ICP */
702 if (!vcpu->arch.icp || !vcpu->kvm->arch.xics)
703 return H_HARDWARE;
704
705 switch (req) {
706 case H_XIRR:
707 res = h_xirr(vcpu);
708 kvmppc_set_gpr(vcpu, 4, res);
709 break;
710 case H_CPPR:
711 h_cppr(vcpu, kvmppc_get_gpr(vcpu, 4));
712 break;
713 case H_EOI:
714 rc = h_eoi(vcpu, kvmppc_get_gpr(vcpu, 4));
715 break;
716 case H_IPI:
717 rc = h_ipi(vcpu, kvmppc_get_gpr(vcpu, 4),
718 kvmppc_get_gpr(vcpu, 5));
719 break;
720 }
721
722 return rc;
723}
724
725
726/* -- Initialisation code etc. -- */
727
728static int xics_debug_show(struct seq_file *m, void *private)
729{
730 struct kvmppc_xics *xics = m->private;
731 struct kvm *kvm = xics->kvm;
732 struct kvm_vcpu *vcpu;
733 int icsid, i;
734
735 if (!kvm)
736 return 0;
737
738 seq_printf(m, "=========\nICP state\n=========\n");
739
740 kvm_for_each_vcpu(i, vcpu, kvm) {
741 struct kvmppc_icp *icp = vcpu->arch.icp;
742 union kvmppc_icp_state state;
743
744 if (!icp)
745 continue;
746
747 state.raw = ACCESS_ONCE(icp->state.raw);
748 seq_printf(m, "cpu server %#lx XIRR:%#x PPRI:%#x CPPR:%#x MFRR:%#x OUT:%d NR:%d\n",
749 icp->server_num, state.xisr,
750 state.pending_pri, state.cppr, state.mfrr,
751 state.out_ee, state.need_resend);
752 }
753
754 for (icsid = 0; icsid <= KVMPPC_XICS_MAX_ICS_ID; icsid++) {
755 struct kvmppc_ics *ics = xics->ics[icsid];
756
757 if (!ics)
758 continue;
759
760 seq_printf(m, "=========\nICS state for ICS 0x%x\n=========\n",
761 icsid);
762
763 mutex_lock(&ics->lock);
764
765 for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
766 struct ics_irq_state *irq = &ics->irq_state[i];
767
768 seq_printf(m, "irq 0x%06x: server %#x prio %#x save prio %#x asserted %d resend %d masked pending %d\n",
769 irq->number, irq->server, irq->priority,
770 irq->saved_priority, irq->asserted,
771 irq->resend, irq->masked_pending);
772
773 }
774 mutex_unlock(&ics->lock);
775 }
776 return 0;
777}
778
779static int xics_debug_open(struct inode *inode, struct file *file)
780{
781 return single_open(file, xics_debug_show, inode->i_private);
782}
783
784static const struct file_operations xics_debug_fops = {
785 .open = xics_debug_open,
786 .read = seq_read,
787 .llseek = seq_lseek,
788 .release = single_release,
789};
790
791static void xics_debugfs_init(struct kvmppc_xics *xics)
792{
793 char *name;
794
795 name = kasprintf(GFP_KERNEL, "kvm-xics-%p", xics);
796 if (!name) {
797 pr_err("%s: no memory for name\n", __func__);
798 return;
799 }
800
801 xics->dentry = debugfs_create_file(name, S_IRUGO, powerpc_debugfs_root,
802 xics, &xics_debug_fops);
803
804 pr_debug("%s: created %s\n", __func__, name);
805 kfree(name);
806}
807
808struct kvmppc_ics *kvmppc_xics_create_ics(struct kvm *kvm,
809 struct kvmppc_xics *xics, int irq)
810{
811 struct kvmppc_ics *ics;
812 int i, icsid;
813
814 icsid = irq >> KVMPPC_XICS_ICS_SHIFT;
815
816 mutex_lock(&kvm->lock);
817
818 /* ICS already exists - somebody else got here first */
819 if (xics->ics[icsid])
820 goto out;
821
822 /* Create the ICS */
823 ics = kzalloc(sizeof(struct kvmppc_ics), GFP_KERNEL);
824 if (!ics)
825 goto out;
826
827 mutex_init(&ics->lock);
828 ics->icsid = icsid;
829
830 for (i = 0; i < KVMPPC_XICS_IRQ_PER_ICS; i++) {
831 ics->irq_state[i].number = (icsid << KVMPPC_XICS_ICS_SHIFT) | i;
832 ics->irq_state[i].priority = MASKED;
833 ics->irq_state[i].saved_priority = MASKED;
834 }
835 smp_wmb();
836 xics->ics[icsid] = ics;
837
838 if (icsid > xics->max_icsid)
839 xics->max_icsid = icsid;
840
841 out:
842 mutex_unlock(&kvm->lock);
843 return xics->ics[icsid];
844}
845
846int kvmppc_xics_create_icp(struct kvm_vcpu *vcpu, unsigned long server_num)
847{
848 struct kvmppc_icp *icp;
849
850 if (!vcpu->kvm->arch.xics)
851 return -ENODEV;
852
853 if (kvmppc_xics_find_server(vcpu->kvm, server_num))
854 return -EEXIST;
855
856 icp = kzalloc(sizeof(struct kvmppc_icp), GFP_KERNEL);
857 if (!icp)
858 return -ENOMEM;
859
860 icp->vcpu = vcpu;
861 icp->server_num = server_num;
862 icp->state.mfrr = MASKED;
863 icp->state.pending_pri = MASKED;
864 vcpu->arch.icp = icp;
865
866 XICS_DBG("created server for vcpu %d\n", vcpu->vcpu_id);
867
868 return 0;
869}
870
871/* -- ioctls -- */
872
873int kvm_vm_ioctl_xics_irq(struct kvm *kvm, struct kvm_irq_level *args)
874{
875 struct kvmppc_xics *xics;
876 int r;
877
878 /* locking against multiple callers? */
879
880 xics = kvm->arch.xics;
881 if (!xics)
882 return -ENODEV;
883
884 switch (args->level) {
885 case KVM_INTERRUPT_SET:
886 case KVM_INTERRUPT_SET_LEVEL:
887 case KVM_INTERRUPT_UNSET:
888 r = ics_deliver_irq(xics, args->irq, args->level);
889 break;
890 default:
891 r = -EINVAL;
892 }
893
894 return r;
895}
896
897void kvmppc_xics_free(struct kvmppc_xics *xics)
898{
899 int i;
900 struct kvm *kvm = xics->kvm;
901
902 debugfs_remove(xics->dentry);
903
904 if (kvm)
905 kvm->arch.xics = NULL;
906
907 for (i = 0; i <= xics->max_icsid; i++)
908 kfree(xics->ics[i]);
909 kfree(xics);
910}
911
912int kvm_xics_create(struct kvm *kvm, u32 type)
913{
914 struct kvmppc_xics *xics;
915 int ret = 0;
916
917 xics = kzalloc(sizeof(*xics), GFP_KERNEL);
918 if (!xics)
919 return -ENOMEM;
920
921 xics->kvm = kvm;
922
923 /* Already there ? */
924 mutex_lock(&kvm->lock);
925 if (kvm->arch.xics)
926 ret = -EEXIST;
927 else
928 kvm->arch.xics = xics;
929 mutex_unlock(&kvm->lock);
930
931 if (ret)
932 return ret;
933
934 xics_debugfs_init(xics);
935
936 return 0;
937}
938
939void kvmppc_xics_free_icp(struct kvm_vcpu *vcpu)
940{
941 if (!vcpu->arch.icp)
942 return;
943 kfree(vcpu->arch.icp);
944 vcpu->arch.icp = NULL;
945 vcpu->arch.irq_type = KVMPPC_IRQ_DEFAULT;
946}