Lines Matching +full:cpu +full:- +full:offset

1 // SPDX-License-Identifier: GPL-2.0
12 int ipnum, cpu, irq_index, irq_mask, irq; in eiointc_set_sw_coreisr() local
15 ipnum = s->ipmap.reg_u8[irq / 32]; in eiointc_set_sw_coreisr()
16 if (!(s->status & BIT(EIOINTC_ENABLE_INT_ENCODE))) { in eiointc_set_sw_coreisr()
23 cpu = s->coremap.reg_u8[irq]; in eiointc_set_sw_coreisr()
24 if (!!(s->coreisr.reg_u32[cpu][irq_index] & irq_mask)) in eiointc_set_sw_coreisr()
25 set_bit(irq, s->sw_coreisr[cpu][ipnum]); in eiointc_set_sw_coreisr()
27 clear_bit(irq, s->sw_coreisr[cpu][ipnum]); in eiointc_set_sw_coreisr()
33 int ipnum, cpu, found, irq_index, irq_mask; in eiointc_update_irq() local
37 ipnum = s->ipmap.reg_u8[irq / 32]; in eiointc_update_irq()
38 if (!(s->status & BIT(EIOINTC_ENABLE_INT_ENCODE))) { in eiointc_update_irq()
43 cpu = s->sw_coremap[irq]; in eiointc_update_irq()
44 vcpu = kvm_get_vcpu(s->kvm, cpu); in eiointc_update_irq()
50 if (((s->enable.reg_u32[irq_index]) & irq_mask) == 0) in eiointc_update_irq()
52 s->coreisr.reg_u32[cpu][irq_index] |= irq_mask; in eiointc_update_irq()
53 found = find_first_bit(s->sw_coreisr[cpu][ipnum], EIOINTC_IRQS); in eiointc_update_irq()
54 set_bit(irq, s->sw_coreisr[cpu][ipnum]); in eiointc_update_irq()
56 s->coreisr.reg_u32[cpu][irq_index] &= ~irq_mask; in eiointc_update_irq()
57 clear_bit(irq, s->sw_coreisr[cpu][ipnum]); in eiointc_update_irq()
58 found = find_first_bit(s->sw_coreisr[cpu][ipnum], EIOINTC_IRQS); in eiointc_update_irq()
64 vcpu_irq.irq = level ? (INT_HWI0 + ipnum) : -(INT_HWI0 + ipnum); in eiointc_update_irq()
71 int i, cpu; in eiointc_update_sw_coremap() local
75 cpu = val & 0xff; in eiointc_update_sw_coremap()
78 if (!(s->status & BIT(EIOINTC_ENABLE_CPU_ENCODE))) { in eiointc_update_sw_coremap()
79 cpu = ffs(cpu) - 1; in eiointc_update_sw_coremap()
80 cpu = (cpu >= 4) ? 0 : cpu; in eiointc_update_sw_coremap()
83 if (s->sw_coremap[irq + i] == cpu) in eiointc_update_sw_coremap()
86 if (notify && test_bit(irq + i, (unsigned long *)s->isr.reg_u8)) { in eiointc_update_sw_coremap()
87 /* lower irq at old cpu and raise irq at new cpu */ in eiointc_update_sw_coremap()
89 s->sw_coremap[irq + i] = cpu; in eiointc_update_sw_coremap()
92 s->sw_coremap[irq + i] = cpu; in eiointc_update_sw_coremap()
100 unsigned long *isr = (unsigned long *)s->isr.reg_u8; in eiointc_set_irq()
103 spin_lock_irqsave(&s->lock, flags); in eiointc_set_irq()
105 spin_unlock_irqrestore(&s->lock, flags); in eiointc_set_irq()
114 val = mask & s->isr.reg_u8[index]; in eiointc_enable_irq()
121 eiointc_update_irq(s, irq - 1 + index * 8, level); in eiointc_enable_irq()
122 val &= ~BIT(irq - 1); in eiointc_enable_irq()
132 gpa_t offset; in loongarch_eiointc_readb() local
134 offset = addr - EIOINTC_BASE; in loongarch_eiointc_readb()
135 switch (offset) { in loongarch_eiointc_readb()
137 index = offset - EIOINTC_NODETYPE_START; in loongarch_eiointc_readb()
138 data = s->nodetype.reg_u8[index]; in loongarch_eiointc_readb()
141 index = offset - EIOINTC_IPMAP_START; in loongarch_eiointc_readb()
142 data = s->ipmap.reg_u8[index]; in loongarch_eiointc_readb()
145 index = offset - EIOINTC_ENABLE_START; in loongarch_eiointc_readb()
146 data = s->enable.reg_u8[index]; in loongarch_eiointc_readb()
149 index = offset - EIOINTC_BOUNCE_START; in loongarch_eiointc_readb()
150 data = s->bounce.reg_u8[index]; in loongarch_eiointc_readb()
153 index = offset - EIOINTC_COREISR_START; in loongarch_eiointc_readb()
154 data = s->coreisr.reg_u8[vcpu->vcpu_id][index]; in loongarch_eiointc_readb()
157 index = offset - EIOINTC_COREMAP_START; in loongarch_eiointc_readb()
158 data = s->coremap.reg_u8[index]; in loongarch_eiointc_readb()
161 ret = -EINVAL; in loongarch_eiointc_readb()
174 gpa_t offset; in loongarch_eiointc_readw() local
176 offset = addr - EIOINTC_BASE; in loongarch_eiointc_readw()
177 switch (offset) { in loongarch_eiointc_readw()
179 index = (offset - EIOINTC_NODETYPE_START) >> 1; in loongarch_eiointc_readw()
180 data = s->nodetype.reg_u16[index]; in loongarch_eiointc_readw()
183 index = (offset - EIOINTC_IPMAP_START) >> 1; in loongarch_eiointc_readw()
184 data = s->ipmap.reg_u16[index]; in loongarch_eiointc_readw()
187 index = (offset - EIOINTC_ENABLE_START) >> 1; in loongarch_eiointc_readw()
188 data = s->enable.reg_u16[index]; in loongarch_eiointc_readw()
191 index = (offset - EIOINTC_BOUNCE_START) >> 1; in loongarch_eiointc_readw()
192 data = s->bounce.reg_u16[index]; in loongarch_eiointc_readw()
195 index = (offset - EIOINTC_COREISR_START) >> 1; in loongarch_eiointc_readw()
196 data = s->coreisr.reg_u16[vcpu->vcpu_id][index]; in loongarch_eiointc_readw()
199 index = (offset - EIOINTC_COREMAP_START) >> 1; in loongarch_eiointc_readw()
200 data = s->coremap.reg_u16[index]; in loongarch_eiointc_readw()
203 ret = -EINVAL; in loongarch_eiointc_readw()
216 gpa_t offset; in loongarch_eiointc_readl() local
218 offset = addr - EIOINTC_BASE; in loongarch_eiointc_readl()
219 switch (offset) { in loongarch_eiointc_readl()
221 index = (offset - EIOINTC_NODETYPE_START) >> 2; in loongarch_eiointc_readl()
222 data = s->nodetype.reg_u32[index]; in loongarch_eiointc_readl()
225 index = (offset - EIOINTC_IPMAP_START) >> 2; in loongarch_eiointc_readl()
226 data = s->ipmap.reg_u32[index]; in loongarch_eiointc_readl()
229 index = (offset - EIOINTC_ENABLE_START) >> 2; in loongarch_eiointc_readl()
230 data = s->enable.reg_u32[index]; in loongarch_eiointc_readl()
233 index = (offset - EIOINTC_BOUNCE_START) >> 2; in loongarch_eiointc_readl()
234 data = s->bounce.reg_u32[index]; in loongarch_eiointc_readl()
237 index = (offset - EIOINTC_COREISR_START) >> 2; in loongarch_eiointc_readl()
238 data = s->coreisr.reg_u32[vcpu->vcpu_id][index]; in loongarch_eiointc_readl()
241 index = (offset - EIOINTC_COREMAP_START) >> 2; in loongarch_eiointc_readl()
242 data = s->coremap.reg_u32[index]; in loongarch_eiointc_readl()
245 ret = -EINVAL; in loongarch_eiointc_readl()
258 gpa_t offset; in loongarch_eiointc_readq() local
260 offset = addr - EIOINTC_BASE; in loongarch_eiointc_readq()
261 switch (offset) { in loongarch_eiointc_readq()
263 index = (offset - EIOINTC_NODETYPE_START) >> 3; in loongarch_eiointc_readq()
264 data = s->nodetype.reg_u64[index]; in loongarch_eiointc_readq()
267 index = (offset - EIOINTC_IPMAP_START) >> 3; in loongarch_eiointc_readq()
268 data = s->ipmap.reg_u64; in loongarch_eiointc_readq()
271 index = (offset - EIOINTC_ENABLE_START) >> 3; in loongarch_eiointc_readq()
272 data = s->enable.reg_u64[index]; in loongarch_eiointc_readq()
275 index = (offset - EIOINTC_BOUNCE_START) >> 3; in loongarch_eiointc_readq()
276 data = s->bounce.reg_u64[index]; in loongarch_eiointc_readq()
279 index = (offset - EIOINTC_COREISR_START) >> 3; in loongarch_eiointc_readq()
280 data = s->coreisr.reg_u64[vcpu->vcpu_id][index]; in loongarch_eiointc_readq()
283 index = (offset - EIOINTC_COREMAP_START) >> 3; in loongarch_eiointc_readq()
284 data = s->coremap.reg_u64[index]; in loongarch_eiointc_readq()
287 ret = -EINVAL; in loongarch_eiointc_readq()
299 int ret = -EINVAL; in kvm_eiointc_read()
301 struct loongarch_eiointc *eiointc = vcpu->kvm->arch.eiointc; in kvm_eiointc_read()
305 return -EINVAL; in kvm_eiointc_read()
308 vcpu->kvm->stat.eiointc_read_exits++; in kvm_eiointc_read()
309 spin_lock_irqsave(&eiointc->lock, flags); in kvm_eiointc_read()
327 spin_unlock_irqrestore(&eiointc->lock, flags); in kvm_eiointc_read()
337 u8 cpu; in loongarch_eiointc_writeb() local
340 gpa_t offset; in loongarch_eiointc_writeb() local
343 offset = addr - EIOINTC_BASE; in loongarch_eiointc_writeb()
345 switch (offset) { in loongarch_eiointc_writeb()
347 index = (offset - EIOINTC_NODETYPE_START); in loongarch_eiointc_writeb()
348 s->nodetype.reg_u8[index] = data; in loongarch_eiointc_writeb()
355 index = (offset - EIOINTC_IPMAP_START); in loongarch_eiointc_writeb()
356 s->ipmap.reg_u8[index] = data; in loongarch_eiointc_writeb()
359 index = (offset - EIOINTC_ENABLE_START); in loongarch_eiointc_writeb()
360 old_data = s->enable.reg_u8[index]; in loongarch_eiointc_writeb()
361 s->enable.reg_u8[index] = data; in loongarch_eiointc_writeb()
366 data = s->enable.reg_u8[index] & ~old_data & s->isr.reg_u8[index]; in loongarch_eiointc_writeb()
372 data = ~s->enable.reg_u8[index] & old_data & s->isr.reg_u8[index]; in loongarch_eiointc_writeb()
377 index = offset - EIOINTC_BOUNCE_START; in loongarch_eiointc_writeb()
378 s->bounce.reg_u8[index] = data; in loongarch_eiointc_writeb()
381 index = (offset - EIOINTC_COREISR_START); in loongarch_eiointc_writeb()
382 /* use attrs to get current cpu index */ in loongarch_eiointc_writeb()
383 cpu = vcpu->vcpu_id; in loongarch_eiointc_writeb()
385 old_coreisr = s->coreisr.reg_u8[cpu][index]; in loongarch_eiointc_writeb()
387 s->coreisr.reg_u8[cpu][index] = old_coreisr & ~coreisr; in loongarch_eiointc_writeb()
398 irq = offset - EIOINTC_COREMAP_START; in loongarch_eiointc_writeb()
400 s->coremap.reg_u8[index] = data; in loongarch_eiointc_writeb()
404 ret = -EINVAL; in loongarch_eiointc_writeb()
416 u8 cpu; in loongarch_eiointc_writew() local
419 gpa_t offset; in loongarch_eiointc_writew() local
422 offset = addr - EIOINTC_BASE; in loongarch_eiointc_writew()
424 switch (offset) { in loongarch_eiointc_writew()
426 index = (offset - EIOINTC_NODETYPE_START) >> 1; in loongarch_eiointc_writew()
427 s->nodetype.reg_u16[index] = data; in loongarch_eiointc_writew()
434 index = (offset - EIOINTC_IPMAP_START) >> 1; in loongarch_eiointc_writew()
435 s->ipmap.reg_u16[index] = data; in loongarch_eiointc_writew()
438 index = (offset - EIOINTC_ENABLE_START) >> 1; in loongarch_eiointc_writew()
439 old_data = s->enable.reg_u32[index]; in loongarch_eiointc_writew()
440 s->enable.reg_u16[index] = data; in loongarch_eiointc_writew()
445 data = s->enable.reg_u16[index] & ~old_data & s->isr.reg_u16[index]; in loongarch_eiointc_writew()
455 data = ~s->enable.reg_u16[index] & old_data & s->isr.reg_u16[index]; in loongarch_eiointc_writew()
463 index = (offset - EIOINTC_BOUNCE_START) >> 1; in loongarch_eiointc_writew()
464 s->bounce.reg_u16[index] = data; in loongarch_eiointc_writew()
467 index = (offset - EIOINTC_COREISR_START) >> 1; in loongarch_eiointc_writew()
468 /* use attrs to get current cpu index */ in loongarch_eiointc_writew()
469 cpu = vcpu->vcpu_id; in loongarch_eiointc_writew()
471 old_coreisr = s->coreisr.reg_u16[cpu][index]; in loongarch_eiointc_writew()
473 s->coreisr.reg_u16[cpu][index] = old_coreisr & ~coreisr; in loongarch_eiointc_writew()
484 irq = offset - EIOINTC_COREMAP_START; in loongarch_eiointc_writew()
486 s->coremap.reg_u16[index] = data; in loongarch_eiointc_writew()
490 ret = -EINVAL; in loongarch_eiointc_writew()
502 u8 cpu; in loongarch_eiointc_writel() local
505 gpa_t offset; in loongarch_eiointc_writel() local
508 offset = addr - EIOINTC_BASE; in loongarch_eiointc_writel()
510 switch (offset) { in loongarch_eiointc_writel()
512 index = (offset - EIOINTC_NODETYPE_START) >> 2; in loongarch_eiointc_writel()
513 s->nodetype.reg_u32[index] = data; in loongarch_eiointc_writel()
520 index = (offset - EIOINTC_IPMAP_START) >> 2; in loongarch_eiointc_writel()
521 s->ipmap.reg_u32[index] = data; in loongarch_eiointc_writel()
524 index = (offset - EIOINTC_ENABLE_START) >> 2; in loongarch_eiointc_writel()
525 old_data = s->enable.reg_u32[index]; in loongarch_eiointc_writel()
526 s->enable.reg_u32[index] = data; in loongarch_eiointc_writel()
531 data = s->enable.reg_u32[index] & ~old_data & s->isr.reg_u32[index]; in loongarch_eiointc_writel()
541 data = ~s->enable.reg_u32[index] & old_data & s->isr.reg_u32[index]; in loongarch_eiointc_writel()
549 index = (offset - EIOINTC_BOUNCE_START) >> 2; in loongarch_eiointc_writel()
550 s->bounce.reg_u32[index] = data; in loongarch_eiointc_writel()
553 index = (offset - EIOINTC_COREISR_START) >> 2; in loongarch_eiointc_writel()
554 /* use attrs to get current cpu index */ in loongarch_eiointc_writel()
555 cpu = vcpu->vcpu_id; in loongarch_eiointc_writel()
557 old_coreisr = s->coreisr.reg_u32[cpu][index]; in loongarch_eiointc_writel()
559 s->coreisr.reg_u32[cpu][index] = old_coreisr & ~coreisr; in loongarch_eiointc_writel()
570 irq = offset - EIOINTC_COREMAP_START; in loongarch_eiointc_writel()
572 s->coremap.reg_u32[index] = data; in loongarch_eiointc_writel()
576 ret = -EINVAL; in loongarch_eiointc_writel()
588 u8 cpu; in loongarch_eiointc_writeq() local
591 gpa_t offset; in loongarch_eiointc_writeq() local
594 offset = addr - EIOINTC_BASE; in loongarch_eiointc_writeq()
596 switch (offset) { in loongarch_eiointc_writeq()
598 index = (offset - EIOINTC_NODETYPE_START) >> 3; in loongarch_eiointc_writeq()
599 s->nodetype.reg_u64[index] = data; in loongarch_eiointc_writeq()
606 index = (offset - EIOINTC_IPMAP_START) >> 3; in loongarch_eiointc_writeq()
607 s->ipmap.reg_u64 = data; in loongarch_eiointc_writeq()
610 index = (offset - EIOINTC_ENABLE_START) >> 3; in loongarch_eiointc_writeq()
611 old_data = s->enable.reg_u64[index]; in loongarch_eiointc_writeq()
612 s->enable.reg_u64[index] = data; in loongarch_eiointc_writeq()
617 data = s->enable.reg_u64[index] & ~old_data & s->isr.reg_u64[index]; in loongarch_eiointc_writeq()
627 data = ~s->enable.reg_u64[index] & old_data & s->isr.reg_u64[index]; in loongarch_eiointc_writeq()
635 index = (offset - EIOINTC_BOUNCE_START) >> 3; in loongarch_eiointc_writeq()
636 s->bounce.reg_u64[index] = data; in loongarch_eiointc_writeq()
639 index = (offset - EIOINTC_COREISR_START) >> 3; in loongarch_eiointc_writeq()
640 /* use attrs to get current cpu index */ in loongarch_eiointc_writeq()
641 cpu = vcpu->vcpu_id; in loongarch_eiointc_writeq()
643 old_coreisr = s->coreisr.reg_u64[cpu][index]; in loongarch_eiointc_writeq()
645 s->coreisr.reg_u64[cpu][index] = old_coreisr & ~coreisr; in loongarch_eiointc_writeq()
656 irq = offset - EIOINTC_COREMAP_START; in loongarch_eiointc_writeq()
658 s->coremap.reg_u64[index] = data; in loongarch_eiointc_writeq()
662 ret = -EINVAL; in loongarch_eiointc_writeq()
673 int ret = -EINVAL; in kvm_eiointc_write()
675 struct loongarch_eiointc *eiointc = vcpu->kvm->arch.eiointc; in kvm_eiointc_write()
679 return -EINVAL; in kvm_eiointc_write()
682 vcpu->kvm->stat.eiointc_write_exits++; in kvm_eiointc_write()
683 spin_lock_irqsave(&eiointc->lock, flags); in kvm_eiointc_write()
701 spin_unlock_irqrestore(&eiointc->lock, flags); in kvm_eiointc_write()
717 struct loongarch_eiointc *eiointc = vcpu->kvm->arch.eiointc; in kvm_eiointc_virt_read()
721 return -EINVAL; in kvm_eiointc_virt_read()
724 addr -= EIOINTC_VIRT_BASE; in kvm_eiointc_virt_read()
725 spin_lock_irqsave(&eiointc->lock, flags); in kvm_eiointc_virt_read()
728 *data = eiointc->features; in kvm_eiointc_virt_read()
731 *data = eiointc->status; in kvm_eiointc_virt_read()
736 spin_unlock_irqrestore(&eiointc->lock, flags); in kvm_eiointc_virt_read()
748 struct loongarch_eiointc *eiointc = vcpu->kvm->arch.eiointc; in kvm_eiointc_virt_write()
752 return -EINVAL; in kvm_eiointc_virt_write()
755 addr -= EIOINTC_VIRT_BASE; in kvm_eiointc_virt_write()
756 spin_lock_irqsave(&eiointc->lock, flags); in kvm_eiointc_virt_write()
759 ret = -EPERM; in kvm_eiointc_virt_write()
765 if ((eiointc->status & BIT(EIOINTC_ENABLE)) && value) { in kvm_eiointc_virt_write()
766 ret = -EPERM; in kvm_eiointc_virt_write()
769 eiointc->status = value & eiointc->features; in kvm_eiointc_virt_write()
774 spin_unlock_irqrestore(&eiointc->lock, flags); in kvm_eiointc_virt_write()
789 unsigned long type = (unsigned long)attr->attr; in kvm_eiointc_ctrl_access()
792 struct loongarch_eiointc *s = dev->kvm->arch.eiointc; in kvm_eiointc_ctrl_access()
794 data = (void __user *)attr->addr; in kvm_eiointc_ctrl_access()
795 spin_lock_irqsave(&s->lock, flags); in kvm_eiointc_ctrl_access()
798 if (copy_from_user(&s->num_cpu, data, 4)) in kvm_eiointc_ctrl_access()
799 ret = -EFAULT; in kvm_eiointc_ctrl_access()
802 if (copy_from_user(&s->features, data, 4)) in kvm_eiointc_ctrl_access()
803 ret = -EFAULT; in kvm_eiointc_ctrl_access()
804 if (!(s->features & BIT(EIOINTC_HAS_VIRT_EXTENSION))) in kvm_eiointc_ctrl_access()
805 s->status |= BIT(EIOINTC_ENABLE); in kvm_eiointc_ctrl_access()
812 (void *)&s->coremap.reg_u32[i], sizeof(u32), false); in kvm_eiointc_ctrl_access()
818 spin_unlock_irqrestore(&s->lock, flags); in kvm_eiointc_ctrl_access()
827 int addr, cpuid, offset, ret = 0; in kvm_eiointc_regs_access() local
833 s = dev->kvm->arch.eiointc; in kvm_eiointc_regs_access()
834 addr = attr->attr; in kvm_eiointc_regs_access()
837 data = (void __user *)attr->addr; in kvm_eiointc_regs_access()
840 offset = (addr - EIOINTC_NODETYPE_START) / 4; in kvm_eiointc_regs_access()
841 p = &s->nodetype.reg_u32[offset]; in kvm_eiointc_regs_access()
844 offset = (addr - EIOINTC_IPMAP_START) / 4; in kvm_eiointc_regs_access()
845 p = &s->ipmap.reg_u32[offset]; in kvm_eiointc_regs_access()
848 offset = (addr - EIOINTC_ENABLE_START) / 4; in kvm_eiointc_regs_access()
849 p = &s->enable.reg_u32[offset]; in kvm_eiointc_regs_access()
852 offset = (addr - EIOINTC_BOUNCE_START) / 4; in kvm_eiointc_regs_access()
853 p = &s->bounce.reg_u32[offset]; in kvm_eiointc_regs_access()
856 offset = (addr - EIOINTC_ISR_START) / 4; in kvm_eiointc_regs_access()
857 p = &s->isr.reg_u32[offset]; in kvm_eiointc_regs_access()
860 offset = (addr - EIOINTC_COREISR_START) / 4; in kvm_eiointc_regs_access()
861 p = &s->coreisr.reg_u32[cpuid][offset]; in kvm_eiointc_regs_access()
864 offset = (addr - EIOINTC_COREMAP_START) / 4; in kvm_eiointc_regs_access()
865 p = &s->coremap.reg_u32[offset]; in kvm_eiointc_regs_access()
869 return -EINVAL; in kvm_eiointc_regs_access()
872 spin_lock_irqsave(&s->lock, flags); in kvm_eiointc_regs_access()
875 ret = -EFAULT; in kvm_eiointc_regs_access()
878 ret = -EFAULT; in kvm_eiointc_regs_access()
880 spin_unlock_irqrestore(&s->lock, flags); in kvm_eiointc_regs_access()
895 s = dev->kvm->arch.eiointc; in kvm_eiointc_sw_status_access()
896 addr = attr->attr; in kvm_eiointc_sw_status_access()
899 data = (void __user *)attr->addr; in kvm_eiointc_sw_status_access()
902 p = &s->num_cpu; in kvm_eiointc_sw_status_access()
905 p = &s->features; in kvm_eiointc_sw_status_access()
908 p = &s->status; in kvm_eiointc_sw_status_access()
912 return -EINVAL; in kvm_eiointc_sw_status_access()
914 spin_lock_irqsave(&s->lock, flags); in kvm_eiointc_sw_status_access()
917 ret = -EFAULT; in kvm_eiointc_sw_status_access()
920 ret = -EFAULT; in kvm_eiointc_sw_status_access()
922 spin_unlock_irqrestore(&s->lock, flags); in kvm_eiointc_sw_status_access()
930 switch (attr->group) { in kvm_eiointc_get_attr()
936 return -EINVAL; in kvm_eiointc_get_attr()
943 switch (attr->group) { in kvm_eiointc_set_attr()
951 return -EINVAL; in kvm_eiointc_set_attr()
960 struct kvm *kvm = dev->kvm; in kvm_eiointc_create()
963 if (kvm->arch.eiointc) in kvm_eiointc_create()
964 return -EINVAL; in kvm_eiointc_create()
968 return -ENOMEM; in kvm_eiointc_create()
970 spin_lock_init(&s->lock); in kvm_eiointc_create()
971 s->kvm = kvm; in kvm_eiointc_create()
976 device = &s->device; in kvm_eiointc_create()
978 mutex_lock(&kvm->slots_lock); in kvm_eiointc_create()
981 mutex_unlock(&kvm->slots_lock); in kvm_eiointc_create()
987 device1 = &s->device_vext; in kvm_eiointc_create()
992 kvm_io_bus_unregister_dev(kvm, KVM_IOCSR_BUS, &s->device); in kvm_eiointc_create()
996 kvm->arch.eiointc = s; in kvm_eiointc_create()
1006 if (!dev || !dev->kvm || !dev->kvm->arch.eiointc) in kvm_eiointc_destroy()
1009 kvm = dev->kvm; in kvm_eiointc_destroy()
1010 eiointc = kvm->arch.eiointc; in kvm_eiointc_destroy()
1011 kvm_io_bus_unregister_dev(kvm, KVM_IOCSR_BUS, &eiointc->device); in kvm_eiointc_destroy()
1012 kvm_io_bus_unregister_dev(kvm, KVM_IOCSR_BUS, &eiointc->device_vext); in kvm_eiointc_destroy()
1017 .name = "kvm-loongarch-eiointc",