Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: powerpc/pic/intr.c IPL_HIGH vs IPL_NONE



Hi! macallan@ and all,


I apologize multi-post.
I add more descriptions.
-------

My bebox hangs up at boot time since change v 1.23 pic/intr.c.

  
http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/powerpc/pic/intr.c.diff?r1=1.22&r2=1.23&only_with_tag=MAIN&f=h


The hangup reason is changing imask[IPL_HIGH] to 0x3ffe0000 from 0x7ffe0000.
The bit30 indicate establish PIC I8259 with IPL_NONE on bebox.

sys/arch/bebox/bebox/machdep.c:cpu_startup() ---

        /*
         * set up i8259 as a cascade on BeInterruptController irq 26.
         */
        intr_establish(16 + 26, IST_LEVEL, IPL_NONE, pic_handle_intr, isa_pic);


intr_establish() sets IPL_HIGH to is->is_ipl in powerpc/pic/intr.c.
However it sets IPL_NONE to ih->ih_ipl.

sys/arch/powerpc/pic/intr.c:intr_establish() ---

        int maxipl = ipl;

        if (maxipl == IPL_NONE)
                maxipl = IPL_HIGH;
        :

        ih->ih_ipl = ipl;

        :

        is->is_ipl = maxipl;



Index: intr.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/pic/intr.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- intr.c      7 Jun 2012 04:37:09 -0000       1.22
+++ intr.c      31 Aug 2012 13:12:52 -0000      1.23

@@ -362,7 +363,9 @@
 
        /* First, figure out which ipl each IRQ uses. */
        for (irq = 0, is = intrsources; irq < NVIRQ; irq++, is++) {
-               newmask[is->is_ipl] |= PIC_VIRQ_TO_MASK(irq);
+               for (ih = is->is_hand; ih != NULL; ih = ih->ih_next) {
+                       newmask[ih->ih_ipl] |= PIC_VIRQ_TO_MASK(irq);
+               }
        }
 
        /*

Shall we call intr_establish() with IPL_HIGH?
Or more better idea?

Also I think, this problem happen on sandpoint(ENCPP1, SANDPOINT).


In the first place, I don't understand this commit log by macallon@.

  
http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/powerpc/pic/intr.c.diff?r1=1.22&r2=1.23&only_with_tag=MAIN&f=h

  when calculating per-IPL virq masks, take into account that shared IRQs may
  request different IPLs.
  fixes vr(4)-related problems seen on ofppc


The is->is_ipl is always set maxipl for shared IRQs.  What problem is this? 

Thanks,
--
kiyohara


Home | Main Index | Thread Index | Old Index