Hi Vineet, Sorry I missed that one, it must have been caught in the mother of all "mark as read" I did on coming back from holiday.
On 12/01/16 07:00, Vineet Gupta wrote: > Hi Marc, > > On Wednesday 30 December 2015 05:05 PM, Vineet Gupta wrote: >> On Friday 18 December 2015 10:01 PM, Marc Zyngier wrote: >>> On 18/12/15 14:29, Noam Camus wrote: >>>>> From: Marc Zyngier [mailto:marc.zyng...@arm.com] >>>>> Sent: Friday, December 18, 2015 1:21 PM >>>> >>>>>> I need this for my per CPU irqs such timer and IPI which do not come >>>>>> from some external device but from CPUs. For these IRQs I am calling >>>>>> to irq_create_mapping() from my platform at arch/arc and at that point >>>>>> I got no irqdomain and using irq_find_host() is not good since I got >>>>>> no device_node (at most I can have DT root). >>>> >>>>> That's a problem. You should never do that for your timer (doing a >>>>> request_irq will do the right thing, and that's what your timer driver >>>>> already does). >>>> >>>> Please be more specific, from all that I wrote what is the problem? >>> >>> Calling irq_create_mapping out of the blue like you do it here: >>> >>> +static void eznps_init_per_cpu(int cpu) >>> +{ >>> + /* Create mapping for all per cpu IRQs */ >>> + if (cpu == 0) { >>> + irq_create_mapping(NULL, TIMER0_IRQ); >>> + irq_create_mapping(NULL, IPI_IRQ); >>> + } >>> >>> is simply not acceptable. >>> >>>> When I use request_irq() it fail without the mapping and mapping fail >>>> without a domain. >>> >>> Grmbl... >>> >>> That's not completely surprising: >>> >>> + timer { >>> + compatible = "ezchip,nps400-timer"; >>> + clocks = <&sysclk>; >>> + clock-names="sysclk"; >>> + }; >>> >>> Where is the interrupt? >>> >>>> Never do what? >>>> What should I do then? >>> >>> Maybe you should start by looking how the other architectures have >>> solved that exact problem at least half a dozen time. >>> >>>> >>>>> As for initializing your IPIs, they are usually outside of the IRQ >>>>> space, so you should handle them separately (and get your irqchip >>>>> to initialize them). >>>> I am handling all my IRQs within same irqchip, which is the only one >>>> I have. So I am not sure what you expect here. Please be more >>>> elaborate. >>> >>> Do not create a mapping for IPIs. Full stop. Handle them independently >>> from your normal IRQs. >>> >>>>>> >>>>>> Another thing I'm not seeing here is where is the interrupt actually >>>>>> taken. This code only contains the EOI part, but not the ACK side, as >>>>>> well as the reverse lookup hwirq -> irq). Where is that code? >>>>>> >>>>>> ACK is an optional handler and is not needed by my platform. >>>>>> I will add comment that since my IRQs are EOI based I do not need an ACK. >>>> >>>>> What I'm talking about is not the irq_ack method that the irqchip can >>>>> provide, but the action your perform on your interrupt controller to >>>>> extract the hwirq number and find out what corresponding Linux interrupt >>>>> has fired. >>>> >>>>>> >>>>>> I do not understand reverse lookup remark, where is it missing? >>>>>> Could you point me to an example for such reverse lookup? >>>> >>>>> See for example: >>>> >>>>> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/irqchip/irq-sun4i.c#n136 >>>> >>>>> This is the function (sun4i_handle_irq) that is executed almost >>>>> immediately after the IRQ is asserted. The CPU reads the hwirq from the >>>>> interrupt controller, and use handle_domain_irq() to call the >>>>> corresponding handler (by doing a lookup in the domain). >>>> >>>>> I couldn't find out in your platform code where you are doing that. >>>> >>>> OK, this is seem much like exclusively ARM stuff. >>> >>> No, this is not. Can you please stop looking at the surface of things >>> and start taking an interest in how things actually *work*? Almost >>> *nothing* in the interrupt handling code is architecture specific. >>> >>>> Note that I am working with ARC (seem alike) here and we do not >>>> define CONFIG_HANDLE_DOMAIN_IRQ and do not implement >>>> set_handle_irq(). >>>> >>>> So for ARC this reverse mapping is something we can leave without >>>> (maybe because we are kind of a legacy domain). >>> >>> Yeah, I just located the crap: arch_do_IRQ() happily takes a hwirq (the >>> vector number), and uses that as a Linux IRQ. This looks a lot like ARM >>> pre-DT, about 10 years ago. >>> >>> Well, time to meet the 21st century. If you intend to use DT, please fix >>> your arch port. Otherwise, just hardcode everything in your platform and >>> don't pretend to support device tree. >> >> Hi Marc, >> >> Taking your rant in a positive stride and I'm all up for making this as >> nice/modern as possible. I don't have issues with enabling >> CONFIG_HANDLE_DOMAIN_IRQ for ARC (although it might add a few cycles o/h to >> each ISR) >> >> However currently (4.4-rcX) it is only enabled for arm/arm64/openrisc and >> from the >> looks of it in drivers/irqchip, only ARM based SoCs use the >> handle_domain_irq() >> calls by plugging into ARM top level handler. >> >> Why is that not a problem for other arches like PPC/MIPS which also use DT >> heavily. Or perhaps they are also subtly broken as ARC is ! >> >> What am I missing ? HANDLE_DOMAIN_IRQ is not mandatory at all - a number of architectures had something open-coded in the past (with some drawbacks and/or bugs), and this config option is just one of the ways to get it right. MIPS/PPC perform the reverse lookup directly, without using this infrastructure, and that would be a valid approach for ARC too. > Marc, I hope you are back from holidays. When u get a chance could you please > respond to above. > > Also I tool a stab at it anyways. > 1. Enabled HANDLE_DOMAIN_IRQ > 2. arch_do_IRQ() calls handle_domain_irq(NULL, hwirq, regs) since that code > doesn't know about domains. > > It fails w/o irq_set_default_host() being called. Well, that's expected. unless you use the underlying primitive (__handle_domain_irq) and pass false as the parameter for lookup (see handle_IRQ() in arch/arm/kernel/irq.c). This is what we use for "legacy" platforms that do not support domains. > If we go back to sunxi example you quoted above, it relies on driver passing > the > domain to handle_domain_irq(). IMHO it is simpler if we had the default > domain. > > So long story short, ARC can be made to use handle_domain_irq() w/o the song > and > dance of registering another callback from irqchip code if we retained the > default > domain setting. This only works if you can guarantee that you will never have another irqchip calling irq_set_default_host()... If your system is always simple enough to guarantee that, why not. Thanks, M. -- Jazz is not dead. It just smells funny... _______________________________________________ linux-snps-arc mailing list linux-snps-arc@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-snps-arc