Lines Matching +full:ipi +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Loongson-3 Virtual IPI interrupt support.
51 static int loongson_vipi_read(struct loongson_kvm_ipi *ipi, in loongson_vipi_read() argument
56 uint32_t id = core + node * 4; in loongson_vipi_read() local
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()
96 static int loongson_vipi_write(struct loongson_kvm_ipi *ipi, in loongson_vipi_write() argument
101 uint32_t id = core + node * 4; in loongson_vipi_write() local
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()
121 irq.cpu = id; in loongson_vipi_write()
123 kvm_vcpu_ioctl_interrupt(kvm_get_vcpu(kvm, id), &irq); in loongson_vipi_write()
127 s->status &= ~data; in loongson_vipi_write()
128 if (!s->status) { in loongson_vipi_write()
129 irq.cpu = id; in loongson_vipi_write()
130 irq.irq = -6; in loongson_vipi_write()
131 kvm_vcpu_ioctl_interrupt(kvm_get_vcpu(kvm, id), &irq); in loongson_vipi_write()
136 pbuf = (void *)s->buf + (offset - 0x20); in loongson_vipi_write()
155 struct loongson_kvm_ipi *ipi; in kvm_ipi_read() local
159 ipi = ipi_device->ipi; in kvm_ipi_read()
161 spin_lock_irqsave(&ipi->lock, flags); in kvm_ipi_read()
162 loongson_vipi_read(ipi, addr, len, val); in kvm_ipi_read()
163 spin_unlock_irqrestore(&ipi->lock, flags); in kvm_ipi_read()
172 struct loongson_kvm_ipi *ipi; in kvm_ipi_write() local
176 ipi = ipi_device->ipi; in kvm_ipi_write()
178 spin_lock_irqsave(&ipi->lock, flags); in kvm_ipi_write()
179 loongson_vipi_write(ipi, addr, len, val); 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()
202 * Initialize IPI device 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()