Lines Matching +full:device +full:- +full:addr

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Loongson-3 Virtual IPI interrupt support.
52 gpa_t addr, int len, void *val) in loongson_vipi_read() argument
54 uint32_t core = (addr >> 8) & 3; in loongson_vipi_read()
55 uint32_t node = (addr >> 44) & 3; in loongson_vipi_read()
57 uint64_t offset = addr & 0xff; 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()
89 pr_notice("%s with unknown addr %llx\n", __func__, addr); in loongson_vipi_read()
97 gpa_t addr, int len, const void *val) in loongson_vipi_write() argument
99 uint32_t core = (addr >> 8) & 3; in loongson_vipi_write()
100 uint32_t node = (addr >> 44) & 3; in loongson_vipi_write()
102 uint64_t data, offset = addr & 0xff; 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()
144 pr_notice("%s with unknown addr %llx\n", __func__, addr); in loongson_vipi_write()
152 gpa_t addr, int len, void *val) in kvm_ipi_read() argument
158 ipi_device = container_of(dev, struct ipi_io_device, device); in kvm_ipi_read()
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()
169 gpa_t addr, int len, const void *val) in kvm_ipi_write() argument
175 ipi_device = container_of(dev, struct ipi_io_device, device); in kvm_ipi_write()
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()
193 unsigned long addr; in kvm_init_loongson_ipi() local
195 struct kvm_io_device *device; in kvm_init_loongson_ipi() local
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()
206 kvm_iodevice_init(device, &kvm_ipi_ops); in kvm_init_loongson_ipi()
207 addr = (((unsigned long)i) << 44) + IPI_BASE; in kvm_init_loongson_ipi()
208 mutex_lock(&kvm->slots_lock); in kvm_init_loongson_ipi()
209 kvm_io_bus_register_dev(kvm, KVM_MMIO_BUS, addr, 0x400, device); 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()