From a5544d0a215ae88af0bc8c0bebb1b6112fd2218b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Fri, 28 Feb 2020 10:29:55 +0100 Subject: [PATCH] hda: disable TCSEL on ATI/AMD for non-hmdi MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit also disable MSI with C-MEDIA 0x5011 (reference alsa) Change-Id: I51e0b8f046df13a23a0b39998e4155a2ec40f5f2 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2290 Reviewed-by: Jérôme Duval --- .../drivers/audio/hda/hda_controller.cpp | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp index f778a9ef8d..c69fd31c1f 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp @@ -37,6 +37,7 @@ #define PCI_VENDOR_ATI 0x1002 #define PCI_VENDOR_AMD 0x1022 #define PCI_VENDOR_CREATIVE 0x1102 +#define PCI_VENDOR_CMEDIA 0x13f6 #define PCI_VENDOR_INTEL 0x8086 #define PCI_VENDOR_NVIDIA 0x10de #define PCI_VENDOR_VMWARE 0x15ad @@ -46,6 +47,7 @@ #define HDA_QUIRK_SNOOP 0x0001 #define HDA_QUIRK_NO_MSI 0x0002 #define HDA_QUIRK_NO_CORBRP_RESET_ACK 0x0004 +#define HDA_QUIRK_NOTCSEL 0x0008 static const struct { @@ -92,17 +94,18 @@ static const struct { { PCI_VENDOR_INTEL, 0xa2f0, HDA_QUIRK_SNOOP }, { PCI_VENDOR_INTEL, 0xa348, HDA_QUIRK_SNOOP }, { PCI_VENDOR_INTEL, 0xa3f0, HDA_QUIRK_SNOOP }, - { PCI_VENDOR_ATI, 0x437b, HDA_QUIRK_SNOOP }, - { PCI_VENDOR_ATI, 0x4383, HDA_QUIRK_SNOOP }, - { PCI_VENDOR_AMD, 0x157a, HDA_QUIRK_SNOOP }, - { PCI_VENDOR_AMD, 0x780d, HDA_QUIRK_SNOOP }, - { PCI_VENDOR_AMD, 0x1457, HDA_QUIRK_SNOOP }, - { PCI_VENDOR_AMD, 0x1487, HDA_QUIRK_SNOOP }, - { PCI_VENDOR_AMD, 0x15e3, HDA_QUIRK_SNOOP }, + { PCI_VENDOR_ATI, 0x437b, HDA_QUIRK_SNOOP | HDA_QUIRK_NOTCSEL }, + { PCI_VENDOR_ATI, 0x4383, HDA_QUIRK_SNOOP | HDA_QUIRK_NOTCSEL }, + { PCI_VENDOR_AMD, 0x157a, HDA_QUIRK_SNOOP | HDA_QUIRK_NOTCSEL }, + { PCI_VENDOR_AMD, 0x780d, HDA_QUIRK_SNOOP | HDA_QUIRK_NOTCSEL }, + { PCI_VENDOR_AMD, 0x1457, HDA_QUIRK_SNOOP | HDA_QUIRK_NOTCSEL }, + { PCI_VENDOR_AMD, 0x1487, HDA_QUIRK_SNOOP | HDA_QUIRK_NOTCSEL }, + { PCI_VENDOR_AMD, 0x15e3, HDA_QUIRK_SNOOP | HDA_QUIRK_NOTCSEL }, // Enable snooping for Nvidia, right now for all their hda-devices, // but only based on guessing. { PCI_VENDOR_NVIDIA, PCI_ALL_DEVICES, HDA_QUIRK_SNOOP | HDA_QUIRK_NO_MSI | HDA_QUIRK_NO_CORBRP_RESET_ACK }, + { PCI_VENDOR_CMEDIA, 0x5011, HDA_QUIRK_NO_MSI }, { PCI_VENDOR_CREATIVE, 0x0010, HDA_QUIRK_NO_MSI }, { PCI_VENDOR_CREATIVE, 0x0012, HDA_QUIRK_NO_MSI }, { PCI_VENDOR_VMWARE, PCI_ALL_DEVICES, HDA_QUIRK_NO_CORBRP_RESET_ACK }, @@ -1060,7 +1063,10 @@ hda_hw_init(hda_controller* controller) goto no_irq; // TCSEL is reset to TC0 (clear 0-2 bits) - update_pci_register(controller, PCI_HDA_TCSEL, PCI_HDA_TCSEL_MASK, 0, 1); + if ((quirks & HDA_QUIRK_NOTCSEL) == 0) { + update_pci_register(controller, PCI_HDA_TCSEL, PCI_HDA_TCSEL_MASK, 0, + 1); + } controller->dma_snooping = false;