From mboxrd@z Thu Jan 1 00:00:00 1970 From: Don Dutile Subject: Re: [PATCH] qemu-kvm: device assignment: add 82599 PCIe Cap struct quirk Date: Mon, 03 Oct 2011 13:02:32 -0400 Message-ID: <4E89EAA8.9080008@redhat.com> References: <1317255633-61967-1-git-send-email-ddutile@redhat.com> <20111002095634.GG29706@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: avi@redhat.com, mtosatti@redhat.com, kvm@vger.kernel.org, chrisw@redhat.com To: "Michael S. Tsirkin" Return-path: Received: from mx1.redhat.com ([209.132.183.28]:10863 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756963Ab1JCRCg (ORCPT ); Mon, 3 Oct 2011 13:02:36 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p93H2Zdf026074 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 3 Oct 2011 13:02:36 -0400 In-Reply-To: <20111002095634.GG29706@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 10/02/2011 05:56 AM, Michael S. Tsirkin wrote: > 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. > good idea.... read more 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 ... > given this is the odd case, yes, i agree. will repost a new patch w/recommended changes. pushed this up do to desire to fix sooner than later, but another day won't matter given it's been this way for a couple months! >> + /* >> + * 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