mirror of
https://github.com/genodelabs/genode.git
synced 2025-01-29 15:44:02 +00:00
platform_drv: skip assign device if iommu missing
Avoid red messages in the log on machines with no IOMMU, which recurring confuse people. Issue #2801
This commit is contained in:
parent
24e6b677bd
commit
501d82b99f
@ -177,6 +177,10 @@ struct Device_scope : Genode::Mmio
|
|||||||
};
|
};
|
||||||
|
|
||||||
unsigned count() const {
|
unsigned count() const {
|
||||||
|
unsigned const length = read<Length>();
|
||||||
|
if (length < 6)
|
||||||
|
return 0;
|
||||||
|
|
||||||
unsigned paths = (read<Length>() - 6) / 2;
|
unsigned paths = (read<Length>() - 6) / 2;
|
||||||
if (paths > MAX_PATHS) {
|
if (paths > MAX_PATHS) {
|
||||||
Genode::error("Device_scope: more paths (", paths, ") than"
|
Genode::error("Device_scope: more paths (", paths, ") than"
|
||||||
@ -187,6 +191,29 @@ struct Device_scope : Genode::Mmio
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* DMA Remapping Hardware Definition - Intel VT-d IO Spec - 8.3. */
|
||||||
|
struct Dmar_drhd : Genode::Mmio
|
||||||
|
{
|
||||||
|
struct Length : Register<0x2, 16> { };
|
||||||
|
struct Flags : Register<0x4, 8> { };
|
||||||
|
struct Segment : Register<0x6, 16> { };
|
||||||
|
struct Phys : Register<0x8, 64> { };
|
||||||
|
|
||||||
|
Dmar_drhd(addr_t a) : Genode::Mmio(a) { }
|
||||||
|
|
||||||
|
template <typename FUNC>
|
||||||
|
void apply(FUNC const &func = [] () { } )
|
||||||
|
{
|
||||||
|
addr_t addr = base() + 16;
|
||||||
|
do {
|
||||||
|
Device_scope scope(addr);
|
||||||
|
|
||||||
|
func(scope);
|
||||||
|
|
||||||
|
addr = scope.base() + scope.read<Device_scope::Length>();
|
||||||
|
} while (addr < base() + read<Length>());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/* DMA Remapping Reporting structure - Intel VT-d IO Spec - 8.3. */
|
/* DMA Remapping Reporting structure - Intel VT-d IO Spec - 8.3. */
|
||||||
struct Dmar_rmrr : Genode::Mmio
|
struct Dmar_rmrr : Genode::Mmio
|
||||||
@ -1366,8 +1393,12 @@ void Acpi::generate_report(Genode::Env &env, Genode::Allocator &alloc)
|
|||||||
/* lambda definition for scope evaluation in rmrr */
|
/* lambda definition for scope evaluation in rmrr */
|
||||||
auto func_scope = [&] (Device_scope const &scope)
|
auto func_scope = [&] (Device_scope const &scope)
|
||||||
{
|
{
|
||||||
|
if (!scope.count())
|
||||||
|
return;
|
||||||
|
|
||||||
xml.node("scope", [&] () {
|
xml.node("scope", [&] () {
|
||||||
xml.attribute("bus_start", scope.read<Device_scope::Bus>());
|
xml.attribute("bus_start", scope.read<Device_scope::Bus>());
|
||||||
|
xml.attribute("type", scope.read<Device_scope::Type>());
|
||||||
for (unsigned j = 0 ; j < scope.count(); j++) {
|
for (unsigned j = 0 ; j < scope.count(); j++) {
|
||||||
xml.node("path", [&] () {
|
xml.node("path", [&] () {
|
||||||
attribute_hex(xml, "dev",
|
attribute_hex(xml, "dev",
|
||||||
@ -1383,6 +1414,17 @@ void Acpi::generate_report(Genode::Env &env, Genode::Allocator &alloc)
|
|||||||
entry; entry = entry->next()) {
|
entry; entry = entry->next()) {
|
||||||
|
|
||||||
entry->apply([&] (Dmar_common const &dmar) {
|
entry->apply([&] (Dmar_common const &dmar) {
|
||||||
|
if (dmar.read<Dmar_common::Type>() == Dmar_common::Type::DRHD) {
|
||||||
|
Dmar_drhd drhd(dmar.base());
|
||||||
|
|
||||||
|
xml.node("drhd", [&] () {
|
||||||
|
attribute_hex(xml, "phys", drhd.read<Dmar_drhd::Phys>());
|
||||||
|
attribute_hex(xml, "flags", drhd.read<Dmar_drhd::Flags>());
|
||||||
|
attribute_hex(xml, "segment", drhd.read<Dmar_drhd::Segment>());
|
||||||
|
drhd.apply(func_scope);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (dmar.read<Dmar_common::Type>() != Dmar_common::Type::RMRR)
|
if (dmar.read<Dmar_common::Type>() != Dmar_common::Type::RMRR)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -219,7 +219,7 @@ class Platform::Session_component : public Genode::Rpc_object<Session>
|
|||||||
Genode::List<Device_component> _device_list { };
|
Genode::List<Device_component> _device_list { };
|
||||||
Platform::Pci_buses &_pci_bus;
|
Platform::Pci_buses &_pci_bus;
|
||||||
Genode::Heap &_global_heap;
|
Genode::Heap &_global_heap;
|
||||||
bool _no_device_pd = false;
|
bool _iommu;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registry of RAM dataspaces allocated by the session
|
* Registry of RAM dataspaces allocated by the session
|
||||||
@ -463,7 +463,8 @@ class Platform::Session_component : public Genode::Rpc_object<Session>
|
|||||||
Genode::Attached_io_mem_dataspace &pciconf,
|
Genode::Attached_io_mem_dataspace &pciconf,
|
||||||
Platform::Pci_buses &buses,
|
Platform::Pci_buses &buses,
|
||||||
Genode::Heap &global_heap,
|
Genode::Heap &global_heap,
|
||||||
char const *args)
|
char const *args,
|
||||||
|
bool const iommu)
|
||||||
:
|
:
|
||||||
_env(env),
|
_env(env),
|
||||||
_config(config),
|
_config(config),
|
||||||
@ -472,7 +473,7 @@ class Platform::Session_component : public Genode::Rpc_object<Session>
|
|||||||
_cap_guard(Genode::cap_quota_from_args(args)),
|
_cap_guard(Genode::cap_quota_from_args(args)),
|
||||||
_md_alloc(_env_ram, env.rm()),
|
_md_alloc(_env_ram, env.rm()),
|
||||||
_label(Genode::label_from_args(args)),
|
_label(Genode::label_from_args(args)),
|
||||||
_pci_bus(buses), _global_heap(global_heap)
|
_pci_bus(buses), _global_heap(global_heap), _iommu(iommu)
|
||||||
{
|
{
|
||||||
/* subtract the RPC session and session dataspace capabilities */
|
/* subtract the RPC session and session dataspace capabilities */
|
||||||
_cap_guard.withdraw(Genode::Cap_quota{2});
|
_cap_guard.withdraw(Genode::Cap_quota{2});
|
||||||
@ -763,7 +764,7 @@ class Platform::Session_component : public Genode::Rpc_object<Session>
|
|||||||
{
|
{
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
if (!device || device->config_space() == ~0UL)
|
if (!device || device->config_space() == ~0UL || !_iommu)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -840,6 +841,8 @@ class Platform::Root : public Genode::Root_component<Session_component>
|
|||||||
|
|
||||||
Genode::Constructible<Platform::Pci_buses> _buses { };
|
Genode::Constructible<Platform::Pci_buses> _buses { };
|
||||||
|
|
||||||
|
bool _iommu { false };
|
||||||
|
|
||||||
void _parse_report_rom(Genode::Env &env, const char * acpi_rom,
|
void _parse_report_rom(Genode::Env &env, const char * acpi_rom,
|
||||||
bool acpi_platform)
|
bool acpi_platform)
|
||||||
{
|
{
|
||||||
@ -914,6 +917,11 @@ class Platform::Root : public Genode::Root_component<Session_component>
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (node.has_type("drhd")) {
|
||||||
|
_iommu = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (node.has_type("rmrr")) {
|
if (node.has_type("rmrr")) {
|
||||||
uint64_t mem_start = 0, mem_end = 0;
|
uint64_t mem_start = 0, mem_end = 0;
|
||||||
node.attribute("start").value(&mem_start);
|
node.attribute("start").value(&mem_start);
|
||||||
@ -1029,7 +1037,8 @@ class Platform::Root : public Genode::Root_component<Session_component>
|
|||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
return new (md_alloc())
|
return new (md_alloc())
|
||||||
Session_component(_env, _config, *_pci_confspace, *_buses, _heap, args);
|
Session_component(_env, _config, *_pci_confspace, *_buses,
|
||||||
|
_heap, args, _iommu);
|
||||||
}
|
}
|
||||||
catch (Genode::Session_policy::No_policy_defined) {
|
catch (Genode::Session_policy::No_policy_defined) {
|
||||||
Genode::error("Invalid session request, no matching policy for ",
|
Genode::error("Invalid session request, no matching policy for ",
|
||||||
|
@ -37,7 +37,7 @@ proc run_boot_dir {binaries} {
|
|||||||
# generate static ACPI report for platform driver on Muen
|
# generate static ACPI report for platform driver on Muen
|
||||||
if {[have_spec "muen"]} {
|
if {[have_spec "muen"]} {
|
||||||
set fh [open "bin/acpi" "WRONLY CREAT TRUNC"]
|
set fh [open "bin/acpi" "WRONLY CREAT TRUNC"]
|
||||||
puts $fh "<acpi><bdf start=\"0\" count=\"16384\" base=\"0xf8000000\"/></acpi>"
|
puts $fh "<acpi><bdf start=\"0\" count=\"16384\" base=\"0xf8000000\"/><drhd/></acpi>"
|
||||||
close $fh
|
close $fh
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user