Lines Matching +full:loongson +full:- +full:3
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Loongson-3 Virtual IPI interrupt support.
5 * Copyright (C) 2019 Loongson Technologies, Inc. All rights reserved.
7 * Authors: Chen Zhu <zhuchen@loongson.cn>
54 uint32_t core = (addr >> 8) & 3; in loongson_vipi_read()
55 uint32_t node = (addr >> 44) & 3; in loongson_vipi_read()
59 struct ipi_state *s = &(ipi->ipistate[id]); in loongson_vipi_read()
61 BUG_ON(offset & (len - 1)); in loongson_vipi_read()
65 *(uint64_t *)val = s->status; in loongson_vipi_read()
69 *(uint64_t *)val = s->en; in loongson_vipi_read()
81 pbuf = (void *)s->buf + (offset - 0x20); in loongson_vipi_read()
99 uint32_t core = (addr >> 8) & 3; in loongson_vipi_write()
100 uint32_t node = (addr >> 44) & 3; in loongson_vipi_write()
104 struct kvm *kvm = ipi->kvm; in loongson_vipi_write()
106 struct ipi_state *s = &(ipi->ipistate[id]); in loongson_vipi_write()
109 BUG_ON(offset & (len - 1)); in loongson_vipi_write()
116 s->en = data; in loongson_vipi_write()
120 s->status |= data; in loongson_vipi_write()
123 kvm_vcpu_ioctl_interrupt(kvm->vcpus[id], &irq); in loongson_vipi_write()
127 s->status &= ~data; in loongson_vipi_write()
128 if (!s->status) { in loongson_vipi_write()
130 irq.irq = -6; in loongson_vipi_write()
131 kvm_vcpu_ioctl_interrupt(kvm->vcpus[id], &irq); in loongson_vipi_write()
136 pbuf = (void *)s->buf + (offset - 0x20); in loongson_vipi_write()
159 ipi = ipi_device->ipi; in kvm_ipi_read()
161 spin_lock_irqsave(&ipi->lock, flags); in kvm_ipi_read()
163 spin_unlock_irqrestore(&ipi->lock, flags); in kvm_ipi_read()
176 ipi = ipi_device->ipi; in kvm_ipi_write()
178 spin_lock_irqsave(&ipi->lock, flags); in kvm_ipi_write()
180 spin_unlock_irqrestore(&ipi->lock, flags); in kvm_ipi_write()
197 s = &kvm->arch.ipi; in kvm_init_loongson_ipi()
198 s->kvm = kvm; in kvm_init_loongson_ipi()
199 spin_lock_init(&s->lock); in kvm_init_loongson_ipi()
205 device = &s->dev_ipi[i].device; in kvm_init_loongson_ipi()
208 mutex_lock(&kvm->slots_lock); in kvm_init_loongson_ipi()
210 mutex_unlock(&kvm->slots_lock); in kvm_init_loongson_ipi()
211 s->dev_ipi[i].ipi = s; in kvm_init_loongson_ipi()
212 s->dev_ipi[i].node_id = i; in kvm_init_loongson_ipi()