Unverified Commit aa2c8813 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!1646 Fixed extioi hardware emulation bugs on loongarch

Merge Pull Request from: @lixianglai 
 
ISSU:  #I7QOYY 
 
Link:https://gitee.com/openeuler/kernel/pulls/1646

 

Reviewed-by: default avatarKevin Zhu <zhukeqian1@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 374dfd20 99bf1b35
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -347,8 +347,6 @@ static int kvm_iocsr_common_set(struct kvm_run *run, struct kvm_vcpu *vcpu,
static int kvm_misc_set(struct kvm_run *run, struct kvm_vcpu *vcpu, u32 addr,
		u64 val)
{
	if ((val & KVM_IOCSRF_MISC_FUNC_EXT_IOI_EN) && vcpu->vcpu_id == 0)
		kvm_setup_ls3a_extirq(vcpu->kvm);
	return kvm_iocsr_common_set(run, vcpu, addr, val);
}

@@ -653,9 +651,6 @@ int _kvm_set_iocsr(struct kvm *kvm, struct kvm_iocsr_entry *__user argp)
	}
	spin_unlock(&kvm->arch.iocsr_lock);

	if (tmp.addr == KVM_IOCSR_MISC_FUNC)
		kvm_enable_ls3a_extirq(kvm, tmp.data & KVM_IOCSRF_MISC_FUNC_EXT_IOI_EN);

out:
	return r;
}
+2 −19
Original line number Diff line number Diff line
@@ -110,9 +110,6 @@ void msi_irq_handler(struct kvm *kvm, int irq, int level)
	struct ls3a_kvm_extirq *s = ls3a_ext_irqchip(kvm);
	struct kvm_ls3a_extirq_state *state = &(s->ls3a_ext_irq);

	if (!atomic64_read(&s->enabled))
		return;

	kvm_debug("ext_irq_handler:irq = %d,level = %d\n", irq, level);

	ls3a_ext_irq_lock(s, flags);
@@ -731,7 +728,6 @@ int kvm_create_ls3a_ext_irq(struct kvm *kvm)
	memset((void *)&s->ls3a_ext_irq, 0x0, sizeof(struct kvm_ls3a_extirq_state));

	spin_lock_init(&s->lock);
	atomic64_set(&s->enabled, 0);
	s->kvm = kvm;

	/*
@@ -872,18 +868,6 @@ int kvm_setup_ls3a_extirq(struct kvm *kvm)
	memset(extirq_state, 0,	sizeof(struct kvm_ls3a_extirq_state));
	ls3a_ext_irq_unlock(v_extirq, flags);

	atomic64_set(&v_extirq->enabled, 1);

	return 0;
}

int kvm_enable_ls3a_extirq(struct kvm *kvm, bool enable)
{
	struct ls3a_kvm_extirq *v_extirq = ls3a_ext_irqchip(kvm);

	if (v_extirq)
		atomic64_set(&v_extirq->enabled, enable);

	return 0;
}

@@ -891,7 +875,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s,
		struct ls3a_kvm_extirq *irqchip)
{
	struct kvm_ls3a_extirq_state *extirq;
	int i = 0, j = 0;
	int i, j = 0;
	unsigned long flags;

	seq_puts(s, "LS3A ext irqchip state:\n");
@@ -901,8 +885,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s,

	extirq = &(irqchip->ls3a_ext_irq);
	ls3a_ext_irq_lock(irqchip, flags);
	i = (int)atomic64_read(&irqchip->enabled);
	seq_printf(s, "ext irq enabled:%d", i);
	seq_puts(s, "ext irq enabled");
	seq_puts(s, "\nenabled:(Not Enabled)");
	for (i = 0; i < EXTIOI_IRQS; i++) {
		if (!test_bit(i, (void *)&extirq->ext_en))
+0 −2
Original line number Diff line number Diff line
@@ -98,7 +98,6 @@ typedef struct kvm_ls3a_extirq_state {
struct ls3a_kvm_extirq {
	spinlock_t lock;
	struct kvm *kvm;
	atomic64_t enabled;
	struct kvm_io_device device;
	struct kvm_ls3a_extirq_state ls3a_ext_irq;
};
@@ -126,6 +125,5 @@ int kvm_set_ls3a_extirq(struct kvm *kvm,
void kvm_destroy_ls3a_ext_irq(struct kvm *kvm);
void msi_irq_handler(struct kvm *kvm, int irq, int level);
int kvm_setup_ls3a_extirq(struct kvm *kvm);
int kvm_enable_ls3a_extirq(struct kvm *kvm, bool enable);
void kvm_dump_ls3a_extirq_state(struct seq_file *m, struct ls3a_kvm_extirq *irqchip);
#endif
+1 −1
Original line number Diff line number Diff line
@@ -973,7 +973,7 @@ static int _kvm_set_one_reg(struct kvm_vcpu *vcpu,
	case KVM_REG_LOONGARCH_VCPU_RESET:
		kvm_reset_timer(vcpu);
		if (vcpu->vcpu_id == 0)
			kvm_enable_ls3a_extirq(vcpu->kvm, false);
			kvm_setup_ls3a_extirq(vcpu->kvm);
		memset(&vcpu->arch.irq_pending, 0, sizeof(vcpu->arch.irq_pending));
		memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear));