diff --git a/repos/dde_linux/src/drivers/nic/fec/lx_emul.cc b/repos/dde_linux/src/drivers/nic/fec/lx_emul.cc index 2beaa394ad..0d51491d7b 100644 --- a/repos/dde_linux/src/drivers/nic/fec/lx_emul.cc +++ b/repos/dde_linux/src/drivers/nic/fec/lx_emul.cc @@ -125,15 +125,15 @@ struct Platform::Device_client : Rpc_client return call(id); } - Io_mem_session_capability io_mem(unsigned id, Range &range, Cache cache) + Io_mem_session_capability io_mem(unsigned id, Range &range) { - return call(id, range, cache); + return call(id, range); } Dataspace_capability io_mem_dataspace(unsigned id = 0) { Range range { }; - return Io_mem_session_client(io_mem(id, range, UNCACHED)).dataspace(); + return Io_mem_session_client(io_mem(id, range)).dataspace(); } }; diff --git a/repos/dde_linux/src/drivers/usb_host/spec/arm/platform.cc b/repos/dde_linux/src/drivers/usb_host/spec/arm/platform.cc index a2b1c471b2..dcffb13345 100644 --- a/repos/dde_linux/src/drivers/usb_host/spec/arm/platform.cc +++ b/repos/dde_linux/src/drivers/usb_host/spec/arm/platform.cc @@ -116,7 +116,7 @@ void lx_platform_device_init() Device_interface::Range range { }; Io_mem_session_client io_mem_client { - device_cap.call(res_count, range, UNCACHED) }; + device_cap.call(res_count, range) }; Io_mem & iom = *new (Lx_kit::env().heap()) Io_mem(io_mem_client.dataspace(), range.start, range.size, diff --git a/repos/os/include/platform_session/device.h b/repos/os/include/platform_session/device.h index a320ffb070..4906f99956 100644 --- a/repos/os/include/platform_session/device.h +++ b/repos/os/include/platform_session/device.h @@ -49,9 +49,9 @@ class Platform::Device : Interface, Noncopyable return _cap.call(index); } - Io_mem_session_capability _io_mem(unsigned index, Range &range, Cache cache) + Io_mem_session_capability _io_mem(unsigned index, Range &range) { - return _cap.call(index, range, cache); + return _cap.call(index, range); } Io_port_session_capability _io_port_range(unsigned index) @@ -92,7 +92,7 @@ class Platform::Device::Mmio : Range, Attached_dataspace, public Genode::Mmio Dataspace_capability _ds_cap(Device &device, unsigned id) { - Io_mem_session_client io_mem(device._io_mem(id, *this, UNCACHED)); + Io_mem_session_client io_mem(device._io_mem(id, *this)); return io_mem.dataspace(); } diff --git a/repos/os/include/platform_session/platform_session.h b/repos/os/include/platform_session/platform_session.h index 6818276188..863764f9f0 100644 --- a/repos/os/include/platform_session/platform_session.h +++ b/repos/os/include/platform_session/platform_session.h @@ -42,7 +42,7 @@ struct Platform::Device_interface : Interface GENODE_RPC(Rpc_irq, Irq_session_capability, irq, unsigned); GENODE_RPC(Rpc_io_mem, Io_mem_session_capability, io_mem, - unsigned, Range &, Cache); + unsigned, Range &); GENODE_RPC(Rpc_io_port_range, Io_port_session_capability, io_port_range, unsigned); diff --git a/repos/os/src/drivers/gpio/imx/driver.h b/repos/os/src/drivers/gpio/imx/driver.h index 192cf328a9..f4d695e3a7 100644 --- a/repos/os/src/drivers/gpio/imx/driver.h +++ b/repos/os/src/drivers/gpio/imx/driver.h @@ -44,15 +44,15 @@ struct Platform::Device_client : Rpc_client return call(id); } - Io_mem_session_capability io_mem(unsigned id, Range &range, Cache cache) + Io_mem_session_capability io_mem(unsigned id, Range &range) { - return call(id, range, cache); + return call(id, range); } Dataspace_capability io_mem_dataspace(unsigned id = 0) { Range range { }; - return Io_mem_session_client(io_mem(id, range, UNCACHED)).dataspace(); + return Io_mem_session_client(io_mem(id, range)).dataspace(); } }; diff --git a/repos/os/src/drivers/gpu/intel/platform_session.h b/repos/os/src/drivers/gpu/intel/platform_session.h index d68f139f42..2c803e2538 100644 --- a/repos/os/src/drivers/gpu/intel/platform_session.h +++ b/repos/os/src/drivers/gpu/intel/platform_session.h @@ -134,9 +134,7 @@ class Platform::Device_component : public Rpc_object::Element Pci_bar bar; Range range; + bool prefetchable; - Io_mem(Pci_bar bar, Range range) - : bar(bar), range(range) {} + Io_mem(Pci_bar bar, Range range, bool pf) + : bar(bar), range(range), prefetchable(pf) {} }; struct Irq : List_model::Element @@ -228,7 +229,7 @@ class Driver::Device : private List_model::Element { unsigned idx = 0; _io_mem_list.for_each([&] (Io_mem const & iomem) { - fn(idx++, iomem.range, iomem.bar); }); + fn(idx++, iomem.range, iomem.bar, iomem.prefetchable); }); } template void for_each_io_port_range(FN const & fn) const @@ -420,7 +421,8 @@ struct Driver::Io_mem_update_policy : Genode::List_model::Update Bar bar { node.attribute_value("pci_bar", Bar::INVALID) }; Range range { node.attribute_value("address", 0), node.attribute_value("size", 0) }; - return *(new (alloc) Element(bar, range)); + bool pf { node.attribute_value("prefetchable", false) }; + return *(new (alloc) Element(bar, range, pf)); } void update_element(Element &, Genode::Xml_node) {} diff --git a/repos/os/src/drivers/platform/device_component.cc b/repos/os/src/drivers/platform/device_component.cc index 985aaabcc6..ff0aa9d4dc 100644 --- a/repos/os/src/drivers/platform/device_component.cc +++ b/repos/os/src/drivers/platform/device_component.cc @@ -47,7 +47,7 @@ Driver::Session_component & Device_component::session() { return _session; } Genode::Io_mem_session_capability -Device_component::io_mem(unsigned idx, Range &range, Cache cache) +Device_component::io_mem(unsigned idx, Range &range) { Io_mem_session_capability cap; @@ -60,7 +60,7 @@ Device_component::io_mem(unsigned idx, Range &range, Cache cache) iomem.io_mem.construct(_env, iomem.range.start, iomem.range.size, - cache == WRITE_COMBINED); + iomem.prefetchable); range = iomem.range; range.start &= 0xfff; @@ -159,13 +159,14 @@ Device_component::Device_component(Registry & registry, new (session.heap()) Irq(_irq_registry, idx, nr, type, polarity, mode); }); - device.for_each_io_mem([&] (unsigned idx, Range range, Device::Pci_bar) + device.for_each_io_mem([&] (unsigned idx, Range range, + Device::Pci_bar, bool pf) { session.ram_quota_guard().withdraw(Ram_quota{Io_mem_session::RAM_QUOTA}); _ram_quota += Io_mem_session::RAM_QUOTA; session.cap_quota_guard().withdraw(Cap_quota{Io_mem_session::CAP_QUOTA}); _cap_quota += Io_mem_session::CAP_QUOTA; - new (session.heap()) Io_mem(_io_mem_registry, idx, range); + new (session.heap()) Io_mem(_io_mem_registry, idx, range, pf); }); device.for_each_io_port_range([&] (unsigned idx, Io_port_range::Range range) @@ -193,7 +194,7 @@ Device_component::Device_component(Registry & registry, session.cap_quota_guard().withdraw(Cap_quota{Io_mem_session::CAP_QUOTA}); _cap_quota += Io_mem_session::CAP_QUOTA; Io_mem & iomem = *(new (session.heap()) - Io_mem(_reserved_mem_registry, idx, range)); + Io_mem(_reserved_mem_registry, idx, range, false)); iomem.io_mem.construct(_env, iomem.range.start, iomem.range.size, false); session.device_pd().attach_dma_mem(iomem.io_mem->dataspace(), diff --git a/repos/os/src/drivers/platform/device_component.h b/repos/os/src/drivers/platform/device_component.h index b65f28c480..8ba561ced0 100644 --- a/repos/os/src/drivers/platform/device_component.h +++ b/repos/os/src/drivers/platform/device_component.h @@ -61,14 +61,16 @@ class Driver::Device_component : public Rpc_object io_mem {}; Io_mem(Registry & registry, unsigned idx, - Range range) + Range range, + bool pf) : Registry::Element(registry, *this), - idx(idx), range(range) {} + idx(idx), range(range), prefetchable(pf) {} }; struct Io_port_range : Registry::Element @@ -109,7 +111,7 @@ class Driver::Device_component : public Rpc_object()) idx = i; }); xml.node("virtio_range", [&] () {