10SN/A// SPDX-License-Identifier: GPL-2.0-only
20SN/A/*
30SN/A * irqchip.c: Common API for in kernel interrupt controllers
40SN/A * Copyright (c) 2007, Intel Corporation.
50SN/A * Copyright 2010 Red Hat, Inc. and/or its affiliates.
61113Sjoehw * Copyright (c) 2013, Alexander Graf <agraf@suse.de>
71113Sjoehw *
81113Sjoehw * This file is derived from virt/kvm/irq_comm.c.
91113Sjoehw *
101113Sjoehw * Authors:
111113Sjoehw *   Yaozu (Eddie) Dong <Eddie.dong@intel.com>
120SN/A *   Alexander Graf <agraf@suse.de>
130SN/A */
140SN/A
150SN/A#include <linux/kvm_host.h>
160SN/A#include <linux/slab.h>
170SN/A#include <linux/srcu.h>
180SN/A#include <linux/export.h>
190SN/A#include <trace/events/kvm.h>
200SN/A
210SN/Aint kvm_irq_map_gsi(struct kvm *kvm,
220SN/A		    struct kvm_kernel_irq_routing_entry *entries, int gsi)
230SN/A{
240SN/A	struct kvm_irq_routing_table *irq_rt;
250SN/A	struct kvm_kernel_irq_routing_entry *e;
260SN/A	int n = 0;
270SN/A
280SN/A	irq_rt = srcu_dereference_check(kvm->irq_routing, &kvm->irq_srcu,
290SN/A					lockdep_is_held(&kvm->irq_lock));
300SN/A	if (irq_rt && gsi < irq_rt->nr_rt_entries) {
310SN/A		hlist_for_each_entry(e, &irq_rt->map[gsi], link) {
320SN/A			entries[n] = *e;
330SN/A			++n;
340SN/A		}
350SN/A	}
360SN/A
370SN/A	return n;
380SN/A}
390SN/A
400SN/Aint kvm_irq_map_chip_pin(struct kvm *kvm, unsigned irqchip, unsigned pin)
410SN/A{
420SN/A	struct kvm_irq_routing_table *irq_rt;
430SN/A
440SN/A	irq_rt = srcu_dereference(kvm->irq_routing, &kvm->irq_srcu);
450SN/A	return irq_rt->chip[irqchip][pin];
460SN/A}
470SN/A
480SN/Aint kvm_send_userspace_msi(struct kvm *kvm, struct kvm_msi *msi)
490SN/A{
500SN/A	struct kvm_kernel_irq_routing_entry route;
510SN/A
520SN/A	if (!kvm_arch_irqchip_in_kernel(kvm) || (msi->flags & ~KVM_MSI_VALID_DEVID))
530SN/A		return -EINVAL;
540SN/A
550SN/A	route.msi.address_lo = msi->address_lo;
560SN/A	route.msi.address_hi = msi->address_hi;
570SN/A	route.msi.data = msi->data;
580SN/A	route.msi.flags = msi->flags;
590SN/A	route.msi.devid = msi->devid;
600SN/A
610SN/A	return kvm_set_msi(&route, kvm, KVM_USERSPACE_IRQ_SOURCE_ID, 1, false);
620SN/A}
630SN/A
640SN/A/*
650SN/A * Return value:
660SN/A *  < 0   Interrupt was ignored (masked or not delivered for other reasons)
670SN/A *  = 0   Interrupt was coalesced (previous irq is still pending)
680SN/A *  > 0   Number of CPUs interrupt was delivered to
690SN/A */
700SN/Aint kvm_set_irq(struct kvm *kvm, int irq_source_id, u32 irq, int level,
710SN/A		bool line_status)
720SN/A{
730SN/A	struct kvm_kernel_irq_routing_entry irq_set[KVM_NR_IRQCHIPS];
740SN/A	int ret = -1, i, idx;
750SN/A
760SN/A	trace_kvm_set_irq(irq, level, irq_source_id);
770SN/A
780SN/A	/* Not possible to detect if the guest uses the PIC or the
790SN/A	 * IOAPIC.  So set the bit in both. The guest will ignore
800SN/A	 * writes to the unused one.
810SN/A	 */
820SN/A	idx = srcu_read_lock(&kvm->irq_srcu);
830SN/A	i = kvm_irq_map_gsi(kvm, irq_set, irq);
840SN/A	srcu_read_unlock(&kvm->irq_srcu, idx);
850SN/A
860SN/A	while (i--) {
870SN/A		int r;
880SN/A		r = irq_set[i].set(&irq_set[i], kvm, irq_source_id, level,
890SN/A				   line_status);
900SN/A		if (r < 0)
910SN/A			continue;
920SN/A
930SN/A		ret = r + ((ret < 0) ? 0 : ret);
940SN/A	}
950SN/A
960SN/A	return ret;
970SN/A}
980SN/A
990SN/Astatic void free_irq_routing_table(struct kvm_irq_routing_table *rt)
1000SN/A{
1010SN/A	int i;
1020SN/A
1030SN/A	if (!rt)
1040SN/A		return;
1050SN/A
1060SN/A	for (i = 0; i < rt->nr_rt_entries; ++i) {
1070SN/A		struct kvm_kernel_irq_routing_entry *e;
1080SN/A		struct hlist_node *n;
1090SN/A
1100SN/A		hlist_for_each_entry_safe(e, n, &rt->map[i], link) {
1110SN/A			hlist_del(&e->link);
1120SN/A			kfree(e);
1130SN/A		}
1140SN/A	}
1150SN/A
1160SN/A	kfree(rt);
1170SN/A}
1180SN/A
1190SN/Avoid kvm_free_irq_routing(struct kvm *kvm)
1200SN/A{
1210SN/A	/* Called only during vm destruction. Nobody can use the pointer
1220SN/A	   at this stage */
1230SN/A	struct kvm_irq_routing_table *rt = rcu_access_pointer(kvm->irq_routing);
1240SN/A	free_irq_routing_table(rt);
1250SN/A}
1260SN/A
1270SN/Astatic int setup_routing_entry(struct kvm *kvm,
1280SN/A			       struct kvm_irq_routing_table *rt,
1290SN/A			       struct kvm_kernel_irq_routing_entry *e,
1300SN/A			       const struct kvm_irq_routing_entry *ue)
1310SN/A{
1320SN/A	struct kvm_kernel_irq_routing_entry *ei;
1330SN/A	int r;
1340SN/A	u32 gsi = array_index_nospec(ue->gsi, KVM_MAX_IRQ_ROUTES);
1350SN/A
1360SN/A	/*
1370SN/A	 * Do not allow GSI to be mapped to the same irqchip more than once.
1380SN/A	 * Allow only one to one mapping between GSI and non-irqchip routing.
1390SN/A	 */
1400SN/A	hlist_for_each_entry(ei, &rt->map[gsi], link)
1410SN/A		if (ei->type != KVM_IRQ_ROUTING_IRQCHIP ||
1420SN/A		    ue->type != KVM_IRQ_ROUTING_IRQCHIP ||
1430SN/A		    ue->u.irqchip.irqchip == ei->irqchip.irqchip)
1440SN/A			return -EINVAL;
1450SN/A
1460SN/A	e->gsi = gsi;
1470SN/A	e->type = ue->type;
1480SN/A	r = kvm_set_routing_entry(kvm, e, ue);
1490SN/A	if (r)
1500SN/A		return r;
1510SN/A	if (e->type == KVM_IRQ_ROUTING_IRQCHIP)
1520SN/A		rt->chip[e->irqchip.irqchip][e->irqchip.pin] = e->gsi;
1530SN/A
1540SN/A	hlist_add_head(&e->link, &rt->map[e->gsi]);
1550SN/A
1560SN/A	return 0;
1570SN/A}
1580SN/A
1590SN/Avoid __attribute__((weak)) kvm_arch_irq_routing_update(struct kvm *kvm)
1600SN/A{
1610SN/A}
1620SN/A
1630SN/Abool __weak kvm_arch_can_set_irq_routing(struct kvm *kvm)
1640SN/A{
1650SN/A	return true;
1660SN/A}
1670SN/A
1680SN/Aint kvm_set_irq_routing(struct kvm *kvm,
1690SN/A			const struct kvm_irq_routing_entry *ue,
1700SN/A			unsigned nr,
1710SN/A			unsigned flags)
1720SN/A{
1730SN/A	struct kvm_irq_routing_table *new, *old;
1740SN/A	struct kvm_kernel_irq_routing_entry *e;
1750SN/A	u32 i, j, nr_rt_entries = 0;
1760SN/A	int r;
1770SN/A
1780SN/A	for (i = 0; i < nr; ++i) {
1790SN/A		if (ue[i].gsi >= KVM_MAX_IRQ_ROUTES)
1800SN/A			return -EINVAL;
1810SN/A		nr_rt_entries = max(nr_rt_entries, ue[i].gsi);
1820SN/A	}
1830SN/A
1840SN/A	nr_rt_entries += 1;
1850SN/A
1860SN/A	new = kzalloc(struct_size(new, map, nr_rt_entries), GFP_KERNEL_ACCOUNT);
1870SN/A	if (!new)
1880SN/A		return -ENOMEM;
1890SN/A
1900SN/A	new->nr_rt_entries = nr_rt_entries;
1910SN/A	for (i = 0; i < KVM_NR_IRQCHIPS; i++)
1920SN/A		for (j = 0; j < KVM_IRQCHIP_NUM_PINS; j++)
1930SN/A			new->chip[i][j] = -1;
1940SN/A
1950SN/A	for (i = 0; i < nr; ++i) {
1960SN/A		r = -ENOMEM;
1970SN/A		e = kzalloc(sizeof(*e), GFP_KERNEL_ACCOUNT);
1980SN/A		if (!e)
1990SN/A			goto out;
2000SN/A
2010SN/A		r = -EINVAL;
2020SN/A		switch (ue->type) {
2030SN/A		case KVM_IRQ_ROUTING_MSI:
2040SN/A			if (ue->flags & ~KVM_MSI_VALID_DEVID)
2050SN/A				goto free_entry;
2060SN/A			break;
2070SN/A		default:
2080SN/A			if (ue->flags)
2090SN/A				goto free_entry;
2100SN/A			break;
2110SN/A		}
2120SN/A		r = setup_routing_entry(kvm, new, e, ue);
2130SN/A		if (r)
2140SN/A			goto free_entry;
2150SN/A		++ue;
2160SN/A	}
2170SN/A
2180SN/A	mutex_lock(&kvm->irq_lock);
2190SN/A	old = rcu_dereference_protected(kvm->irq_routing, 1);
220	rcu_assign_pointer(kvm->irq_routing, new);
221	kvm_irq_routing_update(kvm);
222	kvm_arch_irq_routing_update(kvm);
223	mutex_unlock(&kvm->irq_lock);
224
225	kvm_arch_post_irq_routing_update(kvm);
226
227	synchronize_srcu_expedited(&kvm->irq_srcu);
228
229	new = old;
230	r = 0;
231	goto out;
232
233free_entry:
234	kfree(e);
235out:
236	free_irq_routing_table(new);
237
238	return r;
239}
240