Add the ZynqMP PMU and IPI
v5 cover Add the ZynqMP PMU and IPI
This series adds the ZynqMP Power Management Unit (PMU) machine with basic functionality.
The machine only has the
- CPU
- Memory
- Interrupt controller
- IPI device
connected, but that is enough to run some of the ROM and firmware code on the machine
The series also adds the IPI device and connects it to the ZynqMP ARM side and the ZynqMP PMU. These IPI devices don't connect between the ARM and MicroBlaze instances though.
V5:
- Fix clang makecheck error
- Rebase on master
V4:
- Rename the ZCU102 machine to just ZynqMP
- Rename the PMC SoC to "xlnx,zynqmp-pmu-soc"
- Move the IPI device to the machine instead of the SoC
V3:
- Add the interrupt controller
- Replace some of the error_fatals with errp
- Fix the PMU CPU name
Alistair Francis (9):
microblaze: boot.c: Don't try to find NULL pointer
xlnx-zynqmp-pmu: Initial commit of the ZynqMP PMU
xlnx-zynqmp-pmu: Add the CPU and memory aarch64-softmmu.mak: Use an ARM specific config
xlnx-pmu-iomod-intc: Add the PMU Interrupt controller
xlnx-zynqmp-pmu: Connect the PMU interrupt controller
xlnx-zynqmp-ipi: Initial version of the Xilinx IPI device
xlnx-zynqmp-pmu: Connect the IPI device to the PMU
xlnx-zynqmp: Connect the IPI device to the ZynqMP SoC
default-configs/aarch64-softmmu.mak | 1 + default-configs/microblaze-softmmu.mak | 1 + hw/arm/Makefile.objs | 2 +- hw/arm/xlnx-zynqmp.c | 14 + hw/display/Makefile.objs | 2 +- hw/dma/Makefile.objs | 1 + hw/intc/Makefile.objs | 2 + hw/intc/xlnx-pmu-iomod-intc.c | 554 +++++++++++++++++++++++++++++++++ hw/intc/xlnx-zynqmp-ipi.c | 377 ++++++++++++++++++++++ hw/microblaze/Makefile.objs | 1 + hw/microblaze/boot.c | 2 +- hw/microblaze/xlnx-zynqmp-pmu.c | 204 ++++++++++++ include/hw/arm/xlnx-zynqmp.h | 2 + include/hw/intc/xlnx-pmu-iomod-intc.h | 58 ++++ include/hw/intc/xlnx-zynqmp-ipi.h | 57 ++++ 15 files changed, 1275 insertions(+), 3 deletions(-) create mode 100644 hw/intc/xlnx-pmu-iomod-intc.c create mode 100644 hw/intc/xlnx-zynqmp-ipi.c create mode 100644 hw/microblaze/xlnx-zynqmp-pmu.c create mode 100644 include/hw/intc/xlnx-pmu-iomod-intc.h create mode 100644 include/hw/intc/xlnx-zynqmp-ipi.h
--
2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
PATCH v5 1/9 microblaze: boot.c: Don't try to find NULL pointer
Previously if no device tree was passed to microblaze_load_kernel() then qemu_find_file() would try to find a NULL pointer. To avoid this put a check around qemu_find_file().
---
hw/microblaze/boot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
hw/microblaze/boot.c +1 -1
@@ -124,7 +124,7 @@ void microblaze_load_kernel(MicroBlazeCPU *cpu, hwaddr ddr_base, kernel_cmdline =qemu_opt_get (machine_opts,"append" ); dtb_arg =qemu_opt_get (machine_opts,"dtb" );/* default to pcbios dtb as passed by machine_init */ -if (!dtb_arg) { +if (!dtb_arg && dtb_filename) { filename =qemu_find_file (QEMU_FILE_TYPE_BIOS , dtb_filename); }
--
2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
Re: [Qemu-arm] [PATCH v5 1/9] microblaze: boot.c: Don't try to find NULL pointer
Quoted 6 lines · Alistair Francis
Previously if no device tree was passed to
microblaze_load_kernel()thenqemu_find_file()would try to find a NULL pointer. To avoid this put a check aroundqemu_find_file().Signed-off-by Alistair Francis <[email protected]>Reported-by Peter Maydell <[email protected]>
Quoted 22 lines
---
hw/microblaze/boot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)hw/microblaze/boot.c +1
-2@@ -124,7 +124,7 @@ void microblaze_load_kernel(MicroBlazeCPU *cpu, hwaddr ddr_base, kernel_cmdline =qemu_opt_get (machine_opts,"append" ); dtb_arg =qemu_opt_get (machine_opts,"dtb" );/* default to pcbios dtb as passed by machine_init */ -if (!dtb_arg) { +if (!dtb_arg && dtb_filename) { filename =qemu_find_file (QEMU_FILE_TYPE_BIOS , dtb_filename); } --2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
Re: [Qemu-devel] [Qemu-arm] [PATCH v5 1/9] microblaze: boot.c: Don't try to find NULL pointer
In reply to Alistair FrancisHi Alistair,
Maybe reworded "Don't try to find NULL file"
Quoted 6 lines · Alistair Francis
Previously if no device tree was passed to
microblaze_load_kernel()thenqemu_find_file()would try to find a NULL pointer. To avoid this put a check aroundqemu_find_file().Signed-off-by Alistair Francis <[email protected]>Reported-by Peter Maydell <[email protected]>
Quoted 20 lines
---
hw/microblaze/boot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)hw/microblaze/boot.c +1
-2@@ -124,7 +124,7 @@ void microblaze_load_kernel(MicroBlazeCPU *cpu, hwaddr ddr_base, kernel_cmdline =qemu_opt_get (machine_opts,"append" ); dtb_arg =qemu_opt_get (machine_opts,"dtb" );/* default to pcbios dtb as passed by machine_init */ -if (!dtb_arg) { +if (!dtb_arg && dtb_filename) { filename =qemu_find_file (QEMU_FILE_TYPE_BIOS , dtb_filename); } --2.14.1
PATCH v5 2/9 xlnx-zynqmp-pmu: Initial commit of the ZynqMP PMU
In reply to Alistair FrancisThe Xilinx ZynqMP SoC has two main processing systems in it. The ARM processing system (which is already modeled in QEMU) and the MicroBlaze Power Management Unit (PMU). This is the inital work for adding support for the PMU.
The PMU susbsystem runs along side the ARM system on hardware, but due to architecture limitations in QEMU the two instances are seperate for the time being.
Let's follow the same setup we do with the ARM system, where there is an SoC device and a ZCU102 board. Although the PMU is less board specific we are still going to follow the same split as maybe in future we can connect the PMU device to the ARM ZCU102 board. As the machine will be fairly small let's keep them both together in one file.
---
V4:
- Rename to remove ZCU102 name
hw/microblaze/Makefile.objs | 1 + hw/microblaze/xlnx-zynqmp-pmu.c | 83 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 hw/microblaze/xlnx-zynqmp-pmu.c
hw/microblaze/Makefile.objs +1 -0
@@ -1,3 +1,4 @@ obj-y += petalogix_s3adsp1800_mmu.o obj-y += petalogix_ml605_mmu.o +obj-y += xlnx-zynqmp-pmu.o obj-y += boot.o
hw/microblaze/xlnx-zynqmp-pmu.c new file +83 -0
83 lines not on this page · raw message
--
2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
PATCH v5 3/9 xlnx-zynqmp-pmu: Add the CPU and memory
In reply to Alistair FrancisConnect the MicroBlaze CPU and the ROM and RAM memory regions.
---
V4:
- Remove the ZCU102 name
V2:
- Fix the pmu-cpu name
- Use err and errp for CPU realise instead of error_fatal
hw/microblaze/xlnx-zynqmp-pmu.c | 70 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-)
hw/microblaze/xlnx-zynqmp-pmu.c +68 -2
@@ -18,8 +18,11 @@#include "qemu/osdep.h" #include "qapi/error.h" #include "qemu-common.h" +#include "exec/address-spaces.h" #include "hw/boards.h" +#include "hw/qdev-properties.h" #include "cpu.h" +#include "boot.h" /* Define the PMU device */
@@ -27,21 +30,56 @@#define XLNX_ZYNQMP_PMU_SOC (obj) OBJECT_CHECK(XlnxZynqMPPMUSoCState, (obj), \ TYPE_XLNX_ZYNQMP_PMU_SOC) +#define XLNX_ZYNQMP_PMU_ROM_SIZE 0x8000 +#define XLNX_ZYNQMP_PMU_ROM_ADDR 0xFFD00000 +#define XLNX_ZYNQMP_PMU_RAM_ADDR 0xFFDC0000 +typedef struct XlnxZynqMPPMUSoCState {/*< private >*/ DeviceState parent_obj;/*< public >*/ +MicroBlazeCPU cpu; }XlnxZynqMPPMUSoCState ;static void xlnx_zynqmp_pmu_soc_init (Object *obj) { +XlnxZynqMPPMUSoCState *s =XLNX_ZYNQMP_PMU_SOC (obj); +object_initialize (&s->cpu,sizeof (s->cpu), +TYPE_MICROBLAZE_CPU ); +object_property_add_child (obj,"pmu-cpu" ,OBJECT (&s->cpu), + &error_abort); }static void xlnx_zynqmp_pmu_soc_realize (DeviceState *dev,Error **errp) { - +XlnxZynqMPPMUSoCState *s =XLNX_ZYNQMP_PMU_SOC (dev); +Error *err =NULL ; + +object_property_set_uint (OBJECT (&s->cpu),XLNX_ZYNQMP_PMU_ROM_ADDR , +"base-vectors" , &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"use-stack-protection" , + &error_abort); +object_property_set_uint (OBJECT (&s->cpu),0 ,"use-fpu" , &error_abort); +object_property_set_uint (OBJECT (&s->cpu),0 ,"use-hw-mul" , &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"use-barrel" , + &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"use-msr-instr" , + &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"use-pcmp-instr" , + &error_abort); +object_property_set_bool (OBJECT (&s->cpu), false,"use-mmu" , &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"endianness" , + &error_abort); +object_property_set_str (OBJECT (&s->cpu),"8.40.b" ,"version" , + &error_abort); +object_property_set_uint (OBJECT (&s->cpu),0 ,"pvr" , &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"realized" , &err); +if (err) { +error_propagate (errp, err); +return ; + } }static void xlnx_zynqmp_pmu_soc_class_init (ObjectClass *oc,void *data)
@@ -70,7 +108,35 @@ type_init(xlnx_zynqmp_pmu_soc_register_types)static void xlnx_zynqmp_pmu_init (MachineState *machine) { - +XlnxZynqMPPMUSoCState *pmu =g_new0 (XlnxZynqMPPMUSoCState,1 ); +MemoryRegion *address_space_mem =get_system_memory (); +MemoryRegion *pmu_rom =g_new (MemoryRegion,1 ); +MemoryRegion *pmu_ram =g_new (MemoryRegion,1 ); + +/* Create the ROM */ +memory_region_init_rom (pmu_rom,NULL ,"xlnx-zynqmp-pmu.rom" , +XLNX_ZYNQMP_PMU_ROM_SIZE , &error_fatal); +memory_region_add_subregion (address_space_mem,XLNX_ZYNQMP_PMU_ROM_ADDR , + pmu_rom); + +/* Create the RAM */ +memory_region_init_ram (pmu_ram,NULL ,"xlnx-zynqmp-pmu.ram" , + machine->ram_size, &error_fatal); +memory_region_add_subregion (address_space_mem,XLNX_ZYNQMP_PMU_RAM_ADDR , + pmu_ram); + +/* Create the PMU device */ +object_initialize (pmu,sizeof (XlnxZynqMPPMUSoCState),TYPE_XLNX_ZYNQMP_PMU_SOC ); +object_property_add_child (OBJECT (machine),"pmu" ,OBJECT (pmu), + &error_abort); +object_property_set_bool (OBJECT (pmu), true,"realized" , &error_fatal); + +/* Load the kernel */ +microblaze_load_kernel (&pmu->cpu,XLNX_ZYNQMP_PMU_RAM_ADDR , + machine->ram_size, + machine->kernel_filename, + machine->dtb, +NULL ); }static void xlnx_zynqmp_pmu_machine_init (MachineClass *mc)
--
2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
Re: [Qemu-arm] [PATCH v5 3/9] xlnx-zynqmp-pmu: Add the CPU and memory
Quoted 111 lines · Alistair Francis
Connect the MicroBlaze CPU and the ROM and RAM memory regions.
Signed-off-by Alistair Francis <[email protected]>Reviewed-by Edgar E. Iglesias <[email protected]>---
V4:
- Remove the ZCU102 name
V2:
- Fix the pmu-cpu name
- Use err and errp for CPU realise instead oferror_fatalhw/microblaze/xlnx-zynqmp-pmu.c | 70 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-)hw/microblaze/xlnx-zynqmp-pmu.c +56
-2@@ -18,8 +18,11 @@#include "qemu/osdep.h" #include "qapi/error.h" #include "qemu-common.h" +#include "exec/address-spaces.h" #include "hw/boards.h" +#include "hw/qdev-properties.h" #include "cpu.h" +#include "boot.h" /* Define the PMU device */ @@ -27,21 +30,56 @@#define XLNX_ZYNQMP_PMU_SOC (obj) OBJECT_CHECK(XlnxZynqMPPMUSoCState, (obj), \ TYPE_XLNX_ZYNQMP_PMU_SOC) +#define XLNX_ZYNQMP_PMU_ROM_SIZE 0x8000 +#define XLNX_ZYNQMP_PMU_ROM_ADDR 0xFFD00000 +#define XLNX_ZYNQMP_PMU_RAM_ADDR 0xFFDC0000 +typedef struct XlnxZynqMPPMUSoCState {/*< private >*/ DeviceState parent_obj;/*< public >*/ +MicroBlazeCPU cpu; }XlnxZynqMPPMUSoCState ;static void xlnx_zynqmp_pmu_soc_init (Object *obj) { +XlnxZynqMPPMUSoCState *s =XLNX_ZYNQMP_PMU_SOC (obj); +object_initialize (&s->cpu,sizeof (s->cpu), +TYPE_MICROBLAZE_CPU ); +object_property_add_child (obj,"pmu-cpu" ,OBJECT (&s->cpu), + &error_abort); }static void xlnx_zynqmp_pmu_soc_realize (DeviceState *dev,Error **errp) { - +XlnxZynqMPPMUSoCState *s =XLNX_ZYNQMP_PMU_SOC (dev); +Error *err =NULL ; + +object_property_set_uint (OBJECT (&s->cpu),XLNX_ZYNQMP_PMU_ROM_ADDR , +"base-vectors" , &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"use-stack-protection" , + &error_abort); +object_property_set_uint (OBJECT (&s->cpu),0 ,"use-fpu" , &error_abort); +object_property_set_uint (OBJECT (&s->cpu),0 ,"use-hw-mul" , &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"use-barrel" , + &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"use-msr-instr" , + &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"use-pcmp-instr" , + &error_abort); +object_property_set_bool (OBJECT (&s->cpu), false,"use-mmu" , &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"endianness" , + &error_abort); +object_property_set_str (OBJECT (&s->cpu),"8.40.b" ,"version" , + &error_abort); +object_property_set_uint (OBJECT (&s->cpu),0 ,"pvr" , &error_abort); +object_property_set_bool (OBJECT (&s->cpu), true,"realized" , &err); +if (err) { +error_propagate (errp, err); +return ; + } }static void xlnx_zynqmp_pmu_soc_class_init (ObjectClass *oc,void *data)@@ -70,7 +108,35 @@ type_init(xlnx_zynqmp_pmu_soc_register_types)static void xlnx_zynqmp_pmu_init (MachineState *machine) { - +XlnxZynqMPPMUSoCState *pmu =g_new0 (XlnxZynqMPPMUSoCState,1 ); +MemoryRegion *address_space_mem =get_system_memory (); +MemoryRegion *pmu_rom =g_new (MemoryRegion,1 ); +MemoryRegion *pmu_ram =g_new (MemoryRegion,1 ); + +/* Create the ROM */ +memory_region_init_rom (pmu_rom,NULL ,"xlnx-zynqmp-pmu.rom" , +XLNX_ZYNQMP_PMU_ROM_SIZE , &error_fatal); +memory_region_add_subregion (address_space_mem,XLNX_ZYNQMP_PMU_ROM_ADDR , + pmu_rom); + +/* Create the RAM */ +memory_region_init_ram (pmu_ram,NULL ,"xlnx-zynqmp-pmu.ram" , + machine->ram_size, &error_fatal); +memory_region_add_subregion (address_space_mem,XLNX_ZYNQMP_PMU_RAM_ADDR , + pmu_ram); +
hw/microblaze/xlnx-zynqmp-pmu.c type_init(xlnx_zynqmp_pmu_soc_register_types) · line 137
Quoted 10 lines
hw/microblaze/xlnx-zynqmp-pmu.c +10
-0+/* Create the PMU device */ +object_initialize (pmu,sizeof (XlnxZynqMPPMUSoCState),TYPE_XLNX_ZYNQMP_PMU_SOC ); +object_property_add_child (OBJECT (machine),"pmu" ,OBJECT (pmu), + &error_abort); +object_property_set_bool (OBJECT (pmu), true,"realized" , &error_fatal); + +/* Load the kernel */ + microblaze_load_kernel(&pmu->cpu, XLNX_ZYNQMP_PMU_RAM_ADDR, + machine->ram_size, + machine->kernel_filename,
Hi Alistair,
I think I forgot to mention this on the chat yesterday but I think this argument is incorrect. It should be the initrd filename, or NULL since it may not make sense to load an initrd for the PMU. Can you fix that up?
You can keep my R-b tag.
Cheers,
Edgar
Quoted 8 lines
hw/microblaze/xlnx-zynqmp-pmu.c +2
-0+ machine->dtb, + NULL); }static void xlnx_zynqmp_pmu_machine_init (MachineClass *mc)Signature · 1 line
2.14.1
PATCH v5 4/9 aarch64-softmmu.mak: Use an ARM specific config
In reply to Alistair FrancisIn preperation for having an ARM and MicroBlaze ZynqMP machine let's split out the current ARM specific config options.
---
default-configs/aarch64-softmmu.mak | 1 + hw/arm/Makefile.objs | 2 +- hw/display/Makefile.objs | 2 +- hw/dma/Makefile.objs | 1 + 4 files changed, 4 insertions(+), 2 deletions(-)
default-configs/aarch64-softmmu.mak +1 -0
@@ -7,3 +7,4 @@ CONFIG_AUX=y CONFIG_DDC=y CONFIG_DPCD=y CONFIG_XLNX_ZYNQMP=y +CONFIG_XLNX_ZYNQMP_ARM=y
hw/arm/Makefile.objs +1 -1
@@ -13,7 +13,7 @@ obj-y += omap1.o omap2.o strongarm.o obj-$(CONFIG_ALLWINNER_A10) += allwinner-a10.o cubieboard.o obj-$(CONFIG_RASPI) += bcm2835_peripherals.o bcm2836.o raspi.o obj-$(CONFIG_STM32F205_SOC) += stm32f205_soc.o -obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-zynqmp.o xlnx-zcu102.o +obj-$(CONFIG_XLNX_ZYNQMP_ARM) += xlnx-zynqmp.o xlnx-zcu102.o obj-$(CONFIG_FSL_IMX25) += fsl-imx25.o imx25_pdk.o obj-$(CONFIG_FSL_IMX31) += fsl-imx31.o kzm.o obj-$(CONFIG_FSL_IMX6) += fsl-imx6.o sabrelite.o
hw/display/Makefile.objs +1 -1
@@ -40,4 +40,4 @@ virtio-gpu.o-libs += $(VIRGL_LIBS) virtio-gpu-3d.o-cflags := $(VIRGL_CFLAGS) virtio-gpu-3d.o-libs += $(VIRGL_LIBS) obj-$(CONFIG_DPCD) += dpcd.o -obj-$(CONFIG_XLNX_ZYNQMP) += xlnx_dp.o +obj-$(CONFIG_XLNX_ZYNQMP_ARM) += xlnx_dp.o
hw/dma/Makefile.objs +1 -0
@@ -9,6 +9,7 @@ common-obj-$(CONFIG_ZYNQ_DEVCFG) += xlnx-zynq-devcfg.o common-obj-$(CONFIG_ETRAXFS) += etraxfs_dma.o common-obj-$(CONFIG_STP2000) += sparc32_dma.o obj-$(CONFIG_XLNX_ZYNQMP) += xlnx_dpdma.o +obj-$(CONFIG_XLNX_ZYNQMP_ARM) += xlnx_dpdma.o obj-$(CONFIG_OMAP) += omap_dma.o soc_dma.o obj-$(CONFIG_PXA2XX) += pxa2xx_dma.o
--
2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
PATCH v5 5/9 xlnx-pmu-iomod-intc: Add the PMU Interrupt controller
In reply to Alistair FrancisAdd the PMU IO Module Interrupt controller device.
---
default-configs/microblaze-softmmu.mak | 1 + hw/intc/Makefile.objs | 1 + hw/intc/xlnx-pmu-iomod-intc.c | 554 +++++++++++++++++++++++++++++++++ include/hw/intc/xlnx-pmu-iomod-intc.h | 58 ++++ 4 files changed, 614 insertions(+) create mode 100644 hw/intc/xlnx-pmu-iomod-intc.c create mode 100644 include/hw/intc/xlnx-pmu-iomod-intc.h
default-configs/microblaze-softmmu.mak +1 -0
@@ -9,3 +9,4 @@ CONFIG_XILINX_SPI=y CONFIG_XILINX_ETHLITE=y CONFIG_SSI=y CONFIG_SSI_M25P80=y +CONFIG_XLNX_ZYNQMP=y
hw/intc/Makefile.objs +1 -0
@@ -3,6 +3,7 @@ common-obj-$(CONFIG_I8259) += i8259_common.o i8259.o common-obj-$(CONFIG_PL190) += pl190.o common-obj-$(CONFIG_PUV3) += puv3_intc.o common-obj-$(CONFIG_XILINX) += xilinx_intc.o +common-obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-pmu-iomod-intc.o common-obj-$(CONFIG_ETRAXFS) += etraxfs_pic.o common-obj-$(CONFIG_IMX) += imx_avic.o common-obj-$(CONFIG_LM32) += lm32_pic.o
hw/intc/xlnx-pmu-iomod-intc.c new file +554 -0
554 lines not on this page · raw message
include/hw/intc/xlnx-pmu-iomod-intc.h new file +58 -0
58 lines not on this page · raw message
--
2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
PATCH v5 6/9 xlnx-zynqmp-pmu: Connect the PMU interrupt controller
In reply to Alistair Francis---
hw/microblaze/xlnx-zynqmp-pmu.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
hw/microblaze/xlnx-zynqmp-pmu.c +24 -0
@@ -24,6 +24,8 @@#include "cpu.h" #include "boot.h" +#include "hw/intc/xlnx-pmu-iomod-intc.h" +/* Define the PMU device */ #define TYPE_XLNX_ZYNQMP_PMU_SOC "xlnx,zynqmp-pmu-soc"
@@ -34,14 +36,18 @@#define XLNX_ZYNQMP_PMU_ROM_ADDR 0xFFD00000#define XLNX_ZYNQMP_PMU_RAM_ADDR 0xFFDC0000 +#define XLNX_ZYNQMP_PMU_INTC_ADDR 0xFFD40000 +typedef struct XlnxZynqMPPMUSoCState {/*< private >*/ DeviceState parent_obj;/*< public >*/ MicroBlazeCPU cpu; +XlnxPMUIOIntc intc; }XlnxZynqMPPMUSoCState ; +static void xlnx_zynqmp_pmu_soc_init (Object *obj) {XlnxZynqMPPMUSoCState *s =XLNX_ZYNQMP_PMU_SOC (obj);
@@ -50,6 +56,9 @@ static void xlnx_zynqmp_pmu_soc_init(Object *obj) TYPE_MICROBLAZE_CPU);object_property_add_child (obj,"pmu-cpu" ,OBJECT (&s->cpu), &error_abort); + +object_initialize (&s->intc,sizeof (s->intc),TYPE_XLNX_PMU_IO_INTC ); +qdev_set_parent_bus (DEVICE (&s->intc),sysbus_get_default ()); }static void xlnx_zynqmp_pmu_soc_realize (DeviceState *dev,Error **errp)
@@ -80,6 +89,21 @@ static void xlnx_zynqmp_pmu_soc_realize(DeviceState *dev, Error **errp)error_propagate (errp, err);return ; } + +object_property_set_uint (OBJECT (&s->intc),0x10 ,"intc-intr-size" , + &error_abort); +object_property_set_uint (OBJECT (&s->intc),0x0 ,"intc-level-edge" , + &error_abort); +object_property_set_uint (OBJECT (&s->intc),0xffff ,"intc-positive" , + &error_abort); +object_property_set_bool (OBJECT (&s->intc), true,"realized" , &err); +if (err) { +error_propagate (errp, err); +return ; + } +sysbus_mmio_map (SYS_BUS_DEVICE (&s->intc),0 ,XLNX_ZYNQMP_PMU_INTC_ADDR ); +sysbus_connect_irq (SYS_BUS_DEVICE (&s->intc),0 , +qdev_get_gpio_in (DEVICE (&s->cpu),MB_CPU_IRQ )); }static void xlnx_zynqmp_pmu_soc_class_init (ObjectClass *oc,void *data)
--
2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
PATCH v5 7/9 xlnx-zynqmp-ipi: Initial version of the Xilinx IPI device
In reply to Alistair FrancisThis is the initial version of the Inter Processor Interrupt device.
---
hw/intc/Makefile.objs | 1 + hw/intc/xlnx-zynqmp-ipi.c | 377 ++++++++++++++++++++++++++++++++++++++ include/hw/intc/xlnx-zynqmp-ipi.h | 57 ++++++ 3 files changed, 435 insertions(+) create mode 100644 hw/intc/xlnx-zynqmp-ipi.c create mode 100644 include/hw/intc/xlnx-zynqmp-ipi.h
hw/intc/Makefile.objs +1 -0
@@ -4,6 +4,7 @@ common-obj-$(CONFIG_PL190) += pl190.o common-obj-$(CONFIG_PUV3) += puv3_intc.o common-obj-$(CONFIG_XILINX) += xilinx_intc.o common-obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-pmu-iomod-intc.o +common-obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-zynqmp-ipi.o common-obj-$(CONFIG_ETRAXFS) += etraxfs_pic.o common-obj-$(CONFIG_IMX) += imx_avic.o common-obj-$(CONFIG_LM32) += lm32_pic.o
hw/intc/xlnx-zynqmp-ipi.c new file +377 -0
377 lines not on this page · raw message
include/hw/intc/xlnx-zynqmp-ipi.h new file +57 -0
57 lines not on this page · raw message
--
2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
PATCH v5 8/9 xlnx-zynqmp-pmu: Connect the IPI device to the PMU
In reply to Alistair Francis---
V4:
- Move the IPI to the machine instead of the SoC
hw/microblaze/xlnx-zynqmp-pmu.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)
hw/microblaze/xlnx-zynqmp-pmu.c +31 -0
@@ -24,6 +24,7 @@#include "cpu.h" #include "boot.h" +#include "hw/intc/xlnx-zynqmp-ipi.h" #include "hw/intc/xlnx-pmu-iomod-intc.h" /* Define the PMU device */
@@ -38,6 +39,15 @@#define XLNX_ZYNQMP_PMU_INTC_ADDR 0xFFD40000 +#define XLNX_ZYNQMP_PMU_NUM_IPIS 4 + +static const uint64_t ipi_addr[XLNX_ZYNQMP_PMU_NUM_IPIS ] = { +0xFF340000 ,0xFF350000 ,0xFF360000 ,0xFF370000 , +}; +static const uint64_t ipi_irq[XLNX_ZYNQMP_PMU_NUM_IPIS ] = { +19 ,20 ,21 ,22 , +}; + typedef struct XlnxZynqMPPMUSoCState { /*< private >*/ DeviceState parent_obj;
@@ -136,6 +146,9 @@ static void xlnx_zynqmp_pmu_init(MachineState *machine)MemoryRegion *address_space_mem =get_system_memory ();MemoryRegion *pmu_rom =g_new (MemoryRegion,1 );MemoryRegion *pmu_ram =g_new (MemoryRegion,1 ); +XlnxZynqMPIPI *ipi[XLNX_ZYNQMP_PMU_NUM_IPIS ]; +qemu_irq irq[32 ]; +int i;/* Create the ROM */ memory_region_init_rom(pmu_rom, NULL, "xlnx-zynqmp-pmu.rom",
@@ -155,6 +168,24 @@ static void xlnx_zynqmp_pmu_init(MachineState *machine) &error_abort);object_property_set_bool (OBJECT (pmu), true,"realized" , &error_fatal); +for (i =0 ; i <32 ; i++) { + irq[i] =qdev_get_gpio_in (DEVICE (&pmu->intc), i); + } + +/* Create and connect the IPI device */ +for (i =0 ; i <XLNX_ZYNQMP_PMU_NUM_IPIS ; i++) { + ipi[i] =g_new0 (XlnxZynqMPIPI,1 ); +object_initialize (ipi[i],sizeof (XlnxZynqMPIPI),TYPE_XLNX_ZYNQMP_IPI ); +qdev_set_parent_bus (DEVICE (ipi[i]),sysbus_get_default ()); + } + +for (i =0 ; i <XLNX_ZYNQMP_PMU_NUM_IPIS ; i++) { +object_property_set_bool (OBJECT (ipi[i]), true,"realized" , + &error_abort); +sysbus_mmio_map (SYS_BUS_DEVICE (ipi[i]),0 , ipi_addr[i]); +sysbus_connect_irq (SYS_BUS_DEVICE (ipi[i]),0 , irq[ipi_irq[i]]); + } +/* Load the kernel */ microblaze_load_kernel(&pmu->cpu, XLNX_ZYNQMP_PMU_RAM_ADDR, machine->ram_size,
--
2.14.1
This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
Quoted 64 lines · Alistair Francis
This series adds the ZynqMP Power Management Unit (PMU) machine with basic functionality.
The machine only has the
- CPU
- Memory
- Interrupt controller
- IPI deviceconnected, but that is enough to run some of the ROM and firmware code on the machine
The series also adds the IPI device and connects it to the ZynqMP ARM side and the ZynqMP PMU. These IPI devices don't connect between the ARM and MicroBlaze instances though.
V5:
- Fix clang makecheck error
- Rebase on master
V4:
- Rename the ZCU102 machine to just ZynqMP
- Rename the PMC SoC to "xlnx,zynqmp-pmu-soc"
- Move the IPI device to the machine instead of the SoC
V3:
- Add the interrupt controller
- Replace some of theerror_fatalswith errp
- Fix the PMU CPU nameAlistair Francis (9):
microblaze:boot.c: Don't try to find NULL pointer
xlnx-zynqmp-pmu: Initial commit of the ZynqMP PMU
xlnx-zynqmp-pmu: Add the CPU and memory aarch64-softmmu.mak: Use an ARM specific config
xlnx-pmu-iomod-intc: Add the PMU Interrupt controller
xlnx-zynqmp-pmu: Connect the PMU interrupt controller
xlnx-zynqmp-ipi: Initial version of the Xilinx IPI device
xlnx-zynqmp-pmu: Connect the IPI device to the PMU
xlnx-zynqmp: Connect the IPI device to the ZynqMP SoCdefault-configs/aarch64-softmmu.mak | 1 + default-configs/microblaze-softmmu.mak | 1 + hw/arm/Makefile.objs | 2 +- hw/arm/xlnx-zynqmp.c | 14 + hw/display/Makefile.objs | 2 +- hw/dma/Makefile.objs | 1 + hw/intc/Makefile.objs | 2 + hw/intc/xlnx-pmu-iomod-intc.c | 554 +++++++++++++++++++++++++++++++++ hw/intc/xlnx-zynqmp-ipi.c | 377 ++++++++++++++++++++++ hw/microblaze/Makefile.objs | 1 + hw/microblaze/boot.c | 2 +- hw/microblaze/xlnx-zynqmp-pmu.c | 204 ++++++++++++ include/hw/arm/xlnx-zynqmp.h | 2 + include/hw/intc/xlnx-pmu-iomod-intc.h | 58 ++++ include/hw/intc/xlnx-zynqmp-ipi.h | 57 ++++ 15 files changed, 1275 insertions(+), 3 deletions(-) create mode 100644 hw/intc/xlnx-pmu-iomod-intc.c create mode 100644 hw/intc/xlnx-zynqmp-ipi.c create mode 100644 hw/microblaze/xlnx-zynqmp-pmu.c create mode 100644 include/hw/intc/xlnx-pmu-iomod-intc.h create mode 100644 include/hw/intc/xlnx-zynqmp-ipi.h
Quoted 4 lines
--
2.14.1This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.
ARGH! Apparently Xilinx started this crap up again. I didn't realise this is on all my emails. I'll work on getting it removed.
Alistair