Lines Matching refs:imsic

33 struct imsic {
588 static void imsic_vsfile_cleanup(struct imsic *imsic)
599 write_lock_irqsave(&imsic->vsfile_lock, flags);
600 old_vsfile_hgei = imsic->vsfile_hgei;
601 old_vsfile_cpu = imsic->vsfile_cpu;
602 imsic->vsfile_cpu = imsic->vsfile_hgei = -1;
603 imsic->vsfile_va = NULL;
604 imsic->vsfile_pa = 0;
605 write_unlock_irqrestore(&imsic->vsfile_lock, flags);
607 memset(imsic->swfile, 0, sizeof(*imsic->swfile));
615 struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
616 struct imsic_mrif *mrif = imsic->swfile;
625 spin_lock_irqsave(&imsic->swfile_extirq_lock, flags);
628 imsic_mrif_topei(mrif, imsic->nr_eix, imsic->nr_msis))
633 spin_unlock_irqrestore(&imsic->swfile_extirq_lock, flags);
639 struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
648 memcpy(mrif, imsic->swfile, sizeof(*mrif));
650 memset(imsic->swfile, 0, sizeof(*imsic->swfile));
660 struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
661 struct imsic_mrif *smrif = imsic->swfile;
665 for (i = 0; i < imsic->nr_eix; i++) {
684 struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
687 write_lock_irqsave(&imsic->vsfile_lock, flags);
688 old_vsfile_hgei = imsic->vsfile_hgei;
689 old_vsfile_cpu = imsic->vsfile_cpu;
690 imsic->vsfile_cpu = imsic->vsfile_hgei = -1;
691 imsic->vsfile_va = NULL;
692 imsic->vsfile_pa = 0;
693 write_unlock_irqrestore(&imsic->vsfile_lock, flags);
720 imsic_vsfile_read(old_vsfile_hgei, old_vsfile_cpu, imsic->nr_hw_eix,
739 struct imsic *imsic = vaia->imsic_state;
747 read_lock_irqsave(&imsic->vsfile_lock, flags);
748 old_vsfile_hgei = imsic->vsfile_hgei;
749 old_vsfile_cpu = imsic->vsfile_cpu;
750 read_unlock_irqrestore(&imsic->vsfile_lock, flags);
785 imsic_vsfile_local_clear(new_vsfile_hgei, imsic->nr_hw_eix);
797 write_lock_irqsave(&imsic->vsfile_lock, flags);
798 imsic->vsfile_hgei = new_vsfile_hgei;
799 imsic->vsfile_cpu = vcpu->cpu;
800 imsic->vsfile_va = new_vsfile_va;
801 imsic->vsfile_pa = new_vsfile_pa;
802 write_unlock_irqrestore(&imsic->vsfile_lock, flags);
814 imsic->nr_hw_eix, true, &tmrif);
824 imsic_vsfile_local_update(new_vsfile_hgei, imsic->nr_hw_eix, &tmrif);
848 struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
852 topei = imsic_mrif_topei(imsic->swfile, imsic->nr_eix,
853 imsic->nr_msis);
861 eix = &imsic->swfile->eix[topei /
868 r = imsic_mrif_rmw(imsic->swfile, imsic->nr_eix, isel,
886 struct imsic *imsic;
899 imsic = vcpu->arch.aia_context.imsic_state;
901 read_lock_irqsave(&imsic->vsfile_lock, flags);
904 vsfile_hgei = imsic->vsfile_hgei;
905 vsfile_cpu = imsic->vsfile_cpu;
908 rc = imsic_mrif_rmw(imsic->swfile, imsic->nr_eix,
912 rc = imsic_mrif_rmw(imsic->swfile, imsic->nr_eix,
916 read_unlock_irqrestore(&imsic->vsfile_lock, flags);
919 rc = imsic_vsfile_rw(vsfile_hgei, vsfile_cpu, imsic->nr_eix,
928 struct imsic *imsic;
940 imsic = vcpu->arch.aia_context.imsic_state;
941 return imsic_mrif_isel_check(imsic->nr_eix, isel);
946 struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
948 if (!imsic)
953 memset(imsic->swfile, 0, sizeof(*imsic->swfile));
961 struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
964 if (!imsic || !iid || guest_index ||
970 if (imsic->nr_msis <= iid)
973 read_lock_irqsave(&imsic->vsfile_lock, flags);
975 if (imsic->vsfile_cpu >= 0) {
976 writel(iid, imsic->vsfile_va + IMSIC_MMIO_SETIPNUM_LE);
979 eix = &imsic->swfile->eix[iid / BITS_PER_TYPE(u64)];
984 read_unlock_irqrestore(&imsic->vsfile_lock, flags);
1024 struct imsic *imsic;
1033 imsic = kzalloc(sizeof(*imsic), GFP_KERNEL);
1034 if (!imsic)
1036 vcpu->arch.aia_context.imsic_state = imsic;
1039 imsic->nr_msis = kvm->arch.aia.nr_ids + 1;
1040 rwlock_init(&imsic->vsfile_lock);
1041 imsic->nr_eix = BITS_TO_U64(imsic->nr_msis);
1042 imsic->nr_hw_eix = BITS_TO_U64(kvm_riscv_aia_max_ids);
1043 imsic->vsfile_hgei = imsic->vsfile_cpu = -1;
1047 get_order(sizeof(*imsic->swfile)));
1052 imsic->swfile = page_to_virt(swfile_page);
1053 imsic->swfile_pa = page_to_phys(swfile_page);
1054 spin_lock_init(&imsic->swfile_extirq_lock);
1057 kvm_iodevice_init(&imsic->iodev, &imsic_iodoev_ops);
1062 &imsic->iodev);
1070 free_pages((unsigned long)imsic->swfile,
1071 get_order(sizeof(*imsic->swfile)));
1074 kfree(imsic);
1081 struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
1083 if (!imsic)
1086 imsic_vsfile_cleanup(imsic);
1089 kvm_io_bus_unregister_dev(kvm, KVM_MMIO_BUS, &imsic->iodev);
1092 free_pages((unsigned long)imsic->swfile,
1093 get_order(sizeof(*imsic->swfile)));
1096 kfree(imsic);