Received: by 10.223.185.116 with SMTP id b49csp6078619wrg; Thu, 8 Mar 2018 01:12:07 -0800 (PST) X-Google-Smtp-Source: AG47ELvdWCRyRAlhL+GZC4MFZWE6CMk4B22cT5/9jRNxSrX3S6tt+d+RtC8l6vHzgI52GKwvdVJn X-Received: by 10.101.76.13 with SMTP id u13mr20085520pgq.287.1520500326974; Thu, 08 Mar 2018 01:12:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1520500326; cv=none; d=google.com; s=arc-20160816; b=Ilx/BjkuVX3kAqaozVouy1RQ4vgUh2jITvoIakAozfsDoOK1swBKMKAILPMI2v2P0r Ugp9HCbkiSvv7KAC0KyS3N9lRc7P6Pl5oj5ArFjET1dxe8TsOnMJi/zJEIwzhg5A21rJ JYmjfFi9I3YdYqr+BOMRcbJS1hXa6EJW+SNZN6L1UXrov3jfRwVCH3zVl9klInr2bzhC LScSe1SLJiJk+0ue6zxjrranhWo6LCvYN1k/q1ZNYDezLRyjnC6viCxr1yziZju44qXY YYRjUY806t9TyRGirm1QPaC7bYQpqFYCtIOaMZNIL3V1Ue/UmgGQVa8kJiwoeCvTpEMR Z65w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=4Y81TxfjlRsymEW7EkS+4TofCxiGn28t1QJEC89mYNA=; b=G5X49yl/jTqUK1vwU55XBhTloMIx8g8Q55G1BLTNpIghkumZsSuyVEyJlHZBjdQGsM zOAsOxucHP7j5ip5kdA3ci3O2bznogrggnV3xg9g2PIy8nfeHa5ofNza9pcGJEyEEyhC mVGr0W6/9bX/UUxJkhzbD1kBh1QdVxoa5k20jrPcTA68Jt2u8804QLt6PTtCkG3CLaV/ /W19E2TINQ3mmnYkmvTMvbebx1JSiphH1fNL8XzoiTwFUAeIjeLMvCav1IVOkSxjl1cL s9ZXYXADjizU06qu/YZJm1bN4zgwbHoR8bH+DfTHI6rB58YaWgHVPhwFeqn8So72U519 l2Nw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r8-v6si14351395plo.128.2018.03.08.01.11.52; Thu, 08 Mar 2018 01:12:06 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935381AbeCHJKu (ORCPT + 99 others); Thu, 8 Mar 2018 04:10:50 -0500 Received: from youngberry.canonical.com ([91.189.89.112]:46098 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933516AbeCHJKl (ORCPT ); Thu, 8 Mar 2018 04:10:41 -0500 Received: from [175.41.48.77] (helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1etrZK-0003jn-BU; Thu, 08 Mar 2018 09:10:35 +0000 From: Kai-Heng Feng To: mjg59@srcf.ucam.org, pali.rohar@gmail.com, dvhart@infradead.org, andy@infradead.org, mario.limonciello@dell.com, tiwai@suse.com Cc: platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, alsa-devel@alsa-project.org, Kai-Heng Feng Subject: [PATCH v2 3/3] ALSA: hda: Disabled unused audio controller for Dell platforms with Switchable Graphics Date: Thu, 8 Mar 2018 17:10:23 +0800 Message-Id: <20180308091023.9061-3-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180308091023.9061-1-kai.heng.feng@canonical.com> References: <20180308091023.9061-1-kai.heng.feng@canonical.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some Dell platforms (Preicsion 7510/7710/7520/7720) have a BIOS option "Switchable Graphics" (SG). When SG is enabled, we have: 00:02.0 VGA compatible controller: Intel Corporation Device 591b (rev 04) 00:1f.3 Audio device: Intel Corporation CM238 HD Audio Controller (rev 31) 01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Polaris10] 01:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 580] The Intel Audio outputs all the sound, including HDMI audio. The audio controller comes with AMD graphics doesn't get used. When SG is disabled, we have: 00:1f.3 Audio device: Intel Corporation CM238 HD Audio Controller (rev 31) 01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Polaris10] 01:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 580] Now it's a typical discrete-only system. HDMI audio comes from AMD audio controller, others from Intel audio controller. When SG is enabled, the unused AMD audio controller still exposes its sysfs, so userspace still opens the control file and stream. If userspace tries to output sound through the stream, it hangs when runtime suspend kicks in: [ 12.796265] snd_hda_intel 0000:01:00.1: Disabling via vga_switcheroo [ 12.796367] snd_hda_intel 0000:01:00.1: Cannot lock devices! Since the discrete audio controller isn't useful when SG enabled, we should just disable the device. Signed-off-by: Kai-Heng Feng --- v2: Mario suggested to squash the HDA part into the same series. sound/pci/hda/hda_intel.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 96143df19b21..8e3e8b88624a 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -49,6 +49,7 @@ #include #include #include +#include #ifdef CONFIG_X86 /* for snoop control */ @@ -1620,6 +1621,35 @@ static void check_msi(struct azx *chip) } } +#if IS_ENABLED(CONFIG_DELL_LAPTOP) +static bool check_dell_switchable_gfx(struct pci_dev *pdev) +{ + static int (*dell_switchable_gfx_enabled_func)(bool *); + bool enabled; + int err; + + if (pdev->vendor != PCI_VENDOR_ID_ATI || + pdev->subsystem_vendor != PCI_VENDOR_ID_DELL) + return false; + + dell_switchable_gfx_enabled_func = + symbol_request(dell_switchable_gfx_enabled); + if (!dell_switchable_gfx_enabled_func) + return false; + + err = dell_switchable_gfx_enabled_func(&enabled); + + symbol_put(dell_switchable_gfx_enabled); + + return !err ? enabled : false; +} +#else +static bool check_dell_switchable_gfx(struct pci_dev *pdev) +{ + return false; +} +#endif + /* check the snoop mode availability */ static void azx_check_snoop_available(struct azx *chip) { @@ -1702,6 +1732,11 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, if (err < 0) return err; + if (check_dell_switchable_gfx(pci)) { + pci_disable_device(pci); + return -ENODEV; + } + hda = kzalloc(sizeof(*hda), GFP_KERNEL); if (!hda) { pci_disable_device(pci); -- 2.15.1