From 34e9fa4d3be0284ac120e885ab920bb6024e4f04 Mon Sep 17 00:00:00 2001 From: Sahan Fernando Date: Sat, 12 Jun 2021 22:30:05 +1000 Subject: Kernel: Abstract FramebufferConsole away from contiguous physical range Currently, Kernel::Graphics::FramebufferConsole is written assuming that the underlying framebuffer memory exists in physically contiguous memory. There are a bunch of framebuffer devices that would need to use the components of FramebufferConsole (in particular access to the kernel bitmap font rendering logic). To reduce code duplication, framebuffer console has been split into two parts, the abstract GenericFramebufferConsole class which does the rendering, and the ContiguousFramebufferConsole class which contains all logic related to managing the underling vm object. Also, a new flush method has been added to the class, to support devices that require an extra flush step to render. --- .../Console/ContiguousFramebufferConsole.cpp | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp (limited to 'Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp') diff --git a/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp b/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp new file mode 100644 index 0000000000..12a7cd45ca --- /dev/null +++ b/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2021, Sahan Fernando + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Kernel::Graphics { + +NonnullRefPtr ContiguousFramebufferConsole::initialize(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) +{ + return adopt_ref(*new ContiguousFramebufferConsole(framebuffer_address, width, height, pitch)); +} + +ContiguousFramebufferConsole::ContiguousFramebufferConsole(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) + : GenericFramebufferConsole(width, height, pitch) + , m_framebuffer_address(framebuffer_address) +{ + set_resolution(width, height, pitch); +} + +void ContiguousFramebufferConsole::set_resolution(size_t width, size_t height, size_t pitch) +{ + m_width = width; + m_height = height; + m_pitch = pitch; + + dbgln("Framebuffer Console: taking {} bytes", page_round_up(pitch * height)); + m_framebuffer_region = MM.allocate_kernel_region(m_framebuffer_address, page_round_up(pitch * height), "Framebuffer Console", Region::Access::Read | Region::Access::Write, Region::Cacheable::Yes); + VERIFY(m_framebuffer_region); + + // Just to start cleanly, we clean the entire framebuffer + memset(m_framebuffer_region->vaddr().as_ptr(), 0, pitch * height); + + ConsoleManagement::the().resolution_was_changed(); +} + +} -- cgit v1.2.3