diff --git a/os/include/block/component.h b/os/include/block/component.h
index c45a930698..1fdfdd97cf 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 c035d54366..184171a588 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 38440bb2b7..6b1656783e 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 013efbbfe6..1ce8b2773d 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 bd49d253eb..fb274c6481 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 82df5b3bbd..37d16fa387 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)