From patchwork Thu Oct 2 02:13:38 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Deucher X-Patchwork-Id: 5015231 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: patchwork-linux-pci@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 7B5DEBEEA6 for ; Thu, 2 Oct 2014 02:13:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D679E20259 for ; Thu, 2 Oct 2014 02:13:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 956382020F for ; Thu, 2 Oct 2014 02:13:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751102AbaJBCNj (ORCPT ); Wed, 1 Oct 2014 22:13:39 -0400 Received: from mail-qc0-f170.google.com ([209.85.216.170]:42711 "EHLO mail-qc0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750868AbaJBCNj (ORCPT ); Wed, 1 Oct 2014 22:13:39 -0400 Received: by mail-qc0-f170.google.com with SMTP id m20so1508824qcx.1 for ; Wed, 01 Oct 2014 19:13:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=tFHiSppAyFErQY2lZv48JRRGhsGaqrb82W5lbQ3Trtg=; b=eyoLTJbJWLFrH2QYyW5u5pgEZrcex3/tDuN7raqbevwDYzBL/+yMFx1vAL7fVFDwvw KCmz2dmIlUsjXfUCo+1KP10nGQDgHtH3Pj06lEzsI2R2PpuiYa774CRYNNhAdd12TdmG 3YJDfnmMCaRypLtf46XN7tgW8guWGojKLxa1b2jU9skvwJU3ZRdGmaE4ETQjYuVjDz1t bHz6qn/6eCvoxpCKp75FXMoMH8oPOHWTjX2wiOLQscfogITOKn5/Kpm8t/FM/iQrAspr YNhUZu1wGIRXjUthWXwHaYvxCQZIjbK8izggmGOafzIhHOT2dshpfhjtYSUa/aBKewJA rfgQ== MIME-Version: 1.0 X-Received: by 10.140.82.230 with SMTP id h93mr4848235qgd.44.1412216018502; Wed, 01 Oct 2014 19:13:38 -0700 (PDT) Received: by 10.140.20.118 with HTTP; Wed, 1 Oct 2014 19:13:38 -0700 (PDT) In-Reply-To: <1412210082.10667.2.camel@pasglop> References: <1412210082.10667.2.camel@pasglop> Date: Wed, 1 Oct 2014 22:13:38 -0400 Message-ID: Subject: Re: [PATCH v2 3/4] sound/radeon: Move 64-bit MSI quirk from arch to driver From: Alex Deucher To: Benjamin Herrenschmidt Cc: Bjorn Helgaas , Dave Airlie , Brian King , Takashi Iwai , Linux PCI , Yijing Wang , Anton Blanchard , linuxppc-dev@ozlabs.org Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, T_TVD_MIME_EPI, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On Wed, Oct 1, 2014 at 8:34 PM, Benjamin Herrenschmidt wrote: > > A number of radeon cards have a HW limitation causing them to be > unable to generate the full 64-bit of address bits for MSIs. This > breaks MSIs on some platforms such as POWER machines. > > We used to have a powerpc specific quirk to address that on a > single card, but this doesn't scale very well, this is better > put under control of the drivers who know precisely what a given > HW revision can do. > > This moves the setting of the quirk flag to the audio driver. > > While recent ASICs have that problem fixed, they don't seem to > be listed in the PCI IDs of the current driver, so let's quirk all > the ATI HDMI for now. The consequences are nil on x86 anyway. > > Signed-off-by: Benjamin Herrenschmidt > CC: The attached updated patch only flags the affected asics. Alex > --- > arch/powerpc/kernel/pci_64.c | 6 ------ > sound/pci/hda/hda_intel.c | 10 ++++++++-- > sound/pci/hda/hda_priv.h | 1 + > 3 files changed, 9 insertions(+), 8 deletions(-) > > diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c > index 5330f6d..b15194e 100644 > --- a/arch/powerpc/kernel/pci_64.c > +++ b/arch/powerpc/kernel/pci_64.c > @@ -266,9 +266,3 @@ int pcibus_to_node(struct pci_bus *bus) > } > EXPORT_SYMBOL(pcibus_to_node); > #endif > - > -static void quirk_radeon_32bit_msi(struct pci_dev *dev) > -{ > - dev->no_64bit_msi = true; > -} > -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0xaa68, quirk_radeon_32bit_msi); > diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c > index aa302fb..f91ba7f 100644 > --- a/sound/pci/hda/hda_intel.c > +++ b/sound/pci/hda/hda_intel.c > @@ -296,7 +296,8 @@ enum { > > /* quirks for ATI/AMD HDMI */ > #define AZX_DCAPS_PRESET_ATI_HDMI \ > - (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB) > + (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB|\ > + AZX_DCAPS_NO_MSI64) > > /* quirks for Nvidia */ > #define AZX_DCAPS_PRESET_NVIDIA \ > @@ -1505,9 +1506,14 @@ static int azx_first_init(struct azx *chip) > return -ENXIO; > } > > - if (chip->msi) > + if (chip->msi) { > + if (chip->driver_caps & AZX_DCAPS_NO_MSI64) { > + dev_dbg(card->dev, "Disabling 64bit MSI\n"); > + pci->no_64bit_msi = true; > + } > if (pci_enable_msi(pci) < 0) > chip->msi = 0; > + } > > if (azx_acquire_irq(chip, 0) < 0) > return -EBUSY; > diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h > index 949cd43..5016014 100644 > --- a/sound/pci/hda/hda_priv.h > +++ b/sound/pci/hda/hda_priv.h > @@ -171,6 +171,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; > #define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */ > #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ > #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */ > +#define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */ > > /* HD Audio class code */ > #define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403 > > > > Reviewed-by: Takashi Iwai Signed-off-by: Alex Deucher From 412fce0929558602a43a41feab051c4cf73c7142 Mon Sep 17 00:00:00 2001 From: Benjamin Herrenschmidt Date: Thu, 2 Oct 2014 10:34:42 +1000 Subject: [PATCH] sound/radeon: Move 64-bit MSI quirk from arch to driver (v2) A number of radeon cards have a HW limitation causing them to be unable to generate the full 64-bit of address bits for MSIs. This breaks MSIs on some platforms such as POWER machines. We used to have a powerpc specific quirk to address that on a single card, but this doesn't scale very well, this is better put under control of the drivers who know precisely what a given HW revision can do. This moves the setting of the quirk flag to the audio driver. While recent ASICs have that problem fixed, they don't seem to be listed in the PCI IDs of the current driver, so let's quirk all the ATI HDMI for now. The consequences are nil on x86 anyway. v2: Alex Deucher: only quirk the affected asics Signed-off-by: Benjamin Herrenschmidt CC: --- arch/powerpc/kernel/pci_64.c | 6 --- sound/pci/hda/hda_intel.c | 96 +++++++++++++++++++++++++++++++------------- sound/pci/hda/hda_priv.h | 1 + 3 files changed, 69 insertions(+), 34 deletions(-) diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 5330f6d..b15194e 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c @@ -266,9 +266,3 @@ int pcibus_to_node(struct pci_bus *bus) } EXPORT_SYMBOL(pcibus_to_node); #endif - -static void quirk_radeon_32bit_msi(struct pci_dev *dev) -{ - dev->no_64bit_msi = true; -} -DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0xaa68, quirk_radeon_32bit_msi); diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index aa302fb..4896f25 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -1505,9 +1505,14 @@ static int azx_first_init(struct azx *chip) return -ENXIO; } - if (chip->msi) + if (chip->msi) { + if (chip->driver_caps & AZX_DCAPS_NO_MSI64) { + dev_dbg(card->dev, "Disabling 64bit MSI\n"); + pci->no_64bit_msi = true; + } if (pci_enable_msi(pci) < 0) chip->msi = 0; + } if (azx_acquire_irq(chip, 0) < 0) return -EBUSY; @@ -2062,58 +2067,93 @@ static const struct pci_device_id azx_ids[] = { { PCI_DEVICE(0x1022, 0x780d), .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB }, /* ATI HDMI */ - { PCI_DEVICE(0x1002, 0x793b), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + { PCI_DEVICE(0x1002, 0x1314), + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0x7919), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, + { PCI_DEVICE(0x1002, 0x7969), + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, + { PCI_DEVICE(0x1002, 0x793b), + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0x960f), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, + { PCI_DEVICE(0x1002, 0x9646), + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0x970f), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa00), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa08), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa10), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa18), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa20), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa28), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa30), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa38), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa40), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa48), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa50), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa58), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa60), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa68), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa80), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa88), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa90), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaa98), - .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0x9902), - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaaa0), - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaaa8), - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, { PCI_DEVICE(0x1002, 0xaab0), - .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI }, + .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI | + AZX_DCAPS_NO_MSI64 }, /* VIA VT8251/VT8237A */ { PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA }, diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h index 949cd43..5016014 100644 --- a/sound/pci/hda/hda_priv.h +++ b/sound/pci/hda/hda_priv.h @@ -171,6 +171,7 @@ enum { SDI0, SDI1, SDI2, SDI3, SDO0, SDO1, SDO2, SDO3 }; #define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */ #define AZX_DCAPS_I915_POWERWELL (1 << 27) /* HSW i915 powerwell support */ #define AZX_DCAPS_CORBRP_SELF_CLEAR (1 << 28) /* CORBRP clears itself after reset */ +#define AZX_DCAPS_NO_MSI64 (1 << 29) /* Stick to 32-bit MSIs */ /* HD Audio class code */ #define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403 -- 1.8.3.1