Am 19. November 2024 21:45:39 MEZ schrieb Yuri Zaporozhets <[email protected]>: >Hi Heinrich; hi all owners of SiFive Unmatched + PCIe video card, > >Default U-Boot configuration for Unmatched always fails to initialize >BAR0 of my video card (NVidia GT710), because the PCI driver selects the MEMORY >region at 0x70000000 for bus_start/phys_start ("region 2", according to >decode_regions() output), which has the size of 0x1000000. Naturally, the >video card's BAR0 doesn't fit into this small region, because its size >is also 0x1000000: > > pci_auto_config_devices: start > PCI Autoconfig: Bus Memory region: [70000000-70ffffff], > Physical Memory [70000000-70ffffff] > PCI Autoconfig: Bus Prefetchable Mem region: [2000000000-3fffffffff], > Physical Memory [2000000000-3fffffffff] > PCI Autoconfig: Bus I/O region: [60080000-6008ffff], > Physical Memory [60080000-6008ffff] > ....... > pci_auto_config_devices: device pci_7:0.0 > PCI Autoconfig: BAR 0, Mem, size=0x1000000, bus_lower=0x70400000, > bus_start=0x70000000, phys_start=0x70000000 > addr = 0x71000000 > No room in resource, avail start=70400000 / size=1000000, need=1000000 > PCI: Failed autoconfig bar 10 > >The situation changes drastically if CONFIG_PCI_REGION_MULTI_ENTRY is set to >"yes". >After this, PCI starts to use "region 1" for MEMORY, which has the size of >0xFF70000, and is, obviously, suitable for GPU's BAR0: > >pci_uclass_pre_probe, bus=-1/pcie@e00000000, parent=soc >decode_regions: len=28, cells_per_record=7 >decode_regions: region 0, pci_addr=60080000, addr=60080000, size=10000, >space_code=1 > - type=1, pos=0 >decode_regions: region 1, pci_addr=60090000, addr=60090000, size=ff70000, >space_code=2 > - type=0, pos=1 >decode_regions: region 2, pci_addr=70000000, addr=70000000, size=1000000, >space_code=2 > - type=0, pos=2 >decode_regions: region 3, pci_addr=2000000000, addr=2000000000, >size=2000000000, space_code=3 > - type=8, pos=3 >.... >PCIE-0: Link up (Gen1-x8, Bus0) >pci_uclass_post_probe: probing bus 0 >pci_bind_bus_devices: bus 0/pcie@e00000000: found device 0, function 0: find >ret=-19 >pci_find_and_bind_driver: Searching for driver: vendor=f15e, device=0 >pci_find_and_bind_driver: No match found: bound generic driver instead >pci_auto_config_devices: start >PCI Autoconfig: Bus Memory region: [60090000-6fffffff], > Physical Memory [60090000-6fffffff] >PCI Autoconfig: Bus Prefetchable Mem region: [2000000000-3fffffffff], > Physical Memory [2000000000-3fffffffff] >PCI Autoconfig: Bus I/O region: [60080000-6008ffff], > Physical Memory [60080000-6008ffff] > >This picture is in full accord with Linux kernel, which also uses >0x69000000 ("region 1") for bus_start and phys_start. > >With this setting, all BARs on all devices are initialized correctly, >and, moreover, I can access memory-mapped VGA ports of the card (see [1] for >details), which is essential for initializing the card in text mode with >bios_emulator: > >PCI Autoconfig: BAR 0, Mem, size=0x1000000, bus_lower=0x60500000, >bus_start=0x60090000, phys_start=0x60090000 >address=0x61000000 bus_lower=0x62000000 > >PCI Autoconfig: BAR 1, Prf64, size=0x8000000, bus_lower=0x2000000000, >bus_start=0x2000000000, phys_start=0x2000000000 >address=0x2000000000 bus_lower=0x2008000000 > >PCI Autoconfig: BAR 2, Prf64, size=0x2000000, bus_lower=0x2008000000, >bus_start=0x2000000000, phys_start=0x2000000000 >address=0x2008000000 bus_lower=0x200a000000 > >PCI Autoconfig: BAR 3, I/O, size=0x80, bus_lower=0x60080000, >bus_start=0x60080000, phys_start=0x60080000 >address=0x60080000 bus_lower=0x60080080 > >PCI Autoconfig: ROM, size=0x80000, bus_lower=0x62000000, bus_start=0x60090000, >phys_start=0x60090000 >address=0x62000000 bus_lower=0x62080000 > >Notes: > >[1]: https://envytools.readthedocs.io/en/latest/hw/mmio.html#gf100-mmio-map >
Hello Yuri, Thank you for sharing your investigation results. Could you, please, send a patch? Were you able to show output on HDMI? Best regards Heinrich

