2014-07-01 20:56 GMT+08:00 Jan Kiszka <jan.kis...@web.de>: > On 2014-07-01 14:55, Le Tan wrote: >> 2014-07-01 20:52 GMT+08:00 Le Tan <tamlokv...@gmail.com>: >>> Hi Jan, >>> >>> 2014-07-01 15:34 GMT+08:00 Jan Kiszka <jan.kis...@web.de>: >>>> Hi Le, >>>> >>>> On 2014-07-01 04:34, Le Tan wrote: >>>>> Hi Jan, >>>>> I use pci_setup_iommu() to setup a PCIIOMMUFunc for the q35 pci bus. >>>>> In the iommu_fn, I print out the devfn parameter and find out that it >>>>> sometimes will be -1. So what does it mean? >>>>> The detail code is here: >>>>> >>>>> In mch_init() function, I write like this: >>>>> PCIBus *pci_bus = PCI_BUS(qdev_get_parent_bus(DEVICE(mch))); >>>>> pci_setup_iommu(pci_bus, q35_host_dma_iommu, mch->iommu); >>>>> >>>>> And in q35_host_dma_iommu(PCIBus *bus, void *opaque, int devfn), I >>>>> print out the devfn parameter, sometimes it will be -1. >>>> >>>> Hmm, I have no idea about the reason and would suggest to set a >>>> conditional breakpoint on this function, then print the backtrace to see >>>> where this comes from and analyze the device structure from where that >>>> -1 was most probably taken. >> >> I think maybe this is a bug? In the function do_pci_register_device(), >> maybe these two sentence should be reorder? >> dma_as = pci_device_iommu_address_space(pci_dev); >> pci_dev->devfn = devfn; > > Looks like. Give it a try, then possibly send a patch :) I reorder these two sentences and get the print log like this: vtd bus 0 slot 31 func 0 devfn 248 vtd bus 0 slot 31 func 2 devfn 250 vtd bus 0 slot 31 func 3 devfn 251 vtd bus 0 slot 1 func 0 devfn 8 vtd bus 0 slot 2 func 0 devfn 16
The "info pci" output is here: (qemu) info pci Bus 0, device 0, function 0: Host bridge: PCI device 8086:29c0 id "" Bus 0, device 1, function 0: VGA controller: PCI device 1013:00b8 BAR0: 32 bit prefetchable memory at 0xfc000000 [0xfdffffff]. BAR1: 32 bit memory at 0xfebf0000 [0xfebf0fff]. BAR6: 32 bit memory at 0xffffffffffffffff [0x0000fffe]. id "" Bus 0, device 2, function 0: Ethernet controller: PCI device 8086:100e IRQ 11. BAR0: 32 bit memory at 0xfebc0000 [0xfebdffff]. BAR1: I/O at 0xc000 [0xc03f]. BAR6: 32 bit memory at 0xffffffffffffffff [0x0003fffe]. id "" Bus 0, device 31, function 0: ISA bridge: PCI device 8086:2918 id "" Bus 0, device 31, function 2: SATA controller: PCI device 8086:2922 IRQ 10. BAR4: I/O at 0xc080 [0xc09f]. BAR5: 32 bit memory at 0xfebf1000 [0xfebf1fff]. id "" Bus 0, device 31, function 3: SMBus: PCI device 8086:2930 IRQ 10. BAR4: I/O at 0x0700 [0x073f]. id "" So maybe it is all right now? And I will go on the vtd emulation.:) Thanks very much! > Jan >