How to generate LPI with ITS?

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 CWRITER
B::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.

I have a few questions regarding this:

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

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

Thank you.

0