[PATCH 00/20] nubus: bus, device, bridge, IRQ and address space improvements

Mark Cave-Ayland posted 20 patches 2 years, 7 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20210912074914.22048-1-mark.cave-ayland@ilande.co.uk
Maintainers: Laurent Vivier <laurent@vivier.eu>
There is a newer version of this series
hw/display/macfb.c                  |   6 -
hw/m68k/q800.c                      |  24 ++-
hw/nubus/mac-nubus-bridge.c         |  28 +++-
hw/nubus/nubus-bridge.c             |  23 ++-
hw/nubus/nubus-bus.c                | 117 +++++++++++---
hw/nubus/nubus-device.c             | 226 ++++++++--------------------
hw/nubus/trace-events               |   7 +
hw/nubus/trace.h                    |   1 +
include/hw/nubus/mac-nubus-bridge.h |   9 +-
include/hw/nubus/nubus.h            |  47 +++---
meson.build                         |   1 +
11 files changed, 263 insertions(+), 226 deletions(-)
create mode 100644 hw/nubus/trace-events
create mode 100644 hw/nubus/trace.h
[PATCH 00/20] nubus: bus, device, bridge, IRQ and address space improvements
Posted by Mark Cave-Ayland 2 years, 7 months ago
This patchset is the next set of changes required to boot MacOS on the q800 machine. The
main aim of these patches is to improve the Nubus support so that devices can be plugged
into the Nubus from the command line i.e.

    -device nubus-macfb[,romfile=decl.rom]

At the moment the only device that can be plugged into the Nubus is the macfb framebuffer
however with these changes it is possible to take a ROM from a real Nubus card and
attempt to use it in QEMU, and also allow for future interfaces such as virtio.

Patches 1 to 6 move the logic which manages bus addresses from the NubusDevice into
the NubusBus itself, including the introduction of a bitmap to manage available
slots on the bus.

Patches 7 and 8 change the handling for unassigned (empty) slots to generate a bus
fault and add trace events to allow logging of empty slot accesses during Nubus
enumeration.

Patches 9 to 11 remove the existing stubs for generating the format block (the epilogue
of the Nubus device embedded ROM consisting of metadata and a checksum) and replace them
with a romfile device property to allow the entire Nubus ROM to be loaded from a file
into the ROM area, similar to a PCI option ROM.

Patch 12 moves the Nubus into its own separate address space whilst patches 13 to 17
update the NubusBridge (and MacNubusBridge) devices to allow machines to map the
required slots from the Nubus address space using sysbus_mmio_map().

Finally patches 18 to 20 add support for Nubus IRQs and wire them up appropriately for
the q800 machine through VIA2, which is required for the next set of macfb updates.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>


Mark Cave-Ayland (20):
  nubus-device: rename slot_nb variable to slot
  nubus-device: expose separate super slot memory region
  nubus-device: add device slot parameter
  nubus: use bitmap to manage available slots
  nubus: move slot bitmap checks from NubusDevice realize() to BusClass
    check_address()
  nubus: implement BusClass get_dev_path()
  nubus: add trace-events for unassigned slot accesses
  nubus: generate bus error when attempting to access empty slots
  macfb: don't register declaration ROM
  nubus-device: remove nubus_register_rom() and
    nubus_register_format_block()
  nubus-device: add romfile property for loading declaration ROMs
  nubus: move nubus to its own 32-bit address space
  nubus-bridge: introduce separate NubusBridge structure
  mac-nubus-bridge: rename MacNubusState to MacNubusBridge
  nubus: move NubusBus from mac-nubus-bridge to nubus-bridge
  nubus-bridge: embed the NubusBus object directly within nubus-bridge
  nubus-bridge: make slot_available_mask a qdev property
  nubus: add support for slot IRQs
  q800: wire up nubus IRQs
  q800: configure nubus available slots for Quadra 800

 hw/display/macfb.c                  |   6 -
 hw/m68k/q800.c                      |  24 ++-
 hw/nubus/mac-nubus-bridge.c         |  28 +++-
 hw/nubus/nubus-bridge.c             |  23 ++-
 hw/nubus/nubus-bus.c                | 117 +++++++++++---
 hw/nubus/nubus-device.c             | 226 ++++++++--------------------
 hw/nubus/trace-events               |   7 +
 hw/nubus/trace.h                    |   1 +
 include/hw/nubus/mac-nubus-bridge.h |   9 +-
 include/hw/nubus/nubus.h            |  47 +++---
 meson.build                         |   1 +
 11 files changed, 263 insertions(+), 226 deletions(-)
 create mode 100644 hw/nubus/trace-events
 create mode 100644 hw/nubus/trace.h

-- 
2.20.1


Re: [PATCH 00/20] nubus: bus, device, bridge, IRQ and address space improvements
Posted by Philippe Mathieu-Daudé 2 years, 7 months ago
Hi Mark,

On 9/12/21 9:48 AM, Mark Cave-Ayland wrote:
> This patchset is the next set of changes required to boot MacOS on the q800 machine. The
> main aim of these patches is to improve the Nubus support so that devices can be plugged
> into the Nubus from the command line i.e.
> 
>     -device nubus-macfb[,romfile=decl.rom]
> 
> At the moment the only device that can be plugged into the Nubus is the macfb framebuffer
> however with these changes it is possible to take a ROM from a real Nubus card and
> attempt to use it in QEMU, and also allow for future interfaces such as virtio.
> 
> Patches 1 to 6 move the logic which manages bus addresses from the NubusDevice into
> the NubusBus itself, including the introduction of a bitmap to manage available
> slots on the bus.
> 
> Patches 7 and 8 change the handling for unassigned (empty) slots to generate a bus
> fault and add trace events to allow logging of empty slot accesses during Nubus
> enumeration.
> 
> Patches 9 to 11 remove the existing stubs for generating the format block (the epilogue
> of the Nubus device embedded ROM consisting of metadata and a checksum) and replace them
> with a romfile device property to allow the entire Nubus ROM to be loaded from a file
> into the ROM area, similar to a PCI option ROM.
> 
> Patch 12 moves the Nubus into its own separate address space whilst patches 13 to 17
> update the NubusBridge (and MacNubusBridge) devices to allow machines to map the
> required slots from the Nubus address space using sysbus_mmio_map().
> 
> Finally patches 18 to 20 add support for Nubus IRQs and wire them up appropriately for
> the q800 machine through VIA2, which is required for the next set of macfb updates.

Some questions:

- TYPE_NUBUS_BRIDGE is not abstract. So far, beside
  TYPE_MAC_NUBUS_BRIDGE, no other code use it. Could it
  be use as it? If so, shouldn't the code in
  mac_nubus_bridge_init() be moved to nubus_bridge_realize(),
  creating the slot alias regions generically using the
  slot range from slot_available_mask or using another
  property?

- Why is "slot-available-mask" a bridge device property and
  not a bus one?

Regards,

Phil.

Re: [PATCH 00/20] nubus: bus, device, bridge, IRQ and address space improvements
Posted by Mark Cave-Ayland 2 years, 7 months ago
On 12/09/2021 16:47, Philippe Mathieu-Daudé wrote:

> On 9/12/21 9:48 AM, Mark Cave-Ayland wrote:
>> This patchset is the next set of changes required to boot MacOS on the q800 machine. The
>> main aim of these patches is to improve the Nubus support so that devices can be plugged
>> into the Nubus from the command line i.e.
>>
>>      -device nubus-macfb[,romfile=decl.rom]
>>
>> At the moment the only device that can be plugged into the Nubus is the macfb framebuffer
>> however with these changes it is possible to take a ROM from a real Nubus card and
>> attempt to use it in QEMU, and also allow for future interfaces such as virtio.
>>
>> Patches 1 to 6 move the logic which manages bus addresses from the NubusDevice into
>> the NubusBus itself, including the introduction of a bitmap to manage available
>> slots on the bus.
>>
>> Patches 7 and 8 change the handling for unassigned (empty) slots to generate a bus
>> fault and add trace events to allow logging of empty slot accesses during Nubus
>> enumeration.
>>
>> Patches 9 to 11 remove the existing stubs for generating the format block (the epilogue
>> of the Nubus device embedded ROM consisting of metadata and a checksum) and replace them
>> with a romfile device property to allow the entire Nubus ROM to be loaded from a file
>> into the ROM area, similar to a PCI option ROM.
>>
>> Patch 12 moves the Nubus into its own separate address space whilst patches 13 to 17
>> update the NubusBridge (and MacNubusBridge) devices to allow machines to map the
>> required slots from the Nubus address space using sysbus_mmio_map().
>>
>> Finally patches 18 to 20 add support for Nubus IRQs and wire them up appropriately for
>> the q800 machine through VIA2, which is required for the next set of macfb updates.

Thanks for the review so far :)

> Some questions:
> 
> - TYPE_NUBUS_BRIDGE is not abstract. So far, beside
>    TYPE_MAC_NUBUS_BRIDGE, no other code use it. Could it
>    be use as it? If so, shouldn't the code in
>    mac_nubus_bridge_init() be moved to nubus_bridge_realize(),
>    creating the slot alias regions generically using the
>    slot range from slot_available_mask or using another
>    property?

Not yet, but Nubus was available on non-Apple machines. Given that TYPE_NUBUS_BRIDGE 
and TYPE_MAC_NUBUS_BRIDGE are already there, it seems a shame to prevent anyone who 
wanted to experiment with Nubus in other ways by hard-coding in the Macintosh 
restrictions.

> - Why is "slot-available-mask" a bridge device property and
>    not a bus one?

Architecturally a Nubus always has 16 slots with 1 IRQ per slot (you can compare this 
with PCI always having 32 slots with 4 possible IRQs per slot). In the Macintosh 
design Apple restricted the available address space by mapping a partial address 
range onto the CPU bus, so I'd argue that this is an implementation property of the 
bridge. And of course device properties already exist which helps make things easier 
too :)


ATB,

Mark.