qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] Why devfn will be -1


From: Le Tan
Subject: Re: [Qemu-devel] Why devfn will be -1
Date: Tue, 1 Jul 2014 21:02:50 +0800

2014-07-01 20:56 GMT+08:00 Jan Kiszka <address@hidden>:
> On 2014-07-01 14:55, Le Tan wrote:
>> 2014-07-01 20:52 GMT+08:00 Le Tan <address@hidden>:
>>> Hi Jan,
>>>
>>> 2014-07-01 15:34 GMT+08:00 Jan Kiszka <address@hidden>:
>>>> 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
>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]