]> Pileus Git - ~andy/linux/blobdiff - arch/x86/kvm/i8259.c
Merge remote-tracking branch 'asoc/topic/wm8750' into asoc-next
[~andy/linux] / arch / x86 / kvm / i8259.c
index 9fc9aa7ac7034c64dc8cdb59f27f5ac80e1d77ab..848206df0967d1d35e4fde100575147ef482a2f4 100644 (file)
@@ -190,17 +190,17 @@ void kvm_pic_update_irq(struct kvm_pic *s)
 
 int kvm_pic_set_irq(struct kvm_pic *s, int irq, int irq_source_id, int level)
 {
-       int ret = -1;
+       int ret, irq_level;
+
+       BUG_ON(irq < 0 || irq >= PIC_NUM_PINS);
 
        pic_lock(s);
-       if (irq >= 0 && irq < PIC_NUM_PINS) {
-               int irq_level = __kvm_irq_line_state(&s->irq_states[irq],
-                                                    irq_source_id, level);
-               ret = pic_set_irq1(&s->pics[irq >> 3], irq & 7, irq_level);
-               pic_update_irq(s);
-               trace_kvm_pic_set_irq(irq >> 3, irq & 7, s->pics[irq >> 3].elcr,
-                                     s->pics[irq >> 3].imr, ret == 0);
-       }
+       irq_level = __kvm_irq_line_state(&s->irq_states[irq],
+                                        irq_source_id, level);
+       ret = pic_set_irq1(&s->pics[irq >> 3], irq & 7, irq_level);
+       pic_update_irq(s);
+       trace_kvm_pic_set_irq(irq >> 3, irq & 7, s->pics[irq >> 3].elcr,
+                             s->pics[irq >> 3].imr, ret == 0);
        pic_unlock(s);
 
        return ret;
@@ -275,23 +275,20 @@ void kvm_pic_reset(struct kvm_kpic_state *s)
 {
        int irq, i;
        struct kvm_vcpu *vcpu;
-       u8 irr = s->irr, isr = s->imr;
+       u8 edge_irr = s->irr & ~s->elcr;
        bool found = false;
 
        s->last_irr = 0;
-       s->irr = 0;
+       s->irr &= s->elcr;
        s->imr = 0;
-       s->isr = 0;
        s->priority_add = 0;
-       s->irq_base = 0;
-       s->read_reg_select = 0;
-       s->poll = 0;
        s->special_mask = 0;
-       s->init_state = 0;
-       s->auto_eoi = 0;
-       s->rotate_on_auto_eoi = 0;
-       s->special_fully_nested_mode = 0;
-       s->init4 = 0;
+       s->read_reg_select = 0;
+       if (!s->init4) {
+               s->special_fully_nested_mode = 0;
+               s->auto_eoi = 0;
+       }
+       s->init_state = 1;
 
        kvm_for_each_vcpu(i, vcpu, s->pics_state->kvm)
                if (kvm_apic_accept_pic_intr(vcpu)) {
@@ -304,7 +301,7 @@ void kvm_pic_reset(struct kvm_kpic_state *s)
                return;
 
        for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
-               if (irr & (1 << irq) || isr & (1 << irq))
+               if (edge_irr & (1 << irq))
                        pic_clear_isr(s, irq);
 }
 
@@ -316,40 +313,13 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
        addr &= 1;
        if (addr == 0) {
                if (val & 0x10) {
-                       u8 edge_irr = s->irr & ~s->elcr;
-                       int i;
-                       bool found = false;
-                       struct kvm_vcpu *vcpu;
-
                        s->init4 = val & 1;
-                       s->last_irr = 0;
-                       s->irr &= s->elcr;
-                       s->imr = 0;
-                       s->priority_add = 0;
-                       s->special_mask = 0;
-                       s->read_reg_select = 0;
-                       if (!s->init4) {
-                               s->special_fully_nested_mode = 0;
-                               s->auto_eoi = 0;
-                       }
-                       s->init_state = 1;
                        if (val & 0x02)
                                pr_pic_unimpl("single mode not supported");
                        if (val & 0x08)
                                pr_pic_unimpl(
-                                       "level sensitive irq not supported");
-
-                       kvm_for_each_vcpu(i, vcpu, s->pics_state->kvm)
-                               if (kvm_apic_accept_pic_intr(vcpu)) {
-                                       found = true;
-                                       break;
-                               }
-
-
-                       if (found)
-                               for (irq = 0; irq < PIC_NUM_PINS/2; irq++)
-                                       if (edge_irr & (1 << irq))
-                                               pic_clear_isr(s, irq);
+                                               "level sensitive irq not supported");
+                       kvm_pic_reset(s);
                } else if (val & 0x08) {
                        if (val & 0x04)
                                s->poll = 1;