On Tuesday 12 January 2016 02:18 PM, Marc Zyngier wrote:
> 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.

That was expected - NP :-)

>
> 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.

I'd rather use the generic infrastructure and improve it if needed !

>> > 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.

Right I saw that and that causes virq = hwirq - kind of defeats the purpose if 
we
were doing this on ARC.

>
>> > 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.

ATM we can certainly assume that.

However with ARM approach two irqchips can still call set_handle_irq() and only
the first one succeeds (and others return silently). That seems wrong to me -
irq_xxx.c will still use the handler registered by say irq_sun41.c ?

Thx,
-Vineet


_______________________________________________
linux-snps-arc mailing list
linux-snps-arc@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-snps-arc

Reply via email to