1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-01 08:28:11 +00:00

Kernel: Much improved BochsVGA (BXVGA) support.

Instead of cowboy-calling the VESA BIOS in the bootloader, find the emulator
VGA adapter by scanning the PCI bus. Then set up the desired video mode by
sending device commands.
This commit is contained in:
Andreas Kling 2019-02-06 10:17:26 +01:00
parent e9f6508ada
commit 731fc5a7c8
16 changed files with 298 additions and 114 deletions

48
Kernel/PCI.h Normal file
View file

@ -0,0 +1,48 @@
#pragma once
#include <AK/Function.h>
#include <AK/Types.h>
namespace PCI {
struct ID {
word vendor_id { 0 };
word device_id { 0 };
bool operator==(const ID& other) const
{
return vendor_id == other.vendor_id && device_id == other.device_id;
}
};
struct Address {
Address() { }
Address(byte bus, byte slot, byte function) : m_bus(bus), m_slot(slot), m_function(function) { }
bool is_null() const { return !m_bus && !m_slot && !m_function; }
operator bool() const { return !is_null(); }
byte bus() const { return m_bus; }
byte slot() const { return m_slot; }
byte function() const { return m_function; }
dword io_address_for_field(byte field) const
{
return 0x80000000u | (m_bus << 16u) | (m_slot << 11u) | (m_function << 8u) | (field & 0xfc);
}
private:
byte m_bus { 0 };
byte m_slot { 0 };
byte m_function { 0 };
};
void enumerate_all(Function<void(Address, ID)>);
dword get_BAR0(Address);
dword get_BAR1(Address);
dword get_BAR2(Address);
dword get_BAR3(Address);
dword get_BAR4(Address);
dword get_BAR5(Address);
}