From 8b199c7e3330491bd3c67fc847f94fdafc135954 Mon Sep 17 00:00:00 2001 From: Charlie Xiong <1981639884@qq.com> Date: Mon, 30 Sep 2024 16:48:38 +0800 Subject: [PATCH] Mem: replace memory allocate in rk3568 For better use memory, we allocate different image to allocated address. Signed-off-by: Charlie Xiong <1981639884@qq.com> --- boards/arm64/roc_rk3568_pc/roc_rk3568_pc.dts | 2 +- include/virtualization/vdev/shmem.h | 2 -- include/virtualization/vdev/shmem_rw.h | 3 --- include/virtualization/vm_device.h | 4 ++-- samples/_zvm/boards/roc_rk3568_pc_smp.conf | 2 +- samples/_zvm/boards/roc_rk3568_pc_smp.overlay | 19 ++++++++-------- samples/_zvm/prj.conf | 8 +++---- subsys/virtualization/vdev/shmem.c | 8 +++---- subsys/virtualization/vdev/shmem_rw.c | 8 +++---- subsys/virtualization/vdev/vgic_v3.c | 1 - .../virtualization/vdev/virt_clock_syscon.c | 9 ++------ subsys/virtualization/vdev/virt_syscon.c | 4 ++-- subsys/virtualization/vm_device.c | 4 ++-- zvm_doc/4_Run_on_ROC_RK3568_PC.rst | 22 ++++++++++++++----- 14 files changed, 47 insertions(+), 49 deletions(-) diff --git a/boards/arm64/roc_rk3568_pc/roc_rk3568_pc.dts b/boards/arm64/roc_rk3568_pc/roc_rk3568_pc.dts index 26aefc307..d90fbd9eb 100644 --- a/boards/arm64/roc_rk3568_pc/roc_rk3568_pc.dts +++ b/boards/arm64/roc_rk3568_pc/roc_rk3568_pc.dts @@ -26,7 +26,7 @@ sram0: memory@10000000 { device_type = "memory"; compatible = "mmio-sram"; - reg = <0x0 0x10000000 0x0 DT_SIZE_M(1024)>; + reg = <0x0 0x10000000 0x0 DT_SIZE_M(512)>; }; }; diff --git a/include/virtualization/vdev/shmem.h b/include/virtualization/vdev/shmem.h index 68c430841..c9c67cd13 100644 --- a/include/virtualization/vdev/shmem.h +++ b/include/virtualization/vdev/shmem.h @@ -35,7 +35,5 @@ struct mem_vdevice { * @brief init vm mem device for the vm. */ int vm_mem_create(struct vm *vm); -int memory_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value); -int memory_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value); #endif diff --git a/include/virtualization/vdev/shmem_rw.h b/include/virtualization/vdev/shmem_rw.h index e17c82cdd..b5ec446e2 100644 --- a/include/virtualization/vdev/shmem_rw.h +++ b/include/virtualization/vdev/shmem_rw.h @@ -36,8 +36,5 @@ struct mem_rw_vdevice { * @brief init vm mem device for the vm. */ int vm_mem_rw_create(struct vm *vm); -int memory_rw_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value); -int memory_rw_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value); - #endif diff --git a/include/virtualization/vm_device.h b/include/virtualization/vm_device.h index cdcf1f0c1..cf50bff0b 100644 --- a/include/virtualization/vm_device.h +++ b/include/virtualization/vm_device.h @@ -106,8 +106,8 @@ struct virt_device_config { struct virt_device_api { int (*init_fn)(const struct device *dev, struct vm *vm, struct virt_dev *vdev_desc); - int (*virt_device_write)(struct virt_dev *vdev, uint64_t addr, uint64_t *value); - int (*virt_device_read)(struct virt_dev *vdev, uint64_t addr, uint64_t *value); + int (*virt_device_write)(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size); + int (*virt_device_read)(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size); #ifdef CONFIG_VIRT_DEVICE_INTERRUPT_DRIVEN void (*virt_irq_callback_set)(const struct device *dev, void *cb, void *user_data); #endif diff --git a/samples/_zvm/boards/roc_rk3568_pc_smp.conf b/samples/_zvm/boards/roc_rk3568_pc_smp.conf index d5c8bd5d2..8469ba678 100644 --- a/samples/_zvm/boards/roc_rk3568_pc_smp.conf +++ b/samples/_zvm/boards/roc_rk3568_pc_smp.conf @@ -7,7 +7,7 @@ CONFIG_ARMV8_A_NS=y # kernel vm size(16M virt ram start + size) # It is the virt size of kernel, must bigger than true kernel size. # 128 Mbit -CONFIG_KERNEL_VM_SIZE=0x40000000 +CONFIG_KERNEL_VM_SIZE=0x10000000 # vgic device. CONFIG_VM_VGICV3=y diff --git a/samples/_zvm/boards/roc_rk3568_pc_smp.overlay b/samples/_zvm/boards/roc_rk3568_pc_smp.overlay index 7b67d34a4..79a07969a 100644 --- a/samples/_zvm/boards/roc_rk3568_pc_smp.overlay +++ b/samples/_zvm/boards/roc_rk3568_pc_smp.overlay @@ -14,8 +14,7 @@ ptdevice5 = "/soc/pass_through_device/pwm@fe6f0000"; ptdevice6 = "/soc/pass_through_device/linuxdev@103000"; ptdevice7 = "/soc/pass_through_device/serial@fe6c0000"; - ptdevice8 = "/soc/pass_through_device/model@90000000"; - ptdevice9 = "/soc/pass_through_device/dwmmc@fe2b0000"; + ptdevice8 = "/soc/pass_through_device/model@a0000000"; linuxdebugger = "/soc/fiq-debugger"; vmvirtmem = "/soc/virtmem@bf000000"; vmshmemrw = "/soc/shmem_rw@bd000000"; @@ -118,9 +117,9 @@ label = "LINUXDEV"; }; - model: model@90000000 { + model: model@a0000000 { compatible = "zephyr,model"; - reg = <0x0 0x90000000 0x0 DT_SIZE_M(120)>; + reg = <0x0 0xa0000000 0x0 DT_SIZE_M(120)>; interrupts = ; interrupt-names = "irq_0"; }; @@ -162,17 +161,17 @@ #address-cells = <2>; #size-cells = <2>; compatible = "zephyr-vm"; - dtb_address = <0x49000000>; + dtb_address = <0x200000>; dtb_size = ; vcpu_num = <0x01>; - zephyr_ddr: memory@48000000 { + zephyr_ddr: memory@1000000 { compatible = "vm-dram"; memmap_type = "dirct"; address_type = "normal_memory"; vm_reg_base = <0x40000000>; vm_reg_size = ; - reg = <0x0 0x48000000 0x0 DT_SIZE_M(12)>; + reg = <0x0 0x01000000 0x0 DT_SIZE_M(2)>; label = "VM0_MEM"; }; @@ -182,17 +181,17 @@ #address-cells = <2>; #size-cells = <2>; compatible = "linux-vm"; - dtb_address = <0xbe000000>; + dtb_address = <0x99000000>; dtb_size = ; vcpu_num = <0x01>; - linux_ddr: memory@80000000 { + linux_ddr: memory@60000000 { compatible = "vm-dram"; memmap_type = "dirct"; address_type = "normal_memory"; vm_reg_base = <0x40000000>; vm_reg_size = ; - reg = <0x0 0x80000000 0x0 DT_SIZE_M(64)>; + reg = <0x0 0x60000000 0x0 DT_SIZE_M(64)>; label = "VM1_MEM"; }; }; diff --git a/samples/_zvm/prj.conf b/samples/_zvm/prj.conf index 55ca1f7ae..2ec55749a 100644 --- a/samples/_zvm/prj.conf +++ b/samples/_zvm/prj.conf @@ -1,5 +1,5 @@ # Project configuration -# Copyright 2021-2022 HNU +# Copyright 2021-2022 HNU-ESNL # ZVM CONFIG_ZVM=y @@ -22,7 +22,7 @@ CONFIG_MAX_VCPU_PER_VM=2 # C minimal lib CONFIG_MINIMAL_LIBC_RAND=y -CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE=8192 +CONFIG_MINIMAL_LIBC_MALLOC_ARENA_SIZE=4096 # Enable Console CONFIG_CONSOLE=y @@ -60,8 +60,8 @@ CONFIG_IDLE_STACK_SIZE=65536 CONFIG_ISR_STACK_SIZE=81920 CONFIG_SHELL_STACK_SIZE=65536 -# 32*4MB heap size. -CONFIG_HEAP_MEM_POOL_SIZE=385875968 +# 128MB heap size. +CONFIG_HEAP_MEM_POOL_SIZE=134217728 # expand partitions CONFIG_MAX_DOMAIN_PARTITIONS=32 diff --git a/subsys/virtualization/vdev/shmem.c b/subsys/virtualization/vdev/shmem.c index 0af8aaba2..d600931dd 100644 --- a/subsys/virtualization/vdev/shmem.c +++ b/subsys/virtualization/vdev/shmem.c @@ -26,7 +26,7 @@ LOG_MODULE_DECLARE(ZVM_MODULE_NAME); #define SHMEM_SIZE DT_REG_SIZE(DT_ALIAS(vmvirtmem)) #define SHMEM_VIRQ DT_IRQN(DT_ALIAS(vmvirtmem)) -#define DEV_CFG(dev) ((const struct virt_device_config *const)(dev)->config) +#define DEV_CFG(dev) ((struct virt_device_config *const)(dev)->config) #define DEV_DATA(dev) ((struct virt_device_data *)(dev)->data) @@ -48,7 +48,7 @@ static int vm_virt_mem_init(const struct device *dev, struct vm *vm, struct virt struct mem_vdevice *mem; struct zvm_dev_lists* vdev_list; struct _dnode *d_node, *ds_node; - struct virt_dev *vm_dev, *chosen_dev = NULL; + struct virt_dev *vm_dev; char *dev_name = "VM_SHMEM"; mem = (struct mem_vdevice *)k_malloc(sizeof(struct mem_vdevice)); if (!mem) { @@ -104,7 +104,7 @@ static int vm_virt_mem_init(const struct device *dev, struct vm *vm, struct virt /** * @brief Memory read operation */ -int memory_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value) +static int memory_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size) { return 0; } @@ -112,7 +112,7 @@ int memory_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value) /** * @brief Memory write operation */ -int memory_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value) +static int memory_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size) { return 0; } diff --git a/subsys/virtualization/vdev/shmem_rw.c b/subsys/virtualization/vdev/shmem_rw.c index f5a565414..61799c4cb 100644 --- a/subsys/virtualization/vdev/shmem_rw.c +++ b/subsys/virtualization/vdev/shmem_rw.c @@ -24,7 +24,7 @@ LOG_MODULE_DECLARE(ZVM_MODULE_NAME); #define SHMEM_VIRQ DT_IRQN(DT_ALIAS(vmvirtmem)) -#define DEV_CFG(dev) ((const struct virt_device_config *const)(dev)->config) +#define DEV_CFG(dev) ((struct virt_device_config *const)(dev)->config) #define DEV_DATA(dev) ((struct virt_device_data *)(dev)->data) @@ -47,7 +47,7 @@ static int vm_virt_mem_rw_init(const struct device *dev, struct vm *vm, struct v struct mem_rw_vdevice *mem; struct zvm_dev_lists* vdev_list; struct _dnode *d_node, *ds_node; - struct virt_dev *vm_dev, *chosen_dev = NULL; + struct virt_dev *vm_dev; char *dev_name = "VM_SHMEMRW"; mem = (struct mem_rw_vdevice *)k_malloc(sizeof(struct mem_rw_vdevice)); if (!mem) { @@ -104,7 +104,7 @@ static int vm_virt_mem_rw_init(const struct device *dev, struct vm *vm, struct v /** * @brief Memory read operation */ -int memory_rw_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value) +int memory_rw_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size) { return 0; } @@ -112,7 +112,7 @@ int memory_rw_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value) /** * @brief Memory write operation */ -int memory_rw_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value) +int memory_rw_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size) { struct vm *vm; char *char_value = (char *)value; diff --git a/subsys/virtualization/vdev/vgic_v3.c b/subsys/virtualization/vdev/vgic_v3.c index 68b16f5ca..ab9343a87 100644 --- a/subsys/virtualization/vdev/vgic_v3.c +++ b/subsys/virtualization/vdev/vgic_v3.c @@ -405,7 +405,6 @@ int vgicv3_raise_sgi(struct vcpu *vcpu, unsigned long sgi_value) int i, bit, sgi_num=0; uint32_t sgi_id, sgi_mode; uint32_t target_list, aff1, aff2, aff3, tmp_id; - struct virt_irq_desc *desc; struct vcpu *target; struct vm *vm = vcpu->vm; k_spinlock_key_t key; diff --git a/subsys/virtualization/vdev/virt_clock_syscon.c b/subsys/virtualization/vdev/virt_clock_syscon.c index 4d89cf39f..0490968cc 100644 --- a/subsys/virtualization/vdev/virt_clock_syscon.c +++ b/subsys/virtualization/vdev/virt_clock_syscon.c @@ -116,18 +116,16 @@ static int vm_clock_syscons_init(const struct device *dev, struct vm *vm, struct return 0; } -int clk_syscon_vdev_mem_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value) +static int clk_syscon_vdev_mem_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size) { uint32_t read_value; read_value = sys_read32(addr); *(uint32_t *)value = read_value; - //printk("Device-%s Read:addr is %llx, value is %x\n", vdev->name, addr, read_value); - return 0; } -int clk_syscon_vdev_mem_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value) +static int clk_syscon_vdev_mem_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size) { uint32_t be_write_value, write_value, af_write_value; @@ -136,9 +134,6 @@ int clk_syscon_vdev_mem_write(struct virt_dev *vdev, uint64_t addr, uint64_t *va sys_write32(write_value, addr); af_write_value = sys_read32(addr); - //printk("Device-%s Write:addr is %llx, be_value is %x, ne_value is %x, af_value is %x\n", - // vdev->name, addr, be_write_value, write_value, af_write_value); - return 0; } diff --git a/subsys/virtualization/vdev/virt_syscon.c b/subsys/virtualization/vdev/virt_syscon.c index dd295569c..a29ba1bca 100644 --- a/subsys/virtualization/vdev/virt_syscon.c +++ b/subsys/virtualization/vdev/virt_syscon.c @@ -81,7 +81,7 @@ static int virt_syscon_init(const struct device *dev) } -int syscon_vdev_mem_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value) +static int syscon_vdev_mem_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size) { uint32_t read_value; read_value = sys_read32(addr); @@ -92,7 +92,7 @@ int syscon_vdev_mem_read(struct virt_dev *vdev, uint64_t addr, uint64_t *value) return 0; } -int syscon_vdev_mem_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value) +static int syscon_vdev_mem_write(struct virt_dev *vdev, uint64_t addr, uint64_t *value, uint16_t size) { uint32_t be_write_value, write_value, af_write_value; diff --git a/subsys/virtualization/vm_device.c b/subsys/virtualization/vm_device.c index ff48daada..3d0312446 100644 --- a/subsys/virtualization/vm_device.c +++ b/subsys/virtualization/vm_device.c @@ -197,10 +197,10 @@ int vdev_mmio_abort(arch_commom_regs_t *regs, int write, uint64_t addr, if ((addr >= vdev->vm_vdev_paddr) && (addr < vdev->vm_vdev_paddr + vdev->vm_vdev_size)) { if (write) { return ((const struct virt_device_api * \ - const)(vdevice_instance->api))->virt_device_write(vdev, addr, reg_value); + const)(vdevice_instance->api))->virt_device_write(vdev, addr, reg_value, size); }else{ return ((const struct virt_device_api * \ - const)(vdevice_instance->api))->virt_device_read(vdev, addr, reg_value); + const)(vdevice_instance->api))->virt_device_read(vdev, addr, reg_value, size); } } } diff --git a/zvm_doc/4_Run_on_ROC_RK3568_PC.rst b/zvm_doc/4_Run_on_ROC_RK3568_PC.rst index cb5f97e39..9fc12edd5 100644 --- a/zvm_doc/4_Run_on_ROC_RK3568_PC.rst +++ b/zvm_doc/4_Run_on_ROC_RK3568_PC.rst @@ -56,6 +56,7 @@ zephyr.bin #zephyr vm 镜像 Image #linux vm 内核镜像 rk3568-firefly-roc-pc-simple.dtb #Linux设备树文件 + debian_rt.cpio.gz #Linux rootfs文件 准备好这些镜像后,需要将其统一烧录到rk3568的板卡上。具体来说,就是需要通过tftp协议将这些镜像 烧录到开发板上。包括如下步骤: @@ -104,21 +105,30 @@ rk3568板卡通电,使用串口助手连接板卡后,启动时长按`ctrl + ping 192.168.1.101 #测试tftp服务器地址是否可用,出现active说明正常 由于使用rk3568运行zvm时,主机使用的板卡串口为串口uart3,因此需要主动配置 -板卡的uart相关的gpio端口为串口模式,才能正常使用uart3串口: +板卡的uart相关的gpio端口为串口模式,才能正常使用uart3串口。同时,启动两个 +虚拟机时,还需要一个串口uart9分配给其他虚拟机,示例中为: + +- uart2: 分配给Linux虚拟机 +- uart3: 分配给Zephyr虚拟机 +- uart9: 分配给其他虚拟机 .. code:: shell mw 0xfdc60000 0xffff0022 #写入串口uart3配置 + mw 0xfdc60074 0x04400440 #写入串口uart9配置 + mw 0xfdc60310 0xffff0100 #写入串口uart9配置 + 下载各个镜像到rk3568板卡: .. code:: shell tftp 0x10000000 zvm_host.bin #下载zvm镜像 - tftp 0x48000000 zephyr.bin #下载zephyr vm镜像 - tftp 0x80000000 Image #下载linux vm镜像 - tftp 0xbe000000 rk3568-firefly-roc-pc-simple.dtb #下载linux 设备树镜像 + tftp 0x01000000 zephyr.bin #下载zephyr vm镜像 + tftp 0x60000000 Image #下载linux vm镜像 + tftp 0x99000000 rk3568-firefly-roc-pc-simple.dtb #下载linux 设备树镜像 + tftp 0x69000000 debian_rt.cpio.gz #下载linux rootfs镜像 运行镜像: @@ -128,7 +138,7 @@ rk3568板卡通电,使用串口助手连接板卡后,启动时长按`ctrl + dcache off;icache off;go 0x10000000 #关闭数据和指令cache go 0x10000000 #将pc指针指0x10000000 -此时,打开uart3串口,即可使用zvm的shell来输入命令并启动虚拟机。 +此时,打开uart3串口,即可使用zvm的shell来输入命令并启动两个虚拟机。 3. RK3568平台的ZVM上运行Paddle Lite ----------------------- @@ -166,7 +176,7 @@ rk3568板卡通电,使用串口助手连接板卡后,启动时长按`ctrl + tftp 0x48000000 zephyr.bin #下载zephyr vm镜像 tftp 0x80000000 Image #下载linux vm镜像 tftp 0x48000000 rk3568-firefly-roc-pc-simple.dtb #下载linux 设备树镜像 - tftp 0x90000000 mobilenet_v1.nb #下载mobilenetv1模型 + tftp 0xa0000000 mobilenet_v1.nb #下载mobilenetv1模型 运行镜像: -- Gitee