hw/arm/Kconfig | 1 + hw/arm/xilinx_zynq.c | 55 +++++++++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 21 deletions(-)
v2: * Add Kconfig support * Add array of CPUs to ZynqMachineState * Add FIQ support Sebastian Huber (2): hw/arm/xilinx_zynq: Add cache controller hw/arm/xilinx_zynq: Support up to two CPU cores hw/arm/Kconfig | 1 + hw/arm/xilinx_zynq.c | 55 +++++++++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 21 deletions(-) -- 2.35.3
On Fri, 24 May 2024 at 13:08, Sebastian Huber <sebastian.huber@embedded-brains.de> wrote: > > v2: > > * Add Kconfig support > > * Add array of CPUs to ZynqMachineState > > * Add FIQ support > > Sebastian Huber (2): > hw/arm/xilinx_zynq: Add cache controller > hw/arm/xilinx_zynq: Support up to two CPU cores Applied to target-arm.next, thanks. -- PMM
On 30.05.24 12:30, Peter Maydell wrote: > On Fri, 24 May 2024 at 13:08, Sebastian Huber > <sebastian.huber@embedded-brains.de> wrote: >> >> v2: >> >> * Add Kconfig support >> >> * Add array of CPUs to ZynqMachineState >> >> * Add FIQ support >> >> Sebastian Huber (2): >> hw/arm/xilinx_zynq: Add cache controller >> hw/arm/xilinx_zynq: Support up to two CPU cores > > > > Applied to target-arm.next, thanks. Thanks, for the integration. I did some more tests and there is an issue with the IPI support. My test case worked with this change: diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c index 7f7a3d23fb..8d84eaf070 100644 --- a/hw/arm/xilinx_zynq.c +++ b/hw/arm/xilinx_zynq.c @@ -253,9 +253,9 @@ static void zynq_init(MachineState *machine) sysbus_create_varargs("l2x0", MPCORE_PERIPHBASE + 0x2000, NULL); for (n = 0; n < smp_cpus; n++) { DeviceState *cpudev = DEVICE(zynq_machine->cpu[n]); - sysbus_connect_irq(busdev, (2 * n) + 0, + sysbus_connect_irq(busdev, n, qdev_get_gpio_in(cpudev, ARM_CPU_IRQ)); - sysbus_connect_irq(busdev, (2 * n) + 1, + sysbus_connect_irq(busdev, smp_cpus + n, qdev_get_gpio_in(cpudev, ARM_CPU_FIQ)); } This is just guess work on my side since I have no idea how the second parameter relates to the pin. Originally I used the hw/arm/realview.c as a reference, but his target doesn't use the ARM_CPU_FIQ at all. -- embedded brains GmbH & Co. KG Herr Sebastian HUBER Dornierstr. 4 82178 Puchheim Germany email: sebastian.huber@embedded-brains.de phone: +49-89-18 94 741 - 16 fax: +49-89-18 94 741 - 08 Registergericht: Amtsgericht München Registernummer: HRB 157899 Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler Unsere Datenschutzerklärung finden Sie hier: https://embedded-brains.de/datenschutzerklaerung/
On Fri, 7 Jun 2024 at 15:28, Sebastian Huber <sebastian.huber@embedded-brains.de> wrote: > > On 30.05.24 12:30, Peter Maydell wrote: > > On Fri, 24 May 2024 at 13:08, Sebastian Huber > > <sebastian.huber@embedded-brains.de> wrote: > >> > >> v2: > >> > >> * Add Kconfig support > >> > >> * Add array of CPUs to ZynqMachineState > >> > >> * Add FIQ support > >> > >> Sebastian Huber (2): > >> hw/arm/xilinx_zynq: Add cache controller > >> hw/arm/xilinx_zynq: Support up to two CPU cores > > > > > > > > Applied to target-arm.next, thanks. > > Thanks, for the integration. I did some more tests and there is an issue > with the IPI support. My test case worked with this change: > > diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c > index 7f7a3d23fb..8d84eaf070 100644 > --- a/hw/arm/xilinx_zynq.c > +++ b/hw/arm/xilinx_zynq.c > @@ -253,9 +253,9 @@ static void zynq_init(MachineState *machine) > sysbus_create_varargs("l2x0", MPCORE_PERIPHBASE + 0x2000, NULL); > for (n = 0; n < smp_cpus; n++) { > DeviceState *cpudev = DEVICE(zynq_machine->cpu[n]); > - sysbus_connect_irq(busdev, (2 * n) + 0, > + sysbus_connect_irq(busdev, n, > qdev_get_gpio_in(cpudev, ARM_CPU_IRQ)); > - sysbus_connect_irq(busdev, (2 * n) + 1, > + sysbus_connect_irq(busdev, smp_cpus + n, > qdev_get_gpio_in(cpudev, ARM_CPU_FIQ)); > } > > This is just guess work on my side since I have no idea how the second > parameter relates to the pin. > > Originally I used the hw/arm/realview.c as a reference, but his target > doesn't use the ARM_CPU_FIQ at all. (I suspect it's a bug that we don't wire up FIQ on realview, but Linux doesn't care as it only uses IRQ anyway.) The a9mpcore device's inbound IRQ lines are a passthrough of the IRQ inputs to the GICv2 device. We don't document that that's what a9mpcore does, unfortunately, but we do document the GICv2 layout in include/hw/intc/arm_gic.h: * + sysbus IRQs: (in order; number will vary depending on number of cores) * - IRQ for CPU 0 * - IRQ for CPU 1 * ... * - FIQ for CPU 0 * - FIQ for CPU 1 * ... * - VIRQ for CPU 0 (exists even if virt extensions not present) * - VIRQ for CPU 1 (exists even if virt extensions not present) * ... * - VFIQ for CPU 0 (exists even if virt extensions not present) * - VFIQ for CPU 1 (exists even if virt extensions not present) * ... * - maintenance IRQ for CPU i/f 0 (only if virt extensions present) * - maintenance IRQ for CPU i/f 1 (only if virt extensions present) So yes, your change here is correct. The original patch is in upstream git already, so would you mind sending this fix as a proper patch email? Then I can pick it up as a bugfix. thanks -- PMM
© 2016 - 2024 Red Hat, Inc.