Lines Matching +full:data +full:- +full:addr

1 // SPDX-License-Identifier: GPL-2.0
10 static void ipi_send(struct kvm *kvm, uint64_t data) in ipi_send() argument
17 cpu = ((data & 0xffffffff) >> 16) & 0x3ff; in ipi_send()
24 action = BIT(data & 0x1f); in ipi_send()
25 spin_lock(&vcpu->arch.ipi_state.lock); in ipi_send()
26 status = vcpu->arch.ipi_state.status; in ipi_send()
27 vcpu->arch.ipi_state.status |= action; in ipi_send()
28 spin_unlock(&vcpu->arch.ipi_state.lock); in ipi_send()
35 static void ipi_clear(struct kvm_vcpu *vcpu, uint64_t data) in ipi_clear() argument
40 spin_lock(&vcpu->arch.ipi_state.lock); in ipi_clear()
41 vcpu->arch.ipi_state.status &= ~data; in ipi_clear()
42 status = vcpu->arch.ipi_state.status; in ipi_clear()
43 spin_unlock(&vcpu->arch.ipi_state.lock); in ipi_clear()
45 irq.irq = -LARCH_INT_IPI; in ipi_clear()
52 uint64_t data = 0; in read_mailbox() local
54 spin_lock(&vcpu->arch.ipi_state.lock); in read_mailbox()
55 data = *(ulong *)((void *)vcpu->arch.ipi_state.buf + (offset - 0x20)); in read_mailbox()
56 spin_unlock(&vcpu->arch.ipi_state.lock); in read_mailbox()
60 return data & 0xff; in read_mailbox()
62 return data & 0xffff; in read_mailbox()
64 return data & 0xffffffff; in read_mailbox()
66 return data; in read_mailbox()
68 kvm_err("%s: unknown data len: %d\n", __func__, len); in read_mailbox()
73 static void write_mailbox(struct kvm_vcpu *vcpu, int offset, uint64_t data, int len) in write_mailbox() argument
77 spin_lock(&vcpu->arch.ipi_state.lock); in write_mailbox()
78 pbuf = (void *)vcpu->arch.ipi_state.buf + (offset - 0x20); in write_mailbox()
82 *(unsigned char *)pbuf = (unsigned char)data; in write_mailbox()
85 *(unsigned short *)pbuf = (unsigned short)data; in write_mailbox()
88 *(unsigned int *)pbuf = (unsigned int)data; in write_mailbox()
91 *(unsigned long *)pbuf = (unsigned long)data; in write_mailbox()
94 kvm_err("%s: unknown data len: %d\n", __func__, len); in write_mailbox()
96 spin_unlock(&vcpu->arch.ipi_state.lock); in write_mailbox()
99 static int send_ipi_data(struct kvm_vcpu *vcpu, gpa_t addr, uint64_t data) in send_ipi_data() argument
105 * Bit 27-30 is mask for byte writing. in send_ipi_data()
108 if ((data >> 27) & 0xf) { in send_ipi_data()
110 idx = srcu_read_lock(&vcpu->kvm->srcu); in send_ipi_data()
111 ret = kvm_io_bus_read(vcpu, KVM_IOCSR_BUS, addr, sizeof(val), &val); in send_ipi_data()
112 srcu_read_unlock(&vcpu->kvm->srcu, idx); in send_ipi_data()
114 kvm_err("%s: : read date from addr %llx failed\n", __func__, addr); in send_ipi_data()
117 /* Construct the mask by scanning the bit 27-30 */ in send_ipi_data()
119 if (data & (BIT(27 + i))) in send_ipi_data()
125 val |= ((uint32_t)(data >> 32) & ~mask); in send_ipi_data()
126 idx = srcu_read_lock(&vcpu->kvm->srcu); in send_ipi_data()
127 ret = kvm_io_bus_write(vcpu, KVM_IOCSR_BUS, addr, sizeof(val), &val); in send_ipi_data()
128 srcu_read_unlock(&vcpu->kvm->srcu, idx); in send_ipi_data()
130 kvm_err("%s: : write date to addr %llx failed\n", __func__, addr); in send_ipi_data()
135 static int mail_send(struct kvm *kvm, uint64_t data) in mail_send() argument
140 cpu = ((data & 0xffffffff) >> 16) & 0x3ff; in mail_send()
144 return -EINVAL; in mail_send()
146 mailbox = ((data & 0xffffffff) >> 2) & 0x7; in mail_send()
149 return send_ipi_data(vcpu, offset, data); in mail_send()
152 static int any_send(struct kvm *kvm, uint64_t data) in any_send() argument
157 cpu = ((data & 0xffffffff) >> 16) & 0x3ff; in any_send()
161 return -EINVAL; in any_send()
163 offset = data & 0xffff; in any_send()
165 return send_ipi_data(vcpu, offset, data); in any_send()
168 static int loongarch_ipi_readl(struct kvm_vcpu *vcpu, gpa_t addr, int len, void *val) in loongarch_ipi_readl() argument
174 offset = (uint32_t)(addr & 0x1ff); in loongarch_ipi_readl()
175 WARN_ON_ONCE(offset & (len - 1)); in loongarch_ipi_readl()
179 spin_lock(&vcpu->arch.ipi_state.lock); in loongarch_ipi_readl()
180 res = vcpu->arch.ipi_state.status; in loongarch_ipi_readl()
181 spin_unlock(&vcpu->arch.ipi_state.lock); in loongarch_ipi_readl()
184 spin_lock(&vcpu->arch.ipi_state.lock); in loongarch_ipi_readl()
185 res = vcpu->arch.ipi_state.en; in loongarch_ipi_readl()
186 spin_unlock(&vcpu->arch.ipi_state.lock); in loongarch_ipi_readl()
198 ret = -EINVAL; in loongarch_ipi_readl()
204 kvm_err("%s: unknown addr: %llx\n", __func__, addr); in loongarch_ipi_readl()
205 ret = -EINVAL; in loongarch_ipi_readl()
213 static int loongarch_ipi_writel(struct kvm_vcpu *vcpu, gpa_t addr, int len, const void *val) in loongarch_ipi_writel() argument
216 uint64_t data; in loongarch_ipi_writel() local
219 data = *(uint64_t *)val; in loongarch_ipi_writel()
221 offset = (uint32_t)(addr & 0x1ff); in loongarch_ipi_writel()
222 WARN_ON_ONCE(offset & (len - 1)); in loongarch_ipi_writel()
226 ret = -EINVAL; in loongarch_ipi_writel()
229 spin_lock(&vcpu->arch.ipi_state.lock); in loongarch_ipi_writel()
230 vcpu->arch.ipi_state.en = data; in loongarch_ipi_writel()
231 spin_unlock(&vcpu->arch.ipi_state.lock); in loongarch_ipi_writel()
234 ret = -EINVAL; in loongarch_ipi_writel()
238 ipi_clear(vcpu, data); in loongarch_ipi_writel()
244 ret = -EINVAL; in loongarch_ipi_writel()
247 write_mailbox(vcpu, offset, data, len); in loongarch_ipi_writel()
250 ipi_send(vcpu->kvm, data); in loongarch_ipi_writel()
253 ret = mail_send(vcpu->kvm, *(uint64_t *)val); in loongarch_ipi_writel()
256 ret = any_send(vcpu->kvm, *(uint64_t *)val); in loongarch_ipi_writel()
259 kvm_err("%s: unknown addr: %llx\n", __func__, addr); in loongarch_ipi_writel()
260 ret = -EINVAL; in loongarch_ipi_writel()
269 gpa_t addr, int len, void *val) in kvm_ipi_read() argument
274 ipi = vcpu->kvm->arch.ipi; in kvm_ipi_read()
277 return -EINVAL; in kvm_ipi_read()
279 ipi->kvm->stat.ipi_read_exits++; in kvm_ipi_read()
280 ret = loongarch_ipi_readl(vcpu, addr, len, val); in kvm_ipi_read()
287 gpa_t addr, int len, const void *val) in kvm_ipi_write() argument
292 ipi = vcpu->kvm->arch.ipi; in kvm_ipi_write()
295 return -EINVAL; in kvm_ipi_write()
297 ipi->kvm->stat.ipi_write_exits++; in kvm_ipi_write()
298 ret = loongarch_ipi_writel(vcpu, addr, len, val); in kvm_ipi_write()
313 int cpu, addr; in kvm_ipi_regs_access() local
318 cpu = (attr->attr >> 16) & 0x3ff; in kvm_ipi_regs_access()
319 addr = attr->attr & 0xff; in kvm_ipi_regs_access()
321 vcpu = kvm_get_vcpu(dev->kvm, cpu); in kvm_ipi_regs_access()
324 return -EINVAL; in kvm_ipi_regs_access()
327 switch (addr) { in kvm_ipi_regs_access()
329 p = &vcpu->arch.ipi_state.status; in kvm_ipi_regs_access()
332 p = &vcpu->arch.ipi_state.en; in kvm_ipi_regs_access()
335 p = &vcpu->arch.ipi_state.set; in kvm_ipi_regs_access()
338 p = &vcpu->arch.ipi_state.clear; in kvm_ipi_regs_access()
341 p = &vcpu->arch.ipi_state.buf[0]; in kvm_ipi_regs_access()
345 p = &vcpu->arch.ipi_state.buf[1]; in kvm_ipi_regs_access()
349 p = &vcpu->arch.ipi_state.buf[2]; in kvm_ipi_regs_access()
353 p = &vcpu->arch.ipi_state.buf[3]; in kvm_ipi_regs_access()
357 kvm_err("%s: unknown ipi register, addr = %d\n", __func__, addr); in kvm_ipi_regs_access()
358 return -EINVAL; in kvm_ipi_regs_access()
363 if (get_user(val, (uint32_t __user *)attr->addr)) in kvm_ipi_regs_access()
364 return -EFAULT; in kvm_ipi_regs_access()
367 if (get_user(val, (uint64_t __user *)attr->addr)) in kvm_ipi_regs_access()
368 return -EFAULT; in kvm_ipi_regs_access()
374 return put_user(val, (uint32_t __user *)attr->addr); in kvm_ipi_regs_access()
377 return put_user(val, (uint64_t __user *)attr->addr); in kvm_ipi_regs_access()
387 switch (attr->group) { in kvm_ipi_get_attr()
391 kvm_err("%s: unknown group (%d)\n", __func__, attr->group); in kvm_ipi_get_attr()
392 return -EINVAL; in kvm_ipi_get_attr()
399 switch (attr->group) { in kvm_ipi_set_attr()
403 kvm_err("%s: unknown group (%d)\n", __func__, attr->group); in kvm_ipi_set_attr()
404 return -EINVAL; in kvm_ipi_set_attr()
417 return -EINVAL; in kvm_ipi_create()
420 kvm = dev->kvm; in kvm_ipi_create()
421 if (kvm->arch.ipi) { in kvm_ipi_create()
423 return -EINVAL; in kvm_ipi_create()
428 return -ENOMEM; in kvm_ipi_create()
430 spin_lock_init(&s->lock); in kvm_ipi_create()
431 s->kvm = kvm; in kvm_ipi_create()
436 device = &s->device; in kvm_ipi_create()
438 mutex_lock(&kvm->slots_lock); in kvm_ipi_create()
440 mutex_unlock(&kvm->slots_lock); in kvm_ipi_create()
446 kvm->arch.ipi = s; in kvm_ipi_create()
451 return -EFAULT; in kvm_ipi_create()
459 if (!dev || !dev->kvm || !dev->kvm->arch.ipi) in kvm_ipi_destroy()
462 kvm = dev->kvm; in kvm_ipi_destroy()
463 ipi = kvm->arch.ipi; in kvm_ipi_destroy()
464 kvm_io_bus_unregister_dev(kvm, KVM_IOCSR_BUS, &ipi->device); in kvm_ipi_destroy()
469 .name = "kvm-loongarch-ipi",