At Mon, 16 Mar 2009 22:18:03 +0900, Emmanuel Chanel wrote:
ok. I could patch. I did $ ./configure --with-debug=verbose $ make $ su -c 'make install'
The result is below and it's not detected on alsa. Pulse's Volume Control says no hardware devices but "Null Sound Output".
Hm, how about the patch below then?
thanks,
Takashi ---
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 92a73e8..eb33e15 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -2136,7 +2136,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, struct azx **rchip) { struct azx *chip; - int i, err; + int i, err, rirb_32bit; unsigned short gcap; static struct snd_device_ops ops = { .dev_free = azx_dev_free, @@ -2218,12 +2218,26 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, pci_set_master(pci); synchronize_irq(chip->irq);
+ /* ATI chips seems buggy about 64bit CORB/RIRB addresses */ + if (chip->driver_type == AZX_DRIVER_ATI) + rirb_32bit = 1; + else + rirb_32bit = 0; + gcap = azx_readw(chip, GCAP); snd_printdd("chipset global capabilities = 0x%x\n", gcap);
/* allow 64bit DMA address if supported by H/W */ - if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK)) + /* Don't set 64bit DMA here for the controller buffer allocations + * on some buggy hardwares + */ + if (!rirb_32bit && + (gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK)) pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK); + else { + pci_set_dma_mask(pci, DMA_32BIT_MASK); + pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK); + }
/* read number of streams from GCAP register instead of using * hardcoded value @@ -2309,6 +2323,11 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, sprintf(card->longname, "%s at 0x%lx irq %i", card->shortname, chip->addr, chip->irq);
+ /* allow 64bit DMA address if supported by H/W (if not set yet) */ + if (rirb_32bit && + (gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK)) + pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK); + *rchip = chip; return 0;