hda: disable 64bits dma addressing for some devices
* 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 <jerome.duval@gmail.com>
This commit is contained in:
parent
9a7acbdbcf
commit
ce534c52be
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user