Hi, Here a short status report of this patch series. For V3 update I already prepared the following: - reworked all review comments from Philippe, except: - patch#8: question for the SID, whether command-line override is required (and how is the best way for machine-specific cli arg?) [1] - added BootROM support, allows booting with only specifying -sd - added SDRAM controller driver, for U-Boot SPL - added Allwinner generic RTC driver (for both Cubieboard and OrangePi PC, supports sun4i, sun6i, sun7i) - small fixes for EMAC My current TODO: - integrate Philips acceptance tests in the series - integrate Philips work for generalizing the Allwinner timer, and finish it - test and fix BSD targets (NetBSD, FreeBSD) [2, 3] - further generalize the series to cover very similar SoCs: H2+, H5 Does anyone have more comments/requests for the V3 update? [1] https://lists.gnu.org/archive/html/qemu-devel/2019-12/msg04049.html [2] https://wiki.netbsd.org/ports/evbarm/allwinner/ [3] https://wiki.freebsd.org/action/show/arm/Allwinner?action=show&redirect=FreeBSD%2Farm%2FAllwinner On Tue, Dec 17, 2019 at 12:35 AM Niek Linnenbank wrote: > Dear QEMU developers, > > Hereby I would like to contribute the following set of patches to QEMU > which add support for the Allwinner H3 System on Chip and the > Orange Pi PC machine. The following features and devices are supported: > > * SMP (Quad Core Cortex A7) > * Generic Interrupt Controller configuration > * SRAM mappings > * Timer device (re-used from Allwinner A10) > * UART > * SD/MMC storage controller > * EMAC ethernet connectivity > * USB 2.0 interfaces > * Clock Control Unit > * System Control module > * Security Identifier device > > Functionality related to graphical output such as HDMI, GPU, > Display Engine and audio are not included. Recently released > mainline Linux kernels (4.19 up to latest master) and mainline U-Boot > are known to work. The SD/MMC code is tested using bonnie++ and > various tools such as fsck, dd and fdisk. The EMAC is verified with iperf3 > using -netdev socket. > > To build a Linux mainline kernel that can be booted by the Orange Pi PC > machine, simply configure the kernel using the sunxi_defconfig > configuration: > $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make mrproper > $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make sunxi_defconfig > > To be able to use USB storage, you need to manually enable the > corresponding > configuration item. Start the kconfig configuration tool: > $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make menuconfig > > Navigate to the following item, enable it and save your configuration: > Device Drivers > USB support > USB Mass Storage support > > Build the Linux kernel with: > $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make -j5 > > To boot the newly build linux kernel in QEMU with the Orange Pi PC > machine, use: > $ qemu-system-arm -M orangepi-pc -m 512 -nic user -nographic \ > -kernel /path/to/linux/arch/arm/boot/zImage \ > -append 'console=ttyS0,115200' \ > -dtb /path/to/linux/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb > > Note that this kernel does not have a root filesystem. You may provide it > with an official Orange Pi PC image [1] either as an SD card or as > USB mass storage. To boot using the Orange Pi PC Debian image on SD card, > simply add the -sd argument and provide the proper root= kernel parameter: > $ qemu-system-arm -M orangepi-pc -m 512 -nic user -nographic \ > -kernel /path/to/linux/arch/arm/boot/zImage \ > -append 'console=ttyS0,115200 root=/dev/mmcblk0p2' \ > -dtb /path/to/linux/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb \ > -sd OrangePi_pc_debian_stretch_server_linux5.3.5_v1.0.img > > Alternatively, you can also choose to build and boot a recent buildroot [2] > using the orangepi_pc_defconfig or Armbian image [3] for Orange Pi PC. > To attach an USB mass storage device to the machine, simply append to the > command: > -drive if=none,id=stick,file=myimage.img \ > -device usb-storage,bus=usb-bus.0,drive=stick > > U-Boot mainline can be build and configured using the orangepi_pc_defconfig > using similar commands as describe above for Linux. To start U-Boot using > the Orange Pi PC machine, provide the u-boot binary to the -kernel > argument: > $ qemu-system-arm -M orangepi-pc -m 512 -nic user -nographic \ > -kernel /path/to/uboot/u-boot -sd disk.img > > Use the following U-boot commands to load and boot a Linux kernel from SD > card: > -> setenv bootargs console=ttyS0,115200 > -> ext2load mmc 0 0x42000000 zImage > -> ext2load mmc 0 0x43000000 sun8i-h3-orangepi-pc.dtb > -> bootz 0x42000000 - 0x43000000 > > Looking forward to your review comments. I will do my best > to update the patches where needed. > > ===== CHANGELOG ===== > > v2: > * hw/arm/allwinner-h3.c: use cpus array in AwH3State instead of > object_new() > * hw/arm/allwinner-h3.c: use error_abort in aw_h3_realize() > * hw/arm/allwinner-h3.c: use qdev_init_nofail() in aw_h3_realize() > * hw/arm/allwinner-h3.c: use qdev_get_gpio_in() instead of irq array > * hw/arm/allwinner-h3.c: add all missing unimplemented devices (memory > map is complete) > * hw/arm/allwinner-h3.c: add UART1, UART2, UART3 and remove 'if > (serial_hd(...))' > * hw/arm/allwinner-h3.c: remove sysbusdev variable and use > SYS_BUS_DEVICE() directly > * include/hw/arm/allwinner-h3.h: move PPI/SPI defines to allwinner-h3.c > as enum > * include/hw/arm/allwinner-h3.h: replace mem base/size defines with enum > and memmap (like aspeed_soc.h) > * hw/arm/orangepi.c: Only allow Cortex-A7 in machine->cpu_type > * hw/arm/orangepi.c: Set mc->default_cpu_type to > ARM_CPU_TYPE_NAME("cortex-a7") > * hw/arm/orangepi.c: Use error_abort in orangepi_init() > * hw/arm/orangepi.c: only allow maximum 1GiB RAM > * hw/arm/orangepi.c: renamed machine name to 'orangepi-pc' > * hw/arm/orangepi.c: remove mc->ignore_memory_transaction_failures = true > * hw/arm/orangepi.c: remove unnecessary check for 'sd-bus' > * hw/net/allwinner-h3-emac.c: use AW_H3_EMAC() for opaque in read/write > functions > * hw/sd/allwinner-h3-sdhost.c: replace register defines with enums > * hw/sd/allwinner-h3-sdhost.c: remove 'irq_en' and use if() to set 'irq' > in update_irq function > * hw/sd/allwinner-h3-sdhost.c: simplified if (rlen==) conditions in > send_command function > * hw/sd/allwinner-h3-sdhost.c: use KiB macro to set desc->size > * hw/sd/allwinner-h3-sdhost.c: use ARRAY_SIZE() macro in reset function > * hw/misc/allwinner-h3-sid.c: replace randomized identifier with QemuUUID > property > * hw/misc/allwinner-h3-sid.c: add tracing for read/write functions > * hw/misc/allwinner-h3-sid.c: fix incorrect usage of > REG_PRCTL_OP_LOCK/REG_PRCTL_WRITE > * hw/misc/trace-events: add allwinner_h3_cpucfg* entries in correct patch > (#7) > * hw/*/trace-events: use PRIu32/PRIx32 macros for size and max fields > * hw/*/allwinner-h3-*.c: set .impl.min_access_size = 4 to restrict MMIO > access to 32-bit aligned > * hw/*/allwinner-h3-*.c: replace register defines with enums > * hw/*/allwinner-h3-*.c: set VMStateDescription.name with inline string > (dont use TYPE macro) > * include/hw/*/allwinner-h3-*.h: remove MEM_SIZE define and use size > inline in the source file > * target/arm/arm-powerctl.c: invoke arm_rebuild_hflags() after setting > CP15 bits > > With kind regards, > > Niek Linnenbank > > [1] http://www.orangepi.org/downloadresources/ > [2] https://buildroot.org/download.html > [3] https://www.armbian.com/orange-pi-pc/ > > Niek Linnenbank (10): > hw: arm: add Allwinner H3 System-on-Chip > hw: arm: add Xunlong Orange Pi PC machine > arm: allwinner-h3: add Clock Control Unit > arm: allwinner-h3: add USB host controller > arm: allwinner-h3: add System Control module > arm/arm-powerctl: rebuild hflags after setting CP15 bits in > arm_set_cpu_on() > arm: allwinner-h3: add CPU Configuration module > arm: allwinner-h3: add Security Identifier device > arm: allwinner-h3: add SD/MMC host controller > arm: allwinner-h3: add EMAC ethernet device > > default-configs/arm-softmmu.mak | 1 + > hw/usb/hcd-ehci.h | 1 + > include/hw/arm/allwinner-h3.h | 93 +++ > include/hw/misc/allwinner-h3-clk.h | 40 ++ > include/hw/misc/allwinner-h3-cpucfg.h | 42 ++ > include/hw/misc/allwinner-h3-sid.h | 40 ++ > include/hw/misc/allwinner-h3-syscon.h | 42 ++ > include/hw/net/allwinner-h3-emac.h | 67 +++ > include/hw/sd/allwinner-h3-sdhost.h | 71 +++ > hw/arm/allwinner-h3.c | 442 ++++++++++++++ > hw/arm/orangepi.c | 127 ++++ > hw/misc/allwinner-h3-clk.c | 238 ++++++++ > hw/misc/allwinner-h3-cpucfg.c | 288 +++++++++ > hw/misc/allwinner-h3-sid.c | 179 ++++++ > hw/misc/allwinner-h3-syscon.c | 146 +++++ > hw/net/allwinner-h3-emac.c | 829 ++++++++++++++++++++++++++ > hw/sd/allwinner-h3-sdhost.c | 813 +++++++++++++++++++++++++ > hw/usb/hcd-ehci-sysbus.c | 17 + > target/arm/arm-powerctl.c | 3 + > MAINTAINERS | 8 + > hw/arm/Kconfig | 9 + > hw/arm/Makefile.objs | 1 + > hw/misc/Makefile.objs | 4 + > hw/misc/trace-events | 9 + > hw/net/Kconfig | 3 + > hw/net/Makefile.objs | 1 + > hw/net/trace-events | 10 + > hw/sd/Makefile.objs | 1 + > hw/sd/trace-events | 7 + > 29 files changed, 3532 insertions(+) > create mode 100644 include/hw/arm/allwinner-h3.h > create mode 100644 include/hw/misc/allwinner-h3-clk.h > create mode 100644 include/hw/misc/allwinner-h3-cpucfg.h > create mode 100644 include/hw/misc/allwinner-h3-sid.h > create mode 100644 include/hw/misc/allwinner-h3-syscon.h > create mode 100644 include/hw/net/allwinner-h3-emac.h > create mode 100644 include/hw/sd/allwinner-h3-sdhost.h > create mode 100644 hw/arm/allwinner-h3.c > create mode 100644 hw/arm/orangepi.c > create mode 100644 hw/misc/allwinner-h3-clk.c > create mode 100644 hw/misc/allwinner-h3-cpucfg.c > create mode 100644 hw/misc/allwinner-h3-sid.c > create mode 100644 hw/misc/allwinner-h3-syscon.c > create mode 100644 hw/net/allwinner-h3-emac.c > create mode 100644 hw/sd/allwinner-h3-sdhost.c > > -- > 2.17.1 > > -- Niek Linnenbank