diff mbox series

[v10,7/7] hw/ppc: Add emulation of Genesi/bPlan Pegasos II

Message ID b1639705f196d229647a8fc36e5d1a92f6c58b76.1615943871.git.balaton@eik.bme.hu
State New
Headers show
Series Pegasos2 emulation | expand

Commit Message

BALATON Zoltan March 17, 2021, 1:17 a.m. UTC
Add new machine called pegasos2 emulating the Genesi/bPlan Pegasos II,
a PowerPC board based on the Marvell MV64361 system controller and the
VIA VT8231 integrated south bridge/superio chips. It can run Linux,
AmigaOS and a wide range of MorphOS versions. Currently a firmware ROM
image is needed to boot and only MorphOS has a video driver to produce
graphics output. Linux could work too but distros that supported this
machine don't include usual video drivers so those only run with
serial console for now.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 MAINTAINERS                             |  10 ++
 default-configs/devices/ppc-softmmu.mak |   2 +
 hw/ppc/Kconfig                          |   9 ++
 hw/ppc/meson.build                      |   2 +
 hw/ppc/pegasos2.c                       | 144 ++++++++++++++++++++++++
 5 files changed, 167 insertions(+)
 create mode 100644 hw/ppc/pegasos2.c

Comments

David Gibson March 23, 2021, 12:55 a.m. UTC | #1
On Wed, Mar 17, 2021 at 02:17:51AM +0100, BALATON Zoltan wrote:
> Add new machine called pegasos2 emulating the Genesi/bPlan Pegasos II,
> a PowerPC board based on the Marvell MV64361 system controller and the
> VIA VT8231 integrated south bridge/superio chips. It can run Linux,
> AmigaOS and a wide range of MorphOS versions. Currently a firmware ROM
> image is needed to boot and only MorphOS has a video driver to produce
> graphics output. Linux could work too but distros that supported this
> machine don't include usual video drivers so those only run with
> serial console for now.
> 
> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  MAINTAINERS                             |  10 ++
>  default-configs/devices/ppc-softmmu.mak |   2 +
>  hw/ppc/Kconfig                          |   9 ++
>  hw/ppc/meson.build                      |   2 +
>  hw/ppc/pegasos2.c                       | 144 ++++++++++++++++++++++++
>  5 files changed, 167 insertions(+)
>  create mode 100644 hw/ppc/pegasos2.c
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index b6ab3d25a7..1c3c55ef09 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1353,6 +1353,16 @@ F: pc-bios/canyonlands.dt[sb]
>  F: pc-bios/u-boot-sam460ex-20100605.bin
>  F: roms/u-boot-sam460ex
>  
> +pegasos2
> +M: BALATON Zoltan <balaton@eik.bme.hu>
> +R: David Gibson <david@gibson.dropbear.id.au>
> +L: qemu-ppc@nongnu.org
> +S: Maintained
> +F: hw/ppc/pegasos2.c
> +F: hw/pci-host/mv64361.c
> +F: hw/pci-host/mv643xx.h
> +F: include/hw/pci-host/mv64361.h

Oh, sorry about the comment in the previous patch.

>  RISC-V Machines
>  ---------------
>  OpenTitan
> diff --git a/default-configs/devices/ppc-softmmu.mak b/default-configs/devices/ppc-softmmu.mak
> index 61b78b844d..4535993d8d 100644
> --- a/default-configs/devices/ppc-softmmu.mak
> +++ b/default-configs/devices/ppc-softmmu.mak
> @@ -14,5 +14,7 @@ CONFIG_SAM460EX=y
>  CONFIG_MAC_OLDWORLD=y
>  CONFIG_MAC_NEWWORLD=y
>  
> +CONFIG_PEGASOS2=y

I don't think we can have this default to enabled while it requires a
non-free ROM to start.

>  # For PReP
>  CONFIG_PREP=y
> diff --git a/hw/ppc/Kconfig b/hw/ppc/Kconfig
> index d11dc30509..e51e0e5e5a 100644
> --- a/hw/ppc/Kconfig
> +++ b/hw/ppc/Kconfig
> @@ -68,6 +68,15 @@ config SAM460EX
>      select USB_OHCI
>      select FDT_PPC
>  
> +config PEGASOS2
> +    bool
> +    select MV64361
> +    select VT82C686
> +    select IDE_VIA
> +    select SMBUS_EEPROM
> +# This should come with VT82C686
> +    select ACPI_X86
> +
>  config PREP
>      bool
>      imply PCI_DEVICES
> diff --git a/hw/ppc/meson.build b/hw/ppc/meson.build
> index 218631c883..86d6f379d1 100644
> --- a/hw/ppc/meson.build
> +++ b/hw/ppc/meson.build
> @@ -78,5 +78,7 @@ 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'))
> +# Pegasos2
> +ppc_ss.add(when: 'CONFIG_PEGASOS2', if_true: files('pegasos2.c'))
>  
>  hw_arch += {'ppc': ppc_ss}
> diff --git a/hw/ppc/pegasos2.c b/hw/ppc/pegasos2.c
> new file mode 100644
> index 0000000000..0bfd0928aa
> --- /dev/null
> +++ b/hw/ppc/pegasos2.c
> @@ -0,0 +1,144 @@
> +/*
> + * QEMU PowerPC CHRP (Genesi/bPlan Pegasos II) hardware System Emulator
> + *
> + * Copyright (c) 2018-2020 BALATON Zoltan
> + *
> + * This work is licensed under the GNU GPL license version 2 or later.
> + *
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qemu-common.h"
> +#include "qemu/units.h"
> +#include "qapi/error.h"
> +#include "hw/hw.h"
> +#include "hw/ppc/ppc.h"
> +#include "hw/sysbus.h"
> +#include "hw/pci/pci_host.h"
> +#include "hw/irq.h"
> +#include "hw/pci-host/mv64361.h"
> +#include "hw/isa/vt82c686.h"
> +#include "hw/ide/pci.h"
> +#include "hw/i2c/smbus_eeprom.h"
> +#include "hw/qdev-properties.h"
> +#include "sysemu/reset.h"
> +#include "hw/boards.h"
> +#include "hw/loader.h"
> +#include "hw/fw-path-provider.h"
> +#include "elf.h"
> +#include "qemu/log.h"
> +#include "qemu/error-report.h"
> +#include "sysemu/kvm.h"
> +#include "kvm_ppc.h"
> +#include "exec/address-spaces.h"
> +#include "trace.h"
> +#include "qemu/datadir.h"
> +#include "sysemu/device_tree.h"
> +
> +#define PROM_FILENAME "pegasos2.rom"
> +#define PROM_ADDR     0xfff00000
> +#define PROM_SIZE     0x80000
> +
> +#define BUS_FREQ_HZ 133333333
> +
> +static void pegasos2_cpu_reset(void *opaque)
> +{
> +    PowerPCCPU *cpu = opaque;
> +
> +    cpu_reset(CPU(cpu));
> +    cpu->env.spr[SPR_HID1] = 7ULL << 28;
> +}
> +
> +static void pegasos2_init(MachineState *machine)
> +{
> +    PowerPCCPU *cpu = NULL;
> +    MemoryRegion *rom = g_new(MemoryRegion, 1);
> +    DeviceState *mv;
> +    PCIBus *pci_bus;
> +    PCIDevice *dev;
> +    I2CBus *i2c_bus;
> +    const char *fwname = machine->firmware ?: PROM_FILENAME;
> +    char *filename;
> +    int sz;
> +    uint8_t *spd_data;
> +
> +    /* init CPU */
> +    cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
> +    if (PPC_INPUT(&cpu->env) != PPC_FLAGS_INPUT_6xx) {
> +        error_report("Incompatible CPU, only 6xx bus supported");
> +        exit(1);
> +    }
> +
> +    /* Set time-base frequency */
> +    cpu_ppc_tb_init(&cpu->env, BUS_FREQ_HZ / 4);
> +    qemu_register_reset(pegasos2_cpu_reset, cpu);
> +
> +    /* RAM */
> +    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
> +
> +    /* allocate and load firmware */
> +    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, fwname);
> +    if (!filename) {
> +        error_report("Could not find firmware '%s'", fwname);
> +        exit(1);
> +    }
> +    memory_region_init_rom(rom, NULL, "pegasos2.rom", PROM_SIZE, &error_fatal);
> +    memory_region_add_subregion(get_system_memory(), PROM_ADDR, rom);
> +    sz = load_elf(filename, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
> +                  PPC_ELF_MACHINE, 0, 0);
> +    if (sz <= 0) {
> +        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);
> +
> +    /* Marvell Discovery II system controller */
> +    mv = DEVICE(sysbus_create_simple(TYPE_MV64361, -1,
> +                        ((qemu_irq *)cpu->env.irq_inputs)[PPC6xx_INPUT_INT]));
> +    pci_bus = mv64361_get_pci_bus(mv, 1);
> +
> +    /* VIA VT8231 South Bridge (multifunction PCI device) */
> +    /* VT8231 function 0: PCI-to-ISA Bridge */
> +    dev = pci_create_simple_multifunction(pci_bus, PCI_DEVFN(12, 0), true,
> +                                          TYPE_VT8231_ISA);
> +    qdev_connect_gpio_out(DEVICE(dev), 0,
> +                          qdev_get_gpio_in_named(mv, "gpp", 31));
> +
> +    /* VT8231 function 1: IDE Controller */
> +    dev = pci_create_simple(pci_bus, PCI_DEVFN(12, 1), "via-ide");
> +    pci_ide_create_devs(dev);
> +
> +    /* VT8231 function 2-3: USB Ports */
> +    pci_create_simple(pci_bus, PCI_DEVFN(12, 2), "vt82c686b-usb-uhci");
> +    pci_create_simple(pci_bus, PCI_DEVFN(12, 3), "vt82c686b-usb-uhci");
> +
> +    /* VT8231 function 4: Power Management Controller */
> +    dev = pci_create_simple(pci_bus, PCI_DEVFN(12, 4), TYPE_VT8231_PM);
> +    i2c_bus = I2C_BUS(qdev_get_child_bus(DEVICE(dev), "i2c"));
> +    spd_data = spd_data_generate(DDR, machine->ram_size);
> +    smbus_eeprom_init_one(i2c_bus, 0x57, spd_data);
> +
> +    /* VT8231 function 5-6: AC97 Audio & Modem */
> +    pci_create_simple(pci_bus, PCI_DEVFN(12, 5), TYPE_VIA_AC97);
> +    pci_create_simple(pci_bus, PCI_DEVFN(12, 6), TYPE_VIA_MC97);
> +
> +    /* other PC hardware */
> +    pci_vga_init(pci_bus);
> +}
> +
> +static void pegasos2_machine(MachineClass *mc)
> +{
> +    mc->desc = "Genesi/bPlan Pegasos II";
> +    mc->init = pegasos2_init;
> +    mc->block_default_type = IF_IDE;
> +    mc->default_boot_order = "cd";
> +    mc->default_display = "std";
> +    mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7400_v2.9");
> +    mc->default_ram_id = "pegasos2.ram";
> +    mc->default_ram_size = 512 * MiB;
> +}
> +
> +DEFINE_MACHINE("pegasos2", pegasos2_machine)
BALATON Zoltan March 23, 2021, 1:01 p.m. UTC | #2
On Tue, 23 Mar 2021, David Gibson wrote:
> On Wed, Mar 17, 2021 at 02:17:51AM +0100, BALATON Zoltan wrote:
>> Add new machine called pegasos2 emulating the Genesi/bPlan Pegasos II,
>> a PowerPC board based on the Marvell MV64361 system controller and the
>> VIA VT8231 integrated south bridge/superio chips. It can run Linux,
>> AmigaOS and a wide range of MorphOS versions. Currently a firmware ROM
>> image is needed to boot and only MorphOS has a video driver to produce
>> graphics output. Linux could work too but distros that supported this
>> machine don't include usual video drivers so those only run with
>> serial console for now.
>>
>> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
>> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>>  MAINTAINERS                             |  10 ++
>>  default-configs/devices/ppc-softmmu.mak |   2 +
>>  hw/ppc/Kconfig                          |   9 ++
>>  hw/ppc/meson.build                      |   2 +
>>  hw/ppc/pegasos2.c                       | 144 ++++++++++++++++++++++++
>>  5 files changed, 167 insertions(+)
>>  create mode 100644 hw/ppc/pegasos2.c
>>
>> diff --git a/MAINTAINERS b/MAINTAINERS
>> index b6ab3d25a7..1c3c55ef09 100644
>> --- a/MAINTAINERS
>> +++ b/MAINTAINERS
>> @@ -1353,6 +1353,16 @@ F: pc-bios/canyonlands.dt[sb]
>>  F: pc-bios/u-boot-sam460ex-20100605.bin
>>  F: roms/u-boot-sam460ex
>>
>> +pegasos2
>> +M: BALATON Zoltan <balaton@eik.bme.hu>
>> +R: David Gibson <david@gibson.dropbear.id.au>
>> +L: qemu-ppc@nongnu.org
>> +S: Maintained
>> +F: hw/ppc/pegasos2.c
>> +F: hw/pci-host/mv64361.c
>> +F: hw/pci-host/mv643xx.h
>> +F: include/hw/pci-host/mv64361.h
>
> Oh, sorry about the comment in the previous patch.
>
>>  RISC-V Machines
>>  ---------------
>>  OpenTitan
>> diff --git a/default-configs/devices/ppc-softmmu.mak b/default-configs/devices/ppc-softmmu.mak
>> index 61b78b844d..4535993d8d 100644
>> --- a/default-configs/devices/ppc-softmmu.mak
>> +++ b/default-configs/devices/ppc-softmmu.mak
>> @@ -14,5 +14,7 @@ CONFIG_SAM460EX=y
>>  CONFIG_MAC_OLDWORLD=y
>>  CONFIG_MAC_NEWWORLD=y
>>
>> +CONFIG_PEGASOS2=y
>
> I don't think we can have this default to enabled while it requires a
> non-free ROM to start.

Not having it enabled though does not help those who might want to use it 
as they are not people who can compile their own QEMU but rely on binaries 
so adding it without also enabling it is like it wasn't there at all in 
practice. I can attempt to make some guests boot without a ROM but since 
guests expect an OpenFirmware client interface, I'll need something to 
provide that. I'm waiting for VOF to be merged for this.

Regards,
BALATON Zoltan
David Gibson March 24, 2021, 1:45 a.m. UTC | #3
On Tue, Mar 23, 2021 at 02:01:27PM +0100, BALATON Zoltan wrote:
> On Tue, 23 Mar 2021, David Gibson wrote:
> > On Wed, Mar 17, 2021 at 02:17:51AM +0100, BALATON Zoltan wrote:
> > > Add new machine called pegasos2 emulating the Genesi/bPlan Pegasos II,
> > > a PowerPC board based on the Marvell MV64361 system controller and the
> > > VIA VT8231 integrated south bridge/superio chips. It can run Linux,
> > > AmigaOS and a wide range of MorphOS versions. Currently a firmware ROM
> > > image is needed to boot and only MorphOS has a video driver to produce
> > > graphics output. Linux could work too but distros that supported this
> > > machine don't include usual video drivers so those only run with
> > > serial console for now.
> > > 
> > > Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> > > Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> > > ---
> > >  MAINTAINERS                             |  10 ++
> > >  default-configs/devices/ppc-softmmu.mak |   2 +
> > >  hw/ppc/Kconfig                          |   9 ++
> > >  hw/ppc/meson.build                      |   2 +
> > >  hw/ppc/pegasos2.c                       | 144 ++++++++++++++++++++++++
> > >  5 files changed, 167 insertions(+)
> > >  create mode 100644 hw/ppc/pegasos2.c
> > > 
> > > diff --git a/MAINTAINERS b/MAINTAINERS
> > > index b6ab3d25a7..1c3c55ef09 100644
> > > --- a/MAINTAINERS
> > > +++ b/MAINTAINERS
> > > @@ -1353,6 +1353,16 @@ F: pc-bios/canyonlands.dt[sb]
> > >  F: pc-bios/u-boot-sam460ex-20100605.bin
> > >  F: roms/u-boot-sam460ex
> > > 
> > > +pegasos2
> > > +M: BALATON Zoltan <balaton@eik.bme.hu>
> > > +R: David Gibson <david@gibson.dropbear.id.au>
> > > +L: qemu-ppc@nongnu.org
> > > +S: Maintained
> > > +F: hw/ppc/pegasos2.c
> > > +F: hw/pci-host/mv64361.c
> > > +F: hw/pci-host/mv643xx.h
> > > +F: include/hw/pci-host/mv64361.h
> > 
> > Oh, sorry about the comment in the previous patch.
> > 
> > >  RISC-V Machines
> > >  ---------------
> > >  OpenTitan
> > > diff --git a/default-configs/devices/ppc-softmmu.mak b/default-configs/devices/ppc-softmmu.mak
> > > index 61b78b844d..4535993d8d 100644
> > > --- a/default-configs/devices/ppc-softmmu.mak
> > > +++ b/default-configs/devices/ppc-softmmu.mak
> > > @@ -14,5 +14,7 @@ CONFIG_SAM460EX=y
> > >  CONFIG_MAC_OLDWORLD=y
> > >  CONFIG_MAC_NEWWORLD=y
> > > 
> > > +CONFIG_PEGASOS2=y
> > 
> > I don't think we can have this default to enabled while it requires a
> > non-free ROM to start.
> 
> Not having it enabled though does not help those who might want to use it as
> they are not people who can compile their own QEMU but rely on binaries so
> adding it without also enabling it is like it wasn't there at all in
> practice.

Not convinced, sorry.  If it's not usable out of the box, having to
build from source is kind of expected.  Or you could convince someone
(or do it yourself) to provide prebuild binaries for this purpose that
have the right things enabled.

> I can attempt to make some guests boot without a ROM but since
> guests expect an OpenFirmware client interface, I'll need something to
> provide that. I'm waiting for VOF to be merged for this.
> 
> Regards,
> BALATON Zoltan
BALATON Zoltan March 24, 2021, 11:21 a.m. UTC | #4
On Wed, 24 Mar 2021, David Gibson wrote:
> On Tue, Mar 23, 2021 at 02:01:27PM +0100, BALATON Zoltan wrote:
>> On Tue, 23 Mar 2021, David Gibson wrote:
>>> On Wed, Mar 17, 2021 at 02:17:51AM +0100, BALATON Zoltan wrote:
>>>> Add new machine called pegasos2 emulating the Genesi/bPlan Pegasos II,
>>>> a PowerPC board based on the Marvell MV64361 system controller and the
>>>> VIA VT8231 integrated south bridge/superio chips. It can run Linux,
>>>> AmigaOS and a wide range of MorphOS versions. Currently a firmware ROM
>>>> image is needed to boot and only MorphOS has a video driver to produce
>>>> graphics output. Linux could work too but distros that supported this
>>>> machine don't include usual video drivers so those only run with
>>>> serial console for now.
>>>>
>>>> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
>>>> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>>>> ---
>>>>  MAINTAINERS                             |  10 ++
>>>>  default-configs/devices/ppc-softmmu.mak |   2 +
>>>>  hw/ppc/Kconfig                          |   9 ++
>>>>  hw/ppc/meson.build                      |   2 +
>>>>  hw/ppc/pegasos2.c                       | 144 ++++++++++++++++++++++++
>>>>  5 files changed, 167 insertions(+)
>>>>  create mode 100644 hw/ppc/pegasos2.c
>>>>
>>>> diff --git a/MAINTAINERS b/MAINTAINERS
>>>> index b6ab3d25a7..1c3c55ef09 100644
>>>> --- a/MAINTAINERS
>>>> +++ b/MAINTAINERS
>>>> @@ -1353,6 +1353,16 @@ F: pc-bios/canyonlands.dt[sb]
>>>>  F: pc-bios/u-boot-sam460ex-20100605.bin
>>>>  F: roms/u-boot-sam460ex
>>>>
>>>> +pegasos2
>>>> +M: BALATON Zoltan <balaton@eik.bme.hu>
>>>> +R: David Gibson <david@gibson.dropbear.id.au>
>>>> +L: qemu-ppc@nongnu.org
>>>> +S: Maintained
>>>> +F: hw/ppc/pegasos2.c
>>>> +F: hw/pci-host/mv64361.c
>>>> +F: hw/pci-host/mv643xx.h
>>>> +F: include/hw/pci-host/mv64361.h
>>>
>>> Oh, sorry about the comment in the previous patch.
>>>
>>>>  RISC-V Machines
>>>>  ---------------
>>>>  OpenTitan
>>>> diff --git a/default-configs/devices/ppc-softmmu.mak b/default-configs/devices/ppc-softmmu.mak
>>>> index 61b78b844d..4535993d8d 100644
>>>> --- a/default-configs/devices/ppc-softmmu.mak
>>>> +++ b/default-configs/devices/ppc-softmmu.mak
>>>> @@ -14,5 +14,7 @@ CONFIG_SAM460EX=y
>>>>  CONFIG_MAC_OLDWORLD=y
>>>>  CONFIG_MAC_NEWWORLD=y
>>>>
>>>> +CONFIG_PEGASOS2=y
>>>
>>> I don't think we can have this default to enabled while it requires a
>>> non-free ROM to start.
>>
>> Not having it enabled though does not help those who might want to use it as
>> they are not people who can compile their own QEMU but rely on binaries so
>> adding it without also enabling it is like it wasn't there at all in
>> practice.
>
> Not convinced, sorry.  If it's not usable out of the box, having to
> build from source is kind of expected.  Or you could convince someone

I accept your point however there's a difference of only needing a ROM 
image to be able to use it from your distro's binary and having to rebuild 
it from source. So to me needing a ROM does not make it expected having to 
rebuild it. Needing to configure it some way would make that expected.

> (or do it yourself) to provide prebuild binaries for this purpose that
> have the right things enabled.

There are people who provide binaries with patches for such purposes but 
that limits the availability of it compared to having it in all distro 
binaries without further effort. As I said I also plan to solve this 
eventually but I'd probably need VOF for that. Will that be merged at 
last? Other alternatives would be modifying SLOF, OpenBIOS or OpenFirmware 
or rewrite SmartFirmware to free it from its non-distributable parts but I 
think VOF would be a simpler way also avoiding adding another full OF 
implementation to QEMU that already has more than there should be.

Regards,
BALATON Zoltan

>> I can attempt to make some guests boot without a ROM but since
>> guests expect an OpenFirmware client interface, I'll need something to
>> provide that. I'm waiting for VOF to be merged for this.
>>
>> Regards,
>> BALATON Zoltan
>
>
>
David Gibson March 25, 2021, 2 a.m. UTC | #5
On Wed, Mar 24, 2021 at 12:21:02PM +0100, BALATON Zoltan wrote:
> On Wed, 24 Mar 2021, David Gibson wrote:
> > On Tue, Mar 23, 2021 at 02:01:27PM +0100, BALATON Zoltan wrote:
> > > On Tue, 23 Mar 2021, David Gibson wrote:
> > > > On Wed, Mar 17, 2021 at 02:17:51AM +0100, BALATON Zoltan wrote:
> > > > > Add new machine called pegasos2 emulating the Genesi/bPlan Pegasos II,
> > > > > a PowerPC board based on the Marvell MV64361 system controller and the
> > > > > VIA VT8231 integrated south bridge/superio chips. It can run Linux,
> > > > > AmigaOS and a wide range of MorphOS versions. Currently a firmware ROM
> > > > > image is needed to boot and only MorphOS has a video driver to produce
> > > > > graphics output. Linux could work too but distros that supported this
> > > > > machine don't include usual video drivers so those only run with
> > > > > serial console for now.
> > > > > 
> > > > > Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> > > > > Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> > > > > ---
> > > > >  MAINTAINERS                             |  10 ++
> > > > >  default-configs/devices/ppc-softmmu.mak |   2 +
> > > > >  hw/ppc/Kconfig                          |   9 ++
> > > > >  hw/ppc/meson.build                      |   2 +
> > > > >  hw/ppc/pegasos2.c                       | 144 ++++++++++++++++++++++++
> > > > >  5 files changed, 167 insertions(+)
> > > > >  create mode 100644 hw/ppc/pegasos2.c
> > > > > 
> > > > > diff --git a/MAINTAINERS b/MAINTAINERS
> > > > > index b6ab3d25a7..1c3c55ef09 100644
> > > > > --- a/MAINTAINERS
> > > > > +++ b/MAINTAINERS
> > > > > @@ -1353,6 +1353,16 @@ F: pc-bios/canyonlands.dt[sb]
> > > > >  F: pc-bios/u-boot-sam460ex-20100605.bin
> > > > >  F: roms/u-boot-sam460ex
> > > > > 
> > > > > +pegasos2
> > > > > +M: BALATON Zoltan <balaton@eik.bme.hu>
> > > > > +R: David Gibson <david@gibson.dropbear.id.au>
> > > > > +L: qemu-ppc@nongnu.org
> > > > > +S: Maintained
> > > > > +F: hw/ppc/pegasos2.c
> > > > > +F: hw/pci-host/mv64361.c
> > > > > +F: hw/pci-host/mv643xx.h
> > > > > +F: include/hw/pci-host/mv64361.h
> > > > 
> > > > Oh, sorry about the comment in the previous patch.
> > > > 
> > > > >  RISC-V Machines
> > > > >  ---------------
> > > > >  OpenTitan
> > > > > diff --git a/default-configs/devices/ppc-softmmu.mak b/default-configs/devices/ppc-softmmu.mak
> > > > > index 61b78b844d..4535993d8d 100644
> > > > > --- a/default-configs/devices/ppc-softmmu.mak
> > > > > +++ b/default-configs/devices/ppc-softmmu.mak
> > > > > @@ -14,5 +14,7 @@ CONFIG_SAM460EX=y
> > > > >  CONFIG_MAC_OLDWORLD=y
> > > > >  CONFIG_MAC_NEWWORLD=y
> > > > > 
> > > > > +CONFIG_PEGASOS2=y
> > > > 
> > > > I don't think we can have this default to enabled while it requires a
> > > > non-free ROM to start.
> > > 
> > > Not having it enabled though does not help those who might want to use it as
> > > they are not people who can compile their own QEMU but rely on binaries so
> > > adding it without also enabling it is like it wasn't there at all in
> > > practice.
> > 
> > Not convinced, sorry.  If it's not usable out of the box, having to
> > build from source is kind of expected.  Or you could convince someone
> 
> I accept your point however there's a difference of only needing a ROM image
> to be able to use it from your distro's binary and having to rebuild it from
> source. So to me needing a ROM does not make it expected having to rebuild
> it. Needing to configure it some way would make that expected.

Well, you could always lobby the distro to include it.  Honestly I
think the distros would probably choose not to include something for
such a niche case, even if it was enabled by default upstream.   At
least.. if they were paying attention, which they're likely not.  But
sneaking something in via a side route is not something I'm going to
encourage.

> > (or do it yourself) to provide prebuild binaries for this purpose that
> > have the right things enabled.
> 
> There are people who provide binaries with patches for such purposes but
> that limits the availability of it compared to having it in all distro
> binaries without further effort. As I said I also plan to solve this
> eventually but I'd probably need VOF for that. Will that be merged at last?

I hope so, yes.  I've finally had some time to review recent rounds.
It'll be 6.1 material as well, obviously.  Note that there are some
issues you'll have to sort out to use this for Pegasos which doesn't
have an actual hypervisor mode.

> Other alternatives would be modifying SLOF, OpenBIOS or OpenFirmware or
> rewrite SmartFirmware to free it from its non-distributable parts but I
> think VOF would be a simpler way also avoiding adding another full OF
> implementation to QEMU that already has more than there should be.
> 
> Regards,
> BALATON Zoltan
> 
> > > I can attempt to make some guests boot without a ROM but since
> > > guests expect an OpenFirmware client interface, I'll need something to
> > > provide that. I'm waiting for VOF to be merged for this.
> > > 
> > > Regards,
> > > BALATON Zoltan
> > 
> > 
> >
diff mbox series

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index b6ab3d25a7..1c3c55ef09 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1353,6 +1353,16 @@  F: pc-bios/canyonlands.dt[sb]
 F: pc-bios/u-boot-sam460ex-20100605.bin
 F: roms/u-boot-sam460ex
 
+pegasos2
+M: BALATON Zoltan <balaton@eik.bme.hu>
+R: David Gibson <david@gibson.dropbear.id.au>
+L: qemu-ppc@nongnu.org
+S: Maintained
+F: hw/ppc/pegasos2.c
+F: hw/pci-host/mv64361.c
+F: hw/pci-host/mv643xx.h
+F: include/hw/pci-host/mv64361.h
+
 RISC-V Machines
 ---------------
 OpenTitan
diff --git a/default-configs/devices/ppc-softmmu.mak b/default-configs/devices/ppc-softmmu.mak
index 61b78b844d..4535993d8d 100644
--- a/default-configs/devices/ppc-softmmu.mak
+++ b/default-configs/devices/ppc-softmmu.mak
@@ -14,5 +14,7 @@  CONFIG_SAM460EX=y
 CONFIG_MAC_OLDWORLD=y
 CONFIG_MAC_NEWWORLD=y
 
+CONFIG_PEGASOS2=y
+
 # For PReP
 CONFIG_PREP=y
diff --git a/hw/ppc/Kconfig b/hw/ppc/Kconfig
index d11dc30509..e51e0e5e5a 100644
--- a/hw/ppc/Kconfig
+++ b/hw/ppc/Kconfig
@@ -68,6 +68,15 @@  config SAM460EX
     select USB_OHCI
     select FDT_PPC
 
+config PEGASOS2
+    bool
+    select MV64361
+    select VT82C686
+    select IDE_VIA
+    select SMBUS_EEPROM
+# This should come with VT82C686
+    select ACPI_X86
+
 config PREP
     bool
     imply PCI_DEVICES
diff --git a/hw/ppc/meson.build b/hw/ppc/meson.build
index 218631c883..86d6f379d1 100644
--- a/hw/ppc/meson.build
+++ b/hw/ppc/meson.build
@@ -78,5 +78,7 @@  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'))
+# Pegasos2
+ppc_ss.add(when: 'CONFIG_PEGASOS2', if_true: files('pegasos2.c'))
 
 hw_arch += {'ppc': ppc_ss}
diff --git a/hw/ppc/pegasos2.c b/hw/ppc/pegasos2.c
new file mode 100644
index 0000000000..0bfd0928aa
--- /dev/null
+++ b/hw/ppc/pegasos2.c
@@ -0,0 +1,144 @@ 
+/*
+ * QEMU PowerPC CHRP (Genesi/bPlan Pegasos II) hardware System Emulator
+ *
+ * Copyright (c) 2018-2020 BALATON Zoltan
+ *
+ * This work is licensed under the GNU GPL license version 2 or later.
+ *
+ */
+
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "qemu/units.h"
+#include "qapi/error.h"
+#include "hw/hw.h"
+#include "hw/ppc/ppc.h"
+#include "hw/sysbus.h"
+#include "hw/pci/pci_host.h"
+#include "hw/irq.h"
+#include "hw/pci-host/mv64361.h"
+#include "hw/isa/vt82c686.h"
+#include "hw/ide/pci.h"
+#include "hw/i2c/smbus_eeprom.h"
+#include "hw/qdev-properties.h"
+#include "sysemu/reset.h"
+#include "hw/boards.h"
+#include "hw/loader.h"
+#include "hw/fw-path-provider.h"
+#include "elf.h"
+#include "qemu/log.h"
+#include "qemu/error-report.h"
+#include "sysemu/kvm.h"
+#include "kvm_ppc.h"
+#include "exec/address-spaces.h"
+#include "trace.h"
+#include "qemu/datadir.h"
+#include "sysemu/device_tree.h"
+
+#define PROM_FILENAME "pegasos2.rom"
+#define PROM_ADDR     0xfff00000
+#define PROM_SIZE     0x80000
+
+#define BUS_FREQ_HZ 133333333
+
+static void pegasos2_cpu_reset(void *opaque)
+{
+    PowerPCCPU *cpu = opaque;
+
+    cpu_reset(CPU(cpu));
+    cpu->env.spr[SPR_HID1] = 7ULL << 28;
+}
+
+static void pegasos2_init(MachineState *machine)
+{
+    PowerPCCPU *cpu = NULL;
+    MemoryRegion *rom = g_new(MemoryRegion, 1);
+    DeviceState *mv;
+    PCIBus *pci_bus;
+    PCIDevice *dev;
+    I2CBus *i2c_bus;
+    const char *fwname = machine->firmware ?: PROM_FILENAME;
+    char *filename;
+    int sz;
+    uint8_t *spd_data;
+
+    /* init CPU */
+    cpu = POWERPC_CPU(cpu_create(machine->cpu_type));
+    if (PPC_INPUT(&cpu->env) != PPC_FLAGS_INPUT_6xx) {
+        error_report("Incompatible CPU, only 6xx bus supported");
+        exit(1);
+    }
+
+    /* Set time-base frequency */
+    cpu_ppc_tb_init(&cpu->env, BUS_FREQ_HZ / 4);
+    qemu_register_reset(pegasos2_cpu_reset, cpu);
+
+    /* RAM */
+    memory_region_add_subregion(get_system_memory(), 0, machine->ram);
+
+    /* allocate and load firmware */
+    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, fwname);
+    if (!filename) {
+        error_report("Could not find firmware '%s'", fwname);
+        exit(1);
+    }
+    memory_region_init_rom(rom, NULL, "pegasos2.rom", PROM_SIZE, &error_fatal);
+    memory_region_add_subregion(get_system_memory(), PROM_ADDR, rom);
+    sz = load_elf(filename, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
+                  PPC_ELF_MACHINE, 0, 0);
+    if (sz <= 0) {
+        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);
+
+    /* Marvell Discovery II system controller */
+    mv = DEVICE(sysbus_create_simple(TYPE_MV64361, -1,
+                        ((qemu_irq *)cpu->env.irq_inputs)[PPC6xx_INPUT_INT]));
+    pci_bus = mv64361_get_pci_bus(mv, 1);
+
+    /* VIA VT8231 South Bridge (multifunction PCI device) */
+    /* VT8231 function 0: PCI-to-ISA Bridge */
+    dev = pci_create_simple_multifunction(pci_bus, PCI_DEVFN(12, 0), true,
+                                          TYPE_VT8231_ISA);
+    qdev_connect_gpio_out(DEVICE(dev), 0,
+                          qdev_get_gpio_in_named(mv, "gpp", 31));
+
+    /* VT8231 function 1: IDE Controller */
+    dev = pci_create_simple(pci_bus, PCI_DEVFN(12, 1), "via-ide");
+    pci_ide_create_devs(dev);
+
+    /* VT8231 function 2-3: USB Ports */
+    pci_create_simple(pci_bus, PCI_DEVFN(12, 2), "vt82c686b-usb-uhci");
+    pci_create_simple(pci_bus, PCI_DEVFN(12, 3), "vt82c686b-usb-uhci");
+
+    /* VT8231 function 4: Power Management Controller */
+    dev = pci_create_simple(pci_bus, PCI_DEVFN(12, 4), TYPE_VT8231_PM);
+    i2c_bus = I2C_BUS(qdev_get_child_bus(DEVICE(dev), "i2c"));
+    spd_data = spd_data_generate(DDR, machine->ram_size);
+    smbus_eeprom_init_one(i2c_bus, 0x57, spd_data);
+
+    /* VT8231 function 5-6: AC97 Audio & Modem */
+    pci_create_simple(pci_bus, PCI_DEVFN(12, 5), TYPE_VIA_AC97);
+    pci_create_simple(pci_bus, PCI_DEVFN(12, 6), TYPE_VIA_MC97);
+
+    /* other PC hardware */
+    pci_vga_init(pci_bus);
+}
+
+static void pegasos2_machine(MachineClass *mc)
+{
+    mc->desc = "Genesi/bPlan Pegasos II";
+    mc->init = pegasos2_init;
+    mc->block_default_type = IF_IDE;
+    mc->default_boot_order = "cd";
+    mc->default_display = "std";
+    mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("7400_v2.9");
+    mc->default_ram_id = "pegasos2.ram";
+    mc->default_ram_size = 512 * MiB;
+}
+
+DEFINE_MACHINE("pegasos2", pegasos2_machine)