qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 23/31] hw/loongarch: Add default bios startup support.


From: Michael S. Tsirkin
Subject: Re: [PATCH 23/31] hw/loongarch: Add default bios startup support.
Date: Tue, 19 Oct 2021 12:19:38 -0400

On Tue, Oct 19, 2021 at 03:35:09PM +0800, Xiaojuan Yang wrote:
> This patch add default bios startup.
> The bios source code will be opened int the near future.

That pretty much rules out including this patchset for now ...
Does not mean people won't review, but please tag the subject RFC
until it's all open source and can be merged.
And I would really appreciate not getting CC'd until it is.

Thanks!

> Signed-off-by: Xiaojuan Yang <yangxiaojuan@loongson.cn>
> Signed-off-by: Song Gao <gaosong@loongson.cn>
> ---
>  hw/loongarch/Kconfig             |   4 +++
>  hw/loongarch/fw_cfg.c            |  34 ++++++++++++++++++
>  hw/loongarch/fw_cfg.h            |  16 +++++++++
>  hw/loongarch/ls3a5000_virt.c     |  60 ++++++++++++++++++++++++-------
>  hw/loongarch/meson.build         |   1 +
>  include/hw/loongarch/loongarch.h |   5 +++
>  pc-bios/loongarch_bios.bin       | Bin 0 -> 4128768 bytes
>  7 files changed, 108 insertions(+), 12 deletions(-)
>  create mode 100644 hw/loongarch/fw_cfg.c
>  create mode 100644 hw/loongarch/fw_cfg.h
>  create mode 100644 pc-bios/loongarch_bios.bin
> 
> diff --git a/hw/loongarch/Kconfig b/hw/loongarch/Kconfig
> index fe100b01eb..b59cd98a7a 100644
> --- a/hw/loongarch/Kconfig
> +++ b/hw/loongarch/Kconfig
> @@ -13,3 +13,7 @@ config LOONGSON_3A5000
>      select LOONGARCH_PCH_MSI
>      select LOONGARCH_EXTIOI
>      select LS7A_RTC
> +    select FW_CFG_LOONGARCH
> +
> +config FW_CFG_LOONGARCH
> +    bool
> diff --git a/hw/loongarch/fw_cfg.c b/hw/loongarch/fw_cfg.c
> new file mode 100644
> index 0000000000..42229c5c91
> --- /dev/null
> +++ b/hw/loongarch/fw_cfg.c
> @@ -0,0 +1,34 @@
> +/*
> + * QEMU fw_cfg helpers (LOONGARCH specific)
> + *
> + * Copyright (C) 2021 Loongson Technology Corporation Limited
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu/osdep.h"
> +#include "hw/loongarch/fw_cfg.h"
> +#include "hw/loongarch/loongarch.h"
> +#include "hw/nvram/fw_cfg.h"
> +#include "sysemu/sysemu.h"
> +
> +static void fw_cfg_boot_set(void *opaque, const char *boot_device,
> +                            Error **errp)
> +{
> +    fw_cfg_modify_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
> +}
> +
> +FWCfgState *loongarch_fw_cfg_init(ram_addr_t ram_size, MachineState *ms)
> +{
> +    FWCfgState *fw_cfg;
> +    int max_cpus = ms->smp.max_cpus;
> +    int smp_cpus = ms->smp.cpus;
> +
> +    fw_cfg = fw_cfg_init_mem_wide(FW_CFG_ADDR, FW_CFG_ADDR + 8, 8, 0, NULL);
> +    fw_cfg_add_i16(fw_cfg, FW_CFG_MAX_CPUS, (uint16_t)max_cpus);
> +    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
> +    fw_cfg_add_i16(fw_cfg, FW_CFG_NB_CPUS, (uint16_t)smp_cpus);
> +
> +    qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
> +    return fw_cfg;
> +}
> diff --git a/hw/loongarch/fw_cfg.h b/hw/loongarch/fw_cfg.h
> new file mode 100644
> index 0000000000..d51dfb241a
> --- /dev/null
> +++ b/hw/loongarch/fw_cfg.h
> @@ -0,0 +1,16 @@
> +/*
> + * QEMU fw_cfg helpers (Loongarch specific)
> + *
> + * Copyright (C) 2021 Loongson Technology Corporation Limited
> + *
> + * SPDX-License-Identifier: MIT
> + */
> +
> +#ifndef HW_LOONGARCH_FW_CFG_H
> +#define HW_LOONGARCH_FW_CFG_H
> +
> +#include "hw/boards.h"
> +#include "hw/nvram/fw_cfg.h"
> +
> +FWCfgState *loongarch_fw_cfg_init(ram_addr_t ram_size, MachineState *ms);
> +#endif
> diff --git a/hw/loongarch/ls3a5000_virt.c b/hw/loongarch/ls3a5000_virt.c
> index 79e6605cd8..e8057f7772 100644
> --- a/hw/loongarch/ls3a5000_virt.c
> +++ b/hw/loongarch/ls3a5000_virt.c
> @@ -14,6 +14,8 @@
>  #include "hw/char/serial.h"
>  #include "sysemu/sysemu.h"
>  #include "sysemu/qtest.h"
> +#include "hw/loader.h"
> +#include "elf.h"
>  #include "hw/irq.h"
>  #include "net/net.h"
>  #include "sysemu/runstate.h"
> @@ -24,6 +26,9 @@
>  #include "hw/intc/loongarch_pch_msi.h"
>  #include "hw/pci-host/ls7a.h"
>  #include "hw/misc/unimp.h"
> +#include "hw/loongarch/fw_cfg.h"
> +
> +#define LOONGSON3_BIOSNAME "loongarch_bios.bin"
>  
>  CPULoongArchState *cpu_states[LOONGARCH_MAX_VCPUS];
>  
> @@ -181,8 +186,9 @@ static void ls3a5000_virt_init(MachineState *machine)
>      const char *cpu_model = machine->cpu_type;
>      LoongArchCPU *cpu;
>      CPULoongArchState *env;
> -    uint64_t lowram_size = 0, highram_size = 0;
> +    uint64_t highram_size = 0;
>      MemoryRegion *lowmem = g_new(MemoryRegion, 1);
> +    MemoryRegion *highmem = g_new(MemoryRegion, 1);
>      char *ramName = NULL;
>      ram_addr_t ram_size = machine->ram_size;
>      MemoryRegion *address_space_mem = get_system_memory();
> @@ -190,6 +196,10 @@ static void ls3a5000_virt_init(MachineState *machine)
>      int i;
>      MemoryRegion *iomem = NULL;
>      PCIBus *pci_bus = NULL;
> +    int bios_size;
> +    char *filename;
> +    MemoryRegion *bios = g_new(MemoryRegion, 1);
> +    ram_addr_t offset = 0;
>  
>      if (!cpu_model) {
>          cpu_model = LOONGARCH_CPU_TYPE_NAME("Loongson-3A5000");
> @@ -227,21 +237,46 @@ static void ls3a5000_virt_init(MachineState *machine)
>          qemu_register_reset(main_cpu_reset, cpu);
>      }
>  
> +    if (ram_size < 1 * GiB) {
> +        error_report("ram_size must be greater than 1G due to the bios 
> memory layout");
> +        exit(1);
> +    }
> +
>      ramName = g_strdup_printf("loongarch.lowram");
> -    lowram_size = MIN(ram_size, 256 * 0x100000);
>      memory_region_init_alias(lowmem, NULL, ramName, machine->ram,
> -                             0, lowram_size);
> -    memory_region_add_subregion(address_space_mem, 0, lowmem);
> -
> -    highram_size = ram_size > lowram_size ? ram_size - 256 * 0x100000 : 0;
> -    if (highram_size > 0) {
> -        MemoryRegion *highmem = g_new(MemoryRegion, 1);
> -        ramName = g_strdup_printf("loongarch.highram");
> -        memory_region_init_alias(highmem, NULL, ramName, machine->ram,
> -                                 lowram_size, highram_size);
> -        memory_region_add_subregion(address_space_mem, 0x90000000, highmem);
> +                             0, 256 * MiB);
> +    memory_region_add_subregion(address_space_mem, offset, lowmem);
> +    offset += 256 * MiB;
> +
> +    highram_size = ram_size - 256 * MiB;
> +    ramName = g_strdup_printf("loongarch.highram");
> +    memory_region_init_alias(highmem, NULL, ramName, machine->ram,
> +                             offset, highram_size);
> +    memory_region_add_subregion(address_space_mem, 0x90000000, highmem);
> +    offset += highram_size;
> +
> +    /* load the BIOS image. */
> +    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS,
> +                              machine->firmware ?: LOONGSON3_BIOSNAME);
> +    if (filename) {
> +        bios_size = load_image_targphys(filename, LA_BIOS_BASE, 
> LA_BIOS_SIZE);
> +        lsms->fw_cfg = loongarch_fw_cfg_init(ram_size, machine);
> +        rom_set_fw(lsms->fw_cfg);
> +        g_free(filename);
> +    } else {
> +        bios_size = -1;
>      }
>  
> +    if ((bios_size < 0 || bios_size > LA_BIOS_SIZE) && !qtest_enabled()) {
> +        error_report("Could not load LOONGARCH bios '%s'", 
> machine->firmware);
> +        exit(1);
> +    }
> +
> +    memory_region_init_ram(bios, NULL, "loongarch.bios",
> +                           LA_BIOS_SIZE, &error_fatal);
> +    memory_region_set_readonly(bios, true);
> +    memory_region_add_subregion(get_system_memory(), LA_BIOS_BASE, bios);
> +
>      /*Add PM mmio memory for reboot and shutdown*/
>      iomem = g_new(MemoryRegion, 1);
>      memory_region_init_io(iomem, NULL, &loongarch_pm_ops, NULL,
> @@ -293,6 +328,7 @@ static void loongarch_class_init(ObjectClass *oc, void 
> *data)
>      mc->default_ram_id = "loongarch.ram";
>      mc->max_cpus = LOONGARCH_MAX_VCPUS;
>      mc->is_default = 1;
> +    mc->default_machine_opts = "firmware=loongarch_bios.bin";
>      mc->default_kernel_irqchip_split = false;
>      mc->block_default_type = IF_VIRTIO;
>      mc->default_boot_order = "c";
> diff --git a/hw/loongarch/meson.build b/hw/loongarch/meson.build
> index 1bd209c9eb..3fabfa72dc 100644
> --- a/hw/loongarch/meson.build
> +++ b/hw/loongarch/meson.build
> @@ -1,5 +1,6 @@
>  loongarch_ss = ss.source_set()
>  loongarch_ss.add(files('loongarch_int.c'))
>  loongarch_ss.add(when: 'CONFIG_LOONGSON_3A5000', if_true: 
> files('ls3a5000_virt.c', 'ipi.c'))
> +loongarch_ss.add(when: 'CONFIG_FW_CFG_LOONGARCH', if_true: files('fw_cfg.c'))
>  
>  hw_arch += {'loongarch': loongarch_ss}
> diff --git a/include/hw/loongarch/loongarch.h 
> b/include/hw/loongarch/loongarch.h
> index 210173471d..1316707f49 100644
> --- a/include/hw/loongarch/loongarch.h
> +++ b/include/hw/loongarch/loongarch.h
> @@ -35,6 +35,10 @@
>  #define CPUNAME_REG             0x1fe00020
>  #define MISC_FUNC_REG           0x1fe00420
>  #define FREQ_REG                0x1fe001d0
> +#define FW_CFG_ADDR             0x1e020000
> +
> +#define LA_BIOS_BASE            0x1c000000
> +#define LA_BIOS_SIZE            (4 * 1024 * 1024)
>  
>  typedef struct LoongarchMachineState {
>      /*< private >*/
> @@ -42,6 +46,7 @@ typedef struct LoongarchMachineState {
>  
>      gipiState   *gipi;
>      qemu_irq    *pch_irq;
> +    FWCfgState  *fw_cfg;
>  } LoongarchMachineState;
>  
>  #define TYPE_LOONGARCH_MACHINE  MACHINE_TYPE_NAME("loongson7a")

> new file mode 100644
> index 
> 0000000000000000000000000000000000000000..ac6a691b00ac4fec9a5f4c32aad3865ac24efbb2
> GIT binary patch
> literal 4128768
> zcmeFaeSB5bmH)qTZUU$YBpL)1^`ZgKNkOsI7FumjAQU@;6`PrcY8-A%fLMccI<`Eh
> z^#F-&r#C#PE#MOuB~;r4@mXsfP6C3Rl7QoPs`iPig0{bg2ggo>59EA5YoFYk+-ssv
> 


snipped a ton of binary

> literal 0
> HcmV?d00001
> 
> -- 
> 2.27.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]