the following patch set a couple more bits in the pci configuration space on nvidia hdaudio controllers. this is what ALSA and OSS are doing on these devices. please try this on all nvidia based azalia devices. check that playback is correct. please include a dmesg with your report. tia.
-- [email protected] SDF Public Access UNIX System - http://sdf.lonestar.org Index: azalia.c =================================================================== RCS file: /cvs/src/sys/dev/pci/azalia.c,v retrieving revision 1.153 diff -u -p azalia.c --- azalia.c 14 Sep 2009 09:08:03 -0000 1.153 +++ azalia.c 29 Sep 2009 06:04:28 -0000 @@ -336,6 +336,9 @@ static const char *line_colors[16] = { #define NVIDIA_PCIE_SNOOP_REG 0x4e #define NVIDIA_PCIE_SNOOP_MASK 0xf0 #define NVIDIA_PCIE_SNOOP_ENABLE 0x0f +#define NVIDIA_HDA_ISTR_COH_REG 0x4d +#define NVIDIA_HDA_OSTR_COH_REG 0x4c +#define NVIDIA_HDA_STR_COH_ENABLE 0x01 uint8_t azalia_pci_read(pci_chipset_tag_t pc, pcitag_t pa, int reg) @@ -431,10 +434,32 @@ azalia_pci_attach(struct device *parent, struct device case PCI_PRODUCT_NVIDIA_MCP89_HDA_2: case PCI_PRODUCT_NVIDIA_MCP89_HDA_3: case PCI_PRODUCT_NVIDIA_MCP89_HDA_4: - reg = azalia_pci_read(pa->pa_pc, pa->pa_tag, NVIDIA_PCIE_SNOOP_REG); + reg = azalia_pci_read(pa->pa_pc, pa->pa_tag, + NVIDIA_HDA_OSTR_COH_REG); + reg |= NVIDIA_HDA_STR_COH_ENABLE; + azalia_pci_write(pa->pa_pc, pa->pa_tag, + NVIDIA_HDA_OSTR_COH_REG, reg); + + reg = azalia_pci_read(pa->pa_pc, pa->pa_tag, + NVIDIA_HDA_ISTR_COH_REG); + reg |= NVIDIA_HDA_STR_COH_ENABLE; + azalia_pci_write(pa->pa_pc, pa->pa_tag, + NVIDIA_HDA_ISTR_COH_REG, reg); + + reg = azalia_pci_read(pa->pa_pc, pa->pa_tag, + NVIDIA_PCIE_SNOOP_REG); reg &= NVIDIA_PCIE_SNOOP_MASK; reg |= NVIDIA_PCIE_SNOOP_ENABLE; - azalia_pci_write(pa->pa_pc, pa->pa_tag, NVIDIA_PCIE_SNOOP_REG, reg); + azalia_pci_write(pa->pa_pc, pa->pa_tag, + NVIDIA_PCIE_SNOOP_REG, reg); + + reg = azalia_pci_read(pa->pa_pc, pa->pa_tag, + NVIDIA_PCIE_SNOOP_REG); + if ((reg & NVIDIA_PCIE_SNOOP_ENABLE) != + NVIDIA_PCIE_SNOOP_ENABLE) { + printf(": could not enable PCIe cache snooping!\n"); + } + break; }
