Received: by 10.192.165.148 with SMTP id m20csp46032imm; Fri, 20 Apr 2018 02:46:19 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+MgElDv7MEoe0BdA8Jd+BU78I1d9tk1hRUZVsbz6ZkxdYTh3NzhvEcynZnkUx857C+ENS+ X-Received: by 10.99.120.202 with SMTP id t193mr8028407pgc.255.1524217579353; Fri, 20 Apr 2018 02:46:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524217579; cv=none; d=google.com; s=arc-20160816; b=LqXHb2KOZtFIte2pdLrqaiBwuJYmQAXr2zbUs0eKYLcrfOZWqH/kpTbgSiCik6jymO MlUDV/KD9XeAyPfjISNiJUvFQMbKH/aebaYgM8UQd2JzKdAwfitt2LFxCaBx/F0dgWhK CflCvCt+x+uwnzBP1ovXjsFqrziwZLrvztaJ0KHoKfPxY3z1ZmLsbm7kN9AvAmjqVbrU fak21wfkpqgx1VSHKOTzA4yeF29SmVIRaVBdVjhtYYsBgHpd/ua3QAQBBgkWwaiK1qCk ohAc5NO1tMz6R828B4I0DKbMbZ2qU0Kd4Nf7DgMBo/x5cAl47L0LVztSsgyMMCI8VzLt KsHw== 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=6qaDuCVniU3/L/pmSZf95s+c0Jmb+BoAlPPIh/sRB9M=; b=JFfxR3uL0BRbWHHcgbjUm+NkPsLWqFdPXD1wvt1bTuDpXgH7U6s+BD5QemhHylGsKr 3NrZQ9ap581scXIYoolHCvy7z47/vtzqhXWRl/Pzh2syk3Mf3NMn18IFAlGK4//Wra0R IHuMeBBLoeDvSlQ/7u844QiEPwp/IOmTu4fKz4+4rgTSFNhf1jOYLN5/OYtzpfzxl7Dr f8e/4Q+tjGyBczgdOpWxn1QdtACPi7jJuvszQewzw9VXQpGN0fgGjMDbvDv7mYLA39Zp khGuMtBG9ZrpOY9fT0a72KWfzLBcIrPphnnLlQikGCwD/85zZWlwrIxyYNQeVPL42+Zm wkZA== 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 m65si5141199pfc.9.2018.04.20.02.46.05; Fri, 20 Apr 2018 02:46:19 -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 S1754514AbeDTJoy (ORCPT + 99 others); Fri, 20 Apr 2018 05:44:54 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:41257 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754476AbeDTJow (ORCPT ); Fri, 20 Apr 2018 05:44:52 -0400 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 1f9Say-0006Zu-D2; Fri, 20 Apr 2018 09:44:45 +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 v4 3/3] ALSA: hda: Disabled unused audio controller for Dell platforms with Switchable Graphics Date: Fri, 20 Apr 2018 17:44:32 +0800 Message-Id: <20180420094432.13133-3-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180420094432.13133-1-kai.heng.feng@canonical.com> References: <20180420094432.13133-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 contoller still exposes its sysfs, so userspace still opens the control file and stream. If userspace tries to output sound through the stream, it hangs the system. Since the discrete audio controller isn't useful when SG is enabled, we should just disable the device. Signed-off-by: Kai-Heng Feng --- v4: Change the commit message to clarify there's no more runtime pm warning. Also skip the check for thunderbolt attached devices. 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 | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 7a111a1b5836..3981193c8d29 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 */ @@ -1627,6 +1629,42 @@ 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; + + /* Thunderbolt devices won't be switchable */ + if (pci_is_thunderbolt_attached(pdev)) + return false; + + /* Only 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) { @@ -1709,6 +1747,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