All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Cédric Le Goater" <clg@kaod.org>
To: <qemu-ppc@nongnu.org>, <qemu-devel@nongnu.org>
Cc: "Christophe Leroy" <christophe.leroy@c-s.fr>,
	"Thomas Huth" <thuth@redhat.com>,
	"Daniel Henrique Barboza" <danielhb413@gmail.com>,
	"Greg Kurz" <groug@kaod.org>, "Cédric Le Goater" <clg@kaod.org>,
	"David Gibson" <david@gibson.dropbear.id.au>
Subject: [PATCH 09/15] ppc/ppc405: Rework FW load
Date: Mon, 6 Dec 2021 11:37:06 +0100	[thread overview]
Message-ID: <20211206103712.1866296-10-clg@kaod.org> (raw)
In-Reply-To: <20211206103712.1866296-1-clg@kaod.org>

QEMU installs a custom U-Boot in-memory descriptor to share board
information with Linux, which means that the QEMU machine was
initially designed to support booting Linux directly without using the
loaded FW. But, it's not that simple because the CPU still starts at
address 0xfffffffc where nothing is currently mapped. Support must
have been broken these last years.

Since we can not find a "ppc405_rom.bin" firmware file, request one to
be specified on the command line. A consequence of this change is that
the machine can be booted directly from Linux without any FW being
loaded. This is still broken and the CPU start address will be fixed
in the next changes.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 hw/ppc/ppc405_boards.c | 45 +++++++++++++++++++-----------------------
 1 file changed, 20 insertions(+), 25 deletions(-)

diff --git a/hw/ppc/ppc405_boards.c b/hw/ppc/ppc405_boards.c
index a385e8f15070..cfed43dba2f3 100644
--- a/hw/ppc/ppc405_boards.c
+++ b/hw/ppc/ppc405_boards.c
@@ -139,24 +139,19 @@ static void ref405ep_fpga_init(MemoryRegion *sysmem, uint32_t base)
 static void ref405ep_init(MachineState *machine)
 {
     MachineClass *mc = MACHINE_GET_CLASS(machine);
-    const char *bios_name = machine->firmware ?: BIOS_FILENAME;
     const char *kernel_filename = machine->kernel_filename;
     const char *kernel_cmdline = machine->kernel_cmdline;
     const char *initrd_filename = machine->initrd_filename;
-    char *filename;
     ppc4xx_bd_info_t bd;
     PowerPCCPU *cpu;
     CPUPPCState *env;
     DeviceState *dev;
     SysBusDevice *s;
-    MemoryRegion *bios;
     MemoryRegion *sram = g_new(MemoryRegion, 1);
     ram_addr_t bdloc;
     MemoryRegion *ram_memories = g_new(MemoryRegion, 2);
     hwaddr ram_bases[2], ram_sizes[2];
-    long bios_size;
-    //int phy_addr = 0;
-    //static int phy_addr = 1;
+    long bios_size = -1;
     target_ulong kernel_base, initrd_base;
     long kernel_size, initrd_size;
     int linux_boot;
@@ -190,31 +185,31 @@ static void ref405ep_init(MachineState *machine)
     memory_region_add_subregion(sysmem, PPC405EP_SRAM_BASE, sram);
 
     /* allocate and load BIOS */
-    {
-        bios = g_new(MemoryRegion, 1);
+    if (machine->firmware) {
+        MemoryRegion *bios = g_new(MemoryRegion, 1);
+        g_autofree char *filename;
+
         memory_region_init_rom(bios, NULL, "ef405ep.bios", BIOS_SIZE,
                                &error_fatal);
 
-        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
-        if (filename) {
-            bios_size = load_image_size(filename,
-                                        memory_region_get_ram_ptr(bios),
-                                        BIOS_SIZE);
-            g_free(filename);
-            if (bios_size < 0) {
-                error_report("Could not load PowerPC BIOS '%s'", bios_name);
-                exit(1);
-            }
-            bios_size = (bios_size + 0xfff) & ~0xfff;
-            memory_region_add_subregion(sysmem, (uint32_t)(-bios_size), bios);
-        } else if (!qtest_enabled() || kernel_filename != NULL) {
-            error_report("Could not load PowerPC BIOS '%s'", bios_name);
+        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, machine->firmware);
+        if (!filename) {
+            error_report("Could not find firmware '%s'", machine->firmware);
+            exit(1);
+        }
+
+        bios_size = load_image_size(filename,
+                                    memory_region_get_ram_ptr(bios),
+                                    BIOS_SIZE);
+        if (bios_size < 0) {
+            error_report("Could not load PowerPC BIOS '%s'", machine->firmware);
             exit(1);
-        } else {
-            /* Avoid an uninitialized variable warning */
-            bios_size = -1;
         }
+
+        bios_size = (bios_size + 0xfff) & ~0xfff;
+        memory_region_add_subregion(sysmem, (uint32_t)(-bios_size), bios);
     }
+
     /* Register FPGA */
     ref405ep_fpga_init(sysmem, PPC405EP_FPGA_BASE);
     /* Register NVRAM */
-- 
2.31.1



  parent reply	other threads:[~2021-12-06 10:44 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-06 10:36 [PATCH 00/15] ppc/ppc405: decade cleanup Cédric Le Goater
2021-12-06 10:36 ` [PATCH 01/15] ppc/ppc405: Change kernel load address Cédric Le Goater
2021-12-06 10:36 ` [PATCH 02/15] ppc: Mark the 'taihu' machine as deprecated Cédric Le Goater
2021-12-23  6:55   ` Philippe Mathieu-Daudé
2021-12-06 10:37 ` [PATCH 03/15] ppc: Add trace-events for DCR accesses Cédric Le Goater
2021-12-06 13:17   ` Philippe Mathieu-Daudé
2021-12-06 10:37 ` [PATCH 04/15] ppc/ppc405: Convert printfs to trace-events Cédric Le Goater
2021-12-06 10:37 ` [PATCH 05/15] ppc/ppc405: Drop flag parameter in ppc405_set_bootinfo() Cédric Le Goater
2021-12-06 13:18   ` Philippe Mathieu-Daudé
2021-12-06 10:37 ` [PATCH 06/15] ppc/ppc405: Change ppc405ep_init() return value Cédric Le Goater
2021-12-06 10:37 ` [PATCH 07/15] ppc/ppc405: Add some address space definitions Cédric Le Goater
2021-12-06 13:20   ` Philippe Mathieu-Daudé
2021-12-06 15:05   ` BALATON Zoltan
2021-12-07  6:46     ` Cédric Le Goater
2021-12-06 10:37 ` [PATCH 08/15] ppc/ppc405: Remove flash support Cédric Le Goater
2021-12-06 10:37 ` Cédric Le Goater [this message]
2021-12-06 10:37 ` [PATCH 10/15] ppc/ppc405: Introduce ppc405_set_default_bootinfo() Cédric Le Goater
2021-12-06 10:37 ` [PATCH 11/15] ppc/ppc405: Fix boot from kernel Cédric Le Goater
2021-12-06 15:16   ` BALATON Zoltan
2021-12-07  6:52     ` Cédric Le Goater
2021-12-06 10:37 ` [PATCH 12/15] ppc/ppc405: Change default PLL values at reset Cédric Le Goater
2021-12-06 10:37 ` [PATCH 13/15] ppc/ppc405: Fix bi_pci_enetaddr2 field in U-Boot board information Cédric Le Goater
2021-12-06 13:25   ` Philippe Mathieu-Daudé
2021-12-06 10:37 ` [PATCH 14/15] ppc/ppc405: Add update of bi_procfreq field Cédric Le Goater
2021-12-06 10:37 ` [PATCH 15/15] ppc/ppc405: Update U-Boot board information for hotfoot Cédric Le Goater
2021-12-06 13:27   ` Philippe Mathieu-Daudé
2021-12-06 13:37     ` Cédric Le Goater
2021-12-06 13:40       ` Thomas Huth
2021-12-06 15:20         ` Cédric Le Goater
2021-12-15 16:49 ` [PATCH 00/15] ppc/ppc405: decade cleanup Cédric Le Goater
2021-12-17 16:36   ` Christophe Leroy
2021-12-17 17:18     ` Cédric Le Goater
2021-12-18  9:33       ` Cédric Le Goater
2021-12-20  8:33     ` Cédric Le Goater
2021-12-20 18:07       ` Philippe Mathieu-Daudé
2021-12-20 18:18         ` Cédric Le Goater

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211206103712.1866296-10-clg@kaod.org \
    --to=clg@kaod.org \
    --cc=christophe.leroy@c-s.fr \
    --cc=danielhb413@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=groug@kaod.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.