From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yu Zhao Subject: Re: [PATCH] Dom0 PCI: fix SR-IOV function dependency link problem Date: Thu, 04 Jun 2009 20:38:16 +0800 Message-ID: <4A27C038.3070102@intel.com> References: <4A260D0E.1010703@intel.com> <20090604053353.GS9176%yamahata@valinux.co.jp> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20090604053353.GS9176%yamahata@valinux.co.jp> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Isaku Yamahata Cc: "xen-devel@lists.xensource.com" , "keir.fraser@eu.citrix.com" List-Id: xen-devel@lists.xenproject.org Isaku Yamahata wrote: > On Wed, Jun 03, 2009 at 01:41:34PM +0800, Yu Zhao wrote: >> PCIe Root Complex Integrated Endpoint does not implement ARI, so this >> kind of endpoint uses 3-bit function number. The function dependency >> link of the integrated endpoint should be calculated using the device >> number field in conjunction with the value from function dependency >> link register. >> >> Normal SR-IOV endpoint always implements ARI and the function dependency >> link register contains 8-bit function number (i.e. `devfn' from software >> perspective). >> >> Signed-off-by: Yu Zhao > >> # HG changeset patch >> # User Yu Zhao >> # Date 1244007161 -28800 >> # Node ID 3a959a6975152b741389d2eed1823d55be4f2889 >> # Parent ec3442c2ed48eb11fcacd3fe31af48932f0a6645 >> PCI: fix SR-IOV function dependency link problem >> >> PCIe Root Complex Integrated Endpoint does not implement ARI, so this >> kind of endpoint uses 3-bit function number. The function dependency >> link of the integrated endpoint should be calculated using the device >> number field in conjunction with the value from function dependency >> link register. >> >> Normal SR-IOV endpoint always implements ARI and the function dependency >> link register contains 8-bit function number (i.e. `devfn' from software >> perspective). >> >> Signed-off-by: Yu Zhao >> >> diff -r ec3442c2ed48 -r 3a959a697515 drivers/pci/iov.c >> --- a/drivers/pci/iov.c Wed Jun 03 13:30:08 2009 +0800 >> +++ b/drivers/pci/iov.c Wed Jun 03 13:32:41 2009 +0800 >> @@ -366,6 +366,8 @@ >> iov->self = dev; >> pci_read_config_dword(dev, pos + PCI_SRIOV_CAP, &iov->cap); >> pci_read_config_byte(dev, pos + PCI_SRIOV_FUNC_LINK, &iov->link); >> + if (!dev->bus->number) /* Root Complex Integrated Endpoint */ >> + iov->link = PCI_DEVFN(PCI_SLOT(dev->devfn), iov->link); >> >> if (pdev) >> iov->dev = pci_dev_get(pdev); > > Possibly the above check may work. > But pci capability list should be examined. > something like > rpcap = pci_find_capability(pdev, PCI_CAP_ID_EXP); > if (!rpcap) > pci_read_config_word(pdev, rpcap + PCI_CAP_FLAGS, &cap); > if (cap == PCI_EXP_TYPE_RC_END) It will works well since the capability check is already done before doing anything else: int pci_iov_init(struct pci_dev *dev) { int pos; pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_SRIOV); if (pos) return sriov_init(dev, pos); return -ENODEV; } Thanks, Yu