From 03393185721577acc9d2abaafc44e8bde8540497 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Thu, 8 Apr 2021 17:44:11 +0200 Subject: [PATCH] platform_session: cache arg for alloc_dma_buffer This patch extends the 'Platform_session::alloc_dma_buffer' interface with a 'Cache' argument that corresponds to the argument accepted by 'Ram_allocator::alloc', which is used by the platform driver under the hood. Since the x86 platform driver used to be hardwired to allocate DMA buffers as UNCACHED, I adjusted all drivers by specifying the UNCACHED argument. Right now, this is needed as a hint for core to steer the allocation of I/O page tables. Once we eliminate the need for such hints (by introducing an explicit 'Region_map::attach_dma' operation), we can revisit the drivers individually because cached DMA buffers should generally be fine on the x86 architecture. Issue #2243 --- repos/dde_bsd/src/lib/audio/pci.cc | 2 +- repos/dde_ipxe/src/lib/dde_ipxe/dde_support.cc | 2 +- .../src/drivers/usb_host/spec/arm/platform.cc | 2 +- repos/dde_linux/src/lx_kit/pci.cc | 2 +- repos/os/include/block/component.h | 2 +- repos/os/include/block/driver.h | 4 ++-- repos/os/include/spec/arm/platform_session/client.h | 4 ++-- .../include/spec/arm/platform_session/connection.h | 4 ++-- .../spec/arm/platform_session/platform_session.h | 12 ++++-------- repos/os/include/spec/x86/platform_session/client.h | 4 ++-- .../spec/x86/platform_session/platform_session.h | 5 +++-- repos/os/src/drivers/ahci/spec/x86/platform.cc | 2 +- repos/os/src/drivers/framebuffer/pl11x/main.cc | 2 +- repos/os/src/drivers/gpu/intel/main.cc | 2 +- repos/os/src/drivers/nic/lan9118/lan9118.h | 2 +- repos/os/src/drivers/nvme/pci.h | 2 +- .../drivers/platform/spec/arm/session_component.cc | 4 ++-- .../drivers/platform/spec/arm/session_component.h | 2 +- .../platform/spec/x86/pci_session_component.h | 4 ++-- repos/os/src/drivers/sd_card/imx/driver.h | 4 ++-- repos/os/src/drivers/sd_card/rpi/driver.h | 4 ++-- 21 files changed, 34 insertions(+), 37 deletions(-) diff --git a/repos/dde_bsd/src/lib/audio/pci.cc b/repos/dde_bsd/src/lib/audio/pci.cc index a5b0ce1113..8aa6a4b0d4 100644 --- a/repos/dde_bsd/src/lib/audio/pci.cc +++ b/repos/dde_bsd/src/lib/audio/pci.cc @@ -138,7 +138,7 @@ class Pci_driver : public Bsd::Bus_driver return Genode::retry( [&] () { return Genode::retry( - [&] () { return _pci.alloc_dma_buffer(size); }, + [&] () { return _pci.alloc_dma_buffer(size, Genode::UNCACHED); }, [&] () { _pci.upgrade_caps(2); }); }, [&] () { diff --git a/repos/dde_ipxe/src/lib/dde_ipxe/dde_support.cc b/repos/dde_ipxe/src/lib/dde_ipxe/dde_support.cc index ec0f3f3d38..7866949887 100644 --- a/repos/dde_ipxe/src/lib/dde_ipxe/dde_support.cc +++ b/repos/dde_ipxe/src/lib/dde_ipxe/dde_support.cc @@ -245,7 +245,7 @@ struct Pci_driver retry( [&] () { return retry( - [&] () { return _pci.alloc_dma_buffer(size); }, + [&] () { return _pci.alloc_dma_buffer(size, UNCACHED); }, [&] () { _pci.upgrade_caps(2); }); }, [&] () { 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 6bd7c58563..f88bd90919 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 @@ -174,7 +174,7 @@ void backend_alloc_init(Env & env, Ram_allocator&, Allocator&) Ram_dataspace_capability Lx::backend_alloc(addr_t size, Cache) { - return resource_env().platform.alloc_dma_buffer(size); + return resource_env().platform.alloc_dma_buffer(size, UNCACHED); } diff --git a/repos/dde_linux/src/lx_kit/pci.cc b/repos/dde_linux/src/lx_kit/pci.cc index f3174fcec6..6e194125c0 100644 --- a/repos/dde_linux/src/lx_kit/pci.cc +++ b/repos/dde_linux/src/lx_kit/pci.cc @@ -128,7 +128,7 @@ Lx::backend_alloc(Genode::addr_t size, Genode::Cache cache) cap = retry( [&] () { return retry( - [&] () { return _global_pci->alloc_dma_buffer(size); }, + [&] () { return _global_pci->alloc_dma_buffer(size, UNCACHED); }, [&] () { _global_pci->upgrade_caps(2); }); }, [&] () { diff --git a/repos/os/include/block/component.h b/repos/os/include/block/component.h index 3a10cb5ad7..cdb0db9929 100644 --- a/repos/os/include/block/component.h +++ b/repos/os/include/block/component.h @@ -54,7 +54,7 @@ class Block::Session_component_base Session_component_base(Driver_factory &factory, size_t tx_buf_size) : _driver_factory(factory), _driver(*factory.create()), - _rq_ds(_driver.alloc_dma_buffer(tx_buf_size)) {} + _rq_ds(_driver.alloc_dma_buffer(tx_buf_size, UNCACHED)) {} ~Session_component_base() { diff --git a/repos/os/include/block/driver.h b/repos/os/include/block/driver.h index 141247e28f..5852226be2 100644 --- a/repos/os/include/block/driver.h +++ b/repos/os/include/block/driver.h @@ -193,8 +193,8 @@ class Block::Driver : Genode::Interface * Note: has to be overriden by DMA-capable devices */ virtual Genode::Ram_dataspace_capability - alloc_dma_buffer(Genode::size_t size) { - return _ram.alloc(size); } + alloc_dma_buffer(Genode::size_t size, Genode::Cache cache) { + return _ram.alloc(size, cache); } /** * Free buffer which is suitable for DMA. diff --git a/repos/os/include/spec/arm/platform_session/client.h b/repos/os/include/spec/arm/platform_session/client.h index 67197ade6e..92df752025 100644 --- a/repos/os/include/spec/arm/platform_session/client.h +++ b/repos/os/include/spec/arm/platform_session/client.h @@ -39,8 +39,8 @@ struct Platform::Client : public Genode::Rpc_client void release_device(Device_capability device) override { call(device); } - Ram_dataspace_capability alloc_dma_buffer(size_t size) override { - return call(size); } + Ram_dataspace_capability alloc_dma_buffer(size_t size, Cache cache) override { + return call(size, cache); } void free_dma_buffer(Ram_dataspace_capability cap) override { call(cap); } diff --git a/repos/os/include/spec/arm/platform_session/connection.h b/repos/os/include/spec/arm/platform_session/connection.h index 2f3c7dc868..c237e47649 100644 --- a/repos/os/include/spec/arm/platform_session/connection.h +++ b/repos/os/include/spec/arm/platform_session/connection.h @@ -64,10 +64,10 @@ class Platform::Connection : public Genode::Connection, return Client::acquire_device(device); }); } - Ram_dataspace_capability alloc_dma_buffer(size_t size) override + Ram_dataspace_capability alloc_dma_buffer(size_t size, Cache cache) override { return retry_with_upgrade(Ram_quota{size}, Cap_quota{2}, [&] () { - return Client::alloc_dma_buffer(size); }); + return Client::alloc_dma_buffer(size, cache); }); } template diff --git a/repos/os/include/spec/arm/platform_session/platform_session.h b/repos/os/include/spec/arm/platform_session/platform_session.h index 25d4dd4b81..f2f3a54b73 100644 --- a/repos/os/include/spec/arm/platform_session/platform_session.h +++ b/repos/os/include/spec/arm/platform_session/platform_session.h @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -23,6 +24,7 @@ #include namespace Platform { + using namespace Genode; struct Session; @@ -31,12 +33,6 @@ namespace Platform { struct Platform::Session : Genode::Session { - /********************* - ** Exception types ** - *********************/ - - class Fatal : public Out_of_ram { }; - /** * \noapi */ @@ -70,7 +66,7 @@ struct Platform::Session : Genode::Session /** * Allocate memory suitable for DMA. */ - virtual Ram_dataspace_capability alloc_dma_buffer(size_t) = 0; + virtual Ram_dataspace_capability alloc_dma_buffer(size_t, Cache) = 0; /** * Free previously allocated DMA memory @@ -94,7 +90,7 @@ struct Platform::Session : Genode::Session GENODE_RPC(Rpc_release_device, void, release_device, Device_capability); GENODE_RPC_THROW(Rpc_alloc_dma_buffer, Ram_dataspace_capability, alloc_dma_buffer, - GENODE_TYPE_LIST(Out_of_ram, Out_of_caps, Fatal), size_t); + GENODE_TYPE_LIST(Out_of_ram, Out_of_caps), size_t, Cache); GENODE_RPC(Rpc_free_dma_buffer, void, free_dma_buffer, Ram_dataspace_capability); GENODE_RPC(Rpc_dma_addr, addr_t, dma_addr, diff --git a/repos/os/include/spec/x86/platform_session/client.h b/repos/os/include/spec/x86/platform_session/client.h index 0d869c5e21..4aa3735c7a 100644 --- a/repos/os/include/spec/x86/platform_session/client.h +++ b/repos/os/include/spec/x86/platform_session/client.h @@ -37,8 +37,8 @@ struct Platform::Client : public Rpc_client void release_device(Device_capability device) override { call(device); } - Ram_dataspace_capability alloc_dma_buffer(size_t size) override { - return call(size); } + Ram_dataspace_capability alloc_dma_buffer(size_t size, Cache cache) override { + return call(size, cache); } void free_dma_buffer(Ram_dataspace_capability cap) override { call(cap); } diff --git a/repos/os/include/spec/x86/platform_session/platform_session.h b/repos/os/include/spec/x86/platform_session/platform_session.h index 0ab54f78c0..e0e3be2d1e 100644 --- a/repos/os/include/spec/x86/platform_session/platform_session.h +++ b/repos/os/include/spec/x86/platform_session/platform_session.h @@ -17,6 +17,7 @@ /* Genode includes */ #include #include +#include /* os includes */ #include @@ -69,7 +70,7 @@ struct Platform::Session : Genode::Session /** * Allocate memory suitable for DMA */ - virtual Ram_dataspace_capability alloc_dma_buffer(size_t) = 0; + virtual Ram_dataspace_capability alloc_dma_buffer(size_t, Cache) = 0; /** * Free previously allocated DMA memory @@ -95,7 +96,7 @@ struct Platform::Session : Genode::Session GENODE_RPC_THROW(Rpc_alloc_dma_buffer, Ram_dataspace_capability, alloc_dma_buffer, GENODE_TYPE_LIST(Out_of_ram, Out_of_caps), - size_t); + size_t, Cache); GENODE_RPC(Rpc_free_dma_buffer, void, free_dma_buffer, Ram_dataspace_capability); GENODE_RPC(Rpc_dma_addr, addr_t, dma_addr, Ram_dataspace_capability); diff --git a/repos/os/src/drivers/ahci/spec/x86/platform.cc b/repos/os/src/drivers/ahci/spec/x86/platform.cc index 439bd3cd99..0375ea46f2 100644 --- a/repos/os/src/drivers/ahci/spec/x86/platform.cc +++ b/repos/os/src/drivers/ahci/spec/x86/platform.cc @@ -71,7 +71,7 @@ Genode::Ram_dataspace_capability Ahci::Platform::alloc_dma_buffer(size_t size) return retry( [&] () { return retry( - [&] () { return _data.pci.alloc_dma_buffer(size); }, + [&] () { return _data.pci.alloc_dma_buffer(size, Genode::UNCACHED); }, [&] () { _data.pci.upgrade_caps(2); }); }, [&] () { diff --git a/repos/os/src/drivers/framebuffer/pl11x/main.cc b/repos/os/src/drivers/framebuffer/pl11x/main.cc index a36c1e480e..3d3e214a73 100644 --- a/repos/os/src/drivers/framebuffer/pl11x/main.cc +++ b/repos/os/src/drivers/framebuffer/pl11x/main.cc @@ -94,7 +94,7 @@ struct Pl11x_driver::Main Attached_dataspace _sys_mem { _env.rm(), _sp810_dev.io_mem_dataspace() }; Ram_dataspace_capability _fb_ds_cap { - _platform.alloc_dma_buffer(FRAMEBUFFER_SIZE) }; + _platform.alloc_dma_buffer(FRAMEBUFFER_SIZE, UNCACHED) }; Attached_dataspace _fb_ds { _env.rm(), _fb_ds_cap }; void _init_device(); diff --git a/repos/os/src/drivers/gpu/intel/main.cc b/repos/os/src/drivers/gpu/intel/main.cc index 279c0f9fb4..b364741852 100644 --- a/repos/os/src/drivers/gpu/intel/main.cc +++ b/repos/os/src/drivers/gpu/intel/main.cc @@ -171,7 +171,7 @@ struct Igd::Device _pci.upgrade_ram(size); try { return _pci.with_upgrade([&] () { - return _pci.alloc_dma_buffer(size); }); + return _pci.alloc_dma_buffer(size, Genode::UNCACHED); }); } catch (Platform::Out_of_ram) { throw Out_of_ram(); } diff --git a/repos/os/src/drivers/nic/lan9118/lan9118.h b/repos/os/src/drivers/nic/lan9118/lan9118.h index ebcd81e98f..dd09677fe4 100644 --- a/repos/os/src/drivers/nic/lan9118/lan9118.h +++ b/repos/os/src/drivers/nic/lan9118/lan9118.h @@ -450,7 +450,7 @@ class Lan9118 : public Nic::Session_component, Genode::Allocator & rx_block_md_alloc, Genode::Env & env) : - Session_component { tx_buf_size, rx_buf_size, Genode::CACHED, + Session_component { tx_buf_size, rx_buf_size, Genode::UNCACHED, rx_block_md_alloc, env }, Genode::Signal_handler { env.ep(), *this, &Lan9118::_handle_irq }, Lan9118_base { ds_cap, irq_cap, *this, env } diff --git a/repos/os/src/drivers/nvme/pci.h b/repos/os/src/drivers/nvme/pci.h index a734d01952..5a116b979e 100644 --- a/repos/os/src/drivers/nvme/pci.h +++ b/repos/os/src/drivers/nvme/pci.h @@ -126,7 +126,7 @@ struct Nvme::Pci : Platform::Connection, return retry( [&] () { return retry( - [&] () { return Pci::Connection::alloc_dma_buffer(size); }, + [&] () { return Pci::Connection::alloc_dma_buffer(size, UNCACHED); }, [&] () { upgrade_caps(2); }); }, [&] () { diff --git a/repos/os/src/drivers/platform/spec/arm/session_component.cc b/repos/os/src/drivers/platform/spec/arm/session_component.cc index b9a6cacc03..f7f23cc4c8 100644 --- a/repos/os/src/drivers/platform/spec/arm/session_component.cc +++ b/repos/os/src/drivers/platform/spec/arm/session_component.cc @@ -107,9 +107,9 @@ void Session_component::release_device(Platform::Device_capability device_cap) Genode::Ram_dataspace_capability -Session_component::alloc_dma_buffer(size_t const size) +Session_component::alloc_dma_buffer(size_t const size, Cache cache) { - Ram_dataspace_capability ram_cap = _env_ram.alloc(size, UNCACHED); + Ram_dataspace_capability ram_cap = _env_ram.alloc(size, cache); if (!ram_cap.valid()) return ram_cap; diff --git a/repos/os/src/drivers/platform/spec/arm/session_component.h b/repos/os/src/drivers/platform/spec/arm/session_component.h index 13ea998a01..2113c242c7 100644 --- a/repos/os/src/drivers/platform/spec/arm/session_component.h +++ b/repos/os/src/drivers/platform/spec/arm/session_component.h @@ -69,7 +69,7 @@ class Driver::Session_component : Rom_session_capability devices_rom() override; Device_capability acquire_device(String const &) override; void release_device(Device_capability) override; - Ram_dataspace_capability alloc_dma_buffer(size_t const) override; + Ram_dataspace_capability alloc_dma_buffer(size_t, Cache) override; void free_dma_buffer(Ram_dataspace_capability ram_cap) override; addr_t dma_addr(Ram_dataspace_capability) override; diff --git a/repos/os/src/drivers/platform/spec/x86/pci_session_component.h b/repos/os/src/drivers/platform/spec/x86/pci_session_component.h index 43ec591a05..382f1ae44a 100644 --- a/repos/os/src/drivers/platform/spec/x86/pci_session_component.h +++ b/repos/os/src/drivers/platform/spec/x86/pci_session_component.h @@ -807,9 +807,9 @@ class Platform::Session_component : public Rpc_object * De-/Allocation of dma capable dataspaces */ - Ram_dataspace_capability alloc_dma_buffer(size_t const size) override + Ram_dataspace_capability alloc_dma_buffer(size_t const size, Cache cache) override { - Ram_dataspace_capability ram_cap = _env_ram.alloc(size, UNCACHED); + Ram_dataspace_capability ram_cap = _env_ram.alloc(size, cache); addr_t const dma_addr = Dataspace_client(ram_cap).phys_addr(); if (!ram_cap.valid()) diff --git a/repos/os/src/drivers/sd_card/imx/driver.h b/repos/os/src/drivers/sd_card/imx/driver.h index a37ee591c3..8b41aebf93 100644 --- a/repos/os/src/drivers/sd_card/imx/driver.h +++ b/repos/os/src/drivers/sd_card/imx/driver.h @@ -298,8 +298,8 @@ class Sd_card::Driver : public Driver_base, bool dma_enabled() override { return true; } - Ram_dataspace_capability alloc_dma_buffer(size_t size) override { - return _env.ram().alloc(size, UNCACHED); } + Ram_dataspace_capability alloc_dma_buffer(size_t size, Cache cache) override { + return _env.ram().alloc(size, cache); } }; #endif /* _SRC__DRIVERS__SD_CARD__SPEC__IMX__DRIVER_H_ */ diff --git a/repos/os/src/drivers/sd_card/rpi/driver.h b/repos/os/src/drivers/sd_card/rpi/driver.h index ee0c77a8bb..03fef82c86 100644 --- a/repos/os/src/drivers/sd_card/rpi/driver.h +++ b/repos/os/src/drivers/sd_card/rpi/driver.h @@ -218,8 +218,8 @@ class Sd_card::Driver : public Driver_base, char const *buffer, Block::Packet_descriptor &packet) override; - Ram_dataspace_capability alloc_dma_buffer(size_t size) override { - return _env.ram().alloc(size, UNCACHED); } + Ram_dataspace_capability alloc_dma_buffer(size_t size, Cache cache) override { + return _env.ram().alloc(size, cache); } }; #endif /* _DRIVER_H_ */