From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id A7AEEC433F5 for ; Wed, 20 Apr 2022 05:56:22 +0000 (UTC) Received: from localhost ([::1]:37374 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nh3K9-0001AQ-Cx for qemu-devel@archiver.kernel.org; Wed, 20 Apr 2022 01:56:21 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:33742) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nh3H2-0007qS-Sq for qemu-devel@nongnu.org; Wed, 20 Apr 2022 01:53:08 -0400 Received: from esa1.hgst.iphmx.com ([68.232.141.245]:41244) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nh3H0-0004Qd-PQ for qemu-devel@nongnu.org; Wed, 20 Apr 2022 01:53:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1650433986; x=1681969986; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=/LhyZf2nYA3CHhEVP9i1qF21zpSIkG1ugCVQa7PPYo4=; b=LQw69JaW6+4DVPwY5s3gbX4GveKFWDikGjYreRnK4OXNjvyeU1zlou1T xHuTwdn/6FQb4sxf1BgLF/odJeOxHewRiVDGAo/Fw5Lr9J/lhiam+nAVW d4zbNu6pH7RLjdcu8WljjI0FPuCTs34wFJyM/XQcdZLyTxX2MLzCoRr43 f2ffQiK7NGXmlDqJ7725ttZYu2PtU45+5EBUUk4414/RqudppCdKgtjBD Q3CgxkB6Xk1EP1q8miYoN1P02MI7TFzhJpOhmHQ6tuEj5QI8GpClGECmF kjyYPY015U5biKEawT7NBFQIb6UMPvomNxLVmmkiliGnQQs9dT/7tzBdc w==; X-IronPort-AV: E=Sophos;i="5.90,274,1643644800"; d="scan'208";a="310304320" Received: from uls-op-cesaip02.wdc.com (HELO uls-op-cesaep02.wdc.com) ([199.255.45.15]) by ob1.hgst.iphmx.com with ESMTP; 20 Apr 2022 13:53:03 +0800 IronPort-SDR: KYgFJ1CPrCh826cvCGlHjLmuZDkLfcj338CE6BwepWB89lphldWPzidjn1ANXvfl5/4pPHFAI3 Pk0SiG/ASMSog1ziv6RoQdA+ZRclqsPB+a6G+MW0pRRFve3LbtRoM4WzRCSYy4oxJOwQrc212r qh/QGJpJLOzVmkRIJ6MsO2QBg6CUHDdWwjYTml5HUxeoYmluDxmShvae8ig01momTcxn0RYxCv Na9MIb3PW5BC/o2866gPolxsiSQ9RnTTZa5a1pyv1+sAMNrOOEvPSI6lHAPdScCioSoe2GgjJG r6xyof4R+2LVYHnrX4fDEKEA Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep02.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 19 Apr 2022 22:23:22 -0700 IronPort-SDR: B/tjdgMEmyOGCHTiWzvtH61wA+3z2YjHHNIasDdqu6NXn9W9NTB0tV6VhMP24+09lW9MYqVRFR xIeQUdHk/bVluJ4b3KmsFIwFngJ6qSEkIEoO+tzeebz5Rw49ynNFR9hlrqWk6fRCYOq3FrWG4v 5ZXNHxziC1OdqWwc68nsuprn3OqOmIDeL96RzM1SHa/AcFm8IIhtymphgY3Ck3G09W5vqWgnu1 ey4km92G5X6UyuZkdfzLLA1RAE53bmaB1zsnT4XGASeBzHo8Emwkjj3GXQbLnNQ+gqS+v9oNv4 zCE= WDCIronportException: Internal Received: from usg-ed-osssrv.wdc.com ([10.3.10.180]) by uls-op-cesaip02.wdc.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 19 Apr 2022 22:53:04 -0700 Received: from usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTP id 4Kjqb33Y6dz1SHwl for ; Tue, 19 Apr 2022 22:53:03 -0700 (PDT) Authentication-Results: usg-ed-osssrv.wdc.com (amavisd-new); dkim=pass reason="pass (just generated, assumed good)" header.d=opensource.wdc.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d= opensource.wdc.com; h=content-transfer-encoding:mime-version :references:in-reply-to:x-mailer:message-id:date:subject:to :from; s=dkim; t=1650433981; x=1653025982; bh=/LhyZf2nYA3CHhEVP9 i1qF21zpSIkG1ugCVQa7PPYo4=; b=S3xIxg+NMn+DfAHKJcOR54lLg/YZtdXaUl 6bQUMVieED7govHUBtKHa6riYvvxGn/SGsLT87671jgMOXQY72HB0nbfhkfX8ad+ fQbahIKTnFQgDXGugusRUGyc4rp5KqX2rVnuKpMEXuXR4xGgd++w5QoAq05N9mLJ gl9IZldffFCwWxCgKsqorT+zyFFD6mKj2ja3rx2AojG3D9LQajStZ5+ePbgyPu1s w5iwy9GhZjSVMa9m3PNcPVz0FIsk1PnSxysnGxS/fFATWZHdZDI6yTKmGquT/B5C KRR+aIR1Xlj+p76HgD/snV47EwsCDXa4MkSZ9UJsKILxOlLaa9gA== X-Virus-Scanned: amavisd-new at usg-ed-osssrv.wdc.com Received: from usg-ed-osssrv.wdc.com ([127.0.0.1]) by usg-ed-osssrv.wdc.com (usg-ed-osssrv.wdc.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id gVJB4e9TpJwY for ; Tue, 19 Apr 2022 22:53:01 -0700 (PDT) Received: from toolbox.wdc.com (unknown [10.225.165.119]) by usg-ed-osssrv.wdc.com (Postfix) with ESMTPSA id 4KjqZx4s6Bz1Rwrw; Tue, 19 Apr 2022 22:52:57 -0700 (PDT) From: Alistair Francis To: qemu-riscv@nongnu.org, qemu-devel@nongnu.org Cc: Palmer Dabbelt , Alistair Francis , alistair23@gmail.com, Bin Meng , Alistair Francis , qemu-arm@nongnu.org, Peter Maydell , bmeng.cn@gmail.com, "Edgar E. Iglesias" Subject: [PATCH v4 1/6] hw/riscv: virt: Add a machine done notifier Date: Wed, 20 Apr 2022 15:52:43 +1000 Message-Id: <20220420055248.960491-2-alistair.francis@opensource.wdc.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220420055248.960491-1-alistair.francis@opensource.wdc.com> References: <20220420055248.960491-1-alistair.francis@opensource.wdc.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass client-ip=68.232.141.245; envelope-from=prvs=1021dae20=alistair.francis@opensource.wdc.com; helo=esa1.hgst.iphmx.com X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Alistair Francis Move the binary and device tree loading code to the machine done notifier. This allows us to prepare for editing the device tree as part of the notifier. This is based on similar code in the ARM virt machine. Signed-off-by: Alistair Francis Reviewed-by: Edgar E. Iglesias --- include/hw/riscv/virt.h | 1 + hw/riscv/virt.c | 180 +++++++++++++++++++++------------------- 2 files changed, 97 insertions(+), 84 deletions(-) diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 78b058ec86..8b8db3fb7c 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -45,6 +45,7 @@ struct RISCVVirtState { MachineState parent; =20 /*< public >*/ + Notifier machine_done; RISCVHartArrayState soc[VIRT_SOCKETS_MAX]; DeviceState *irqchip[VIRT_SOCKETS_MAX]; PFlashCFI01 *flash[2]; diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index da50cbed43..3d48469367 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1156,6 +1156,95 @@ static DeviceState *virt_create_aia(RISCVVirtAIATy= pe aia_type, int aia_guests, return aplic_m; } =20 +static +void virt_machine_done(Notifier *notifier, void *data) +{ + RISCVVirtState *s =3D container_of(notifier, RISCVVirtState, + machine_done); + const MemMapEntry *memmap =3D virt_memmap; + MachineState *machine =3D MACHINE(s); + target_ulong start_addr =3D memmap[VIRT_DRAM].base; + target_ulong firmware_end_addr, kernel_start_addr; + uint32_t fdt_load_addr; + uint64_t kernel_entry; + + /* + * Only direct boot kernel is currently supported for KVM VM, + * so the "-bios" parameter is ignored and treated like "-bios none" + * when KVM is enabled. + */ + if (kvm_enabled()) { + g_free(machine->firmware); + machine->firmware =3D g_strdup("none"); + } + + if (riscv_is_32bit(&s->soc[0])) { + firmware_end_addr =3D riscv_find_and_load_firmware(machine, + RISCV32_BIOS_BIN, start_addr, NULL); + } else { + firmware_end_addr =3D riscv_find_and_load_firmware(machine, + RISCV64_BIOS_BIN, start_addr, NULL); + } + + if (machine->kernel_filename) { + kernel_start_addr =3D riscv_calc_kernel_start_addr(&s->soc[0], + firmware_end_ad= dr); + + kernel_entry =3D riscv_load_kernel(machine->kernel_filename, + kernel_start_addr, NULL); + + if (machine->initrd_filename) { + hwaddr start; + hwaddr end =3D riscv_load_initrd(machine->initrd_filename, + machine->ram_size, kernel_ent= ry, + &start); + qemu_fdt_setprop_cell(machine->fdt, "/chosen", + "linux,initrd-start", start); + qemu_fdt_setprop_cell(machine->fdt, "/chosen", "linux,initrd= -end", + end); + } + } else { + /* + * If dynamic firmware is used, it doesn't know where is the next= mode + * if kernel argument is not set. + */ + kernel_entry =3D 0; + } + + if (drive_get(IF_PFLASH, 0, 0)) { + /* + * Pflash was supplied, let's overwrite the address we jump to a= fter + * reset to the base of the flash. + */ + start_addr =3D virt_memmap[VIRT_FLASH].base; + } + + /* + * Init fw_cfg. Must be done before riscv_load_fdt, otherwise the d= evice + * tree cannot be altered and we get FDT_ERR_NOSPACE. + */ + s->fw_cfg =3D create_fw_cfg(machine); + rom_set_fw(s->fw_cfg); + + /* Compute the fdt load address in dram */ + fdt_load_addr =3D riscv_load_fdt(memmap[VIRT_DRAM].base, + machine->ram_size, machine->fdt); + /* load the reset vector */ + riscv_setup_rom_reset_vec(machine, &s->soc[0], start_addr, + virt_memmap[VIRT_MROM].base, + virt_memmap[VIRT_MROM].size, kernel_entry, + fdt_load_addr, machine->fdt); + + /* + * Only direct boot kernel is currently supported for KVM VM, + * So here setup kernel start address and fdt address. + * TODO:Support firmware loading and integrate to TCG start + */ + if (kvm_enabled()) { + riscv_setup_direct_kernel(kernel_entry, fdt_load_addr); + } +} + static void virt_machine_init(MachineState *machine) { const MemMapEntry *memmap =3D virt_memmap; @@ -1163,10 +1252,6 @@ static void virt_machine_init(MachineState *machin= e) MemoryRegion *system_memory =3D get_system_memory(); MemoryRegion *mask_rom =3D g_new(MemoryRegion, 1); char *soc_name; - target_ulong start_addr =3D memmap[VIRT_DRAM].base; - target_ulong firmware_end_addr, kernel_start_addr; - uint32_t fdt_load_addr; - uint64_t kernel_entry; DeviceState *mmio_irqchip, *virtio_irqchip, *pcie_irqchip; int i, base_hartid, hart_count; =20 @@ -1296,92 +1381,12 @@ static void virt_machine_init(MachineState *machi= ne) memory_region_add_subregion(system_memory, memmap[VIRT_DRAM].base, machine->ram); =20 - /* create device tree */ - create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline, - riscv_is_32bit(&s->soc[0])); - /* boot rom */ memory_region_init_rom(mask_rom, NULL, "riscv_virt_board.mrom", memmap[VIRT_MROM].size, &error_fatal); memory_region_add_subregion(system_memory, memmap[VIRT_MROM].base, mask_rom); =20 - /* - * Only direct boot kernel is currently supported for KVM VM, - * so the "-bios" parameter is ignored and treated like "-bios none" - * when KVM is enabled. - */ - if (kvm_enabled()) { - g_free(machine->firmware); - machine->firmware =3D g_strdup("none"); - } - - if (riscv_is_32bit(&s->soc[0])) { - firmware_end_addr =3D riscv_find_and_load_firmware(machine, - RISCV32_BIOS_BIN, start_addr, NULL); - } else { - firmware_end_addr =3D riscv_find_and_load_firmware(machine, - RISCV64_BIOS_BIN, start_addr, NULL); - } - - if (machine->kernel_filename) { - kernel_start_addr =3D riscv_calc_kernel_start_addr(&s->soc[0], - firmware_end_ad= dr); - - kernel_entry =3D riscv_load_kernel(machine->kernel_filename, - kernel_start_addr, NULL); - - if (machine->initrd_filename) { - hwaddr start; - hwaddr end =3D riscv_load_initrd(machine->initrd_filename, - machine->ram_size, kernel_ent= ry, - &start); - qemu_fdt_setprop_cell(machine->fdt, "/chosen", - "linux,initrd-start", start); - qemu_fdt_setprop_cell(machine->fdt, "/chosen", "linux,initrd= -end", - end); - } - } else { - /* - * If dynamic firmware is used, it doesn't know where is the next= mode - * if kernel argument is not set. - */ - kernel_entry =3D 0; - } - - if (drive_get(IF_PFLASH, 0, 0)) { - /* - * Pflash was supplied, let's overwrite the address we jump to a= fter - * reset to the base of the flash. - */ - start_addr =3D virt_memmap[VIRT_FLASH].base; - } - - /* - * Init fw_cfg. Must be done before riscv_load_fdt, otherwise the d= evice - * tree cannot be altered and we get FDT_ERR_NOSPACE. - */ - s->fw_cfg =3D create_fw_cfg(machine); - rom_set_fw(s->fw_cfg); - - /* Compute the fdt load address in dram */ - fdt_load_addr =3D riscv_load_fdt(memmap[VIRT_DRAM].base, - machine->ram_size, machine->fdt); - /* load the reset vector */ - riscv_setup_rom_reset_vec(machine, &s->soc[0], start_addr, - virt_memmap[VIRT_MROM].base, - virt_memmap[VIRT_MROM].size, kernel_entry, - fdt_load_addr, machine->fdt); - - /* - * Only direct boot kernel is currently supported for KVM VM, - * So here setup kernel start address and fdt address. - * TODO:Support firmware loading and integrate to TCG start - */ - if (kvm_enabled()) { - riscv_setup_direct_kernel(kernel_entry, fdt_load_addr); - } - /* SiFive Test MMIO device */ sifive_test_create(memmap[VIRT_TEST].base); =20 @@ -1417,6 +1422,13 @@ static void virt_machine_init(MachineState *machin= e) drive_get(IF_PFLASH, 0, i)); } virt_flash_map(s, system_memory); + + /* create device tree */ + create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline, + riscv_is_32bit(&s->soc[0])); + + s->machine_done.notify =3D virt_machine_done; + qemu_add_machine_init_done_notifier(&s->machine_done); } =20 static void virt_machine_instance_init(Object *obj) --=20 2.35.1