diff --git a/Kernel/Devices/Audio/AC97.cpp b/Kernel/Devices/Audio/AC97.cpp index 1be6222420..0f677d475a 100644 --- a/Kernel/Devices/Audio/AC97.cpp +++ b/Kernel/Devices/Audio/AC97.cpp @@ -87,8 +87,12 @@ 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(); - VERIFY((extended_audio_id & ExtendedAudioMask::Revision) >> 10 == AC97Revision::Revision23); + 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); diff --git a/Kernel/Devices/Audio/AC97.h b/Kernel/Devices/Audio/AC97.h index a35eff5108..19a9169e51 100644 --- a/Kernel/Devices/Audio/AC97.h +++ b/Kernel/Devices/Audio/AC97.h @@ -57,6 +57,7 @@ private: Revision21OrEarlier = 0b00, Revision22 = 0b01, Revision23 = 0b10, + Reserved = 0b11, }; enum NativeAudioBusChannel : u8 { @@ -162,6 +163,7 @@ private: OwnPtr m_buffer_descriptor_list; u8 m_buffer_descriptor_list_index { 0 }; + AC97Revision m_codec_revision; bool m_double_rate_pcm_enabled { false }; IOAddress m_io_mixer_base; IOAddress m_io_bus_base;