Hello, I am currently conducting LPI(generic MSI) testing using a dummy device in the kernel. The environment supports kernel version 6.12.y and GIC-600 / ITS.
I'd like to share the tests I have performed with Trace32 so far, and I have a question I'd like to ask. I created a dummy device driver in the kernel and registered the device using the device tree. Then, by referring to the document "Learn the architecture – Generic Interrupt Controller v3 and v4, LPIs", I successfully generated an ITS LPI.
After the kernel boots, the relevant register values are as follows: On the left are the ITS CBASER, CWRITER, and CREADR registers, and on the right is a dump of the ITS command queue. The initial values of the command queue pointers are as follows: CWRITER: 0x5C0 CREADR: 0x5C0
The DeviceID of the registered dummy device is 1. Following the implementation guide, I issued the INV(1, 0) and INT(1, 0) commands to verify the interrupt.
Sequence:
B::Data.Set ANSD:0x1A05605C0 %LE %Quad 0x10000000C // INV(1, 0)B::Data.Set ANSD:0x17640088 %LE %Quad 0x5E0 // Update CWRITERB::Data.Set ANSD:0x1A05605E0 %LE %Quad 0x100000003 // INT(1, 0)B::Data.Set ANSD:0x17640088 %LE %Quad 0x600 // Update CWRITER
then, check Ack of interrupt by reading ICC_IAR1_EL1 (Disable All system counters)
(pINTID: 8192)
And, run "B:: Go"
I have finally succeeded in triggering the LPI interrupt handler!
However, this was verified using the ITS command,
and what I would really like to do is confirm the interrupt by writing a value to the GITS_TRANSLATER register during actual device operation.
GITS_TRANSLATER
I have a few questions regarding this:
When using the ITS INT command, does it not update the LPI pending table in the GICR? I was not able to observe any updates..
INT
If I were to replace the INT(1, 0) command with writing data directly to GITS_TRANSLATER, what value should be written to this register?I tried writing a value to GITS_TRANSLATER in PCIe BDF format, but it was unsuccessful.I tried I wrote the value of (1 << 11.)
INT(1, 0)
Thank you.