]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
board: qemu: m68k: Create virtio mmio instances
authorDaniel Palmer <daniel@thingy.jp>
Sat, 16 May 2026 07:40:01 +0000 (16:40 +0900)
committerTom Rini <trini@konsulko.com>
Fri, 22 May 2026 22:47:54 +0000 (16:47 -0600)
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 <angelo@kernel-space.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Kuan-Wei Chiu <visitorckw@gmail.com>
Tested-by: Kuan-Wei Chiu <visitorckw@gmail.com>
Signed-off-by: Daniel Palmer <daniel@thingy.jp>
arch/m68k/Kconfig
board/emulation/qemu-m68k/qemu-m68k.c

index 00e89bd0a6253fb3be2b61ddc0d1b9e2728fd549..8bebf0ea3e131f639c99901d54c8186eb1e9f5c8 100644 (file)
@@ -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
 
index d3527aee1128590f36a4185399e5b8f243021fc3..a19b23a28ce3f4a51a50eb8f2a2729b41ed6f367 100644 (file)
 #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");