mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-21 10:01:57 +00:00
driver_manager: add fb_boot_drv support
This commit is contained in:
parent
13690ec898
commit
aec97b7da0
@ -5,6 +5,7 @@ _/src/usb_drv
|
|||||||
_/src/usb_block_drv
|
_/src/usb_block_drv
|
||||||
_/src/vesa_drv
|
_/src/vesa_drv
|
||||||
_/src/intel_fb_drv
|
_/src/intel_fb_drv
|
||||||
|
_/src/boot_fb_drv
|
||||||
_/src/ahci_drv
|
_/src/ahci_drv
|
||||||
_/src/fs_report
|
_/src/fs_report
|
||||||
_/src/fs_rom
|
_/src/fs_rom
|
||||||
|
@ -33,6 +33,7 @@ namespace Driver_manager {
|
|||||||
struct Device_driver;
|
struct Device_driver;
|
||||||
struct Intel_fb_driver;
|
struct Intel_fb_driver;
|
||||||
struct Vesa_fb_driver;
|
struct Vesa_fb_driver;
|
||||||
|
struct Boot_fb_driver;
|
||||||
struct Ahci_driver;
|
struct Ahci_driver;
|
||||||
|
|
||||||
struct Priority { int value; };
|
struct Priority { int value; };
|
||||||
@ -156,6 +157,47 @@ struct Driver_manager::Vesa_fb_driver : Device_driver
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct Driver_manager::Boot_fb_driver : Device_driver
|
||||||
|
{
|
||||||
|
Ram_quota const _ram_quota;
|
||||||
|
|
||||||
|
struct Mode
|
||||||
|
{
|
||||||
|
unsigned _width = 0, _height = 0, _bpp = 0;
|
||||||
|
|
||||||
|
Mode() { }
|
||||||
|
|
||||||
|
Mode(Xml_node node)
|
||||||
|
:
|
||||||
|
_width (node.attribute_value("width", 0U)),
|
||||||
|
_height(node.attribute_value("height", 0U)),
|
||||||
|
_bpp (node.attribute_value("bpp", 0U))
|
||||||
|
{ }
|
||||||
|
|
||||||
|
size_t num_bytes() const { return _width * _height * _bpp/8 + 512*1024; }
|
||||||
|
|
||||||
|
bool valid() const { return _width*_height*_bpp != 0; }
|
||||||
|
};
|
||||||
|
|
||||||
|
Boot_fb_driver(Mode const mode) : _ram_quota(Ram_quota{mode.num_bytes()}) { }
|
||||||
|
|
||||||
|
void generate_start_node(Xml_generator &xml) const override
|
||||||
|
{
|
||||||
|
xml.node("start", [&] () {
|
||||||
|
_gen_common_start_node_content(xml, "fb_boot_drv", "fb_boot_drv",
|
||||||
|
_ram_quota, Cap_quota{100},
|
||||||
|
Priority{-1});
|
||||||
|
_gen_provides_node<Framebuffer::Session>(xml);
|
||||||
|
xml.node("route", [&] () {
|
||||||
|
_gen_config_route(xml, "fb_drv.config");
|
||||||
|
_gen_default_parent_route(xml);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
_gen_forwarded_service<Framebuffer::Session>(xml, "fb_boot_drv");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Driver_manager::Ahci_driver : Device_driver
|
struct Driver_manager::Ahci_driver : Device_driver
|
||||||
{
|
{
|
||||||
void generate_start_node(Xml_generator &xml) const override
|
void generate_start_node(Xml_generator &xml) const override
|
||||||
@ -203,6 +245,7 @@ struct Driver_manager::Main : Block_devices_generator
|
|||||||
{
|
{
|
||||||
Env &_env;
|
Env &_env;
|
||||||
|
|
||||||
|
Attached_rom_dataspace _platform { _env, "platform_info" };
|
||||||
Attached_rom_dataspace _init_state { _env, "init_state" };
|
Attached_rom_dataspace _init_state { _env, "init_state" };
|
||||||
Attached_rom_dataspace _usb_devices { _env, "usb_devices" };
|
Attached_rom_dataspace _usb_devices { _env, "usb_devices" };
|
||||||
Attached_rom_dataspace _pci_devices { _env, "pci_devices" };
|
Attached_rom_dataspace _pci_devices { _env, "pci_devices" };
|
||||||
@ -214,8 +257,18 @@ struct Driver_manager::Main : Block_devices_generator
|
|||||||
|
|
||||||
Constructible<Intel_fb_driver> _intel_fb_driver;
|
Constructible<Intel_fb_driver> _intel_fb_driver;
|
||||||
Constructible<Vesa_fb_driver> _vesa_fb_driver;
|
Constructible<Vesa_fb_driver> _vesa_fb_driver;
|
||||||
|
Constructible<Boot_fb_driver> _boot_fb_driver;
|
||||||
Constructible<Ahci_driver> _ahci_driver;
|
Constructible<Ahci_driver> _ahci_driver;
|
||||||
|
|
||||||
|
Boot_fb_driver::Mode _boot_fb_mode() const
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
Xml_node fb = _platform.xml().sub_node("boot").sub_node("framebuffer");
|
||||||
|
return Boot_fb_driver::Mode(fb);
|
||||||
|
} catch (...) { }
|
||||||
|
return Boot_fb_driver::Mode();
|
||||||
|
}
|
||||||
|
|
||||||
void _handle_pci_devices_update();
|
void _handle_pci_devices_update();
|
||||||
|
|
||||||
Signal_handler<Main> _pci_devices_update_handler {
|
Signal_handler<Main> _pci_devices_update_handler {
|
||||||
@ -269,10 +322,16 @@ void Driver_manager::Main::_handle_pci_devices_update()
|
|||||||
{
|
{
|
||||||
_pci_devices.update();
|
_pci_devices.update();
|
||||||
|
|
||||||
|
/* decide about fb not before the first valid pci report is available */
|
||||||
|
if (!_pci_devices.valid())
|
||||||
|
return;
|
||||||
|
|
||||||
bool has_vga = false;
|
bool has_vga = false;
|
||||||
bool has_intel_graphics = false;
|
bool has_intel_graphics = false;
|
||||||
bool has_ahci = false;
|
bool has_ahci = false;
|
||||||
|
|
||||||
|
Boot_fb_driver::Mode const boot_fb_mode = _boot_fb_mode();
|
||||||
|
|
||||||
_pci_devices.xml().for_each_sub_node([&] (Xml_node device) {
|
_pci_devices.xml().for_each_sub_node([&] (Xml_node device) {
|
||||||
|
|
||||||
uint16_t const vendor_id = device.attribute_value("vendor_id", 0UL);
|
uint16_t const vendor_id = device.attribute_value("vendor_id", 0UL);
|
||||||
@ -297,11 +356,21 @@ void Driver_manager::Main::_handle_pci_devices_update()
|
|||||||
if (!_intel_fb_driver.constructed() && has_intel_graphics) {
|
if (!_intel_fb_driver.constructed() && has_intel_graphics) {
|
||||||
_intel_fb_driver.construct();
|
_intel_fb_driver.construct();
|
||||||
_vesa_fb_driver.destruct();
|
_vesa_fb_driver.destruct();
|
||||||
|
_boot_fb_driver.destruct();
|
||||||
_generate_init_config(_init_config);
|
_generate_init_config(_init_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_vesa_fb_driver.constructed() && has_vga && !has_intel_graphics) {
|
if (!_boot_fb_driver.constructed() && boot_fb_mode.valid() && !has_intel_graphics) {
|
||||||
_intel_fb_driver.destruct();
|
_intel_fb_driver.destruct();
|
||||||
|
_vesa_fb_driver.destruct();
|
||||||
|
_boot_fb_driver.construct(boot_fb_mode);
|
||||||
|
_generate_init_config(_init_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_vesa_fb_driver.constructed() && has_vga && !has_intel_graphics &&
|
||||||
|
!boot_fb_mode.valid()) {
|
||||||
|
_intel_fb_driver.destruct();
|
||||||
|
_boot_fb_driver.destruct();
|
||||||
_vesa_fb_driver.construct();
|
_vesa_fb_driver.construct();
|
||||||
_generate_init_config(_init_config);
|
_generate_init_config(_init_config);
|
||||||
}
|
}
|
||||||
@ -358,6 +427,9 @@ void Driver_manager::Main::_generate_init_config(Reporter &init_config) const
|
|||||||
if (_vesa_fb_driver.constructed())
|
if (_vesa_fb_driver.constructed())
|
||||||
_vesa_fb_driver->generate_start_node(xml);
|
_vesa_fb_driver->generate_start_node(xml);
|
||||||
|
|
||||||
|
if (_boot_fb_driver.constructed())
|
||||||
|
_boot_fb_driver->generate_start_node(xml);
|
||||||
|
|
||||||
if (_ahci_driver.constructed())
|
if (_ahci_driver.constructed())
|
||||||
_ahci_driver->generate_start_node(xml);
|
_ahci_driver->generate_start_node(xml);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user