Re: Status update on sparc32 genirq support

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

 



Sam Ravnborg wrote:

Hi Daniel - thanks for looking at this patch.

I was actually planning to send it to David tonight.
But after your comments I will wait.

I have begun too look at the patches, one thing that strikes me is
why handle_level_irq is used and why the ack functions irq_ack and
irq_mask_ack are not defined.

The sun4m at least uses level triggered interrupts.
And looking at the implmentation the enable() and disable() functions
in all cases did a simple mask and unmask - also the leon variants.
Ok.

mask and unmask is harmless on the LEON, incomming IRQs will be pending but not propagated to the CPU until it is unmasked, they will not disapear.

As I understand it the mask/unmask in handler_irq is done in order to avoid generating an extra IRQ for level triggered IRQs. When first unmasking no more IRQs will be queued for the CPU from this IRQ source, the current pending IRQ is cleared by acking the IRQ controller, the "real" IRQ source (for example a PCI board) is acked in the ISR, then handler_irq unmasks the IRQ again and can safely avoid an extra spurious IRQ.

So based on this observation I decided to go got the handle_level_irq
flow handler. From the implmentation in kernel/irq/ I could
also see that handle_level_irq always called irq_mask() / irq_unmask()
which was a match towoards to earlier implemtnation.

On top of this - this just worked for my sun4m box.
Ok

On the LEON architecture IRQs are
normally edge triggered, the exception beeing PCI interrupts that is
level triggered. Implementing the ack functions in the current
implementation would result in acking edge triggered IRQs which means
IRQs may be lost (on the LEON at least)? I thought SUN SPARCs also have
edge triggered interrupts and that the CPU acks the IRQ automatically
when the trap is taken?
What is the difference between having handle_level_irq without ACKs
implemented and having handle_edge_irq doing the interrupt flow
handling?

Thomas? Can you help here? You are much more into these details than I am.

Must add one more thing here: I now see that the egde IRQ handler (handler_edge_irq) does ack which is also incorrect on the LEON. One could argue that irq_ack should be left undefined, however it is needed for PCI Level IRQs later. Mixing handler_edge_irq and handler_level_irq does not seem to be a good idea on LEON since ack is called both times, and edge IRQs must not be acked whereas level IRQs should on the LEON. Instead I suggest for the LEON:
1. using handle_fasteoi_irq for "edge" IRQs
2. using handle_level_irq for PCI IRQs in the future, this also requires that irq_ack and irq_mask_ack is defined (I have a patch for this)


One other thing is that I can't boot anymore on the LEON with the genirq patch, this is because the virtual IRQs is not 1:1 to real IRQs and the APBUART serial tty console driver uses the "interrupt" property directely, thus VIRQs and real IRQs are mixed and that can not work. Perhaps there are other drivers on sparc32 machines that use the interrupt propery directely? I will try creating a patch for APBUART driver to use VIRQs instead, perhaps that patch can go in before Sam's genirq patch...

I really think this is the right way forward for IRQ handling on sparc32, this is an improvement for LEON indeed. Thank you all for your efforts in this.

Thanks,
Daniel
--
To unsubscribe from this list: send the line "unsubscribe sparclinux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Kernel Development]     [DCCP]     [Linux ARM Development]     [Linux]     [Photo]     [Yosemite Help]     [Linux ARM Kernel]     [Linux SCSI]     [Linux x86_64]     [Linux Hams]

  Powered by Linux