| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * irq_comm.c: Common API for in kernel interrupt controller |
|---|
| 3 | 4 | * Copyright (c) 2007, Intel Corporation. |
|---|
| 4 | 5 | * |
|---|
| 5 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 6 | | - * under the terms and conditions of the GNU General Public License, |
|---|
| 7 | | - * version 2, as published by the Free Software Foundation. |
|---|
| 8 | | - * |
|---|
| 9 | | - * This program is distributed in the hope it will be useful, but WITHOUT |
|---|
| 10 | | - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|---|
| 11 | | - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
|---|
| 12 | | - * more details. |
|---|
| 13 | | - * |
|---|
| 14 | | - * You should have received a copy of the GNU General Public License along with |
|---|
| 15 | | - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple |
|---|
| 16 | | - * Place - Suite 330, Boston, MA 02111-1307 USA. |
|---|
| 17 | 6 | * Authors: |
|---|
| 18 | 7 | * Yaozu (Eddie) Dong <Eddie.dong@intel.com> |
|---|
| 19 | 8 | * |
|---|
| .. | .. |
|---|
| 63 | 52 | unsigned long dest_vcpu_bitmap[BITS_TO_LONGS(KVM_MAX_VCPUS)]; |
|---|
| 64 | 53 | unsigned int dest_vcpus = 0; |
|---|
| 65 | 54 | |
|---|
| 66 | | - if (irq->dest_mode == 0 && irq->dest_id == 0xff && |
|---|
| 67 | | - kvm_lowest_prio_delivery(irq)) { |
|---|
| 55 | + if (kvm_irq_delivery_to_apic_fast(kvm, src, irq, &r, dest_map)) |
|---|
| 56 | + return r; |
|---|
| 57 | + |
|---|
| 58 | + if (irq->dest_mode == APIC_DEST_PHYSICAL && |
|---|
| 59 | + irq->dest_id == 0xff && kvm_lowest_prio_delivery(irq)) { |
|---|
| 68 | 60 | printk(KERN_INFO "kvm: apic: phys broadcast and lowest prio\n"); |
|---|
| 69 | 61 | irq->delivery_mode = APIC_DM_FIXED; |
|---|
| 70 | 62 | } |
|---|
| 71 | | - |
|---|
| 72 | | - if (kvm_irq_delivery_to_apic_fast(kvm, src, irq, &r, dest_map)) |
|---|
| 73 | | - return r; |
|---|
| 74 | 63 | |
|---|
| 75 | 64 | memset(dest_vcpu_bitmap, 0, sizeof(dest_vcpu_bitmap)); |
|---|
| 76 | 65 | |
|---|
| .. | .. |
|---|
| 86 | 75 | if (r < 0) |
|---|
| 87 | 76 | r = 0; |
|---|
| 88 | 77 | r += kvm_apic_set_irq(vcpu, irq, dest_map); |
|---|
| 89 | | - } else if (kvm_lapic_enabled(vcpu)) { |
|---|
| 78 | + } else if (kvm_apic_sw_enabled(vcpu->arch.apic)) { |
|---|
| 90 | 79 | if (!kvm_vector_hashing_enabled()) { |
|---|
| 91 | 80 | if (!lowest) |
|---|
| 92 | 81 | lowest = vcpu; |
|---|
| .. | .. |
|---|
| 125 | 114 | irq->dest_id |= MSI_ADDR_EXT_DEST_ID(e->msi.address_hi); |
|---|
| 126 | 115 | irq->vector = (e->msi.data & |
|---|
| 127 | 116 | MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT; |
|---|
| 128 | | - irq->dest_mode = (1 << MSI_ADDR_DEST_MODE_SHIFT) & e->msi.address_lo; |
|---|
| 117 | + irq->dest_mode = kvm_lapic_irq_dest_mode( |
|---|
| 118 | + !!((1 << MSI_ADDR_DEST_MODE_SHIFT) & e->msi.address_lo)); |
|---|
| 129 | 119 | irq->trig_mode = (1 << MSI_DATA_TRIGGER_SHIFT) & e->msi.data; |
|---|
| 130 | 120 | irq->delivery_mode = e->msi.data & 0x700; |
|---|
| 131 | 121 | irq->msi_redir_hint = ((e->msi.address_lo |
|---|
| 132 | 122 | & MSI_ADDR_REDIRECTION_LOWPRI) > 0); |
|---|
| 133 | 123 | irq->level = 1; |
|---|
| 134 | | - irq->shorthand = 0; |
|---|
| 124 | + irq->shorthand = APIC_DEST_NOSHORT; |
|---|
| 135 | 125 | } |
|---|
| 136 | 126 | EXPORT_SYMBOL_GPL(kvm_set_msi_irq); |
|---|
| 137 | 127 | |
|---|
| .. | .. |
|---|
| 295 | 285 | switch (ue->u.irqchip.irqchip) { |
|---|
| 296 | 286 | case KVM_IRQCHIP_PIC_SLAVE: |
|---|
| 297 | 287 | e->irqchip.pin += PIC_NUM_PINS / 2; |
|---|
| 298 | | - /* fall through */ |
|---|
| 288 | + fallthrough; |
|---|
| 299 | 289 | case KVM_IRQCHIP_PIC_MASTER: |
|---|
| 300 | 290 | if (ue->u.irqchip.pin >= PIC_NUM_PINS / 2) |
|---|
| 301 | 291 | return -EINVAL; |
|---|
| .. | .. |
|---|
| 427 | 417 | |
|---|
| 428 | 418 | kvm_set_msi_irq(vcpu->kvm, entry, &irq); |
|---|
| 429 | 419 | |
|---|
| 430 | | - if (irq.trig_mode && kvm_apic_match_dest(vcpu, NULL, 0, |
|---|
| 420 | + if (irq.trig_mode && |
|---|
| 421 | + kvm_apic_match_dest(vcpu, NULL, APIC_DEST_NOSHORT, |
|---|
| 431 | 422 | irq.dest_id, irq.dest_mode)) |
|---|
| 432 | 423 | __set_bit(irq.vector, ioapic_handled_vectors); |
|---|
| 433 | 424 | } |
|---|