Lines Matching +full:ipi +full:- +full:id
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Loongson-3 Virtual IPI interrupt support.
53 static int loongson_vipi_read(struct loongson_kvm_ipi *ipi, in loongson_vipi_read() argument
58 uint32_t id = core + node * 4; in loongson_vipi_read() local
61 struct ipi_state *s = &(ipi->ipistate[id]); in loongson_vipi_read()
63 BUG_ON(offset & (len - 1)); in loongson_vipi_read()
67 *(uint64_t *)val = s->status; in loongson_vipi_read()
71 *(uint64_t *)val = s->en; in loongson_vipi_read()
83 pbuf = (void *)s->buf + (offset - 0x20); in loongson_vipi_read()
98 static int loongson_vipi_write(struct loongson_kvm_ipi *ipi, in loongson_vipi_write() argument
103 uint32_t id = core + node * 4; in loongson_vipi_write() local
106 struct kvm *kvm = ipi->kvm; in loongson_vipi_write()
108 struct ipi_state *s = &(ipi->ipistate[id]); in loongson_vipi_write()
111 BUG_ON(offset & (len - 1)); in loongson_vipi_write()
118 s->en = data; in loongson_vipi_write()
122 s->status |= data; in loongson_vipi_write()
123 irq.cpu = id; in loongson_vipi_write()
125 kvm_vcpu_ioctl_interrupt(kvm_get_vcpu(kvm, id), &irq); in loongson_vipi_write()
129 s->status &= ~data; in loongson_vipi_write()
130 if (!s->status) { in loongson_vipi_write()
131 irq.cpu = id; in loongson_vipi_write()
132 irq.irq = -6; in loongson_vipi_write()
133 kvm_vcpu_ioctl_interrupt(kvm_get_vcpu(kvm, id), &irq); in loongson_vipi_write()
138 pbuf = (void *)s->buf + (offset - 0x20); in loongson_vipi_write()
157 struct loongson_kvm_ipi *ipi; in kvm_ipi_read() local
161 ipi = ipi_device->ipi; in kvm_ipi_read()
163 spin_lock_irqsave(&ipi->lock, flags); in kvm_ipi_read()
164 loongson_vipi_read(ipi, addr, len, val); in kvm_ipi_read()
165 spin_unlock_irqrestore(&ipi->lock, flags); in kvm_ipi_read()
174 struct loongson_kvm_ipi *ipi; in kvm_ipi_write() local
178 ipi = ipi_device->ipi; in kvm_ipi_write()
180 spin_lock_irqsave(&ipi->lock, flags); in kvm_ipi_write()
181 loongson_vipi_write(ipi, addr, len, val); in kvm_ipi_write()
182 spin_unlock_irqrestore(&ipi->lock, flags); in kvm_ipi_write()
199 s = &kvm->arch.ipi; in kvm_init_loongson_ipi()
200 s->kvm = kvm; in kvm_init_loongson_ipi()
201 spin_lock_init(&s->lock); in kvm_init_loongson_ipi()
204 * Initialize IPI device in kvm_init_loongson_ipi()
207 device = &s->dev_ipi[i].device; in kvm_init_loongson_ipi()
210 mutex_lock(&kvm->slots_lock); in kvm_init_loongson_ipi()
212 mutex_unlock(&kvm->slots_lock); in kvm_init_loongson_ipi()
213 s->dev_ipi[i].ipi = s; in kvm_init_loongson_ipi()
214 s->dev_ipi[i].node_id = i; in kvm_init_loongson_ipi()