From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Michael S. Tsirkin" Subject: Re: [PATCH] qemu-kvm: device assignment: add 82599 PCIe Cap struct quirk Date: Sun, 2 Oct 2011 11:56:35 +0200 Message-ID: <20111002095634.GG29706@redhat.com> References: <1317255633-61967-1-git-send-email-ddutile@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: avi@redhat.com, mtosatti@redhat.com, kvm@vger.kernel.org, chrisw@redhat.com To: Donald Dutile Return-path: Received: from mx1.redhat.com ([209.132.183.28]:56993 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752132Ab1JBJz0 (ORCPT ); Sun, 2 Oct 2011 05:55:26 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p929tQKJ030751 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Sun, 2 Oct 2011 05:55:26 -0400 Content-Disposition: inline In-Reply-To: <1317255633-61967-1-git-send-email-ddutile@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On Wed, Sep 28, 2011 at 08:20:33PM -0400, Donald Dutile wrote: > commit f9c29774d2174df6ffc20becec20928948198914 > changed the PCIe Capability structure version check > from if > 2 fail, to if ==1, size=x, if ==2, size=y, > else fail. > Turns out the 82599's VF has an errata where it's > PCIe Cap struct version is 0, which now fails device assignment > due to the else fallout, where before, it would blissfully work. > > Add a quirk if version=0, & intel-82599, set size to version 2 struct. > > Signed-off-by: Donald_Dutile Makes sense. Nit: please use PCI_VENDOR_ID_INTEL instead of 0x8086 below. > --- > hw/device-assignment.c | 12 ++++++++++-- > 1 files changed, 10 insertions(+), 2 deletions(-) > > diff --git a/hw/device-assignment.c b/hw/device-assignment.c > index 288f80c..ed2a883 100644 > --- a/hw/device-assignment.c > +++ b/hw/device-assignment.c > @@ -1261,12 +1261,20 @@ static int assigned_device_pci_cap_init(PCIDevice *pci_dev) > > if ((pos = pci_find_cap_offset(pci_dev, PCI_CAP_ID_EXP, 0))) { > uint8_t version, size; > - uint16_t type, devctl, lnkcap, lnksta; > + uint16_t type, devctl, lnkcap, lnksta, vendor, device; > uint32_t devcap; > > + vendor = pci_get_word(pci_dev->config + PCI_VENDOR_ID); > + device = pci_get_word(pci_dev->config + PCI_DEVICE_ID); > version = pci_get_byte(pci_dev->config + pos + PCI_EXP_FLAGS); > version &= PCI_EXP_FLAGS_VERS; > - if (version == 1) { > + if (version == 0 && vendor == 0x8086 && device == 0x10ed) { I'd also make version == 0 last test in the list to stress the fact this is a device specific quirk, but that's a matter of taste ... > + /* > + * quirk for Intel 82599 VF with invalid PCIe capability version, > + * should really be version 2 (same as PF) > + */ > + size = 0x3c; > + } else if (version == 1) { > size = 0x14; > } else if (version == 2) { > /* > -- > 1.7.1