
在 2022-08-25星期四的 11:01 +0300,Felix Yan写道:
Hi,
Today I discovered a failure which bisected to this commit.
When running QEMU with libvirt, which created some pcie devices, U-boot fails on autoboot with:
Unhandled exception: Load access fault EPC: 00000000bff7c46e RA: 00000000bff7c46c TVAL: 0000000040200014 EPC: 000000008002446e RA: 000000008002446c reloc adjusted
Code: 8082 1141 e022 e406 842e 40ef dc5f 611c (c783 0147)
I have tried to minimize the command line that makes the difference.
This works:
-device '{"driver":"virtio-blk-pci","drive":"libvirt-2-format","id":"virtio-disk0","bootindex":1}'
This doesn't work:
-device '{"driver":"virtio-blk-pci","bus":"pci.2","addr":"0x0","drive":"libvirt-2-format","id":"virtio-disk0","bootindex":1}'
I have tried this on multiple machines, different U-boot tags, mmode or smode with OpenSBI, all with the same behavior. Latest U-boot master with this commit reverted works fine on both cases.
I am very new to U-boot, please do let me know if more info are to be provided.
Attached the full command line, for reference:
/usr/bin/qemu-system-riscv64 \ -machine virt \ -bios u-boot/u-boot.bin \ -m 1024 \ -device '{"driver":"pcie-root-port","port":8,"chassis":1,"id":"pci.1","bus":"pcie.0","multifunction":true,"addr":"0x1"}' \ -device '{"driver":"pcie-root-port","port":9,"chassis":2,"id":"pci.2","bus":"pcie.0","addr":"0x1.0x1"}' \ -blockdev '{"driver":"file","filename":"archriscv-2022-08-24.qcow2","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \ -blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"qcow2","file":"libvirt-2-storage","backing":null}' \ -device '{"driver":"virtio-blk-pci","bus":"pci.2","addr":"0x0","drive":"libvirt-2-format","id":"virtio-disk0","bootindex":1}' \ -nographic
-- Regards, Felix Yan
Please try my patch and let me know the test results
diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c index 880a12cc28..cfde4007f5 100644 --- a/drivers/virtio/virtio_pci_modern.c +++ b/drivers/virtio/virtio_pci_modern.c @@ -466,7 +466,7 @@ static void __iomem *virtio_pci_map_capability(struct udevice *udev, unsigned long mask = PCI_REGION_TYPE | PCI_REGION_SYS_MEMORY | PCI_REGION_RO; unsigned long flags = PCI_REGION_MEM; - u8 *p = dm_pci_map_bar(udev, PCI_BASE_ADDRESS_0 + cap->bar, cap->offset, + u8 *p = dm_pci_map_bar(udev, PCI_BASE_ADDRESS_0 + 4 * cap->bar, cap->offset, cap->length, mask, flags);
return (void __iomem *)p;
Regards, Xiang W