From 0c8a4f9f3a360219fa021346dbc0ca1a10413bf7 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Sat, 23 Nov 2013 00:24:44 +0100 Subject: [PATCH] block: extend interface of generic driver class To support read-only devices like CDROMs, or rom_blk the supported block operations have to be stated by specific the device driver. Ref #966 --- os/include/block/component.h | 3 +-- os/include/block/driver.h | 7 ++++++- os/src/drivers/ahci/include/ahci_driver_base.h | 9 +++++++++ os/src/drivers/sd_card/exynos5/driver.h | 8 ++++++++ os/src/drivers/sd_card/omap4/driver.h | 8 ++++++++ os/src/drivers/sd_card/pl180/sd_card.h | 8 ++++++++ 6 files changed, 40 insertions(+), 3 deletions(-) diff --git a/os/include/block/component.h b/os/include/block/component.h index c45a93069..1fdfdd97c 100644 --- a/os/include/block/component.h +++ b/os/include/block/component.h @@ -136,8 +136,7 @@ class Block::Session_component : public Block::Session_rpc_object { *blk_count = _driver.block_count(); *blk_size = _driver.block_size(); - ops->set_operation(Packet_descriptor::READ); - ops->set_operation(Packet_descriptor::WRITE); + *ops = _driver.ops(); } void sync() { _driver.sync(); } diff --git a/os/include/block/driver.h b/os/include/block/driver.h index c035d5436..184171a58 100644 --- a/os/include/block/driver.h +++ b/os/include/block/driver.h @@ -19,7 +19,7 @@ #include #include - +#include namespace Block { @@ -43,6 +43,11 @@ namespace Block { */ virtual Genode::size_t block_count() = 0; + /** + * Request operations supported by the device + */ + virtual Session::Operations ops() = 0; + /** * Read from medium * diff --git a/os/src/drivers/ahci/include/ahci_driver_base.h b/os/src/drivers/ahci/include/ahci_driver_base.h index 38440bb2b..6b1656783 100644 --- a/os/src/drivers/ahci/include/ahci_driver_base.h +++ b/os/src/drivers/ahci/include/ahci_driver_base.h @@ -46,6 +46,15 @@ class Ahci_driver_base : public Block::Driver size_t block_size() { return Ahci_device::block_size(); } size_t block_count() { return _device ? _device->block_count() : 0; } + + Block::Session::Operations ops() + { + Block::Session::Operations o; + o.set_operation(Block::Packet_descriptor::READ); + o.set_operation(Block::Packet_descriptor::WRITE); + return o; + } + bool dma_enabled() { return true; } void read_dma(size_t block_number, diff --git a/os/src/drivers/sd_card/exynos5/driver.h b/os/src/drivers/sd_card/exynos5/driver.h index 013efbbfe..1ce8b2773 100644 --- a/os/src/drivers/sd_card/exynos5/driver.h +++ b/os/src/drivers/sd_card/exynos5/driver.h @@ -89,6 +89,14 @@ class Block::Exynos5_driver : public Block::Driver return _controller.card_info().capacity_mb() * 1024 * 2; } + Block::Session::Operations ops() + { + Block::Session::Operations o; + o.set_operation(Block::Packet_descriptor::READ); + o.set_operation(Block::Packet_descriptor::WRITE); + return o; + } + void read(Genode::size_t block_number, Genode::size_t block_count, char *out_buffer) diff --git a/os/src/drivers/sd_card/omap4/driver.h b/os/src/drivers/sd_card/omap4/driver.h index bd49d253e..fb274c648 100644 --- a/os/src/drivers/sd_card/omap4/driver.h +++ b/os/src/drivers/sd_card/omap4/driver.h @@ -82,6 +82,14 @@ class Block::Omap4_driver : public Block::Driver return _controller.card_info().capacity_mb() * 1024 * 2; } + Block::Session::Operations ops() + { + Block::Session::Operations o; + o.set_operation(Block::Packet_descriptor::READ); + o.set_operation(Block::Packet_descriptor::WRITE); + return o; + } + void read(Genode::size_t block_number, Genode::size_t block_count, char *out_buffer) diff --git a/os/src/drivers/sd_card/pl180/sd_card.h b/os/src/drivers/sd_card/pl180/sd_card.h index 82df5b3bb..37d16fa38 100644 --- a/os/src/drivers/sd_card/pl180/sd_card.h +++ b/os/src/drivers/sd_card/pl180/sd_card.h @@ -79,6 +79,14 @@ class Sd_card : public Block::Driver */ Genode::size_t block_count() { return 0x20000000 / BLOCK_SIZE; } + Block::Session::Operations ops() + { + Block::Session::Operations o; + o.set_operation(Block::Packet_descriptor::READ); + o.set_operation(Block::Packet_descriptor::WRITE); + return o; + } + void read(Genode::size_t block_number, Genode::size_t block_count, char *out_buffer)