riscv: Move virtio scan to board_late_init()
[platform/kernel/u-boot.git] / board / emulation / qemu-riscv / qemu-riscv.c
index 49e304f..173245b 100644 (file)
@@ -5,13 +5,41 @@
 
 #include <common.h>
 #include <dm.h>
+#include <dm/ofnode.h>
 #include <env.h>
 #include <fdtdec.h>
+#include <image.h>
+#include <log.h>
+#include <spl.h>
+#include <init.h>
+#include <usb.h>
 #include <virtio_types.h>
 #include <virtio.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
+#if IS_ENABLED(CONFIG_MTD_NOR_FLASH)
+int is_flash_available(void)
+{
+       if (!ofnode_equal(ofnode_by_compatible(ofnode_null(), "cfi-flash"),
+                         ofnode_null()))
+               return 1;
+
+       return 0;
+}
+#endif
+
 int board_init(void)
 {
+       return 0;
+}
+
+int board_late_init(void)
+{
+       /* start usb so that usb keyboard can be used as input device */
+       if (CONFIG_IS_ENABLED(USB_KEYBOARD))
+               usb_init();
+
        /*
         * Make sure virtio bus is enumerated so that peripherals
         * on the virtio bus can be discovered by their drivers
@@ -21,70 +49,25 @@ int board_init(void)
        return 0;
 }
 
-int board_late_init(void)
+#ifdef CONFIG_SPL
+u32 spl_boot_device(void)
 {
-       ulong kernel_start;
-       ofnode chosen_node;
-       int ret;
-
-       chosen_node = ofnode_path("/chosen");
-       if (!ofnode_valid(chosen_node)) {
-               debug("No chosen node found, can't get kernel start address\n");
-               return 0;
-       }
-
-#ifdef CONFIG_ARCH_RV64I
-       ret = ofnode_read_u64(chosen_node, "riscv,kernel-start",
-                             (u64 *)&kernel_start);
-#else
-       ret = ofnode_read_u32(chosen_node, "riscv,kernel-start",
-                             (u32 *)&kernel_start);
+       /* RISC-V QEMU only supports RAM as SPL boot device */
+       return BOOT_DEVICE_RAM;
+}
 #endif
-       if (ret) {
-               debug("Can't find kernel start address in device tree\n");
-               return 0;
-       }
-
-       env_set_hex("kernel_start", kernel_start);
 
+#ifdef CONFIG_SPL_LOAD_FIT
+int board_fit_config_name_match(const char *name)
+{
+       /* boot using first FIT config */
        return 0;
 }
-
-/*
- * QEMU specifies the location of Linux (supplied with the -kernel argument)
- * in the device tree using the riscv,kernel-start and riscv,kernel-end
- * properties. We currently rely on the SBI implementation of BBL to run
- * Linux and therefore embed Linux as payload in BBL. This causes an issue,
- * because BBL detects the kernel properties in the device tree and ignores
- * the Linux payload as a result. To work around this issue, we clear the
- * kernel properties before booting Linux.
- *
- * This workaround can be removed, once we do not require BBL for its SBI
- * implementation anymore.
- */
-int ft_board_setup(void *blob, bd_t *bd)
-{
-       int chosen_offset, ret;
-
-       chosen_offset = fdt_path_offset(blob, "/chosen");
-       if (chosen_offset < 0)
-               return 0;
-
-#ifdef CONFIG_ARCH_RV64I
-       ret = fdt_setprop_u64(blob, chosen_offset, "riscv,kernel-start", 0);
-#else
-       ret = fdt_setprop_u32(blob, chosen_offset, "riscv,kernel-start", 0);
 #endif
-       if (ret)
-               return ret;
 
-#ifdef CONFIG_ARCH_RV64I
-       ret = fdt_setprop_u64(blob, chosen_offset, "riscv,kernel-end", 0);
-#else
-       ret = fdt_setprop_u32(blob, chosen_offset, "riscv,kernel-end", 0);
-#endif
-       if (ret)
-               return ret;
-
-       return 0;
+void *board_fdt_blob_setup(int *err)
+{
+       *err = 0;
+       /* Stored the DTB address there during our init */
+       return (void *)(ulong)gd->arch.firmware_fdt_addr;
 }