Received: by 10.192.165.156 with SMTP id m28csp1797171imm; Thu, 12 Apr 2018 03:46:25 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+0mHoXB/rEZ6972/cKEeXd52/i7Md4FA6b6bWkkk5Rxu9//dJa5yamWvZRaxh1S97NunDX X-Received: by 10.99.107.65 with SMTP id g62mr310362pgc.180.1523529985813; Thu, 12 Apr 2018 03:46:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523529985; cv=none; d=google.com; s=arc-20160816; b=Mgjs9h2AL91jwZPYhlaHAJTq/6ulgBcDphEpquPYd1Q7BkwXq3GqJIGLD1D1XMJzGn 6+PWSsB1Ap2/Nqt2tchS2EfAqS1zvMRpcxo0duXrTMLT/DykzAMIQdO90BDaEg102848 RDXA9Hc1cf7sVJdhiVqQUwhs/0zJNAnIKhQJRQKX/bqX4rX4pJkldBLNVMTbV48vLaCG 30ly4OTAVEDUFnfRyhbgd/2NH3xQVQevdVXDugTKI7//tOgOUMua2Zs2T/eB8w6PhTkE MTOlhXOcjGAVUi2KYJF9Zd75CXtJFQ6W5XRGEY5vg6B7QgvSf0k4nSc/5pm/VA1CANp1 vIfQ== 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=TZQ3Y1KGUVWbaWu1v8E956O9o4R20tvx5UifN1e++kM=; b=BTuY9bWX10VAX2VIdoR09BQ3R1tbfS7Ye1xEco77vZX2rf9khv5THLZEwf5URbGiwp 8kdxaX+fZw4rdBlPKoRQvCxhtBJ5x+1LtikmY+fpLicpDLhhTiOF3kIFOA29s8XjWCxO 98BAmz6T8X7tuqKD2riZ/TUsomEiEGjijQPyljn3B4gsUkVnmnEJEFYKQTHSxCzoGetI 9xYJFuDxwogLec1nb7VJ0q/W/1SyIZtkYwwbCjxivnq7Wa4wod/RdIwJfwKzZO73GKG5 zmZONF2SZ3VA5ZJ2QahK9FAb8H9DEls04J5EFVhs2ZVvB6cJREEARk+EmrFVuCU9Unit 7WSg== 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 c3si2035794pgu.785.2018.04.12.03.45.49; Thu, 12 Apr 2018 03:46:25 -0700 (PDT) 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 S1752879AbeDLKnC (ORCPT + 99 others); Thu, 12 Apr 2018 06:43:02 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:36488 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752746AbeDLKnA (ORCPT ); Thu, 12 Apr 2018 06:43:00 -0400 Received: from 2.general.khfeng.us.vpn ([10.172.68.175] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1f6Zgq-0003bw-3S; Thu, 12 Apr 2018 10:42:52 +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 v3 3/3] ALSA: hda: Disabled unused audio controller for Dell platforms with Switchable Graphics Date: Thu, 12 Apr 2018 18:42:39 +0800 Message-Id: <20180412104239.25584-3-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180412104239.25584-1-kai.heng.feng@canonical.com> References: <20180412104239.25584-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 --- v3: Simplify dell_switchable_gfx_is_enabled() by returning bool instead of error code. Use DMI_DEV_TYPE_OEM_STRING to match Dell System. v2: Mario suggested to squash the HDA part into the same series. sound/pci/hda/hda_intel.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 7720e3102bcc..d9310616d5ca 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -49,6 +49,8 @@ #include #include #include +#include +#include #ifdef CONFIG_X86 /* for snoop control */ @@ -1629,6 +1631,38 @@ static void check_msi(struct azx *chip) } } +#if IS_ENABLED(CONFIG_DELL_LAPTOP) +static bool check_dell_switchable_gfx(struct pci_dev *pdev) +{ + bool (*dell_switchable_gfx_is_enabled_func)(void); + bool enabled; + + /* Only need to check for Dell laptops and AIOs */ + if (!dmi_find_device(DMI_DEV_TYPE_OEM_STRING, "Dell System", NULL) || + !(dmi_match(DMI_CHASSIS_TYPE, "10") || + dmi_match(DMI_CHASSIS_TYPE, "13")) || + !(pdev->vendor == PCI_VENDOR_ID_ATI || + pdev->vendor == PCI_VENDOR_ID_NVIDIA)) + return false; + + dell_switchable_gfx_is_enabled_func = + symbol_request(dell_switchable_gfx_is_enabled); + if (!dell_switchable_gfx_is_enabled_func) + return false; + + enabled = dell_switchable_gfx_is_enabled_func(); + + symbol_put(dell_switchable_gfx_is_enabled); + + return enabled; +} +#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) { @@ -1711,6 +1745,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.17.0