mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 20:17:44 +00:00
Kernel/Graphics: Don't try to enumerate PCI adapters if PCI is disabled
If there's no PCI bus, then it's safe to assume that the x86 machine we run on supports VGA text mode console output with an ISA VGA adapter. If this is the case, we just instantiate a ISAVGAAdapter object that assumes this situation and allows us to boot into VGA text mode console.
This commit is contained in:
parent
15315be55c
commit
fafa339264
10 changed files with 197 additions and 72 deletions
50
Kernel/Graphics/VGA/ISAAdapter.cpp
Normal file
50
Kernel/Graphics/VGA/ISAAdapter.cpp
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <Kernel/Graphics/Console/ContiguousFramebufferConsole.h>
|
||||
#include <Kernel/Graphics/Console/TextModeConsole.h>
|
||||
#include <Kernel/Graphics/GraphicsManagement.h>
|
||||
#include <Kernel/Graphics/VGA/ISAAdapter.h>
|
||||
#include <Kernel/Sections.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
UNMAP_AFTER_INIT NonnullRefPtr<ISAVGAAdapter> ISAVGAAdapter::initialize()
|
||||
{
|
||||
return adopt_ref(*new ISAVGAAdapter());
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT ISAVGAAdapter::ISAVGAAdapter()
|
||||
{
|
||||
m_framebuffer_console = Graphics::TextModeConsole::initialize();
|
||||
GraphicsManagement::the().set_console(*m_framebuffer_console);
|
||||
}
|
||||
|
||||
void ISAVGAAdapter::enable_consoles()
|
||||
{
|
||||
VERIFY(m_framebuffer_console);
|
||||
m_framebuffer_console->enable();
|
||||
}
|
||||
void ISAVGAAdapter::disable_consoles()
|
||||
{
|
||||
VERIFY(m_framebuffer_console);
|
||||
m_framebuffer_console->disable();
|
||||
}
|
||||
|
||||
void ISAVGAAdapter::initialize_framebuffer_devices()
|
||||
{
|
||||
}
|
||||
|
||||
bool ISAVGAAdapter::try_to_set_resolution(size_t, size_t, size_t)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
bool ISAVGAAdapter::set_y_offset(size_t, size_t)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
41
Kernel/Graphics/VGA/ISAAdapter.h
Normal file
41
Kernel/Graphics/VGA/ISAAdapter.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Types.h>
|
||||
#include <Kernel/Bus/PCI/Device.h>
|
||||
#include <Kernel/Graphics/Console/Console.h>
|
||||
#include <Kernel/Graphics/FramebufferDevice.h>
|
||||
#include <Kernel/Graphics/GenericGraphicsAdapter.h>
|
||||
#include <Kernel/PhysicalAddress.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
class ISAVGAAdapter final : public VGACompatibleAdapter {
|
||||
friend class GraphicsManagement;
|
||||
|
||||
public:
|
||||
static NonnullRefPtr<ISAVGAAdapter> initialize();
|
||||
|
||||
// Note: We simply don't support old VGA framebuffer modes (like the 320x200 256-colors one)
|
||||
virtual bool framebuffer_devices_initialized() const override { return false; }
|
||||
|
||||
virtual bool try_to_set_resolution(size_t output_port_index, size_t width, size_t height) override;
|
||||
virtual bool set_y_offset(size_t output_port_index, size_t y) override;
|
||||
|
||||
private:
|
||||
ISAVGAAdapter();
|
||||
|
||||
// ^GenericGraphicsAdapter
|
||||
virtual void initialize_framebuffer_devices() override;
|
||||
|
||||
virtual void enable_consoles() override;
|
||||
virtual void disable_consoles() override;
|
||||
|
||||
RefPtr<Graphics::Console> m_framebuffer_console;
|
||||
};
|
||||
}
|
72
Kernel/Graphics/VGA/PCIAdapter.cpp
Normal file
72
Kernel/Graphics/VGA/PCIAdapter.cpp
Normal file
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <Kernel/Graphics/Console/ContiguousFramebufferConsole.h>
|
||||
#include <Kernel/Graphics/Console/TextModeConsole.h>
|
||||
#include <Kernel/Graphics/GraphicsManagement.h>
|
||||
#include <Kernel/Graphics/VGA/PCIAdapter.h>
|
||||
#include <Kernel/Sections.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
UNMAP_AFTER_INIT NonnullRefPtr<PCIVGACompatibleAdapter> PCIVGACompatibleAdapter::initialize_with_preset_resolution(PCI::DeviceIdentifier const& pci_device_identifier, PhysicalAddress m_framebuffer_address, size_t framebuffer_width, size_t framebuffer_height, size_t framebuffer_pitch)
|
||||
{
|
||||
return adopt_ref(*new PCIVGACompatibleAdapter(pci_device_identifier.address(), m_framebuffer_address, framebuffer_width, framebuffer_height, framebuffer_pitch));
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT NonnullRefPtr<PCIVGACompatibleAdapter> PCIVGACompatibleAdapter::initialize(PCI::DeviceIdentifier const& pci_device_identifier)
|
||||
{
|
||||
return adopt_ref(*new PCIVGACompatibleAdapter(pci_device_identifier.address()));
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT void PCIVGACompatibleAdapter::initialize_framebuffer_devices()
|
||||
{
|
||||
// We might not have any pre-set framebuffer, so if that's the case - don't try to initialize one.
|
||||
if (m_framebuffer_address.is_null())
|
||||
return;
|
||||
VERIFY(m_framebuffer_width);
|
||||
VERIFY(m_framebuffer_width != 0);
|
||||
VERIFY(m_framebuffer_height != 0);
|
||||
VERIFY(m_framebuffer_pitch != 0);
|
||||
m_framebuffer_device = FramebufferDevice::create(*this, m_framebuffer_address, m_framebuffer_width, m_framebuffer_height, m_framebuffer_pitch);
|
||||
// FIXME: Would be nice to be able to return ErrorOr<void> here.
|
||||
VERIFY(!m_framebuffer_device->try_to_initialize().is_error());
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT PCIVGACompatibleAdapter::PCIVGACompatibleAdapter(PCI::Address address)
|
||||
: PCI::Device(address)
|
||||
{
|
||||
m_framebuffer_console = Graphics::TextModeConsole::initialize();
|
||||
GraphicsManagement::the().set_console(*m_framebuffer_console);
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT PCIVGACompatibleAdapter::PCIVGACompatibleAdapter(PCI::Address address, PhysicalAddress framebuffer_address, size_t framebuffer_width, size_t framebuffer_height, size_t framebuffer_pitch)
|
||||
: PCI::Device(address)
|
||||
, m_framebuffer_address(framebuffer_address)
|
||||
, m_framebuffer_width(framebuffer_width)
|
||||
, m_framebuffer_height(framebuffer_height)
|
||||
, m_framebuffer_pitch(framebuffer_pitch)
|
||||
{
|
||||
m_framebuffer_console = Graphics::ContiguousFramebufferConsole::initialize(framebuffer_address, framebuffer_width, framebuffer_height, framebuffer_pitch);
|
||||
GraphicsManagement::the().set_console(*m_framebuffer_console);
|
||||
}
|
||||
|
||||
void PCIVGACompatibleAdapter::enable_consoles()
|
||||
{
|
||||
VERIFY(m_framebuffer_console);
|
||||
if (m_framebuffer_device)
|
||||
m_framebuffer_device->deactivate_writes();
|
||||
m_framebuffer_console->enable();
|
||||
}
|
||||
void PCIVGACompatibleAdapter::disable_consoles()
|
||||
{
|
||||
VERIFY(m_framebuffer_device);
|
||||
VERIFY(m_framebuffer_console);
|
||||
m_framebuffer_console->disable();
|
||||
m_framebuffer_device->activate_writes();
|
||||
}
|
||||
|
||||
}
|
46
Kernel/Graphics/VGA/PCIAdapter.h
Normal file
46
Kernel/Graphics/VGA/PCIAdapter.h
Normal file
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Liav A. <liavalb@hotmail.co.il>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <AK/Types.h>
|
||||
#include <Kernel/Bus/PCI/Device.h>
|
||||
#include <Kernel/Graphics/Console/Console.h>
|
||||
#include <Kernel/Graphics/FramebufferDevice.h>
|
||||
#include <Kernel/Graphics/GenericGraphicsAdapter.h>
|
||||
#include <Kernel/PhysicalAddress.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
class PCIVGACompatibleAdapter : public VGACompatibleAdapter
|
||||
, public PCI::Device {
|
||||
public:
|
||||
static NonnullRefPtr<PCIVGACompatibleAdapter> initialize_with_preset_resolution(PCI::DeviceIdentifier const&, PhysicalAddress, size_t framebuffer_width, size_t framebuffer_height, size_t framebuffer_pitch);
|
||||
static NonnullRefPtr<PCIVGACompatibleAdapter> initialize(PCI::DeviceIdentifier const&);
|
||||
|
||||
virtual bool framebuffer_devices_initialized() const override { return !m_framebuffer_device.is_null(); }
|
||||
|
||||
protected:
|
||||
explicit PCIVGACompatibleAdapter(PCI::Address);
|
||||
|
||||
private:
|
||||
PCIVGACompatibleAdapter(PCI::Address, PhysicalAddress, size_t framebuffer_width, size_t framebuffer_height, size_t framebuffer_pitch);
|
||||
|
||||
// ^GenericGraphicsAdapter
|
||||
virtual void initialize_framebuffer_devices() override;
|
||||
|
||||
virtual void enable_consoles() override;
|
||||
virtual void disable_consoles() override;
|
||||
|
||||
protected:
|
||||
PhysicalAddress m_framebuffer_address;
|
||||
size_t m_framebuffer_width { 0 };
|
||||
size_t m_framebuffer_height { 0 };
|
||||
size_t m_framebuffer_pitch { 0 };
|
||||
|
||||
RefPtr<FramebufferDevice> m_framebuffer_device;
|
||||
};
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue