From d58439ca56ec6460e6d99041336ac10bbe3f5ef2 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Mon, 18 Feb 2013 10:30:29 +0100 Subject: [PATCH] pci: provide dma-able memory via pci_drv --- os/include/block/component.h | 25 ++++++++++++---------- os/include/block/driver.h | 7 ++++++ os/include/pci_session/client.h | 4 ++++ os/include/pci_session/pci_session.h | 13 ++++++++++- os/src/drivers/ahci/main.cc | 3 +++ os/src/drivers/pci/pci_session_component.h | 4 ++++ os/src/drivers/sd_card/omap4/driver.h | 4 ++++ os/src/drivers/sd_card/sd_card.h | 5 +++++ 8 files changed, 53 insertions(+), 12 deletions(-) diff --git a/os/include/block/component.h b/os/include/block/component.h index 3e608e9aa8..b383870dc3 100644 --- a/os/include/block/component.h +++ b/os/include/block/component.h @@ -104,25 +104,26 @@ namespace Block { } }; - Driver_factory &_driver_factory; - Driver &_driver; - Dataspace_capability _rq_ds; - Rq_thread _rq_thread; + Driver_factory &_driver_factory; + Driver &_driver; + Ram_dataspace_capability _rq_ds; + Rq_thread _rq_thread; public: /** * Constructor */ - Session_component(Dataspace_capability rq_ds, - Driver_factory &driver_factory, - Rpc_entrypoint &ep) + Session_component(Ram_dataspace_capability rq_ds, + Driver &driver, + Driver_factory &driver_factory, + Rpc_entrypoint &ep) : Session_rpc_object(rq_ds, ep), _driver_factory(driver_factory), - _driver(*_driver_factory.create()), + _driver(driver), _rq_ds(rq_ds), - _rq_thread(tx_sink(), _driver, Dataspace_client(rq_ds).phys_addr()) + _rq_thread(tx_sink(), _driver, Dataspace_client(_rq_ds).phys_addr()) { } /** @@ -188,9 +189,11 @@ namespace Block { throw Root::Quota_exceeded(); } + Driver * driver = _driver_factory.create(); + Ram_dataspace_capability ds_cap; + ds_cap = driver->alloc_dma_buffer(tx_buf_size); return new (md_alloc()) - Session_component(env()->ram_session()->alloc(tx_buf_size, false), - _driver_factory, _ep); + Session_component(ds_cap, *driver, _driver_factory, _ep); } public: diff --git a/os/include/block/driver.h b/os/include/block/driver.h index bbab5290ca..5a1aafdbdd 100644 --- a/os/include/block/driver.h +++ b/os/include/block/driver.h @@ -18,6 +18,8 @@ #include #include +#include + namespace Block { @@ -91,6 +93,11 @@ namespace Block { * \return true if DMA is enabled, false otherwise */ virtual bool dma_enabled() = 0; + + /** + * Allocate buffer which is suitable for DMA. + */ + virtual Genode::Ram_dataspace_capability alloc_dma_buffer(Genode::size_t) = 0; }; diff --git a/os/include/pci_session/client.h b/os/include/pci_session/client.h index 302bb108a0..a28ea78b1a 100644 --- a/os/include/pci_session/client.h +++ b/os/include/pci_session/client.h @@ -35,6 +35,10 @@ namespace Pci { Genode::Io_mem_dataspace_capability config_extended(Device_capability device_cap) { return call(device_cap); } + + Genode::Ram_dataspace_capability alloc_dma_buffer(Device_capability device_cap, + Genode::size_t size) { + return call(device_cap, size); } }; } diff --git a/os/include/pci_session/pci_session.h b/os/include/pci_session/pci_session.h index 53cd2c25dc..3cff3ae83a 100644 --- a/os/include/pci_session/pci_session.h +++ b/os/include/pci_session/pci_session.h @@ -16,6 +16,7 @@ #include #include +#include namespace Pci { @@ -55,6 +56,11 @@ namespace Pci { */ virtual Genode::Io_mem_dataspace_capability config_extended(Device_capability) = 0; + /** + * Allocate memory suitable for DMA. + */ + virtual Genode::Ram_dataspace_capability alloc_dma_buffer(Device_capability, + Genode::size_t) = 0; /********************* ** RPC declaration ** *********************/ @@ -65,9 +71,14 @@ namespace Pci { GENODE_RPC(Rpc_release_device, void, release_device, Device_capability); GENODE_RPC(Rpc_config_extended, Genode::Io_mem_dataspace_capability, config_extended, Device_capability); + GENODE_RPC_THROW(Rpc_alloc_dma_buffer, Genode::Ram_dataspace_capability, + alloc_dma_buffer, + GENODE_TYPE_LIST(Genode::Ram_session::Quota_exceeded), + Device_capability, Genode::size_t); GENODE_RPC_INTERFACE(Rpc_first_device, Rpc_next_device, - Rpc_release_device, Rpc_config_extended); + Rpc_release_device, Rpc_config_extended, + Rpc_alloc_dma_buffer); }; } diff --git a/os/src/drivers/ahci/main.cc b/os/src/drivers/ahci/main.cc index 3b3eea097a..7c669a44bb 100644 --- a/os/src/drivers/ahci/main.cc +++ b/os/src/drivers/ahci/main.cc @@ -770,6 +770,9 @@ class Ahci_driver : public Block::Driver PERR("%s should not be called", __PRETTY_FUNCTION__); throw Io_error(); } + + Ram_dataspace_capability alloc_dma_buffer(size_t size) { + return env()->ram_session()->alloc(size); } }; diff --git a/os/src/drivers/pci/pci_session_component.h b/os/src/drivers/pci/pci_session_component.h index e7398d84fe..aee6709c1d 100644 --- a/os/src/drivers/pci/pci_session_component.h +++ b/os/src/drivers/pci/pci_session_component.h @@ -291,6 +291,10 @@ namespace Pci { return io_mem->dataspace(); } + + Genode::Ram_dataspace_capability alloc_dma_buffer(Device_capability device_cap, + Genode::size_t size) { + return Genode::env()->ram_session()->alloc(size, false); } }; diff --git a/os/src/drivers/sd_card/omap4/driver.h b/os/src/drivers/sd_card/omap4/driver.h index c03484798a..e65f07261f 100644 --- a/os/src/drivers/sd_card/omap4/driver.h +++ b/os/src/drivers/sd_card/omap4/driver.h @@ -119,6 +119,10 @@ class Block::Omap4_driver : public Block::Driver } bool dma_enabled() { return _use_dma; } + + Ram_dataspace_capability alloc_dma_buffer(size_t size) { + /* unused */ + return Ram_dataspace_capability(); } }; #endif /* _DRIVER_H_ */ diff --git a/os/src/drivers/sd_card/sd_card.h b/os/src/drivers/sd_card/sd_card.h index 322f22c8dd..837ca42151 100644 --- a/os/src/drivers/sd_card/sd_card.h +++ b/os/src/drivers/sd_card/sd_card.h @@ -130,6 +130,11 @@ class Sd_card : public Block::Driver throw Io_error(); } bool dma_enabled() { return false; } + + Genode::Ram_dataspace_capability alloc_dma_buffer(Genode::size_t size) + { + return Genode::env()->ram_session()->alloc(size, false); + } }; #endif /* _SD_CARD_H_ */