/* * Copyright (c) 2023, Edwin Rijkee * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Kernel::VoodooGraphics { class VoodooDisplayConnector final : public DisplayConnector { friend class VoodooGraphicsAdapter; friend class Kernel::DeviceManagement; public: static NonnullLockRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping, NonnullOwnPtr io_window); private: ErrorOr fetch_and_initialize_edid(); ErrorOr create_attached_framebuffer_console(); VoodooDisplayConnector(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping, NonnullOwnPtr io_window); virtual bool mutable_mode_setting_capable() const override final { return false; } virtual bool double_framebuffering_capable() const override { return false; } virtual ErrorOr set_mode_setting(ModeSetting const&) override; virtual ErrorOr set_y_offset(size_t y) override; virtual ErrorOr set_safe_mode_setting() override final; virtual ErrorOr unblank() override; virtual bool partial_flush_support() const override final { return false; } virtual bool flush_support() const override final { return false; } virtual bool refresh_rate_support() const override final { return false; } virtual ErrorOr flush_first_surface() override final; virtual void enable_console() override final; virtual void disable_console() override final; ErrorOr for_each_dmt_timing_in_edid(Function) const; ErrorOr find_suitable_mode(ModeSetting const& requested_mode) const; u8 read_vga(VGAPort port); u8 read_vga_indexed(VGAPort index_port, VGAPort data_port, u8 index); void write_vga(VGAPort port, u8 value); void write_vga_indexed(VGAPort index_port, VGAPort data_port, u8 index, u8 value); ErrorOr wait_for_fifo_space(u32 minimum_entries); static PLLSettings calculate_pll(i32 desired_frequency_in_khz); ErrorOr prepare_mode_switch(ModeSetting const& mode_setting); ErrorOr perform_mode_switch(ModeRegisters const& regs); LockRefPtr m_framebuffer_console; Memory::TypedMapping m_registers; NonnullOwnPtr m_io_window; }; }