irq_comm.c 12.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * irq_comm.c: Common API for in kernel interrupt controller
 * Copyright (c) 2007, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place - Suite 330, Boston, MA 02111-1307 USA.
 * Authors:
 *   Yaozu (Eddie) Dong <Eddie.dong@intel.com>
 *
N
Nicolas Kaiser 已提交
20
 * Copyright 2010 Red Hat, Inc. and/or its affiliates.
21 22 23
 */

#include <linux/kvm_host.h>
24
#include <linux/slab.h>
25
#include <trace/events/kvm.h>
S
Sheng Yang 已提交
26 27

#include <asm/msidef.h>
28 29 30
#ifdef CONFIG_IA64
#include <asm/iosapic.h>
#endif
S
Sheng Yang 已提交
31

32 33 34 35
#include "irq.h"

#include "ioapic.h"

36 37 38 39 40 41 42 43 44 45 46 47
static inline int kvm_irq_line_state(unsigned long *irq_state,
				     int irq_source_id, int level)
{
	/* Logical OR for level trig interrupt */
	if (level)
		set_bit(irq_source_id, irq_state);
	else
		clear_bit(irq_source_id, irq_state);

	return !!(*irq_state);
}

48
static int kvm_set_pic_irq(struct kvm_kernel_irq_routing_entry *e,
49
			   struct kvm *kvm, int irq_source_id, int level)
50 51
{
#ifdef CONFIG_X86
52 53 54 55
	struct kvm_pic *pic = pic_irqchip(kvm);
	level = kvm_irq_line_state(&pic->irq_states[e->irqchip.pin],
				   irq_source_id, level);
	return kvm_pic_set_irq(pic, e->irqchip.pin, level);
56 57
#else
	return -1;
58 59 60
#endif
}

61
static int kvm_set_ioapic_irq(struct kvm_kernel_irq_routing_entry *e,
62
			      struct kvm *kvm, int irq_source_id, int level)
63
{
64 65 66 67 68
	struct kvm_ioapic *ioapic = kvm->arch.vioapic;
	level = kvm_irq_line_state(&ioapic->irq_states[e->irqchip.pin],
				   irq_source_id, level);

	return kvm_ioapic_set_irq(ioapic, e->irqchip.pin, level);
69 70
}

71
inline static bool kvm_is_dm_lowest_prio(struct kvm_lapic_irq *irq)
72
{
73 74 75 76 77 78 79
#ifdef CONFIG_IA64
	return irq->delivery_mode ==
		(IOSAPIC_LOWEST_PRIORITY << IOSAPIC_DELIVERY_SHIFT);
#else
	return irq->delivery_mode == APIC_DM_LOWEST;
#endif
}
80

81 82 83 84 85 86 87 88
int kvm_irq_delivery_to_apic(struct kvm *kvm, struct kvm_lapic *src,
		struct kvm_lapic_irq *irq)
{
	int i, r = -1;
	struct kvm_vcpu *vcpu, *lowest = NULL;

	if (irq->dest_mode == 0 && irq->dest_id == 0xff &&
			kvm_is_dm_lowest_prio(irq))
89 90
		printk(KERN_INFO "kvm: apic: phys broadcast and lowest prio\n");

91 92
	kvm_for_each_vcpu(i, vcpu, kvm) {
		if (!kvm_apic_present(vcpu))
93 94
			continue;

95 96
		if (!kvm_apic_match_dest(vcpu, src, irq->shorthand,
					irq->dest_id, irq->dest_mode))
97 98
			continue;

99 100 101 102
		if (!kvm_is_dm_lowest_prio(irq)) {
			if (r < 0)
				r = 0;
			r += kvm_apic_set_irq(vcpu, irq);
103
		} else if (kvm_lapic_enabled(vcpu)) {
104 105 106 107
			if (!lowest)
				lowest = vcpu;
			else if (kvm_apic_compare_prio(vcpu, lowest) < 0)
				lowest = vcpu;
108
		}
109 110
	}

111 112 113 114
	if (lowest)
		r = kvm_apic_set_irq(lowest, irq);

	return r;
115 116
}

117 118
int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
		struct kvm *kvm, int irq_source_id, int level)
S
Sheng Yang 已提交
119
{
120
	struct kvm_lapic_irq irq;
S
Sheng Yang 已提交
121

122 123 124
	if (!level)
		return -1;

125 126
	trace_kvm_msi_set_irq(e->msi.address_lo, e->msi.data);

127
	irq.dest_id = (e->msi.address_lo &
128
			MSI_ADDR_DEST_ID_MASK) >> MSI_ADDR_DEST_ID_SHIFT;
129
	irq.vector = (e->msi.data &
130
			MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT;
131 132 133 134 135
	irq.dest_mode = (1 << MSI_ADDR_DEST_MODE_SHIFT) & e->msi.address_lo;
	irq.trig_mode = (1 << MSI_DATA_TRIGGER_SHIFT) & e->msi.data;
	irq.delivery_mode = e->msi.data & 0x700;
	irq.level = 1;
	irq.shorthand = 0;
136 137

	/* TODO Deal with RH bit of MSI message address */
138
	return kvm_irq_delivery_to_apic(kvm, NULL, &irq);
S
Sheng Yang 已提交
139 140
}

141 142 143 144 145 146 147 148 149 150 151 152 153 154
int kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi)
{
	struct kvm_kernel_irq_routing_entry route;

	if (!irqchip_in_kernel(kvm) || msi->flags != 0)
		return -EINVAL;

	route.msi.address_lo = msi->address_lo;
	route.msi.address_hi = msi->address_hi;
	route.msi.data = msi->data;

	return kvm_set_msi(&route, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1);
}

155
/*
156 157 158 159 160
 * Return value:
 *  < 0   Interrupt was ignored (masked or not delivered for other reasons)
 *  = 0   Interrupt was coalesced (previous irq is still pending)
 *  > 0   Number of CPUs interrupt was delivered to
 */
161
int kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level)
162
{
G
Gleb Natapov 已提交
163 164
	struct kvm_kernel_irq_routing_entry *e, irq_set[KVM_NR_IRQCHIPS];
	int ret = -1, i = 0;
165 166
	struct kvm_irq_routing_table *irq_rt;
	struct hlist_node *n;
S
Sheng Yang 已提交
167

A
Avi Kivity 已提交
168
	trace_kvm_set_irq(irq, level, irq_source_id);
169

170 171 172 173
	/* Not possible to detect if the guest uses the PIC or the
	 * IOAPIC.  So set the bit in both. The guest will ignore
	 * writes to the unused one.
	 */
174 175
	rcu_read_lock();
	irq_rt = rcu_dereference(kvm->irq_routing);
176
	if (irq < irq_rt->nr_rt_entries)
G
Gleb Natapov 已提交
177 178
		hlist_for_each_entry(e, n, &irq_rt->map[irq], link)
			irq_set[i++] = *e;
179
	rcu_read_unlock();
G
Gleb Natapov 已提交
180 181 182 183 184 185 186 187 188 189

	while(i--) {
		int r;
		r = irq_set[i].set(&irq_set[i], kvm, irq_source_id, level);
		if (r < 0)
			continue;

		ret = r + ((ret < 0) ? 0 : ret);
	}

190
	return ret;
191 192
}

193
void kvm_notify_acked_irq(struct kvm *kvm, unsigned irqchip, unsigned pin)
194 195 196
{
	struct kvm_irq_ack_notifier *kian;
	struct hlist_node *n;
197
	int gsi;
198

199 200
	trace_kvm_ack_irq(irqchip, pin);

201 202
	rcu_read_lock();
	gsi = rcu_dereference(kvm->irq_routing)->chip[irqchip][pin];
203
	if (gsi != -1)
204 205
		hlist_for_each_entry_rcu(kian, n, &kvm->irq_ack_notifier_list,
					 link)
206 207
			if (kian->gsi == gsi)
				kian->irq_acked(kian);
208
	rcu_read_unlock();
209 210 211 212 213
}

void kvm_register_irq_ack_notifier(struct kvm *kvm,
				   struct kvm_irq_ack_notifier *kian)
{
214
	mutex_lock(&kvm->irq_lock);
215
	hlist_add_head_rcu(&kian->link, &kvm->irq_ack_notifier_list);
216
	mutex_unlock(&kvm->irq_lock);
217 218
}

219 220
void kvm_unregister_irq_ack_notifier(struct kvm *kvm,
				    struct kvm_irq_ack_notifier *kian)
221
{
222
	mutex_lock(&kvm->irq_lock);
223
	hlist_del_init_rcu(&kian->link);
224
	mutex_unlock(&kvm->irq_lock);
225
	synchronize_rcu();
226
}
227 228 229 230

int kvm_request_irq_source_id(struct kvm *kvm)
{
	unsigned long *bitmap = &kvm->arch.irq_sources_bitmap;
231 232 233
	int irq_source_id;

	mutex_lock(&kvm->irq_lock);
234
	irq_source_id = find_first_zero_bit(bitmap, BITS_PER_LONG);
235

236
	if (irq_source_id >= BITS_PER_LONG) {
237
		printk(KERN_WARNING "kvm: exhaust allocatable IRQ sources!\n");
238 239
		irq_source_id = -EFAULT;
		goto unlock;
240 241 242 243
	}

	ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID);
	set_bit(irq_source_id, bitmap);
244
unlock:
245
	mutex_unlock(&kvm->irq_lock);
246

247 248 249 250 251 252 253
	return irq_source_id;
}

void kvm_free_irq_source_id(struct kvm *kvm, int irq_source_id)
{
	int i;

254 255
	ASSERT(irq_source_id != KVM_USERSPACE_IRQ_SOURCE_ID);

256
	mutex_lock(&kvm->irq_lock);
257
	if (irq_source_id < 0 ||
258
	    irq_source_id >= BITS_PER_LONG) {
259
		printk(KERN_ERR "kvm: IRQ source ID out of range!\n");
260
		goto unlock;
261
	}
262 263 264 265
	clear_bit(irq_source_id, &kvm->arch.irq_sources_bitmap);
	if (!irqchip_in_kernel(kvm))
		goto unlock;

266 267 268 269 270 271 272 273
	for (i = 0; i < KVM_IOAPIC_NUM_PINS; i++) {
		clear_bit(irq_source_id, &kvm->arch.vioapic->irq_states[i]);
		if (i >= 16)
			continue;
#ifdef CONFIG_X86
		clear_bit(irq_source_id, &pic_irqchip(kvm)->irq_states[i]);
#endif
	}
274
unlock:
275
	mutex_unlock(&kvm->irq_lock);
276
}
277 278 279 280

void kvm_register_irq_mask_notifier(struct kvm *kvm, int irq,
				    struct kvm_irq_mask_notifier *kimn)
{
281
	mutex_lock(&kvm->irq_lock);
282
	kimn->irq = irq;
283
	hlist_add_head_rcu(&kimn->link, &kvm->mask_notifier_list);
284
	mutex_unlock(&kvm->irq_lock);
285 286 287 288 289
}

void kvm_unregister_irq_mask_notifier(struct kvm *kvm, int irq,
				      struct kvm_irq_mask_notifier *kimn)
{
290
	mutex_lock(&kvm->irq_lock);
291
	hlist_del_rcu(&kimn->link);
292
	mutex_unlock(&kvm->irq_lock);
293
	synchronize_rcu();
294 295
}

296 297
void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin,
			     bool mask)
298 299 300
{
	struct kvm_irq_mask_notifier *kimn;
	struct hlist_node *n;
301
	int gsi;
302

303
	rcu_read_lock();
304 305 306 307 308
	gsi = rcu_dereference(kvm->irq_routing)->chip[irqchip][pin];
	if (gsi != -1)
		hlist_for_each_entry_rcu(kimn, n, &kvm->mask_notifier_list, link)
			if (kimn->irq == gsi)
				kimn->func(kimn, mask);
309
	rcu_read_unlock();
310 311
}

312 313
void kvm_free_irq_routing(struct kvm *kvm)
{
314 315
	/* Called only during vm destruction. Nobody can use the pointer
	   at this stage */
316
	kfree(kvm->irq_routing);
317 318
}

319 320
static int setup_routing_entry(struct kvm_irq_routing_table *rt,
			       struct kvm_kernel_irq_routing_entry *e,
321
			       const struct kvm_irq_routing_entry *ue)
322 323 324
{
	int r = -EINVAL;
	int delta;
325
	unsigned max_pin;
326 327 328 329 330 331 332 333 334 335 336
	struct kvm_kernel_irq_routing_entry *ei;
	struct hlist_node *n;

	/*
	 * Do not allow GSI to be mapped to the same irqchip more than once.
	 * Allow only one to one mapping between GSI and MSI.
	 */
	hlist_for_each_entry(ei, n, &rt->map[ue->gsi], link)
		if (ei->type == KVM_IRQ_ROUTING_MSI ||
		    ue->u.irqchip.irqchip == ei->irqchip.irqchip)
			return r;
337 338

	e->gsi = ue->gsi;
339
	e->type = ue->type;
340 341 342 343 344 345
	switch (ue->type) {
	case KVM_IRQ_ROUTING_IRQCHIP:
		delta = 0;
		switch (ue->u.irqchip.irqchip) {
		case KVM_IRQCHIP_PIC_MASTER:
			e->set = kvm_set_pic_irq;
346
			max_pin = 16;
347 348
			break;
		case KVM_IRQCHIP_PIC_SLAVE:
349
			e->set = kvm_set_pic_irq;
350
			max_pin = 16;
351 352 353
			delta = 8;
			break;
		case KVM_IRQCHIP_IOAPIC:
354
			max_pin = KVM_IOAPIC_NUM_PINS;
355
			e->set = kvm_set_ioapic_irq;
356 357 358 359 360 361
			break;
		default:
			goto out;
		}
		e->irqchip.irqchip = ue->u.irqchip.irqchip;
		e->irqchip.pin = ue->u.irqchip.pin + delta;
362
		if (e->irqchip.pin >= max_pin)
363 364
			goto out;
		rt->chip[ue->u.irqchip.irqchip][e->irqchip.pin] = ue->gsi;
365
		break;
S
Sheng Yang 已提交
366 367 368 369 370 371
	case KVM_IRQ_ROUTING_MSI:
		e->set = kvm_set_msi;
		e->msi.address_lo = ue->u.msi.address_lo;
		e->msi.address_hi = ue->u.msi.address_hi;
		e->msi.data = ue->u.msi.data;
		break;
372 373 374
	default:
		goto out;
	}
375 376

	hlist_add_head(&e->link, &rt->map[e->gsi]);
377 378 379 380 381 382 383 384 385 386 387
	r = 0;
out:
	return r;
}


int kvm_set_irq_routing(struct kvm *kvm,
			const struct kvm_irq_routing_entry *ue,
			unsigned nr,
			unsigned flags)
{
388
	struct kvm_irq_routing_table *new, *old;
389
	u32 i, j, nr_rt_entries = 0;
390 391
	int r;

392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
	for (i = 0; i < nr; ++i) {
		if (ue[i].gsi >= KVM_MAX_IRQ_ROUTES)
			return -EINVAL;
		nr_rt_entries = max(nr_rt_entries, ue[i].gsi);
	}

	nr_rt_entries += 1;

	new = kzalloc(sizeof(*new) + (nr_rt_entries * sizeof(struct hlist_head))
		      + (nr * sizeof(struct kvm_kernel_irq_routing_entry)),
		      GFP_KERNEL);

	if (!new)
		return -ENOMEM;

	new->rt_entries = (void *)&new->map[nr_rt_entries];

	new->nr_rt_entries = nr_rt_entries;
410 411 412
	for (i = 0; i < 3; i++)
		for (j = 0; j < KVM_IOAPIC_NUM_PINS; j++)
			new->chip[i][j] = -1;
413

414 415 416 417
	for (i = 0; i < nr; ++i) {
		r = -EINVAL;
		if (ue->flags)
			goto out;
418
		r = setup_routing_entry(new, &new->rt_entries[i], ue);
419 420 421 422 423
		if (r)
			goto out;
		++ue;
	}

424
	mutex_lock(&kvm->irq_lock);
425
	old = kvm->irq_routing;
426
	kvm_irq_routing_update(kvm, new);
427
	mutex_unlock(&kvm->irq_lock);
428

429
	synchronize_rcu();
430

431
	new = old;
432 433 434
	r = 0;

out:
435
	kfree(new);
436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
	return r;
}

#define IOAPIC_ROUTING_ENTRY(irq) \
	{ .gsi = irq, .type = KVM_IRQ_ROUTING_IRQCHIP,	\
	  .u.irqchip.irqchip = KVM_IRQCHIP_IOAPIC, .u.irqchip.pin = (irq) }
#define ROUTING_ENTRY1(irq) IOAPIC_ROUTING_ENTRY(irq)

#ifdef CONFIG_X86
#  define PIC_ROUTING_ENTRY(irq) \
	{ .gsi = irq, .type = KVM_IRQ_ROUTING_IRQCHIP,	\
	  .u.irqchip.irqchip = SELECT_PIC(irq), .u.irqchip.pin = (irq) % 8 }
#  define ROUTING_ENTRY2(irq) \
	IOAPIC_ROUTING_ENTRY(irq), PIC_ROUTING_ENTRY(irq)
#else
#  define ROUTING_ENTRY2(irq) \
	IOAPIC_ROUTING_ENTRY(irq)
#endif

static const struct kvm_irq_routing_entry default_routing[] = {
	ROUTING_ENTRY2(0), ROUTING_ENTRY2(1),
	ROUTING_ENTRY2(2), ROUTING_ENTRY2(3),
	ROUTING_ENTRY2(4), ROUTING_ENTRY2(5),
	ROUTING_ENTRY2(6), ROUTING_ENTRY2(7),
	ROUTING_ENTRY2(8), ROUTING_ENTRY2(9),
	ROUTING_ENTRY2(10), ROUTING_ENTRY2(11),
	ROUTING_ENTRY2(12), ROUTING_ENTRY2(13),
	ROUTING_ENTRY2(14), ROUTING_ENTRY2(15),
	ROUTING_ENTRY1(16), ROUTING_ENTRY1(17),
	ROUTING_ENTRY1(18), ROUTING_ENTRY1(19),
	ROUTING_ENTRY1(20), ROUTING_ENTRY1(21),
	ROUTING_ENTRY1(22), ROUTING_ENTRY1(23),
#ifdef CONFIG_IA64
	ROUTING_ENTRY1(24), ROUTING_ENTRY1(25),
	ROUTING_ENTRY1(26), ROUTING_ENTRY1(27),
	ROUTING_ENTRY1(28), ROUTING_ENTRY1(29),
	ROUTING_ENTRY1(30), ROUTING_ENTRY1(31),
	ROUTING_ENTRY1(32), ROUTING_ENTRY1(33),
	ROUTING_ENTRY1(34), ROUTING_ENTRY1(35),
	ROUTING_ENTRY1(36), ROUTING_ENTRY1(37),
	ROUTING_ENTRY1(38), ROUTING_ENTRY1(39),
	ROUTING_ENTRY1(40), ROUTING_ENTRY1(41),
	ROUTING_ENTRY1(42), ROUTING_ENTRY1(43),
	ROUTING_ENTRY1(44), ROUTING_ENTRY1(45),
	ROUTING_ENTRY1(46), ROUTING_ENTRY1(47),
#endif
};

int kvm_setup_default_irq_routing(struct kvm *kvm)
{
	return kvm_set_irq_routing(kvm, default_routing,
				   ARRAY_SIZE(default_routing), 0);
}