From ce534c52be7093225bf724a9c7a7498ab0b5953b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 25 Jan 2021 19:16:52 +0100 Subject: [PATCH] hda: disable 64bits dma addressing for some devices MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * creative, not supported * amd/ati/nvidia, supports 40/48bits, disabled for simplicity * should help with #16491 Change-Id: I736d17b7dc5d4798688f9bd2741705362837b082 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3680 Reviewed-by: Jérôme Duval --- .../drivers/audio/hda/hda_controller.cpp | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 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 22212c1f18..3cabc15008 100644 --- a/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp +++ b/src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp @@ -48,6 +48,10 @@ #define HDA_QUIRK_NO_MSI 0x0002 #define HDA_QUIRK_NO_CORBRP_RESET_ACK 0x0004 #define HDA_QUIRK_NOTCSEL 0x0008 +#define HDA_QUIRK_NO_64BITDMA 0x0010 +#define HDA_QUIRKS_AMD \ + (HDA_QUIRK_SNOOP | HDA_QUIRK_NOTCSEL | HDA_QUIRK_NO_64BITDMA) + static const struct { @@ -94,22 +98,23 @@ 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 | 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 }, + { PCI_VENDOR_ATI, 0x437b, HDA_QUIRKS_AMD }, + { PCI_VENDOR_ATI, 0x4383, HDA_QUIRKS_AMD }, + { PCI_VENDOR_AMD, 0x157a, HDA_QUIRKS_AMD }, + { PCI_VENDOR_AMD, 0x780d, HDA_QUIRKS_AMD }, + { PCI_VENDOR_AMD, 0x1457, HDA_QUIRKS_AMD }, + { PCI_VENDOR_AMD, 0x1487, HDA_QUIRKS_AMD }, + { PCI_VENDOR_AMD, 0x15e3, HDA_QUIRKS_AMD }, // 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 }, + | HDA_QUIRK_NO_CORBRP_RESET_ACK | HDA_QUIRK_NO_64BITDMA }, { 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_CREATIVE, 0x0010, HDA_QUIRK_NO_MSI | HDA_QUIRK_NO_64BITDMA }, + { PCI_VENDOR_CREATIVE, 0x0012, HDA_QUIRK_NO_MSI | HDA_QUIRK_NO_64BITDMA }, { PCI_VENDOR_VMWARE, PCI_ALL_DEVICES, HDA_QUIRK_NO_CORBRP_RESET_ACK }, { PCI_VENDOR_SIS, 0x7502, HDA_QUIRK_NO_CORBRP_RESET_ACK }, + { PCI_VENDOR_ATI, PCI_ALL_DEVICES, HDA_QUIRK_NO_64BITDMA }, }; @@ -1181,7 +1186,8 @@ hda_hw_init(hda_controller* controller) controller->num_input_streams = GLOBAL_CAP_INPUT_STREAMS(capabilities); controller->num_output_streams = GLOBAL_CAP_OUTPUT_STREAMS(capabilities); controller->num_bidir_streams = GLOBAL_CAP_BIDIR_STREAMS(capabilities); - controller->is_64_bit = GLOBAL_CAP_64BIT(capabilities); + controller->is_64_bit = GLOBAL_CAP_64BIT(capabilities) + && (quirks & HDA_QUIRK_NO_64BITDMA) == 0; // show some hw features dprintf("hda: HDA v%d.%d, O:%" B_PRIu32 "/I:%" B_PRIu32 "/B:%" B_PRIu32