Can't understand /proc/interrupts output for GICv3 case
Chan Kim
ckim at etri.re.kr
Mon Apr 11 08:36:14 EDT 2022
Hi,
nobody's replying to my question.. so sad..
I found the kernel makes an array (actually a radix tree) of 'irq_desc's.
And my hwirq (SPI 15) is assigned to one of these irq_descs while processing
device tree.
In my case it was assigned irq 6 (this irq is what is called virtual irq).
So I registered the handler by request_irq(6,...) and the interrupt works
fine.
So now my question is : how can find my irq number (correct irq_desc number)
in kernel driver module?
I'll appreciate it if you could tell me how to do it.
Thank you!
Chan Kim
> -----Original Message-----
> From: Chan Kim <ckim at etri.re.kr>
> Sent: Friday, April 8, 2022 1:53 PM
> To: 'qemu-discuss' <qemu-discuss at nongnu.org>;
> kernelnewbies at kernelnewbies.org
> Subject: Can't understand /proc/interrupts output for GICv3 case
>
> Hello all
>
> I think I'm asking too many question recently but sometimes I get very big
> help from here so please forgive me.
> (and I think someone else can get help from this email thread) I'm doing
> experiment for interrupt of a device called axpu on an arm64 virtual
> machine.
> In QEMU virtual machine, the interrupts are assigned as below.
> (These numbers are SPI(shared peripheral interrupt) numbers, and there are
> 16 SGI and 16 PPI before SPI, so we have to add 32 to get the INTID
> value(hwirq number))
>
> static const int a15irqmap[] = {
> [AB21Q_UART] = 1,
> [AB21Q_RTC] = 2,
> [AB21Q_PCIE] = 3, /* ... to 6 */
> [AB21Q_GPIO] = 7,
> [AB21Q_SECURE_UART] = 8,
> [AB21Q_ACPI_GED] = 9,
> [AB21Q_MMIO] = 16, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */
> [AB21Q_GIC_V2M] = 48, /* ...to 48 + NUM_GICV2M_SPIS - 1 */
> [AB21Q_SMMU] = 74, /* ...to 74 + NUM_SMMU_IRQS - 1 */
> [AB21Q_PLATFORM_BUS] = 112, /* ...to 112 + PLATFORM_BUS_NUM_IRQS -1 */
> [AB21Q_AXPU] = 15,
> };
>
> In the driver, when I do request_irq(32+15, axpu_irq_handler, IRQF_SHARED,
> "axpu_irq", &axpu_cdev) for my device axpu, the /proc/interrupts' looks
> like this. See the 10th item(axpu_irq).
>
> CPU0
> 1: 0 GICv3 25 Level vgic
> 3: 0 GICv3 30 Level kvm guest ptimer
> 4: 0 GICv3 27 Level kvm guest vtimer
> 5: 20432 GICv3 26 Level arch_timer
> 40: 0 GICv3 106 Edge arm-smmu-v3-evtq
> 43: 0 GICv3 109 Edge arm-smmu-v3-gerror
> 44: 0 GICv3 34 Level rtc-pl031
> 45: 164 GICv3 33 Level uart-pl011
> 46: 0 GICv3 23 Level arm-pmu
> 47: 7789 GICv3 36 Level virtio0, axpu_irq
> 48: 0 9030000.pl061 3 Edge GPIO Key Poweroff
> IPI0: 0 Rescheduling interrupts
> IPI1: 0 Function call interrupts
> IPI2: 0 CPU stop interrupts
> IPI3: 0 CPU stop (for crash dump) interrupts
> IPI4: 0 Timer broadcast interrupts
> IPI5: 0 IRQ work interrupts
> IPI6: 0 CPU wake-up interrupts
> Err: 0
>
> There are two numbers. One in the first column and the other in the 4th
> column.
> After observing uart-pl011 driver's action(who's irq in 8th row), I found
> the number in the first column is the one I should pass to the request_irq
> funcion, and the second number in the 4th column is the input to the
GICv3.
> (uart was assigned SPI 1, so 32+1 = 33).
> In my axpu driver case, I requested request_irq(47, ...) so hwirq is 47
> but I don't know why it was assigned to GICv3 input 36.
> Shouldn't it be 47 too? (32+15=47).
>
> Without fixing QEMU code(still using SPI 15), I tried doing
request_irq(15,
> axpu_irq_handler, ..) for test and this time it looks like this.(see the
> 5th
> row)
>
> CPU0
> 1: 0 GICv3 25 Level vgic
> 3: 0 GICv3 30 Level kvm guest ptimer
> 4: 0 GICv3 27 Level kvm guest vtimer
> 5: 8174 GICv3 26 Level arch_timer
> 15: 0 GICv3 56 Edge axpu_irq
> 40: 0 GICv3 106 Edge arm-smmu-v3-evtq
> 43: 0 GICv3 109 Edge arm-smmu-v3-gerror
> 44: 0 GICv3 34 Level rtc-pl031
> 45: 175 GICv3 33 Level uart-pl011
> 46: 0 GICv3 23 Level arm-pmu
> 47: 7790 GICv3 36 Level virtio0
> 48: 0 9030000.pl061 3 Edge GPIO Key Poweroff
> IPI0: 0 Rescheduling interrupts
> IPI1: 0 Function call interrupts
> IPI2: 0 CPU stop interrupts
> IPI3: 0 CPU stop (for crash dump) interrupts
> IPI4: 0 Timer broadcast interrupts
> IPI5: 0 IRQ work interrupts
> IPI6: 0 CPU wake-up interrupts
> Err: 0
>
> Now axpu_irq has moved to INTID 15 (as expected), but it changed to "GICv3
> 56 Edge".
> How is this GICv3 number is assigned? (and I guess edge trigger is the
> default for INTID < 16. Because it's SGI..?)
>
> I thought I connected my device (axpu) to SPI 15 in qemu code but this
> GICv3 input number changes according to with what number I called
> reqeust_irq.
> Could anyone tell me what is going on here?
>
> Thank you.
> Chan Kim
>
>
>
>
>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
More information about the Kernelnewbies
mailing list