On Thu, 1 Oct 2015, James Cameron wrote:
-vga vmware -> VMWare (15ad:404) - DOES NOT WORK
For me, "-vga vmware" reproduces your problem.
So, I got a bit further, although I am still puzzled a bit. It seems like the registers do not work initially, the first mapping of the fifo area causes a Page Fault. However, if you never check for the magic value in the register 0 AND initialize the driver again - things magically start to work!
The first virtual mapping of fifo ffc00000 causes a segfault, but the next one works (fifo@ffbf0000).
After this even "detect-version" works. Qemu complains on stderr about bad depth:
vmsvga_value_write: Bad bits per pixel: 16 bits
but it's harmless because we switch automatically to a 32 bit depth. This message helped me to realize that we actually start hitting registers at some point.
Below is my patch to the tree to get the debug information out and provide more-or-less correct "reg" property. At the bottom a complete transcript of a session.
What is a bit special about this device is that we need to map the registers first, then we need to read two values (register 15 and 19) and only then we can determine the sizes of the requested memory areas (actually those values match those in BARs). For now I have just hardcoded those values in the "reg" property, but once we figure out how to get registers work at an early stage those values should be entered into the property.
I actually managed to switch console to vmsvga and it worked.
Marcin
Index: dev/pcibus.fth =================================================================== --- dev/pcibus.fth (wersja 3784) +++ dev/pcibus.fth (kopia robocza) @@ -14,8 +14,8 @@ defer setup-fcodes ( -- ) ' noop to setup-fcodes defer restore-fcodes ( -- ) ' noop to restore-fcodes
-false value pcimsg? \ Optional Debug Msgs -false value probemsg? \ Optional Probing Msgs +true value pcimsg? \ Optional Debug Msgs +true value probemsg? \ Optional Probing Msgs
\ The default value for first-io skips the area where built-in ISA \ devices normally live, but stays below 64K, in order to work with @@ -1183,7 +1183,8 @@ 4 ( increment ) then ( increment ) +loop - + else + " reg property missing!" diag-type-cr then r> finish-aa-property ; Index: dev/video/controlr/vmsvga.fth =================================================================== --- dev/video/controlr/vmsvga.fth (wersja 3784) +++ dev/video/controlr/vmsvga.fth (kopia robocza) @@ -95,6 +95,8 @@ /fb 0 my-space h# 0200.0018 + /fifo " map-in" $call-parent to fifo then 3 my-space h# 04 + " config-w!" $call-parent + cr ." map-mem: fifo@" fifo . ." size= " /fifo . + cr ." map-mem: fb@" frame-buffer-adr . ." size= " /fb . ; : unmap-regs ( -- ) regs h# 10 " map-out" $call-parent ; : unmap-mem ( -- ) @@ -110,6 +112,8 @@ : fifo-next@ ( -- n ) fifo 2 la+ l@ ; : fifo-next! ( n -- ) fifo 2 la+ l! ; : fifo-stop@ ( -- n ) fifo 3 la+ l@ ; : fifo-stop! ( n -- ) fifo 3 la+ l! ;
+: int+ ( adr len n -- adr' len' ) encode-int encode+ ; + : detect-version ( -- ) h# 9000.0002 dup 0 reg! 0 reg@ = if exit then h# 9000.0001 dup 0 reg! 0 reg@ = if exit then @@ -116,6 +120,23 @@ unmap-regs abort \ We don't support version 0 ; + +: set-reg-property + my-address my-space encode-phys 0 int+ h# 0 int+ + my-address my-space h# 0100.0010 + encode-phys encode+ 0 int+ h# 10 int+ + my-address my-space h# 0200.0014 + encode-phys encode+ 0 int+ h# 1000000 int+ + my-address my-space h# 0200.0018 + encode-phys encode+ 0 int+ h# 10000 int+ + " reg" property +; + +: probe ( -- ) + \ map-regs + \ map-mem + set-reg-property + \ unmap-mem + \ unmap-regs +; + : init-fb ( -- ) depth 7 reg! 7 reg@ depth <> if 7 reg@ to depth then
@@ -249,7 +270,7 @@
: init ( -- ) map-regs - detect-version + \ detect-version map-mem init-fb init-fifo Index: dev/video/vmsvga.bth =================================================================== --- dev/video/vmsvga.bth (wersja 3784) +++ dev/video/vmsvga.bth (kopia robocza) @@ -12,6 +12,7 @@ " display" device-name
fload ${BP}/dev/video/controlr/vmsvga.fth \ VMware-specific words +probe
end0
---------------------end----------------------------- ------------------- output begin --------------------
Script started on Thu Oct 1 15:30:31 2015 command: qemu-system-i386 -m 32 -bios /var/tmp/openfirmware/cpu/x86/pc/emu/build/emuofw.rom -hda fat:/var/tmp/openfirmware/cpu/x86/pc/emu/build -serial stdio -vga vmware vvfat /var/tmp/openfirmware/cpu/x86/pc/emu/build chs 1024,16,63 WARNING: Image format was not specified for 'json:{"fat-type": 0, "dir": "/var/tmp/openfirmware/cpu/x86/pc/emu/build", "driver": "vvfat", "floppy": false, "rw": false}' and probing guessed raw. Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted. Specify the 'raw' format explicitly to remove the restrictions.
Forthmacs Type 'i' to interrupt stand-init sequence First stand-init: Exceptions CIF DHCP init memory node Probing memory MMU Reclaim dictionary PCI host bridge ISA Calibrating millisecond timer RTC CPU nodes Pseudo-NVRAM Can't read the configuration memory The configuration memory is invalid. Using default values. Sound Probe IDE Unimplemented package interface procedure nvramrc Probing probe-pci PCI PROBE-SELF: Phys.hi = 0 Checking for built-in FCode match for Vendor:8086 Device:1237 Checking for built-in FCode match... PCI PROBE-SELF: Phys.hi = 800 Checking for built-in FCode match for Vendor:8086 Device:7010 Checking for built-in FCode match... DROPIN CLASS MATCH PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 81000000 0 0 Checking for built-in FCode match for Vendor:8086 Device:7113 Checking for built-in FCode match... PCI PROBE-SELF: Phys.hi = 1000 PCI-MAP-IN: Bus: 0 , MEM, PCI PHYS.HI..LO = 2001030 0 0 Assigning PCI Space of length 10000 Memory Space... Base Reg: 2001030 = 11010000 Function:15ad Function: 405 Non FCode Format ROM Image. Checking for built-in FCode match for Vendor:15ad Device: 405 Checking for built-in FCode match... DROPIN NAME MATCH PCI PROBE-SELF: Phys.hi = 1800 PCI-MAP-IN: Bus: 0 , MEM, PCI PHYS.HI..LO = 2001830 0 0 Assigning PCI Space of length 40000 Memory Space... Base Reg: 2001830 = 10040000 Function:8086 Function:100e Non FCode Format ROM Image. Function:8086 Function:100e Non FCode Format ROM Image. Function:8086 Function:100e Non FCode Format ROM Image. Checking for built-in FCode match for Vendor:8086 Device:100e Checking for built-in FCode match... PCI PROBE-SELF: Phys.hi = 2000 Nothing there PCI PROBE-SELF: Phys.hi = 2800 Nothing there PCI PROBE-SELF: Phys.hi = 3000 Nothing there PCI PROBE-SELF: Phys.hi = 3800 Nothing there PCI PROBE-SELF: Phys.hi = 4000 Nothing there PCI PROBE-SELF: Phys.hi = 4800 Nothing there PCI PROBE-SELF: Phys.hi = 5000 Nothing there PCI PROBE-SELF: Phys.hi = 5800 Nothing there PCI PROBE-SELF: Phys.hi = 6000 Nothing there PCI PROBE-SELF: Phys.hi = 6800 Nothing there PCI PROBE-SELF: Phys.hi = 7000 Nothing there PCI PROBE-SELF: Phys.hi = 7800 Nothing there PCI PROBE-SELF: Phys.hi = 8000 Nothing there PCI PROBE-SELF: Phys.hi = 8800 Nothing there PCI PROBE-SELF: Phys.hi = 9000 Nothing there PCI PROBE-SELF: Phys.hi = 9800 Nothing there PCI PROBE-SELF: Phys.hi = a000 Nothing there PCI PROBE-SELF: Phys.hi = a800 Nothing there PCI PROBE-SELF: Phys.hi = b000 Nothing there PCI PROBE-SELF: Phys.hi = b800 Nothing there PCI PROBE-SELF: Phys.hi = c000 Nothing there PCI PROBE-SELF: Phys.hi = c800 Nothing there PCI PROBE-SELF: Phys.hi = d000 Nothing there PCI PROBE-SELF: Phys.hi = d800 Nothing there PCI PROBE-SELF: Phys.hi = e000 Nothing there PCI PROBE-SELF: Phys.hi = e800 Nothing there PCI PROBE-SELF: Phys.hi = f000 Nothing there PCI PROBE-SELF: Phys.hi = f800 Nothing there Assigning PCI Space of length 10 I/O Space... Base Reg: 1000920 = 8000 Assigning PCI Space of length 10 I/O Space... Base Reg: 1001010 = 8010 Assigning PCI Space of length 1000000 Memory Space... Base Reg: 2001014 = 10000000 Assigning PCI Space of length 10000 Memory Space... Base Reg: 2001018 = 11000000 Assigning PCI Space of length 20000 Memory Space... Base Reg: 2001810 = 11020000 Assigning PCI Space of length 40 I/O Space... Base Reg: 1001814 = 8040 USB2 devices: USB1 devices: Install console Generic PC, Serial #0, 32 MiB memory installed Open Firmware Copyright 1999 FirmWorks All Rights Reserved
Open Firmware demonstration version by FirmWorks (info@firmworks.com) Type any key to interrupt automatic startup 6 5 4 3 2 ok select /pci/display@2 PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 1001010 0 0 PCI-MAP-IN: Bus: 0 , MEM, PCI PHYS.HI..LO = 2001014 0 0 PCI-MAP-IN: Bus: 0 , MEM, PCI PHYS.HI..LO = 2001018 0 0 map-mem: fifo@ffc00000 size= 10000 map-mem: fb@ffc00000 size= 1000000 vmsvga_value_write: Bad bits per pixel: 16 bits Page Fault ok dev /pci/display@2 ok 0 reg@ . 90000002 ok select /pci/display@2 PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 1001010 0 0 PCI-MAP-IN: Bus: 0 , MEM, PCI PHYS.HI..LO = 2001014 0 0 PCI-MAP-IN: Bus: 0 , MEM, PCI PHYS.HI..LO = 2001018 0 0 map-mem: fifo@ffbf0000 size= 10000 map-mem: fb@fe800000 size= 1000000 vmsvga_value_write: Bad bits per pixel: 16 bits
ok use-ks PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 81000000 0 0 PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 1000920 0 0 PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 81000000 0 0 PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 1000920 0 0 input-device = keyboard PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 81000000 0 0 PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 1000920 0 0 PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 81000000 0 0 PCI-MAP-IN: Bus: 0 , I/O, PCI PHYS.HI..LO = 1000920 0 0 output-device = screen ok install-console ok power-off
Script done on Thu Oct 1 15:31:56 2015