/* * Copyright (c) 2022, Liav A. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace Kernel { class IntelNativeGraphicsAdapter; class IntelDisplayConnectorGroup : public RefCounted { friend class IntelNativeGraphicsAdapter; public: struct MMIORegion { enum class BARAssigned { BAR0, BAR2, }; BARAssigned pci_bar_assigned; PhysicalAddress pci_bar_paddr; size_t pci_bar_space_length; }; private: AK_TYPEDEF_DISTINCT_ORDERED_ID(size_t, RegisterOffset); enum class AnalogOutputRegisterOffset { AnalogDisplayPort = 0x61100, VGADisplayPlaneControl = 0x71400, }; public: static ErrorOr> try_create(Badge, IntelGraphics::Generation, MMIORegion const&, MMIORegion const&); ErrorOr set_safe_mode_setting(Badge, IntelNativeDisplayConnector&); ErrorOr set_mode_setting(Badge, IntelNativeDisplayConnector&, DisplayConnector::ModeSetting const&); private: IntelDisplayConnectorGroup(IntelGraphics::Generation generation, NonnullOwnPtr, NonnullOwnPtr registers_region, MMIORegion const&, MMIORegion const&); ErrorOr set_mode_setting(IntelNativeDisplayConnector&, DisplayConnector::ModeSetting const&); StringView convert_analog_output_register_to_string(AnalogOutputRegisterOffset index) const; void write_to_analog_output_register(AnalogOutputRegisterOffset, u32 value); u32 read_from_analog_output_register(AnalogOutputRegisterOffset) const; void write_to_general_register(RegisterOffset offset, u32 value); u32 read_from_general_register(RegisterOffset offset) const; // DisplayConnector initialization related methods ErrorOr initialize_connectors(); ErrorOr initialize_gen4_connectors(); // General Modesetting methods ErrorOr set_gen4_mode_setting(IntelNativeDisplayConnector&, DisplayConnector::ModeSetting const&); bool set_crt_resolution(DisplayConnector::ModeSetting const&); void disable_vga_emulation(); void enable_vga_plane(); void disable_dac_output(); void enable_dac_output(); Spinlock m_control_lock; Spinlock m_modeset_lock; mutable Spinlock m_registers_lock; // Note: The linux driver specifies an enum of possible ports and there is only // 9 ports (PORT_{A-I}). PORT_TC{1-6} are mapped to PORT_{D-I}. Array, 9> m_connectors; Array, 5> m_transcoders; Array, 3> m_planes; const MMIORegion m_mmio_first_region; const MMIORegion m_mmio_second_region; MMIORegion const& m_assigned_mmio_registers_region; const IntelGraphics::Generation m_generation; NonnullOwnPtr m_registers_region; NonnullOwnPtr m_gmbus_connector; }; }