Hello,
On Tue, 30 Jul 2019, BALATON Zoltan wrote:
- Try to get some other OF implementation working like OpenFirmware. Based
on previous work by Atar for the 40p this is possible although to do it cleanly may be more work and hindered by the need to do it in Forth completely. But Forth is needed to hack on OpenBIOS as well so once someone gets over that hurdle it does not matter. I've started looking at this posibility to find out how much work would this be that's why I was asking the question. I've compiled Atar's work which is now upstram in Mitch Bradley's tree and it worked well with 40p and even started with pegasos2 but of course it did not init the hardware correctly expecting to run on 40p (haven't tried with mac99 but I expect the same result). So OpenFirmware already works on PPC and has some QEMU specific drivers what we may need is porting drivers for mac specific and pegasos2 devices from OpenBIOS from C to Forth (or get equivalents from somewhere else) and think about how to pass the initial device tree similar to SLOF to avoid having to implement each board in OpenFirmware separately (although doing hardcoded board implementation like Atar's 40p might be a quick and dirty way to get it working with much less work).
I gave it a try playing with it for a few hours (without really knowing what am I doing) just to get to know it better and see what's needed. So I started by stripping down Atar's QEMU PReP port removing PReP specific parts and just leaving a bare minimum to work on PowerPC and I actually managed to build a ROM image that works with my pegasos2 emulation and gets me an OF environment over diag serial port now:
$ qemu-system-ppc -M pegasos2 -bios ofw.rom -serial stdio setup_mem_windows: Should enable region 14 Mapping pci1-io-win 0x0+0x2000000 @ 0xfe000000 setup_mem_windows: Should enable region 20
Type 'i' to interrupt stand-init sequence First stand-init: Calibrate CIF buffers DHCP init memory node Instruction cache on Decrementer Enable machine check exceptions Set Memory Map MMU Root node Data cache on Fast CPU mode PCI host bridge CPU nodes Keyboard overrides Memory node not found. not found. /pci/isa/serial@i2f8 not found. /pci/isa/serial@i2f8 not found. not found. not found. , Serial #0, 128 MiB memory installed Open Firmware Copyright (c) 1995-2000, FirmWorks. Copyright (c) 2014,2017,2019 Artyom Tarasenko.
Type any key to interrupt automatic startup 6 5 4 3 2 1
Boot device: net Arguments:
Can't open boot device
ok show-devs /dropin-fs /null-nvram /cpus /<Unnamed> /mmu /memory@0 /aliases /options /openprom /chosen /packages /cpus/PowerPC,603evARTHUR@0 /packages/ext2-file-system /packages/disk-label /packages/iso9660-file-system /packages/fat-file-system /packages/obp-tftp /packages/deblocker /packages/stringio /packages/terminal-emulator /packages/client-services ok printenv Variable Name Value Default Value
hrp-memmap? false false virt-size 0x0 0xffffffff virt-base 0x0 0xffffffff real-size 0x0 0xffffffff real-base 0x0 0xffffffff real-mode? false false diag-switch? false false fcode-debug? false false ip-address 255.255.255.255 255.255.255.255 ip-router ip-domain ip-netmask 255.255.255.0 255.255.255.0 ip-dns-server local-mac-address? false false oem-logo oem-logo? false false oem-banner oem-banner? false false output-device /pci/isa/serial@i2f8 /pci/isa/serial@i2f8 input-device /pci/isa/serial@i2f8 /pci/isa/serial@i2f8 load-base 4194304 4194304 boot-command boot boot auto-boot? true true watchdog-reboot? false false diag-file diag-device net net boot-file boot-device disk net disk net ansi-terminal? true true screen-#columns 80 80 screen-#rows 34 34 silent-mode? false false use-nvramrc? false false nvramrc security-password security-#badlogins 0 security-mode none diag-switch? false false ok dev / ok .properties #address-cells 00000001 ok dev openprom ok .properties model FirmWorks,3.0 aligned-allocator relative-addressing name openprom ok dev /cpus/PowerPC,603evARTHUR ok .properties clock-frequency 05f5e100 reg 00000000 timebase-frequency 007de290 tlb-sets 00000080 tlb-size 00000100 d-cache-sets 00000080 d-cache-block-size 00000020 d-cache-size 00008000 i-cache-sets 00000080 i-cache-block-size 00000020 i-cache-size 00008000 device_type cpu name PowerPC,603evARTHUR ok
Of course it's only the start and has a lot of missing parts yet: does not detect PCI bus and devices (I need to write a driver for the PCI host similar to what Atar did for 40p), it misdetects the CPU (or it may be hard coded somewhere), does not detect memory size (this is mentioned on Atar's blog) and may have other defficiencies. But for a start it works quite well and it was surprisingly easy to get it up thanks to previous work. Given that the Pegasos2 is quite close to PReP and PC hardware most of the drivers for PC like hardware are already there in OF, so maybe if I can make a working driver for the system controller chip the rest would just work or should be relatively easy to fix. So for the pegasos2 this seems to be a viable alternative that may not be too hard to get working if I limit the scope to just the pegasos2.
For Mac machines more drivers would need to be written as these are not included in the open source OF version that was released for OLPC so only those drivers are included which were needed for that. Therefore it would be more work to write those missing drivers. We have USB driver (I've once tried porting that to OpenBIOS[1]) so keyboard and mouse might work where we have USB but we would still need drivers for uninorth and mac-io at least to get something working but maybe others as well, I'm not sure.
For Sparc machines even CPU support is missing so it may be more difficult to get that working. Or maybe not as this could be added based on some other similar architecture: arm, mips and ppc are already there but these do have a lot of Forth files so it may take a while to understand those. I don't know Sparc hardware to tell what drivers may be needed.
But from Atar's blog on getting OF working for QEMU PReP/40p I got the impression that Mitch Bradley (inventor of OpenFirmware and founder of FirmWorks) did help him by releasing some additional drivers or sources that he needed so maybe asking politely would not hurt and it may get easier, unless there are legal hurdles in releasing additional sources. Otherwise those need to be recreated but that may still be doable if someone does not mind learning enough Forth to do it.
I'm not sure which is more work, getting OpenBIOS to the same level or writing drivers for OpenFirmware but maybe for PPC machines it's not much harder to rewrite the missing drivers. For Sparc I'm not sure, PPC support was already there so I don't know what it takes to add a new cpu support.
Regards, BALATON Zoltan
[1] One can follow the thread starting here: https://mail.coreboot.org/pipermail/openbios/2014-May/008244.html but basically the attempt to port OF driver to OpenBIOS ended with: https://mail.coreboot.org/pipermail/openbios/2014-May/008281.html some of those words are already there now but some are still missing. I've ended up finishing the C driver which was finally added, even though I only wanted to try qemu-system-ppc64 originally and did not plan to port a USB driver. That's what I meant saying I end up having to do fixes whenever I try something in OpenBIOS: like trying an FCode ROM the last time. At least OpenFirmware implements the standard already perfectly so we would only need to care about getting it to work with the machine and not if it has everythung that might be needed by stuff using it (or at least much less so than starting from scratch).