未验证 提交 aa2c8813 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!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: Kevin Zhu <zhukeqian1@huawei.com> 
Signed-off-by: Jialin Zhang <zhangjialin11@huawei.com> 
...@@ -347,8 +347,6 @@ static int kvm_iocsr_common_set(struct kvm_run *run, struct kvm_vcpu *vcpu, ...@@ -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, static int kvm_misc_set(struct kvm_run *run, struct kvm_vcpu *vcpu, u32 addr,
u64 val) 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); 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) ...@@ -653,9 +651,6 @@ int _kvm_set_iocsr(struct kvm *kvm, struct kvm_iocsr_entry *__user argp)
} }
spin_unlock(&kvm->arch.iocsr_lock); 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: out:
return r; return r;
} }
......
...@@ -110,9 +110,6 @@ void msi_irq_handler(struct kvm *kvm, int irq, int level) ...@@ -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 ls3a_kvm_extirq *s = ls3a_ext_irqchip(kvm);
struct kvm_ls3a_extirq_state *state = &(s->ls3a_ext_irq); 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); kvm_debug("ext_irq_handler:irq = %d,level = %d\n", irq, level);
ls3a_ext_irq_lock(s, flags); ls3a_ext_irq_lock(s, flags);
...@@ -731,7 +728,6 @@ int kvm_create_ls3a_ext_irq(struct kvm *kvm) ...@@ -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)); memset((void *)&s->ls3a_ext_irq, 0x0, sizeof(struct kvm_ls3a_extirq_state));
spin_lock_init(&s->lock); spin_lock_init(&s->lock);
atomic64_set(&s->enabled, 0);
s->kvm = kvm; s->kvm = kvm;
/* /*
...@@ -872,18 +868,6 @@ int kvm_setup_ls3a_extirq(struct kvm *kvm) ...@@ -872,18 +868,6 @@ int kvm_setup_ls3a_extirq(struct kvm *kvm)
memset(extirq_state, 0, sizeof(struct kvm_ls3a_extirq_state)); memset(extirq_state, 0, sizeof(struct kvm_ls3a_extirq_state));
ls3a_ext_irq_unlock(v_extirq, flags); 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; return 0;
} }
...@@ -891,7 +875,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s, ...@@ -891,7 +875,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s,
struct ls3a_kvm_extirq *irqchip) struct ls3a_kvm_extirq *irqchip)
{ {
struct kvm_ls3a_extirq_state *extirq; struct kvm_ls3a_extirq_state *extirq;
int i = 0, j = 0; int i, j = 0;
unsigned long flags; unsigned long flags;
seq_puts(s, "LS3A ext irqchip state:\n"); seq_puts(s, "LS3A ext irqchip state:\n");
...@@ -901,8 +885,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s, ...@@ -901,8 +885,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s,
extirq = &(irqchip->ls3a_ext_irq); extirq = &(irqchip->ls3a_ext_irq);
ls3a_ext_irq_lock(irqchip, flags); ls3a_ext_irq_lock(irqchip, flags);
i = (int)atomic64_read(&irqchip->enabled); seq_puts(s, "ext irq enabled");
seq_printf(s, "ext irq enabled:%d", i);
seq_puts(s, "\nenabled:(Not Enabled)"); seq_puts(s, "\nenabled:(Not Enabled)");
for (i = 0; i < EXTIOI_IRQS; i++) { for (i = 0; i < EXTIOI_IRQS; i++) {
if (!test_bit(i, (void *)&extirq->ext_en)) if (!test_bit(i, (void *)&extirq->ext_en))
......
...@@ -98,7 +98,6 @@ typedef struct kvm_ls3a_extirq_state { ...@@ -98,7 +98,6 @@ typedef struct kvm_ls3a_extirq_state {
struct ls3a_kvm_extirq { struct ls3a_kvm_extirq {
spinlock_t lock; spinlock_t lock;
struct kvm *kvm; struct kvm *kvm;
atomic64_t enabled;
struct kvm_io_device device; struct kvm_io_device device;
struct kvm_ls3a_extirq_state ls3a_ext_irq; struct kvm_ls3a_extirq_state ls3a_ext_irq;
}; };
...@@ -126,6 +125,5 @@ int kvm_set_ls3a_extirq(struct kvm *kvm, ...@@ -126,6 +125,5 @@ int kvm_set_ls3a_extirq(struct kvm *kvm,
void kvm_destroy_ls3a_ext_irq(struct kvm *kvm); void kvm_destroy_ls3a_ext_irq(struct kvm *kvm);
void msi_irq_handler(struct kvm *kvm, int irq, int level); void msi_irq_handler(struct kvm *kvm, int irq, int level);
int kvm_setup_ls3a_extirq(struct kvm *kvm); 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); void kvm_dump_ls3a_extirq_state(struct seq_file *m, struct ls3a_kvm_extirq *irqchip);
#endif #endif
...@@ -973,7 +973,7 @@ static int _kvm_set_one_reg(struct kvm_vcpu *vcpu, ...@@ -973,7 +973,7 @@ static int _kvm_set_one_reg(struct kvm_vcpu *vcpu,
case KVM_REG_LOONGARCH_VCPU_RESET: case KVM_REG_LOONGARCH_VCPU_RESET:
kvm_reset_timer(vcpu); kvm_reset_timer(vcpu);
if (vcpu->vcpu_id == 0) 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_pending, 0, sizeof(vcpu->arch.irq_pending));
memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear)); memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册