|
@@ -298,7 +298,8 @@ enum {
|
|
|
|
|
|
/* quirks for ATI/AMD HDMI */
|
|
/* quirks for ATI/AMD HDMI */
|
|
#define AZX_DCAPS_PRESET_ATI_HDMI \
|
|
#define AZX_DCAPS_PRESET_ATI_HDMI \
|
|
- (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB)
|
|
|
|
|
|
+ (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB|\
|
|
|
|
+ AZX_DCAPS_NO_MSI64)
|
|
|
|
|
|
/* quirks for Nvidia */
|
|
/* quirks for Nvidia */
|
|
#define AZX_DCAPS_PRESET_NVIDIA \
|
|
#define AZX_DCAPS_PRESET_NVIDIA \
|
|
@@ -1486,6 +1487,7 @@ static int azx_first_init(struct azx *chip)
|
|
struct snd_card *card = chip->card;
|
|
struct snd_card *card = chip->card;
|
|
int err;
|
|
int err;
|
|
unsigned short gcap;
|
|
unsigned short gcap;
|
|
|
|
+ unsigned int dma_bits = 64;
|
|
|
|
|
|
#if BITS_PER_LONG != 64
|
|
#if BITS_PER_LONG != 64
|
|
/* Fix up base address on ULI M5461 */
|
|
/* Fix up base address on ULI M5461 */
|
|
@@ -1509,9 +1511,14 @@ static int azx_first_init(struct azx *chip)
|
|
return -ENXIO;
|
|
return -ENXIO;
|
|
}
|
|
}
|
|
|
|
|
|
- if (chip->msi)
|
|
|
|
|
|
+ if (chip->msi) {
|
|
|
|
+ if (chip->driver_caps & AZX_DCAPS_NO_MSI64) {
|
|
|
|
+ dev_dbg(card->dev, "Disabling 64bit MSI\n");
|
|
|
|
+ pci->no_64bit_msi = true;
|
|
|
|
+ }
|
|
if (pci_enable_msi(pci) < 0)
|
|
if (pci_enable_msi(pci) < 0)
|
|
chip->msi = 0;
|
|
chip->msi = 0;
|
|
|
|
+ }
|
|
|
|
|
|
if (azx_acquire_irq(chip, 0) < 0)
|
|
if (azx_acquire_irq(chip, 0) < 0)
|
|
return -EBUSY;
|
|
return -EBUSY;
|
|
@@ -1522,9 +1529,14 @@ static int azx_first_init(struct azx *chip)
|
|
gcap = azx_readw(chip, GCAP);
|
|
gcap = azx_readw(chip, GCAP);
|
|
dev_dbg(card->dev, "chipset global capabilities = 0x%x\n", gcap);
|
|
dev_dbg(card->dev, "chipset global capabilities = 0x%x\n", gcap);
|
|
|
|
|
|
|
|
+ /* AMD devices support 40 or 48bit DMA, take the safe one */
|
|
|
|
+ if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
|
|
|
|
+ dma_bits = 40;
|
|
|
|
+
|
|
/* disable SB600 64bit support for safety */
|
|
/* disable SB600 64bit support for safety */
|
|
if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
|
|
if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
|
|
struct pci_dev *p_smbus;
|
|
struct pci_dev *p_smbus;
|
|
|
|
+ dma_bits = 40;
|
|
p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
|
|
p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
|
|
PCI_DEVICE_ID_ATI_SBX00_SMBUS,
|
|
PCI_DEVICE_ID_ATI_SBX00_SMBUS,
|
|
NULL);
|
|
NULL);
|
|
@@ -1554,9 +1566,11 @@ static int azx_first_init(struct azx *chip)
|
|
}
|
|
}
|
|
|
|
|
|
/* allow 64bit DMA address if supported by H/W */
|
|
/* allow 64bit DMA address if supported by H/W */
|
|
- if ((gcap & AZX_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
|
|
|
|
- pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
|
|
|
|
- else {
|
|
|
|
|
|
+ if (!(gcap & AZX_GCAP_64OK))
|
|
|
|
+ dma_bits = 32;
|
|
|
|
+ if (!pci_set_dma_mask(pci, DMA_BIT_MASK(dma_bits))) {
|
|
|
|
+ pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(dma_bits));
|
|
|
|
+ } else {
|
|
pci_set_dma_mask(pci, DMA_BIT_MASK(32));
|
|
pci_set_dma_mask(pci, DMA_BIT_MASK(32));
|
|
pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
|
|
pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
|
|
}
|
|
}
|