Ticket #1072: hda_ati_nvidia.patch

File hda_ati_nvidia.patch, 2.5 KB (added by tqh, 15 years ago)

Preliminary patch, works for ATI

  • src/add-ons/kernel/drivers/audio/hda/hda_controller.cpp

     
    700700{
    701701    uint16 capabilities, stateStatus, cmd;
    702702    status_t status;
    703     uint8 tcsel;
     703    uint8 tcsel, tmpreg;
    704704
    705705    /* Map MMIO registers */
    706706    controller->regs_area = map_physical_memory("hda_hw_regs",
     
    735735        controller->pci_info.device, controller->pci_info.function,
    736736        PCI_HDA_TCSEL, 1, tcsel & 0xf8);
    737737
     738    /* Enable snooping for ATI and Nvidia, right now for all their hda-devices,
     739       but only based on guessing. */
     740    switch (controller->pci_info.vendor_id) {
     741        /* NVIDIA */
     742        case 0x10de:
     743            tmpreg = (gPci->read_pci_config)(controller->pci_info.bus, controller->pci_info.device,
     744                controller->pci_info.function, NVIDIA_HDA_TRANSREG_ADDR, 1);
     745            (gPci->write_pci_config)(controller->pci_info.bus, controller->pci_info.device,
     746            controller->pci_info.function, NVIDIA_HDA_TRANSREG_ADDR, 1, (tmpreg & 0xf8) | NVIDIA_HDA_ENABLE_COHBITS);
     747            break;
     748        /* ATI */
     749        case 0x1002:
     750            tmpreg = (gPci->read_pci_config)(controller->pci_info.bus, controller->pci_info.device,
     751                controller->pci_info.function, ATI_HDA_MISC_CNTR2_ADDR, 1);
     752            (gPci->write_pci_config)(controller->pci_info.bus, controller->pci_info.device,
     753            controller->pci_info.function, ATI_HDA_MISC_CNTR2_ADDR, 1, (tmpreg & 0xf8) | ATI_HDA_ENABLE_SNOOP);
     754            break;
     755    }   
     756
    738757    capabilities = controller->Read16(HDAC_GLOBAL_CAP);
    739758    controller->num_input_streams = GLOBAL_CAP_INPUT_STREAMS(capabilities);
    740759    controller->num_output_streams = GLOBAL_CAP_OUTPUT_STREAMS(capabilities);
     
    762781        dprintf("hda: init_corb_rirb_pos failed\n");
    763782        goto corb_rirb_failed;
    764783    }
    765 
     784   
    766785    controller->Write16(HDAC_WAKE_ENABLE, 0x7fff);
    767786
    768787    /* Enable controller interrupts */
  • src/add-ons/kernel/drivers/audio/hda/hda_controller_defs.h

     
    134134/* PCI space register definitions */
    135135#define PCI_HDA_TCSEL                   0x44
    136136
     137#define ATI_HDA_MISC_CNTR2_ADDR         0x42
     138#define ATI_HDA_ENABLE_SNOOP            0x02
     139#define NVIDIA_HDA_TRANSREG_ADDR        0x4e
     140#define NVIDIA_HDA_ENABLE_COHBITS       0x0f
     141
     142
    137143typedef uint32 corb_t;
    138144typedef struct {
    139145    uint32 response;