From 694ff1227209fc5a409ed55c14a35232e0a89044 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Sun, 27 Feb 2022 15:57:06 +0100 Subject: [PATCH] Kernel: Read and report AC'97 codec revision This might help with debugging on bare metal. Since the minimum version that can be specified is revision 2.1, and we do not use any feature from revision 2.2 or newer, this is merely future-proofing ourselves for new features yet to be built. Additionally, removing the `VERIFY()` ensures we will not crash on cards that only support earlier revisions. --- Kernel/Devices/Audio/AC97.cpp | 6 +++++- Kernel/Devices/Audio/AC97.h | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) 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;