/* * Copyright (c) 2022, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include namespace Kernel { class IntelDisplayConnectorGroup; class IntelAnalogDisplayTranscoder final : public IntelDisplayTranscoder { public: static ErrorOr> create_with_physical_addresses(PhysicalAddress transcoder_registers_start_address, PhysicalAddress pipe_registers_start_address, PhysicalAddress dpll_registers_start_address, PhysicalAddress dpll_control_registers_start_address); virtual ErrorOr set_dpll_settings(Badge, IntelGraphics::PLLSettings const& settings, size_t dac_multiplier) override; virtual ErrorOr enable_dpll_without_vga(Badge) override; virtual ErrorOr disable_dpll(Badge) override; private: struct [[gnu::packed]] DPLLRegisters { u32 divisor_a0; u32 divisor_a1; }; struct [[gnu::packed]] DPLLControlRegisters { u32 control; u32 padding; // On Gen4, this is the control register of DPLL B, don't touch this u32 multiplier; }; IntelAnalogDisplayTranscoder(Memory::TypedMapping, Memory::TypedMapping, Memory::TypedMapping, Memory::TypedMapping); Memory::TypedMapping m_dpll_registers; Memory::TypedMapping m_dpll_control_registers; }; }