From 4f91616759a8d22fd7a32e24958a02c16596ff91 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Sun, 27 Feb 2022 20:45:21 +0100 Subject: [PATCH] Kernel: Report AC'97 vendor and device ID --- Kernel/Devices/Audio/AC97.cpp | 21 ++++++++++++--------- Kernel/Devices/Audio/AC97.h | 2 ++ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Kernel/Devices/Audio/AC97.cpp b/Kernel/Devices/Audio/AC97.cpp index a92db92107..03aa09d585 100644 --- a/Kernel/Devices/Audio/AC97.cpp +++ b/Kernel/Devices/Audio/AC97.cpp @@ -78,10 +78,20 @@ UNMAP_AFTER_INIT ErrorOr AC97::initialize() dbgln_if(AC97_DEBUG, "AC97 @ {}: mixer base: {:#04x}", pci_address(), m_io_mixer_base.get()); dbgln_if(AC97_DEBUG, "AC97 @ {}: bus base: {:#04x}", pci_address(), m_io_bus_base.get()); - enable_pin_based_interrupts(); - PCI::enable_bus_mastering(pci_address()); + // Read out AC'97 codec revision and vendor + auto extended_audio_id = m_io_mixer_base.offset(NativeAudioMixerRegister::ExtendedAudioID).in(); + m_codec_revision = static_cast(((extended_audio_id & ExtendedAudioMask::Revision) >> 10) & 0b11); + dbgln_if(AC97_DEBUG, "AC97 @ {}: codec revision {:#02b}", pci_address(), to_underlying(m_codec_revision)); + if (m_codec_revision == AC97Revision::Reserved) + return ENOTSUP; + + // Report vendor / device ID + u32 vendor_id = m_io_mixer_base.offset(NativeAudioMixerRegister::VendorID1).in() << 16 | m_io_mixer_base.offset(NativeAudioMixerRegister::VendorID2).in(); + dbgln("AC97 @ {}: Vendor ID: {:#8x}", pci_address(), vendor_id); // Bus cold reset, enable interrupts + enable_pin_based_interrupts(); + PCI::enable_bus_mastering(pci_address()); auto control = m_io_bus_base.offset(NativeAudioBusRegister::GlobalControl).in(); control |= GlobalControlFlag::GPIInterruptEnable; control |= GlobalControlFlag::AC97ColdReset; @@ -90,13 +100,6 @@ UNMAP_AFTER_INIT ErrorOr AC97::initialize() // Reset mixer m_io_mixer_base.offset(NativeAudioMixerRegister::Reset).out(1); - // Read out AC'97 codec revision - auto extended_audio_id = m_io_mixer_base.offset(NativeAudioMixerRegister::ExtendedAudioID).in(); - m_codec_revision = static_cast(((extended_audio_id & ExtendedAudioMask::Revision) >> 10) & 0b11); - dbgln_if(AC97_DEBUG, "AC97 @ {}: codec revision {:#02b}", pci_address(), to_underlying(m_codec_revision)); - if (m_codec_revision == AC97Revision::Reserved) - return ENOTSUP; - // Enable variable and double rate PCM audio if supported auto extended_audio_status_control_register = m_io_mixer_base.offset(NativeAudioMixerRegister::ExtendedAudioStatusControl); auto extended_audio_status = extended_audio_status_control_register.in(); diff --git a/Kernel/Devices/Audio/AC97.h b/Kernel/Devices/Audio/AC97.h index 76a4dcac90..8279985e7e 100644 --- a/Kernel/Devices/Audio/AC97.h +++ b/Kernel/Devices/Audio/AC97.h @@ -40,6 +40,8 @@ private: ExtendedAudioID = 0x28, ExtendedAudioStatusControl = 0x2a, PCMFrontDACRate = 0x2c, + VendorID1 = 0x7c, + VendorID2 = 0x7e, }; enum ExtendedAudioMask : u16 {