Skip to content

Commit

Permalink
ALSA: hda: intel: Add Lenovo IdeaPad Z570 to probe denylist
Browse files Browse the repository at this point in the history
Lenovo IdeaPad Z570 with NVIDIA GeForce Ge 540M doesn't have sound on
the discrete GPU. The HDA controller in DGPU is disabled by BIOS, but
then reenabled by quirk_nvidia_hda(). The probe fails and ends up with
the "GPU sound probed, but not operational" error.

Add this laptop to DMI-based denylist to prevent probe early. DMI is
used, because the audio device has zero subsystem IDs, and this entry
would be too much, blocking all 540M chips:
    PCI_DEVICE_SUB(0x10de, 0x0bea, 0x0000, 0x0000)
Also, this laptop comes in a variety of modifications with different
NVIDIA GPUs, so the DMI check will cover them all.

Signed-off-by: Maxim Mikityanskiy <maxtram95@gmail.com>
Link: https://patch.msgid.link/20250208214602.39607-3-maxtram95@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Maxim Mikityanskiy authored and Takashi Iwai committed Feb 10, 2025
1 parent 2b360ba commit becc794
Showing 1 changed file with 29 additions and 0 deletions.
29 changes: 29 additions & 0 deletions sound/pci/hda/hda_intel.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#include <linux/completion.h>
#include <linux/acpi.h>
#include <linux/pgtable.h>
#include <linux/dmi.h>

#ifdef CONFIG_X86
/* for snoop control */
Expand Down Expand Up @@ -2074,6 +2075,27 @@ static const struct pci_device_id driver_denylist[] = {
{}
};

static struct pci_device_id driver_denylist_ideapad_z570[] = {
{ PCI_DEVICE_SUB(0x10de, 0x0bea, 0x0000, 0x0000) }, /* NVIDIA GF108 HDA */
{}
};

/* DMI-based denylist, to be used when:
* - PCI subsystem IDs are zero, impossible to distinguish from valid sound cards.
* - Different modifications of the same laptop use different GPU models.
*/
static const struct dmi_system_id driver_denylist_dmi[] = {
{
/* No HDA in NVIDIA DGPU. BIOS disables it, but quirk_nvidia_hda() reenables. */
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Ideapad Z570"),
},
.driver_data = &driver_denylist_ideapad_z570,
},
{}
};

static const struct hda_controller_ops pci_hda_ops = {
.disable_msi_reset_irq = disable_msi_reset_irq,
.position_check = azx_position_check,
Expand All @@ -2084,6 +2106,7 @@ static DECLARE_BITMAP(probed_devs, SNDRV_CARDS);
static int azx_probe(struct pci_dev *pci,
const struct pci_device_id *pci_id)
{
const struct dmi_system_id *dmi;
struct snd_card *card;
struct hda_intel *hda;
struct azx *chip;
Expand All @@ -2096,6 +2119,12 @@ static int azx_probe(struct pci_dev *pci,
return -ENODEV;
}

dmi = dmi_first_match(driver_denylist_dmi);
if (dmi && pci_match_id(dmi->driver_data, pci)) {
dev_info(&pci->dev, "Skipping the device on the DMI denylist\n");
return -ENODEV;
}

dev = find_first_zero_bit(probed_devs, SNDRV_CARDS);
if (dev >= SNDRV_CARDS)
return -ENODEV;
Expand Down

0 comments on commit becc794

Please sign in to comment.