mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-18 07:08:18 +00:00
committed by
Christian Helmuth
parent
134b07f41f
commit
dd562f84fa
@ -44,6 +44,7 @@
|
|||||||
<policy label="driver_manager -> usb_devices" report="usb_drv -> devices"/>
|
<policy label="driver_manager -> usb_devices" report="usb_drv -> devices"/>
|
||||||
<policy label="dynamic -> config" report="driver_manager -> init.config"/>
|
<policy label="dynamic -> config" report="driver_manager -> init.config"/>
|
||||||
<policy label="driver_manager -> ahci_ports" report="dynamic -> ahci_ports"/>
|
<policy label="driver_manager -> ahci_ports" report="dynamic -> ahci_ports"/>
|
||||||
|
<policy label="driver_manager -> nvme_ns" report="dynamic -> nvme_ns"/>
|
||||||
<policy label="rom_reporter -> acpi" report="acpi_drv -> acpi"/>
|
<policy label="rom_reporter -> acpi" report="acpi_drv -> acpi"/>
|
||||||
<policy label="rom_reporter -> pci_devices" report="platform_drv -> pci"/>
|
<policy label="rom_reporter -> pci_devices" report="platform_drv -> pci"/>
|
||||||
<policy label="rom_reporter -> usb_devices" report="usb_drv -> devices"/>
|
<policy label="rom_reporter -> usb_devices" report="usb_drv -> devices"/>
|
||||||
@ -108,6 +109,7 @@
|
|||||||
<policy label_prefix="ps2_drv"> <device name="PS2"/> </policy>
|
<policy label_prefix="ps2_drv"> <device name="PS2"/> </policy>
|
||||||
<policy label_prefix="dynamic -> vesa_fb_drv"> <pci class="VGA"/> </policy>
|
<policy label_prefix="dynamic -> vesa_fb_drv"> <pci class="VGA"/> </policy>
|
||||||
<policy label_prefix="dynamic -> ahci_drv"> <pci class="AHCI"/> </policy>
|
<policy label_prefix="dynamic -> ahci_drv"> <pci class="AHCI"/> </policy>
|
||||||
|
<policy label_prefix="dynamic -> nvme_drv"> <pci class="NVME"/> </policy>
|
||||||
<policy label_prefix="usb_drv"> <pci class="USB"/> </policy>
|
<policy label_prefix="usb_drv"> <pci class="USB"/> </policy>
|
||||||
<policy label_prefix="dynamic -> intel_fb_drv" irq_mode="nomsi">
|
<policy label_prefix="dynamic -> intel_fb_drv" irq_mode="nomsi">
|
||||||
<pci class="VGA"/>
|
<pci class="VGA"/>
|
||||||
@ -194,6 +196,7 @@
|
|||||||
<service name="ROM" label="usb_devices"> <child name="report_rom"/> </service>
|
<service name="ROM" label="usb_devices"> <child name="report_rom"/> </service>
|
||||||
<service name="ROM" label="pci_devices"> <child name="report_rom"/> </service>
|
<service name="ROM" label="pci_devices"> <child name="report_rom"/> </service>
|
||||||
<service name="ROM" label="ahci_ports"> <child name="report_rom"/> </service>
|
<service name="ROM" label="ahci_ports"> <child name="report_rom"/> </service>
|
||||||
|
<service name="ROM" label="nvme_ns"> <child name="report_rom"/> </service>
|
||||||
<service name="LOG"> <parent/> </service>
|
<service name="LOG"> <parent/> </service>
|
||||||
<service name="PD"> <parent/> </service>
|
<service name="PD"> <parent/> </service>
|
||||||
<service name="CPU"> <parent/> </service>
|
<service name="CPU"> <parent/> </service>
|
||||||
@ -211,6 +214,7 @@
|
|||||||
<route>
|
<route>
|
||||||
<service name="Platform"> <child name="platform_drv"/> </service>
|
<service name="Platform"> <child name="platform_drv"/> </service>
|
||||||
<service name="Report" label="ahci_ports"> <child name="report_rom"/> </service>
|
<service name="Report" label="ahci_ports"> <child name="report_rom"/> </service>
|
||||||
|
<service name="Report" label="nvme_ns"> <child name="report_rom"/> </service>
|
||||||
<service name="Report"> <parent/> </service>
|
<service name="Report"> <parent/> </service>
|
||||||
<service name="Usb"> <child name="usb_drv"/> </service>
|
<service name="Usb"> <child name="usb_drv"/> </service>
|
||||||
<service name="ROM" label="config"> <child name="report_rom"/> </service>
|
<service name="ROM" label="config"> <child name="report_rom"/> </service>
|
||||||
|
@ -35,6 +35,7 @@ namespace Driver_manager {
|
|||||||
struct Vesa_fb_driver;
|
struct Vesa_fb_driver;
|
||||||
struct Boot_fb_driver;
|
struct Boot_fb_driver;
|
||||||
struct Ahci_driver;
|
struct Ahci_driver;
|
||||||
|
struct Nvme_driver;
|
||||||
|
|
||||||
struct Priority { int value; };
|
struct Priority { int value; };
|
||||||
}
|
}
|
||||||
@ -258,6 +259,57 @@ struct Driver_manager::Ahci_driver : Device_driver
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct Driver_manager::Nvme_driver : Device_driver
|
||||||
|
{
|
||||||
|
void generate_start_node(Xml_generator &xml) const override
|
||||||
|
{
|
||||||
|
xml.node("start", [&] () {
|
||||||
|
_gen_common_start_node_content(xml, "nvme_drv", "nvme_drv",
|
||||||
|
Ram_quota{8*1024*1024}, Cap_quota{100},
|
||||||
|
Priority{-1});
|
||||||
|
_gen_provides_node<Block::Session>(xml);
|
||||||
|
xml.node("config", [&] () {
|
||||||
|
xml.node("report", [&] () { xml.attribute("namespaces", "yes"); });
|
||||||
|
xml.node("policy", [&] () {
|
||||||
|
xml.attribute("label_suffix", String<64>("nvme-0"));
|
||||||
|
xml.attribute("namespace", 1);
|
||||||
|
xml.attribute("writeable", "yes");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
xml.node("route", [&] () {
|
||||||
|
xml.node("service", [&] () {
|
||||||
|
xml.attribute("name", "Report");
|
||||||
|
xml.node("parent", [&] () { xml.attribute("label", "nvme_ns"); });
|
||||||
|
});
|
||||||
|
_gen_default_parent_route(xml);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef String<32> Default_label;
|
||||||
|
|
||||||
|
void gen_service_forwarding_policy(Xml_generator &xml,
|
||||||
|
Default_label const &default_label) const
|
||||||
|
{
|
||||||
|
xml.node("policy", [&] () {
|
||||||
|
xml.attribute("label_suffix", String<64>("nvme-0"));
|
||||||
|
xml.node("child", [&] () {
|
||||||
|
xml.attribute("name", "nvme_drv"); });
|
||||||
|
});
|
||||||
|
|
||||||
|
if (default_label.valid()) {
|
||||||
|
xml.node("policy", [&] () {
|
||||||
|
xml.attribute("label_suffix", " default");
|
||||||
|
xml.node("child", [&] () {
|
||||||
|
xml.attribute("name", "nvme_drv");
|
||||||
|
xml.attribute("label", default_label);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Driver_manager::Main : Block_devices_generator
|
struct Driver_manager::Main : Block_devices_generator
|
||||||
{
|
{
|
||||||
Env &_env;
|
Env &_env;
|
||||||
@ -266,6 +318,7 @@ struct Driver_manager::Main : Block_devices_generator
|
|||||||
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" };
|
||||||
Attached_rom_dataspace _ahci_ports { _env, "ahci_ports" };
|
Attached_rom_dataspace _ahci_ports { _env, "ahci_ports" };
|
||||||
|
Attached_rom_dataspace _nvme_ns { _env, "nvme_ns" };
|
||||||
|
|
||||||
Reporter _init_config { _env, "config", "init.config" };
|
Reporter _init_config { _env, "config", "init.config" };
|
||||||
Reporter _usb_drv_config { _env, "config", "usb_drv.config" };
|
Reporter _usb_drv_config { _env, "config", "usb_drv.config" };
|
||||||
@ -275,6 +328,7 @@ struct Driver_manager::Main : Block_devices_generator
|
|||||||
Constructible<Vesa_fb_driver> _vesa_fb_driver;
|
Constructible<Vesa_fb_driver> _vesa_fb_driver;
|
||||||
Constructible<Boot_fb_driver> _boot_fb_driver;
|
Constructible<Boot_fb_driver> _boot_fb_driver;
|
||||||
Constructible<Ahci_driver> _ahci_driver;
|
Constructible<Ahci_driver> _ahci_driver;
|
||||||
|
Constructible<Nvme_driver> _nvme_driver;
|
||||||
|
|
||||||
Boot_fb_driver::Mode _boot_fb_mode() const
|
Boot_fb_driver::Mode _boot_fb_mode() const
|
||||||
{
|
{
|
||||||
@ -300,6 +354,11 @@ struct Driver_manager::Main : Block_devices_generator
|
|||||||
Signal_handler<Main> _ahci_ports_update_handler {
|
Signal_handler<Main> _ahci_ports_update_handler {
|
||||||
_env.ep(), *this, &Main::_handle_ahci_ports_update };
|
_env.ep(), *this, &Main::_handle_ahci_ports_update };
|
||||||
|
|
||||||
|
void _handle_nvme_ns_update();
|
||||||
|
|
||||||
|
Signal_handler<Main> _nvme_ns_update_handler {
|
||||||
|
_env.ep(), *this, &Main::_handle_nvme_ns_update };
|
||||||
|
|
||||||
static void _gen_parent_service_xml(Xml_generator &xml, char const *name)
|
static void _gen_parent_service_xml(Xml_generator &xml, char const *name)
|
||||||
{
|
{
|
||||||
xml.node("service", [&] () { xml.attribute("name", name); });
|
xml.node("service", [&] () { xml.attribute("name", name); });
|
||||||
@ -325,6 +384,7 @@ struct Driver_manager::Main : Block_devices_generator
|
|||||||
_pci_devices.sigh(_pci_devices_update_handler);
|
_pci_devices.sigh(_pci_devices_update_handler);
|
||||||
_usb_devices.sigh(_usb_devices_update_handler);
|
_usb_devices.sigh(_usb_devices_update_handler);
|
||||||
_ahci_ports .sigh(_ahci_ports_update_handler);
|
_ahci_ports .sigh(_ahci_ports_update_handler);
|
||||||
|
_nvme_ns .sigh(_nvme_ns_update_handler);
|
||||||
|
|
||||||
_generate_init_config(_init_config);
|
_generate_init_config(_init_config);
|
||||||
_generate_usb_drv_config(_usb_drv_config, Xml_node("<devices/>"));
|
_generate_usb_drv_config(_usb_drv_config, Xml_node("<devices/>"));
|
||||||
@ -332,6 +392,7 @@ struct Driver_manager::Main : Block_devices_generator
|
|||||||
_handle_pci_devices_update();
|
_handle_pci_devices_update();
|
||||||
_handle_usb_devices_update();
|
_handle_usb_devices_update();
|
||||||
_handle_ahci_ports_update();
|
_handle_ahci_ports_update();
|
||||||
|
_handle_nvme_ns_update();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -347,6 +408,7 @@ void Driver_manager::Main::_handle_pci_devices_update()
|
|||||||
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;
|
||||||
|
bool has_nvme = false;
|
||||||
|
|
||||||
Boot_fb_driver::Mode const boot_fb_mode = _boot_fb_mode();
|
Boot_fb_driver::Mode const boot_fb_mode = _boot_fb_mode();
|
||||||
|
|
||||||
@ -359,6 +421,7 @@ void Driver_manager::Main::_handle_pci_devices_update()
|
|||||||
VENDOR_INTEL = 0x8086U,
|
VENDOR_INTEL = 0x8086U,
|
||||||
CLASS_VGA = 0x300U,
|
CLASS_VGA = 0x300U,
|
||||||
CLASS_AHCI = 0x106U,
|
CLASS_AHCI = 0x106U,
|
||||||
|
CLASS_NVME = 0x108U,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (class_code == CLASS_VGA)
|
if (class_code == CLASS_VGA)
|
||||||
@ -369,6 +432,9 @@ void Driver_manager::Main::_handle_pci_devices_update()
|
|||||||
|
|
||||||
if (vendor_id == VENDOR_INTEL && class_code == CLASS_AHCI)
|
if (vendor_id == VENDOR_INTEL && class_code == CLASS_AHCI)
|
||||||
has_ahci = true;
|
has_ahci = true;
|
||||||
|
|
||||||
|
if (class_code == CLASS_NVME)
|
||||||
|
has_nvme = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!_intel_fb_driver.constructed() && has_intel_graphics) {
|
if (!_intel_fb_driver.constructed() && has_intel_graphics) {
|
||||||
@ -397,6 +463,11 @@ void Driver_manager::Main::_handle_pci_devices_update()
|
|||||||
_ahci_driver.construct();
|
_ahci_driver.construct();
|
||||||
_generate_init_config(_init_config);
|
_generate_init_config(_init_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!_nvme_driver.constructed() && has_nvme) {
|
||||||
|
_nvme_driver.construct();
|
||||||
|
_generate_init_config(_init_config);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -410,6 +481,16 @@ void Driver_manager::Main::_handle_ahci_ports_update()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Driver_manager::Main::_handle_nvme_ns_update()
|
||||||
|
{
|
||||||
|
_nvme_ns.update();
|
||||||
|
_generate_block_devices(_block_devices);
|
||||||
|
|
||||||
|
/* update service forwarding rules */
|
||||||
|
_generate_init_config(_init_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Driver_manager::Main::_handle_usb_devices_update()
|
void Driver_manager::Main::_handle_usb_devices_update()
|
||||||
{
|
{
|
||||||
_usb_devices.update();
|
_usb_devices.update();
|
||||||
@ -454,13 +535,25 @@ void Driver_manager::Main::_generate_init_config(Reporter &init_config) const
|
|||||||
if (_ahci_driver.constructed())
|
if (_ahci_driver.constructed())
|
||||||
_ahci_driver->generate_start_node(xml);
|
_ahci_driver->generate_start_node(xml);
|
||||||
|
|
||||||
|
if (_nvme_driver.constructed())
|
||||||
|
_nvme_driver->generate_start_node(xml);
|
||||||
|
|
||||||
/* block-service forwarding rules */
|
/* block-service forwarding rules */
|
||||||
if (_ahci_driver.constructed() && _ahci_ports.xml().has_sub_node("port")) {
|
bool const ahci = _ahci_driver.constructed() && _ahci_ports.xml().has_sub_node("port");
|
||||||
|
bool const nvme = _nvme_driver.constructed() && _nvme_ns.xml().has_sub_node("namespace");
|
||||||
|
|
||||||
|
if (!ahci && !nvme) return;
|
||||||
|
|
||||||
|
bool const ahci_and_nvme = ahci && nvme;
|
||||||
xml.node("service", [&] () {
|
xml.node("service", [&] () {
|
||||||
xml.attribute("name", Block::Session::service_name());
|
xml.attribute("name", Block::Session::service_name());
|
||||||
_ahci_driver->gen_service_forwarding_policy(xml, _default_block_device());
|
if (ahci)
|
||||||
|
_ahci_driver->gen_service_forwarding_policy(xml,
|
||||||
|
ahci_and_nvme ? Ahci_driver::Default_label() : _default_block_device());
|
||||||
|
if (nvme)
|
||||||
|
_nvme_driver->gen_service_forwarding_policy(xml,
|
||||||
|
ahci_and_nvme ? Nvme_driver::Default_label() : "nvme-0");
|
||||||
});
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,6 +606,30 @@ void Driver_manager::Main::_generate_block_devices(Reporter &block_devices) cons
|
|||||||
xml.attribute("model", model);
|
xml.attribute("model", model);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* for now just report the first name space */
|
||||||
|
if (_nvme_ns.xml().has_sub_node("namespace")) {
|
||||||
|
|
||||||
|
Xml_node nvme_ctrl = _nvme_ns.xml();
|
||||||
|
Xml_node nvme_ns = _nvme_ns.xml().sub_node("namespace");
|
||||||
|
xml.node("device", [&] () {
|
||||||
|
|
||||||
|
unsigned long const
|
||||||
|
block_count = nvme_ns.attribute_value("block_count", 0UL),
|
||||||
|
block_size = nvme_ns.attribute_value("block_size", 0UL);
|
||||||
|
|
||||||
|
typedef String<40+1> Model;
|
||||||
|
Model const model = nvme_ctrl.attribute_value("model", Model());
|
||||||
|
typedef String<20+1> Serial;
|
||||||
|
Serial const serial = nvme_ctrl.attribute_value("serial", Serial());
|
||||||
|
|
||||||
|
xml.attribute("label", String<16>("nvme-0"));
|
||||||
|
xml.attribute("block_count", block_count);
|
||||||
|
xml.attribute("block_size", block_size);
|
||||||
|
xml.attribute("model", model);
|
||||||
|
xml.attribute("serial", serial);
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user