[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XenPPC] [pushed] [ppc] use status bits for level/edge detection
changeset: 9943:a1a9a3b498d39ff29803a3d12af61a6041b35f01 tag: tip user: jimix@xxxxxxxxxxxxxxxxxxxxx date: Wed Apr 19 17:02:59 2006 -0400 files: xen/arch/ppc/mpic.c xen/arch/x86/irq.c xen/include/xen/irq.h description: [ppc] use status bits for level/edge detection diff -r 92867e8ea266d01daa29edd78c0edb59b7f47992 -r a1a9a3b498d39ff29803a3d12af61a6041b35f01 xen/arch/ppc/mpic.c --- a/xen/arch/ppc/mpic.c Wed Apr 19 17:01:42 2006 -0400 +++ b/xen/arch/ppc/mpic.c Wed Apr 19 17:02:59 2006 -0400 @@ -32,7 +32,6 @@ typedef int irqreturn_t; #define IRQ_POLARITY_MASK 0x2 #define IRQ_POLARITY_POSITIVE 0x2 /* high level or low->high edge */ #define IRQ_POLARITY_NEGATIVE 0x0 /* low level or high->low edge */ -#define IRQ_LEVEL 64 /* IRQ level triggered */ #define CONFIG_IRQ_ALL_CPUS 0 #define distribute_irqs CONFIG_IRQ_ALL_CPUS diff -r 92867e8ea266d01daa29edd78c0edb59b7f47992 -r a1a9a3b498d39ff29803a3d12af61a6041b35f01 xen/arch/x86/irq.c --- a/xen/arch/x86/irq.c Wed Apr 19 17:01:42 2006 -0400 +++ b/xen/arch/x86/irq.c Wed Apr 19 17:02:59 2006 -0400 @@ -198,7 +198,7 @@ static void __do_IRQ_guest(int vector) { d = action->guest[i]; if ( (action->ack_type != ACKTYPE_NONE) && - !test_and_set_bit(irq, &d->pirq_mask[0]) ) + !test_and_set_bit(irq, d->pirq_mask) ) action->in_flight++; send_guest_pirq(d, irq); } @@ -285,7 +285,7 @@ static void flush_all_pending_eoi(void * ASSERT(action->ack_type == ACKTYPE_EOI); ASSERT(desc->status & IRQ_GUEST); for ( i = 0; i < action->nr_guests; i++ ) - clear_bit(vector_to_irq(vector), &action->guest[i]->pirq_mask[0]); + clear_bit(vector_to_irq(vector), action->guest[i]->pirq_mask); action->in_flight = 0; spin_unlock(&desc->lock); } @@ -310,8 +310,8 @@ int pirq_guest_unmask(struct domain *d) spin_lock_irq(&desc->lock); - if ( !test_bit(d->pirq_to_evtchn[pirq], &s->evtchn_mask[0]) && - test_and_clear_bit(pirq, &d->pirq_mask[0]) ) + if ( !test_bit(d->pirq_to_evtchn[pirq], s->evtchn_mask) && + test_and_clear_bit(pirq, d->pirq_mask) ) { ASSERT(action->ack_type != ACKTYPE_NONE); if ( --action->in_flight == 0 ) @@ -356,14 +356,6 @@ int pirq_acktype(int irq) desc = &irq_desc[vector]; -#if defined (__powerpc__) -#define IRQ_LEVEL 64 - if (desc->status & IRQ_LEVEL) - return ACKTYPE_UNMASK; - else - return ACKTYPE_NONE; -#endif /* defined (__powerpc__) */ - /* * Edge-triggered IO-APIC interrupts need no final acknowledgement: * we ACK early during interrupt processing. @@ -385,6 +377,16 @@ int pirq_acktype(int irq) /* Legacy PIC interrupts can be acknowledged from any CPU. */ if ( !strcmp(desc->handler->typename, "XT-PIC") ) return ACKTYPE_UNMASK; + + if ( strstr(desc->handler->typename, "MPIC") ) { + if (desc->status & IRQ_LEVEL) { + if (desc->status & IRQ_PER_CPU) + return ACKTYPE_EOI; + else + return ACKTYPE_UNMASK; + } + return ACKTYPE_NONE; + } BUG(); return 0; @@ -505,13 +507,13 @@ int pirq_guest_unbind(struct domain *d, switch ( action->ack_type ) { case ACKTYPE_UNMASK: - if ( test_and_clear_bit(irq, &d->pirq_mask[0]) && + if ( test_and_clear_bit(irq, d->pirq_mask) && (--action->in_flight == 0) ) desc->handler->end(vector); break; case ACKTYPE_EOI: /* NB. If #guests == 0 then we clear the eoi_map later on. */ - if ( test_and_clear_bit(irq, &d->pirq_mask[0]) && + if ( test_and_clear_bit(irq, d->pirq_mask) && (--action->in_flight == 0) && (action->nr_guests != 0) ) { @@ -523,7 +525,7 @@ int pirq_guest_unbind(struct domain *d, break; } - BUG_ON(test_bit(irq, &d->pirq_mask[0])); + BUG_ON(test_bit(irq, d->pirq_mask)); if ( action->nr_guests != 0 ) goto out; @@ -599,16 +601,16 @@ static void dump_irqs(unsigned char key) printk("%u(%c%c%c%c)", d->domain_id, (test_bit(d->pirq_to_evtchn[irq], - &d->shared_info->evtchn_pending[0]) ? + d->shared_info->evtchn_pending) ? 'P' : '-'), (test_bit(d->pirq_to_evtchn[irq]/BITS_PER_LONG, &d->shared_info->vcpu_info[0]. evtchn_pending_sel) ? 'S' : '-'), (test_bit(d->pirq_to_evtchn[irq], - &d->shared_info->evtchn_mask[0]) ? + d->shared_info->evtchn_mask) ? 'M' : '-'), - (test_bit(irq, &d->pirq_mask[0]) ? + (test_bit(irq, d->pirq_mask) ? 'M' : '-')); if ( i != action->nr_guests ) printk(","); diff -r 92867e8ea266d01daa29edd78c0edb59b7f47992 -r a1a9a3b498d39ff29803a3d12af61a6041b35f01 xen/include/xen/irq.h --- a/xen/include/xen/irq.h Wed Apr 19 17:01:42 2006 -0400 +++ b/xen/include/xen/irq.h Wed Apr 19 17:02:59 2006 -0400 @@ -22,6 +22,7 @@ struct irqaction #define IRQ_PENDING 4 /* IRQ pending - replay on enable */ #define IRQ_REPLAY 8 /* IRQ has been replayed but not acked yet */ #define IRQ_GUEST 16 /* IRQ is handled by guest OS(es) */ +#define IRQ_LEVEL 64 /* IRQ level triggered */ #define IRQ_PER_CPU 256 /* IRQ is per CPU */ /* _______________________________________________ Xen-ppc-devel mailing list Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ppc-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |