Maybe the problem is with the Linux side and/or UIO driver, because when I 
start both cell, I can see that both send interrupts to Linux and they are 
received. However, Linux can only send interrupts to cell 1.

I also did an user space program that maps the PCI regions using mmap and sends 
interrupts through the mapped addresses. I can map region 1 (0xfc100000) with 
size 0x100 without program, but for region 2 (0xfc100100) I can only map using 
size 4096. With size 0x100, I get an invalid mapping from mmap (maybe some 
align problem?). Using 4096 in region 2, I can issue an interrupt, but it is 
sent to cell 1, instead of cell 2.

Any advise on how to test this to find the error?

> On 2018-05-03 20:26, Giovani Gracioli wrote:
> > I noticed that if I set a higher bdf value (0x0 in one cell config and 0x10 
> > in the another one) in the .pci_devices, I can see two different interrupts 
> > mapped in Linux:
> > 
> > 38:          2          0     GICv2 136 Edge      uio_ivshmem
> > 39:          5          0     GICv2 138 Edge      uio_ivshmem
> 
> Yes, INTx interrupts are assigned according to slot numbers:
> 
> Pin = (bdf >> 3) & 0x3) + 1
> 
> With 1 = "Pin A", 2 = "Pin B" and so forth - following PCI
> recommendations. The vpci_irq_base you configure per cell is the
> interrupt baseline for the final SPI:
> 
> SPI = vpci_irq_base + pin - 1
> 
> > 
> > # lspci -vv
> > 
> > 00:00.0 Unassigned class [ff00]: Red Hat, Inc Inter-VM shared memory
> >         Subsystem: Red Hat, Inc Inter-VM shared memory
> >         Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
> > Stepping- SERR- FastB2B- Di-
> >         Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
> > <TAbort- <MAbort- >SERR- <PERR- -
> >         Latency: 0
> >         Interrupt: pin A routed to IRQ 38
> >         Region 0: Memory at fc100000 (64-bit, non-prefetchable) [size=256]
> >         Kernel driver in use: uio_ivshmem
> > 
> > 00:02.0 Unassigned class [ff00]: Red Hat, Inc Inter-VM shared memory
> >         Subsystem: Red Hat, Inc Inter-VM shared memory
> >         Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- 
> > Stepping- SERR- FastB2B- Di-
> >         Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- 
> > <TAbort- <MAbort- >SERR- <PERR- -
> >         Latency: 0
> >         Interrupt: pin C routed to IRQ 39
> >         Region 0: Memory at fc100100 (64-bit, non-prefetchable) [size=256]
> >         Kernel driver in use: uio_ivshmem
> > 
> > Then, I loaded and started both bare metal cells. The two cells were able 
> > to find PCI devices. However, cell 2 identified a wrong PCI (01:00.0) with 
> > a wrong bdf (256 instead of 0x10):
> > 
> > Found 1af4:1110 at 01:00.0
> > shmem is at 0x0000000800500000, shmemsz is 0x0000000000100000
> > bar0 is at 0x00000000fc100100
> > mapped shmem and bars, got position 0x0000000000000000 - bdf = 256
> > 
> > Note that bdf may have changed after the call to pci_find_device(), 256 
> > instead of 0x10 and 01:00.0 insteaf of 02:00.0 as shown in Linux.
> 
> That might be issues of the driver or the userspace test programs. lspci
> and Linux kernel core messages tell the truth.
> 
> > 
> > Also, in Linux, I can send an interrupt to cell 1 by using /dev/uio0 and 
> > the uio_send tool. But when I try to send an interrupt to cell 2 through 
> > /dev/uio1, I get a mmap failed:
> > 
> > [UIO] opening file /dev/uio1
> > [UIO] count is 1
> > mmap failed (0x0xffffffffffffffff)
> > 
> > I believe something is still not right in the config files. I attached all 
> > of them here. Any help is appreciated.
> 
> You can find a working setup with a full-meshed ivshmem-net network
> between three cells, which implies two distinct ivshmem devices per cell
> under configs/arm64/zynqmp-zcu102{,-linux-demo,-linux-demo-2}.c. You
> should be able to transfer that to your UIO setup (change shmem_protocol
> for the existing device, for a starter).
> 
> Jan
> 
> > 
> >> Hello,
> >>
> >> I have configured ivshmem interrupts between the root-cell (Linux) and 
> >> another bare-metal cell on the ultrascale+ (arm64) platform.
> >>
> >> What I would like to have now is another bare-metal cell, and then 
> >> interrupts among:
> >>
> >> Linux <-> bare metal cell 1
> >> Linux <-> bare metal cell 2
> >>
> >> The idea is that bare metal cell 1 uses the shared memory region 
> >> 0x800400000 and vpci 0xfc100000 and cell 2 uses 0x800500000 and vpci 
> >> 0xfc100100.
> >>
> >> In my original root-cell configuration, when I add another vPCI, I can see 
> >> in Linux that both devices use the same interrupt number (38). Then, when 
> >> I write to the first doorbell vpci device reg (mapped from 0xfc100000), 
> >> cell 2 receives the interrupt, instead of cell 1.
> >>
> >> How can I completely separate both vPCI devices, so each one have 
> >> different interrupts in Linux and are routed to different Jailhouse cells?
> >>
> >> Best regards,
> >> Giovani
> > 
> 
> -- 
> Siemens AG, Corporate Technology, CT RDA IOT SES-DE
> Corporate Competence Center Embedded Linux

-- 
You received this message because you are subscribed to the Google Groups 
"Jailhouse" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to