Thanks Jan.
So what I should do is to have a different IRQ for the root and non-root cells?
The root cell config has the following:
...
.vpci_irq_base = 136-32
...
.irqchips = {
/* GIC */ {
.address = 0xf9010000,
.pin_base = 32,
.pin_bitmap = {
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
},
},
},
I changed the non-root cell config to be similar to the linux-demo config:
.vpci_irq_base = 140-32
and
.irqchips = {
/* GIC */ {
.address = 0xf9010000,
.pin_base = 32,
.pin_bitmap = {
1, 0, 0, 0,
},
},
},
When I start the non-root cell, I can see the interrupt arriving in the root
cell, with irq_id = 136:
ivshmem_register_mmio() mmio->address = 8, mmio->is_write = 0, current cpu = 3
ivshmem_register_mmio() mmio->address = 0, mmio->is_write = 1, current cpu = 3
arch_ivshmem_update_intx(ive=0x0000ffffc02450a0),
device->info->num_msix_vectors = 0, ctrl eg intx enable = 1
ivshmem_register_mmio() mmio->address = 12, mmio->is_write = 1, current cpu = 3
@@@@@ ivshmem_remote_interrupt() ive->remote: 0x0000ffffc0245000, current cpu =
3
arch_ivshmem_trigger_interrupt(ive:0x0000ffffc0245000), irq_id:136, current cpu
= 3
irqchip_set_pending(), local_injection = 0, sender (current cpu) = 3
irqchip_set_pending() -> inside if(!cpu_data), irq_id = 136, gicd_base =
0x0000000000140000, GICD_ISPENDR = 200, 16
irqchip_handle_irq(cpu_data:0x0000ffffc021d000, irq_id:136), is_sgi(irq_id) = 0
irqchip_handle_irq() this_cpu_data() = 0x0000ffffc021d000, current cpu 0,
cpu_data->cpu_id = 0
arch_handle_phys_irq calling irqchip_set_pending(cpu_data=0x0000ffffc021d000,
irqn=136), cpu_id = 0
irqchip_set_pending(), local_injection = 1, sender (current cpu) = 0
irqchip_set_pending() -> just return after irqchip.inject_irq, cpu_data->cpu_id
= 0
irqchip_set_pending(), local_injection = 1, sender (current cpu) = 0
irqchip_set_pending() -> just return after irqchip.inject_irq, cpu_data->cpu_id
= 0
When I write from Linux, the interrupt counter is not incremented
(/proc/interrupt remains the same) and I see that in Jailhouse generates an
interrupt with irq_id = 140 (the base for the non-root cell):
Writing 1 to 0x7f910bf00c
ivshmem_register_mmio() mmio->address = 12, mmio->is_write = 1, current cpu = 2
@@@@@ ivshmem_remote_interrupt() ive->remote: 0x0000ffffc02450a0, current cpu =
2
arch_ivshmem_trigger_interrupt(ive:0x0000ffffc02450a0), irq_id:140, current cpu
= 2
irqchip_set_pending(), local_injection = 0, sender (current cpu) = 2
irqchip_set_pending() -> inside if(!cpu_data), irq_id = 140, gicd_base =
0x0000000000140000, GICD_ISPENDR = 200, 16
However, the interrupt is not handled by the non-root cell (cpu 3). I pass 140
to gic_setup() and enable the irq by writing 0xffffffff to 0xfc100000:
static void enable_irq(struct ivshmem_dev_data *d)
{
printk("IVSHMEM: Enabling IVSHMEM_IRQs registers = %p\n", d->registers);
mmio_write32(d->registers, 0xffffffff);
}
It is not clear to me the relation between the root and non-root cells with
respect to the irqchips and vpci_irq_base configs. Clearly something is wrong
with my configs.
Appreciate your help!
Giovani
>
> Root cell and non-root cell are still sharing interrupts /wrt the
> virtual pci host controller and ivshmem. Just derive your inmate config
> from configs/arm64/zynqmp-zcu102-linux-demo[-2].c, those work.
>
> Jan
>
--
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.