From: Daniel Henrique Barboza <danielhb413@gmail.com>
To: BALATON Zoltan <balaton@eik.bme.hu>,
qemu-devel@nongnu.org, qemu-ppc@nongnu.org
Cc: Nicholas Piggin <npiggin@gmail.com>,
clg@kaod.org, philmd@linaro.org,
Bernhard Beschow <shentey@gmail.com>,
Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>,
Rene Engel <ReneEngel80@emailn.de>,
vr_qemu@t-online.de
Subject: Re: [PATCH v9 2/3] hw/ppc: Add emulation of AmigaOne XE board
Date: Tue, 7 Nov 2023 15:52:31 -0300 [thread overview]
Message-ID: <3d1b7f6a-ddab-4d0e-b15a-07f5f2f2dcef@gmail.com> (raw)
In-Reply-To: <804935e7a5921548d630576159ae2c758fe6e275.1699382232.git.balaton@eik.bme.hu>
On 11/7/23 15:40, BALATON Zoltan wrote:
> The AmigaOne is a rebranded MAI Teron board that uses U-Boot firmware
> with patches to support AmigaOS and is very similar to pegasos2 so can
> be easily emulated sharing most code with pegasos2. The reason to
> emulate it is that AmigaOS comes in different versions for AmigaOne
> and PegasosII which only have drivers for one machine and firmware so
> these only run on the specific machine. Adding this board allows
> another AmigaOS version to be used reusing already existing peagasos2
> emulation. (The AmigaOne was the first of these boards so likely most
> widespread which then inspired Pegasos that was later replaced with
> PegasosII due to problems with Articia S, so these have a lot of
> similarity. Pegasos mainly ran MorphOS while the PegasosII version of
> AmigaOS was added later and therefore less common than the AmigaOne
> version.)
>
> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> Tested-by: Rene Engel <ReneEngel80@emailn.de>
Acked-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This is passing qtest-hmp and it's not adding a new firmware in pc-bios, so
let's go with it.
Thanks,
Daniel
> ---
> v9: Skip error about missing -bios when using qtest
>
> MAINTAINERS | 8 ++
> configs/devices/ppc-softmmu/default.mak | 1 +
> hw/ppc/Kconfig | 7 +
> hw/ppc/amigaone.c | 166 ++++++++++++++++++++++++
> hw/ppc/meson.build | 2 +
> 5 files changed, 184 insertions(+)
> create mode 100644 hw/ppc/amigaone.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index b86ea7f75a..3d0aec7ffa 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1536,6 +1536,14 @@ F: hw/pci-host/mv64361.c
> F: hw/pci-host/mv643xx.h
> F: include/hw/pci-host/mv64361.h
>
> +amigaone
> +M: BALATON Zoltan <balaton@eik.bme.hu>
> +L: qemu-ppc@nongnu.org
> +S: Maintained
> +F: hw/ppc/amigaone.c
> +F: hw/pci-host/articia.c
> +F: include/hw/pci-host/articia.h
> +
> Virtual Open Firmware (VOF)
> M: Alexey Kardashevskiy <aik@ozlabs.ru>
> R: David Gibson <david@gibson.dropbear.id.au>
> diff --git a/configs/devices/ppc-softmmu/default.mak b/configs/devices/ppc-softmmu/default.mak
> index a887f5438b..b85fd2bcd7 100644
> --- a/configs/devices/ppc-softmmu/default.mak
> +++ b/configs/devices/ppc-softmmu/default.mak
> @@ -14,6 +14,7 @@ CONFIG_SAM460EX=y
> CONFIG_MAC_OLDWORLD=y
> CONFIG_MAC_NEWWORLD=y
>
> +CONFIG_AMIGAONE=y
> CONFIG_PEGASOS2=y
>
> # For PReP
> diff --git a/hw/ppc/Kconfig b/hw/ppc/Kconfig
> index 5dfbf47ef5..56f0475a8e 100644
> --- a/hw/ppc/Kconfig
> +++ b/hw/ppc/Kconfig
> @@ -69,6 +69,13 @@ config SAM460EX
> select USB_OHCI
> select FDT_PPC
>
> +config AMIGAONE
> + bool
> + imply ATI_VGA
> + select ARTICIA
> + select VT82C686
> + select SMBUS_EEPROM
> +
> config PEGASOS2
> bool
> imply ATI_VGA
> diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
> new file mode 100644
> index 0000000000..992a55e632
> --- /dev/null
> +++ b/hw/ppc/amigaone.c
> @@ -0,0 +1,166 @@
> +/*
> + * QEMU Eyetech AmigaOne/Mai Logic Teron emulation
> + *
> + * Copyright (c) 2023 BALATON Zoltan
> + *
> + * This work is licensed under the GNU GPL license version 2 or later.
> + *
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu/units.h"
> +#include "qemu/datadir.h"
> +#include "qemu/log.h"
> +#include "qemu/error-report.h"
> +#include "qapi/error.h"
> +#include "hw/ppc/ppc.h"
> +#include "hw/boards.h"
> +#include "hw/loader.h"
> +#include "hw/pci-host/articia.h"
> +#include "hw/isa/vt82c686.h"
> +#include "hw/ide/pci.h"
> +#include "hw/i2c/smbus_eeprom.h"
> +#include "hw/ppc/ppc.h"
> +#include "sysemu/qtest.h"
> +#include "sysemu/reset.h"
> +#include "kvm_ppc.h"
> +
> +#define BUS_FREQ_HZ 100000000
> +
> +/*
> + * Firmware binary available at
> + * https://www.hyperion-entertainment.com/index.php/downloads?view=files&parent=28
> + * then "tail -c 524288 updater.image >u-boot-amigaone.bin"
> + *
> + * BIOS emulator in firmware cannot run QEMU vgabios and hangs on it, use
> + * -device VGA,romfile=VGABIOS-lgpl-latest.bin
> + * from http://www.nongnu.org/vgabios/ instead.
> + */
> +#define PROM_FILENAME "u-boot-amigaone.bin"
> +#define PROM_ADDR 0xfff00000
> +#define PROM_SIZE (512 * KiB)
> +
> +static void amigaone_cpu_reset(void *opaque)
> +{
> + PowerPCCPU *cpu = opaque;
> +
> + cpu_reset(CPU(cpu));
> + cpu_ppc_tb_reset(&cpu->env);
> +}
> +
> +static void fix_spd_data(uint8_t *spd)
> +{
> + uint32_t bank_size = 4 * MiB * spd[31];
> + uint32_t rows = bank_size / spd[13] / spd[17];
> + spd[3] = ctz32(rows) - spd[4];
> +}
> +
> +static void amigaone_init(MachineState *machine)
> +{
> + PowerPCCPU *cpu;
> + CPUPPCState *env;
> + MemoryRegion *rom, *pci_mem, *mr;
> + const char *fwname = machine->firmware ?: PROM_FILENAME;
> + char *filename;
> + ssize_t sz;
> + PCIBus *pci_bus;
> + Object *via;
> + DeviceState *dev;
> + I2CBus *i2c_bus;
> + uint8_t *spd_data;
> + int i;
> +
> + /* init CPU */
> + cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
> + env = &cpu->env;
> + if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) {
> + error_report("Incompatible CPU, only 6xx bus supported");
> + exit(1);
> + }
> + cpu_ppc_tb_init(env, BUS_FREQ_HZ / 4);
> + qemu_register_reset(amigaone_cpu_reset, cpu);
> +
> + /* RAM */
> + if (machine->ram_size > 2 * GiB) {
> + error_report("RAM size more than 2 GiB is not supported");
> + exit(1);
> + }
> + memory_region_add_subregion(get_system_memory(), 0, machine->ram);
> + if (machine->ram_size < 1 * GiB + 32 * KiB) {
> + /* Firmware uses this area for startup */
> + mr = g_new(MemoryRegion, 1);
> + memory_region_init_ram(mr, NULL, "init-cache", 32 * KiB, &error_fatal);
> + memory_region_add_subregion(get_system_memory(), 0x40000000, mr);
> + }
> +
> + /* allocate and load firmware */
> + filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, fwname);
> + if (filename) {
> + rom = g_new(MemoryRegion, 1);
> + memory_region_init_rom(rom, NULL, "rom", PROM_SIZE, &error_fatal);
> + memory_region_add_subregion(get_system_memory(), PROM_ADDR, rom);
> + sz = load_image_targphys(filename, PROM_ADDR, PROM_SIZE);
> + if (sz <= 0 || sz > PROM_SIZE) {
> + error_report("Could not load firmware '%s'", filename);
> + exit(1);
> + }
> + g_free(filename);
> + } else if (!qtest_enabled()) {
> + error_report("Could not find firmware '%s'", fwname);
> + exit(1);
> + }
> +
> + /* Articia S */
> + dev = sysbus_create_simple(TYPE_ARTICIA, 0xfe000000, NULL);
> +
> + i2c_bus = I2C_BUS(qdev_get_child_bus(dev, "smbus"));
> + if (machine->ram_size > 512 * MiB) {
> + spd_data = spd_data_generate(SDR, machine->ram_size / 2);
> + } else {
> + spd_data = spd_data_generate(SDR, machine->ram_size);
> + }
> + fix_spd_data(spd_data);
> + smbus_eeprom_init_one(i2c_bus, 0x51, spd_data);
> + if (machine->ram_size > 512 * MiB) {
> + smbus_eeprom_init_one(i2c_bus, 0x52, spd_data);
> + }
> +
> + pci_mem = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1);
> + mr = g_new(MemoryRegion, 1);
> + memory_region_init_alias(mr, OBJECT(dev), "pci-mem-low", pci_mem,
> + 0, 0x1000000);
> + memory_region_add_subregion(get_system_memory(), 0xfd000000, mr);
> + mr = g_new(MemoryRegion, 1);
> + memory_region_init_alias(mr, OBJECT(dev), "pci-mem-high", pci_mem,
> + 0x80000000, 0x7d000000);
> + memory_region_add_subregion(get_system_memory(), 0x80000000, mr);
> + pci_bus = PCI_BUS(qdev_get_child_bus(dev, "pci.0"));
> +
> + /* VIA VT82c686B South Bridge (multifunction PCI device) */
> + via = OBJECT(pci_create_simple_multifunction(pci_bus, PCI_DEVFN(7, 0),
> + TYPE_VT82C686B_ISA));
> + object_property_add_alias(OBJECT(machine), "rtc-time",
> + object_resolve_path_component(via, "rtc"),
> + "date");
> + qdev_connect_gpio_out(DEVICE(via), 0,
> + qdev_get_gpio_in(DEVICE(cpu), PPC6xx_INPUT_INT));
> + for (i = 0; i < PCI_NUM_PINS; i++) {
> + qdev_connect_gpio_out(dev, i, qdev_get_gpio_in_named(DEVICE(via),
> + "pirq", i));
> + }
> + pci_ide_create_devs(PCI_DEVICE(object_resolve_path_component(via, "ide")));
> + pci_vga_init(pci_bus);
> +}
> +
> +static void amigaone_machine_init(MachineClass *mc)
> +{
> + mc->desc = "Eyetech AmigaOne/Mai Logic Teron";
> + mc->init = amigaone_init;
> + mc->block_default_type = IF_IDE;
> + mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7457_v1.2");
> + mc->default_display = "std";
> + mc->default_ram_id = "ram";
> + mc->default_ram_size = 512 * MiB;
> +}
> +
> +DEFINE_MACHINE("amigaone", amigaone_machine_init)
> diff --git a/hw/ppc/meson.build b/hw/ppc/meson.build
> index 7c2c52434a..7338f9432a 100644
> --- a/hw/ppc/meson.build
> +++ b/hw/ppc/meson.build
> @@ -81,6 +81,8 @@ ppc_ss.add(when: 'CONFIG_E500', if_true: files(
> ))
> # PowerPC 440 Xilinx ML507 reference board.
> ppc_ss.add(when: 'CONFIG_VIRTEX', if_true: files('virtex_ml507.c'))
> +# AmigaOne
> +ppc_ss.add(when: 'CONFIG_AMIGAONE', if_true: files('amigaone.c'))
> # Pegasos2
> ppc_ss.add(when: 'CONFIG_PEGASOS2', if_true: files('pegasos2.c'))
>
next prev parent reply other threads:[~2023-11-07 18:53 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-27 11:54 [PATCH v7 0/3] Add emulation of AmigaOne XE board BALATON Zoltan
2023-10-27 11:54 ` [PATCH v7 1/3] hw/pci-host: Add emulation of Mai Logic Articia S BALATON Zoltan
2023-11-07 18:53 ` Daniel Henrique Barboza
2023-10-27 11:54 ` [PATCH v7 2/3] hw/ppc: Add emulation of AmigaOne XE board BALATON Zoltan
2023-11-07 18:21 ` [PATCH v8 " BALATON Zoltan
2023-11-07 18:25 ` Peter Maydell
2023-11-07 18:28 ` BALATON Zoltan
2023-11-07 18:40 ` [PATCH v9 " BALATON Zoltan
2023-11-07 18:52 ` Daniel Henrique Barboza [this message]
2023-10-27 11:54 ` [PATCH v7 3/3] tests/avocado: Add test for amigaone board BALATON Zoltan
2023-11-07 18:53 ` Daniel Henrique Barboza
2023-10-28 14:52 ` [PATCH v7 0/3] Add emulation of AmigaOne XE board Bernhard Beschow
2023-10-28 18:20 ` BALATON Zoltan
2023-11-06 10:30 ` BALATON Zoltan
2023-11-07 8:50 ` BALATON Zoltan
2023-11-07 14:42 ` BALATON Zoltan
2023-11-07 16:20 ` Daniel Henrique Barboza
2023-11-07 16:41 ` BALATON Zoltan
2023-11-07 17:20 ` Daniel Henrique Barboza
2023-11-07 17:33 ` BALATON Zoltan
2023-11-07 17:42 ` Daniel Henrique Barboza
2023-11-07 17:49 ` BALATON Zoltan
2023-11-07 18:03 ` BALATON Zoltan
2023-11-07 18:14 ` Peter Maydell
2023-11-07 18:18 ` BALATON Zoltan
2023-11-07 18:21 ` Peter Maydell
2023-11-07 18:25 ` BALATON Zoltan
2023-11-07 18:41 ` BALATON Zoltan
2023-11-07 17:44 ` BALATON Zoltan
2023-11-07 18:53 ` Daniel Henrique Barboza
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=3d1b7f6a-ddab-4d0e-b15a-07f5f2f2dcef@gmail.com \
--to=danielhb413@gmail.com \
--cc=ReneEngel80@emailn.de \
--cc=balaton@eik.bme.hu \
--cc=clg@kaod.org \
--cc=mark.cave-ayland@ilande.co.uk \
--cc=npiggin@gmail.com \
--cc=philmd@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=shentey@gmail.com \
--cc=vr_qemu@t-online.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).