On Tue, May 05, 2026 at 04:49:41PM +0900, Daniel Palmer wrote: > So that you can use virtio network, block etc create the virtio mmio > instances. There are 128 of these even if they are not all used, a > single mmio base value is passed via bootinfo. > > Reviewed-by: Angelo Dureghello <[email protected]> > Reviewed-by: Simon Glass <[email protected]> > Signed-off-by: Daniel Palmer <[email protected]>
Reviewed-by: Kuan-Wei Chiu <[email protected]> Tested-by: Kuan-Wei Chiu <[email protected]> Regards, Kuan-Wei > --- > arch/m68k/Kconfig | 14 +++++---- > board/emulation/qemu-m68k/qemu-m68k.c | 45 +++++++++++++++++++++++++++ > 2 files changed, 53 insertions(+), 6 deletions(-) > > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > index 00e89bd0a625..8bebf0ea3e13 100644 > --- a/arch/m68k/Kconfig > +++ b/arch/m68k/Kconfig > @@ -196,12 +196,14 @@ config TARGET_STMARK2 > select M54418 > > config TARGET_QEMU_M68K > - bool "Support QEMU m68k virt" > - select M68040 > - imply CMD_DM > - help > - This target supports the QEMU m68k virtual machine (-M virt). > - It simulates a Motorola 68040 CPU with Goldfish peripherals. > + bool "Support QEMU m68k virt" > + select M68040 > + select BOARD_EARLY_INIT_R > + select VIRTIO_MMIO > + imply CMD_DM > + help > + This target supports the QEMU m68k virtual machine (-M virt). > + It simulates a Motorola 68040 CPU with Goldfish peripherals. > > endchoice > > diff --git a/board/emulation/qemu-m68k/qemu-m68k.c > b/board/emulation/qemu-m68k/qemu-m68k.c > index d3527aee1128..a19b23a28ce3 100644 > --- a/board/emulation/qemu-m68k/qemu-m68k.c > +++ b/board/emulation/qemu-m68k/qemu-m68k.c > @@ -14,9 +14,14 @@ > #include <asm/bootinfo.h> > #include <asm/global_data.h> > #include <asm/io.h> > +#include <dm.h> > +#include <dm/device-internal.h> > +#include <dm/lists.h> > #include <dm/platdata.h> > +#include <dm/root.h> > #include <linux/errno.h> > #include <linux/sizes.h> > +#include <virtio_mmio.h> > > DECLARE_GLOBAL_DATA_PTR; > > @@ -25,6 +30,38 @@ static struct goldfish_rtc_plat rtc_plat; > static struct goldfish_timer_plat timer_plat; > static struct qemu_virt_ctrl_plat reset_plat; > > +#define VIRTIO_MMIO_NUM 128 > +#define VIRTIO_MMIO_SZ 0x200 > + > +static struct virtio_mmio_plat virtio_mmio_plat[VIRTIO_MMIO_NUM]; > +static char virtio_mmio_names[VIRTIO_MMIO_NUM][11]; > +static phys_addr_t virtio_mmio_base; > + > +static int create_virtio_mmios(void) > +{ > + struct driver *drv; > + int i, ret; > + > + if (!virtio_mmio_base) > + return -ENODEV; > + > + drv = lists_driver_lookup_name("virtio-mmio"); > + if (!drv) > + return -ENOENT; > + > + for (i = 0; i < VIRTIO_MMIO_NUM; i++) { > + virtio_mmio_plat[i].base = virtio_mmio_base + (VIRTIO_MMIO_SZ * > i); > + sprintf(virtio_mmio_names[i], "virtio-%d", i); > + > + ret = device_bind(dm_root(), drv, virtio_mmio_names[i], > + &virtio_mmio_plat[i], ofnode_null(), NULL); > + if (ret) > + return ret; > + } > + > + return 0; > +} > + > /* > * Theoretical limit derivation: > * Max Bootinfo Size (Standard Page) = 4096 bytes > @@ -65,6 +102,9 @@ static void parse_bootinfo(void) > case BI_VIRT_CTRL_BASE: > reset_plat.reg = base; > break; > + case BI_VIRT_VIRTIO_BASE: > + virtio_mmio_base = base; > + break; > case BI_MEMCHUNK: > gd->ram_size = record->data[1]; > break; > @@ -80,6 +120,11 @@ int board_early_init_f(void) > return 0; > } > > +int board_early_init_r(void) > +{ > + return create_virtio_mmios(); > +} > + > int checkboard(void) > { > puts("Board: QEMU m68k virt\n"); > -- > 2.53.0 >

