On 20/07/2019 16:19, BALATON Zoltan wrote:
On Sat, 20 Jul 2019, BALATON Zoltan wrote:
based on the above I think the pci-map-in implemented in OpenBIOS's pci driver approximately does what map-in we're missing should do:
https://github.com/openbios/openbios/blob/master/drivers/pci.c#L413
[...]
Or maybe it's easier to just rename pci-map-in in source as it only seems to be used by the vga driver FCode part in drivers/vga.fs (where it is used to map PCI BARs of the card, the same as the ATI ROM is trying to do). So is there a reason this is not yet called map-in but pci-map in?
I've tried renaming pci-map-in to map-in but it does not seem to work for what the ATI FCode is trying to do. I've also enabled PCI debugging options in OpenBIOS and QEMU, here are some logs I got (this is with the pci-set-args patch we talked about earlier plus renaming pci-map-in to map-in in drivers/pci.c):
[Cut some logs of init-ing other PCI cards, similar as below for ati-vga] 3233@1563634437.470612:pci_cfg_read ati-vga 15:0 @0x0 -> 0x1002 3233@1563634437.470616:pci_cfg_read ati-vga 15:0 @0x2 -> 0x5046 3233@1563634437.470619:pci_cfg_read ati-vga 15:0 @0xa -> 0x300 3233@1563634437.470622:pci_cfg_read ati-vga 15:0 @0x9 -> 0x0
0:f.0 - 1002:5046 -
3233@1563634437.470675:pci_cfg_read ati-vga 15:0 @0xe -> 0x0 /pci@f2000000/ATY - 3233@1563634437.471882:pci_cfg_read ati-vga 15:0 @0x3d -> 0x0 3233@1563634437.471886:pci_cfg_read ati-vga 15:0 @0x10 -> 0x8 3233@1563634437.471889:pci_cfg_write ati-vga 15:0 @0x10 <- 0xffffffff 3233@1563634437.471892:pci_cfg_read ati-vga 15:0 @0x10 -> 0xff000008 changing mem_base from 0x80400000 to 0x82000000
Configuring BARs for /pci@f2000000/ATY: reloc 0x81000000 omask 0x8
io_base 0x1000 mem_base 0x82000000 size 0x1000000 3233@1563634437.472242:pci_cfg_write ati-vga 15:0 @0x10 <- 0x81000008 3233@1563634437.472254:pci_cfg_read ati-vga 15:0 @0x14 -> 0x1 3233@1563634437.472257:pci_cfg_write ati-vga 15:0 @0x14 <- 0xffffffff 3233@1563634437.472260:pci_cfg_read ati-vga 15:0 @0x14 -> 0xffffff01
changing io_base from 0x1000 to 0x1100 Configuring BARs for /pci@f2000000/ATY: reloc 0x1000 omask 0x1 io_base
0x1100 mem_base 0x82000000 size 0x100 3233@1563634437.472556:pci_cfg_write ati-vga 15:0 @0x14 <- 0x1001 3233@1563634437.472566:pci_cfg_read ati-vga 15:0 @0x18 -> 0x0 3233@1563634437.472569:pci_cfg_write ati-vga 15:0 @0x18 <- 0xffffffff 3233@1563634437.472571:pci_cfg_read ati-vga 15:0 @0x18 -> 0xffffc000
changing mem_base from 0x82000000 to 0x82010000 Configuring BARs for /pci@f2000000/ATY: reloc 0x82000000 omask 0x0
io_base 0x1100 mem_base 0x82010000 size 0x10000 3233@1563634437.472878:pci_cfg_write ati-vga 15:0 @0x18 <- 0x82000000 3233@1563634437.472881:pci_cfg_read ati-vga 15:0 @0x1c -> 0x0 3233@1563634437.472884:pci_cfg_write ati-vga 15:0 @0x1c <- 0xffffffff 3233@1563634437.472886:pci_cfg_read ati-vga 15:0 @0x1c -> 0x0 3233@1563634437.472889:pci_cfg_read ati-vga 15:0 @0x20 -> 0x0 3233@1563634437.472891:pci_cfg_write ati-vga 15:0 @0x20 <- 0xffffffff 3233@1563634437.472893:pci_cfg_read ati-vga 15:0 @0x20 -> 0x0 3233@1563634437.472896:pci_cfg_read ati-vga 15:0 @0x24 -> 0x0 3233@1563634437.472898:pci_cfg_write ati-vga 15:0 @0x24 <- 0xffffffff 3233@1563634437.472901:pci_cfg_read ati-vga 15:0 @0x24 -> 0x0 3233@1563634437.472903:pci_cfg_read ati-vga 15:0 @0x30 -> 0x0 3233@1563634437.472906:pci_cfg_write ati-vga 15:0 @0x30 <- 0xffffffff 3233@1563634437.472908:pci_cfg_read ati-vga 15:0 @0x30 -> 0xffff0001
changing mem_base from 0x82010000 to 0x82020000 Configuring BARs for /pci@f2000000/ATY: reloc 0x82010000 omask 0x1
io_base 0x1100 mem_base 0x82020000 size 0x10000 3233@1563634437.473236:pci_cfg_write ati-vga 15:0 @0x30 <- 0x82010001 3233@1563634437.473240:pci_cfg_read ati-vga 15:0 @0x4 -> 0x0 3233@1563634437.473242:pci_cfg_write ati-vga 15:0 @0x4 <- 0x3 3233@1563634437.473244:pci_update_mappings_add d=0x55ef8ac6e280 00:0f.0 0,0x81000000+0x1000000 pci_update_mappings: adding bar 0 to unin-pci-mmio @ 0x81000000 3233@1563634437.473322:pci_update_mappings_add d=0x55ef8ac6e280 00:0f.0 1,0x1000+0x100 pci_update_mappings: adding bar 1 to unin-pci-isa-mmio @ 0x1000 3233@1563634437.473409:pci_update_mappings_add d=0x55ef8ac6e280 00:0f.0 2,0x82000000+0x4000 pci_update_mappings: adding bar 2 to unin-pci-mmio @ 0x82000000 3233@1563634437.473531:pci_update_mappings_add d=0x55ef8ac6e280 00:0f.0 6,0x82010000+0x10000 pci_update_mappings: adding bar 6 to unin-pci-mmio @ 0x82010000 3233@1563634437.473639:pci_cfg_read ati-vga 15:0 @0x0 -> 0x1002 3233@1563634437.473643:pci_cfg_read ati-vga 15:0 @0x2 -> 0x5046 3233@1563634437.473645:pci_cfg_read ati-vga 15:0 @0x8 -> 0x0 3233@1563634437.473647:pci_cfg_read ati-vga 15:0 @0x9 -> 0x0 3233@1563634437.473649:pci_cfg_read ati-vga 15:0 @0xa -> 0x300 3233@1563634437.473914:pci_cfg_read ati-vga 15:0 @0x3e -> 0x0 3233@1563634437.474012:pci_cfg_read ati-vga 15:0 @0x3f -> 0x0 3233@1563634437.474146:pci_cfg_read ati-vga 15:0 @0x6 -> 0x0 3233@1563634437.474261:pci_cfg_read ati-vga 15:0 @0x2c -> 0x1af4 3233@1563634437.474380:pci_cfg_read ati-vga 15:0 @0x2e -> 0x1100 3233@1563634437.474515:pci_cfg_read ati-vga 15:0 @0xc -> 0x0
ob_pci_encode_unit space=0 dev=15 fn=0 buf=f
=== CHANGED === package path old=/pci@f2000000/ATY
new=/pci@f2000000/ATY@f
pci_set_reg reg 00007800 00000000 00000000 00000000 00000000 42007810
00000000 00000000 00000000 01000000 01007814 00000000 00000000 00000000 00000100 02007818 00000000 00000000 00000000 00004000 3233@1563634437.593836:pci_cfg_read uni-north-pci 11:0 @0x30 -> 0x0 3233@1563634437.593845:pci_cfg_write uni-north-pci 11:0 @0x0 <- 0x1
ob_pci_decode_unit idx=1fc5a984 ob_pci_decode_unit idx=1fc5a984 addr=00000000 00000000 00007800 ob_pci_bar_map_in idx=1fc5a984 ob_pci_map: phys=0x82000000 size=16384 ob_pci_bar_map_in idx=1fc5a984 ob_pci_map: phys=0x81000000 size=16777216 ob_pci_decode_unit idx=1fc5a984 ob_pci_decode_unit idx=1fc5a984 addr=00000000 00000000 00007800
3233@1563634437.781563:pci_cfg_write uni-north-pci 11:0 @0x1a <- 0x0
bridge /pci@f2000000 PCI bus primary=0 secondary=0 subordinate=0
3233@1563634437.781711:pci_cfg_write uni-north-pci 11:0 @0x22 <- 0x8200 3233@1563634437.781718:pci_cfg_write uni-north-pci 11:0 @0x32 <- 0x0 3233@1563634437.781724:pci_cfg_write uni-north-pci 11:0 @0x1d <- 0x10 3233@1563634437.781729:pci_cfg_read uni-north-pci 11:0 @0x4 -> 0x3
setting bus range for /pci@f2000000 PCI device, package handle fff5b0a8
bus primary=0 secondary=0 subordinate=0
setting up interrupt map for host fff5b0a8 set_property: NULL phandle
============================================================= OpenBIOS 1.1 [Jul 20 2019 14:01] Configuration device id QEMU version 1 machine id 1 CPUs: 1 Memory: 512M UUID: 00000000-0000-0000-0000-000000000000 CPU type PowerPC,G4
milliseconds isn't unique.
ob_pci_decode_unit idx=fff5b130 ob_pci_decode_unit idx=fff5b130 addr=00000000 00000000 00006000 ob_pci_decode_unit idx=1fc5ab54 ob_pci_decode_unit idx=1fc5ab54 addr=00000000 00000000 00006000 ob_pci_encode_unit space=0 dev=13 fn=0 buf=d ob_pci_decode_unit idx=fff5b130 ob_pci_decode_unit idx=fff5b130 addr=00000000 00000000 00006000 ob_pci_decode_unit idx=fff5b130 ob_pci_decode_unit idx=fff5b130 addr=00000000 00000000 00006000 ob_pci_decode_unit idx=1fc5acc0 ob_pci_decode_unit idx=1fc5acc0 addr=00000000 00000000 00006000 ob_pci_decode_unit idx=fff5b130 ob_pci_decode_unit idx=fff5b130 addr=00000000 00000000 00006000 ob_pci_decode_unit idx=1fc5adc8 ob_pci_decode_unit idx=1fc5adc8 addr=00000000 00000000 00006000
Welcome to OpenBIOS v1.1 built on Jul 20 2019 14:01
0 > dev /pci@f2000000/ATY ok 0 > .properties name "ATY" vendor-id 1002 device-id 5046 revision-id 0 class-code 30000 min-grant 0 max-latency 0 devsel-speed 0 subsystem-vendor-id 1af4 subsystem-id 1100 cache-line-size 0 device_type "display" model "ATY Rage128" compatible "VGA" assigned-addresses -- 3c : 42 00 78 10 00 00 00 00 81 00 00 00 00 00 00 00 01 00 00 00 01 00 78 14 00 00 00 00 00 00 10 00 00 00 00 00 00 00 01 00 02 00 78 18 00 00 00 00 82 00 00 00 00 00 00 00 00 00 40 00 reg 00007800 00000000 00000000 00000000 00000000 42007810 00000000 00000000 00000000 01000000 01007814 00000000 00000000 00000000 00000100 02007818 00000000 00000000 00000000 00004000 width 320 height 258 depth 20 linebytes c80 address 81000000 ok 0 > " /pci@f2000000/ATY" open-dev to my-self ok 0 > my-unit ok 3 > . 7800 ok 2 > . 0 ok 1 > . 0 ok 0 > my-address ok 2 > . 0 ok 1 > . 0 ok 0 > my-space . 7800 ok 0 > my-address h# 1000014 my-space + h# 100 ok 4 > .s <4> 0 0 1007814 100 ok 4 > " map-in" $call-parent >> ob_pci_bar_map_in idx=1fc5aef4
ob_pci_map: phys=0x00000000 size=256
ok 1 > . -1 ok 0 >
So the ob_pci_bus_map_in() in drivers/pci.c is called but it does not find the correct phys address to map. This is done in ob_pci_map() where I've added a debug message before of_mem_claim_phys() is called. Before that it has these calls:
pci_decode_pci_addr(ba, &flags, &space_code, &mask);
phys = pci_bus_addr_to_host_addr(space_code, ba & ~mask);
So one of these does not work correctly and cannot find the requested space of the card. Maybe this only works for BARs but we need config space here which is not yet supported? Does the above make sense to anyone or do I have to trace it back myself?
I'm fairly sure the reason I named the function pci-map-in rather than just map-in is because it doesn't quite follow the spec, but it's enough to allow us to map various devices within memory such as the in-built VGA driver in vga.fs (see there for an example usage).
Probably the correct solution is to create a call-parent chain much like the dma-* words which should also enable you to get rid of the hack that is pci_bus_addr_to_host_addr(). Also looking at your Forth above where you are about to call map-in for a PCI device the parameters look correct, so it's really the PCI mapping function that needs to be tweaked here.
ATB,
Mark.