Lines Matching +full:lock +full:- +full:offset

1 // SPDX-License-Identifier: GPL-2.0
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()
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()
50 static uint64_t read_mailbox(struct kvm_vcpu *vcpu, int offset, int len) in read_mailbox() argument
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()
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()
96 spin_unlock(&vcpu->arch.ipi_state.lock); in write_mailbox()
105 * Bit 27-30 is mask for byte writing. in send_ipi_data()
110 idx = srcu_read_lock(&vcpu->kvm->srcu); in send_ipi_data()
112 srcu_read_unlock(&vcpu->kvm->srcu, idx); in send_ipi_data()
117 /* Construct the mask by scanning the bit 27-30 */ in send_ipi_data()
126 idx = srcu_read_lock(&vcpu->kvm->srcu); in send_ipi_data()
128 srcu_read_unlock(&vcpu->kvm->srcu, idx); in send_ipi_data()
137 int cpu, mailbox, offset; in mail_send() local
144 return -EINVAL; in mail_send()
147 offset = IOCSR_IPI_BASE + IOCSR_IPI_BUF_20 + mailbox * 4; in mail_send()
149 return send_ipi_data(vcpu, offset, data); in mail_send()
154 int cpu, offset; in any_send() local
161 return -EINVAL; in any_send()
163 offset = data & 0xffff; in any_send()
165 return send_ipi_data(vcpu, offset, data); in any_send()
171 uint32_t offset; in loongarch_ipi_readl() local
174 offset = (uint32_t)(addr & 0x1ff); in loongarch_ipi_readl()
175 WARN_ON_ONCE(offset & (len - 1)); in loongarch_ipi_readl()
177 switch (offset) { 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()
195 if (offset + len > IOCSR_IPI_BUF_38 + 8) { in loongarch_ipi_readl()
196 kvm_err("%s: invalid offset or len: offset = %d, len = %d\n", in loongarch_ipi_readl()
197 __func__, offset, len); in loongarch_ipi_readl()
198 ret = -EINVAL; in loongarch_ipi_readl()
201 res = read_mailbox(vcpu, offset, len); in loongarch_ipi_readl()
205 ret = -EINVAL; in loongarch_ipi_readl()
217 uint32_t offset; in loongarch_ipi_writel() local
221 offset = (uint32_t)(addr & 0x1ff); in loongarch_ipi_writel()
222 WARN_ON_ONCE(offset & (len - 1)); in loongarch_ipi_writel()
224 switch (offset) { 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()
241 if (offset + len > IOCSR_IPI_BUF_38 + 8) { in loongarch_ipi_writel()
242 kvm_err("%s: invalid offset or len: offset = %d, len = %d\n", in loongarch_ipi_writel()
243 __func__, offset, len); 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()
260 ret = -EINVAL; in loongarch_ipi_writel()
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()
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()
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()
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()
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",