block: support for block number >32 bit (Fix #968)

This commit is contained in:
Stefan Kalkowski 2013-12-04 14:34:53 +01:00 committed by Norman Feske
parent 1bc16f3a23
commit b10b9e20a2
28 changed files with 117 additions and 132 deletions

View File

@ -43,7 +43,7 @@ class Storage_device : public Genode::List<Storage_device>::Element,
Block::Packet_descriptor *packet = static_cast<Block::Packet_descriptor *>(cmnd->packet); Block::Packet_descriptor *packet = static_cast<Block::Packet_descriptor *>(cmnd->packet);
if (verbose) if (verbose)
PDBG("ACK packet for block: %zu status: %d", packet->block_number(), cmnd->result); PDBG("ACK packet for block: %llu status: %d", packet->block_number(), cmnd->result);
session->complete_packet(*packet); session->complete_packet(*packet);
Genode::destroy(Genode::env()->heap(), packet); Genode::destroy(Genode::env()->heap(), packet);
@ -86,7 +86,7 @@ class Storage_device : public Genode::List<Storage_device>::Element,
_scsi_free_command(cmnd); _scsi_free_command(cmnd);
} }
void _io(Genode::size_t block_nr, Genode::size_t block_count, void _io(Block::sector_t block_nr, Genode::size_t block_count,
Block::Packet_descriptor packet, Block::Packet_descriptor packet,
Genode::addr_t virt, Genode::addr_t phys, bool read) Genode::addr_t virt, Genode::addr_t phys, bool read)
{ {
@ -94,7 +94,7 @@ class Storage_device : public Genode::List<Storage_device>::Element,
throw Io_error(); throw Io_error();
if (verbose) if (verbose)
PDBG("PACKET: phys: %lx block: %zu count: %u %s", PDBG("PACKET: phys: %lx block: %llu count: %u %s",
phys, block_nr, block_count, read ? "read" : "write"); phys, block_nr, block_count, read ? "read" : "write");
struct scsi_cmnd *cmnd = _scsi_alloc_command(); struct scsi_cmnd *cmnd = _scsi_alloc_command();
@ -142,8 +142,8 @@ class Storage_device : public Genode::List<Storage_device>::Element,
_capacity(); _capacity();
} }
Genode::size_t block_size() { return _block_size; } Genode::size_t block_size() { return _block_size; }
Genode::size_t block_count() { return _block_count; } Block::sector_t block_count() { return _block_count; }
Block::Session::Operations ops() Block::Session::Operations ops()
{ {
@ -153,7 +153,7 @@ class Storage_device : public Genode::List<Storage_device>::Element,
return o; return o;
} }
void read_dma(Genode::size_t block_number, void read_dma(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
@ -163,7 +163,7 @@ class Storage_device : public Genode::List<Storage_device>::Element,
phys, true); phys, true);
} }
void write_dma(Genode::size_t block_number, void write_dma(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)

View File

@ -39,8 +39,8 @@ class Driver : public Block::Driver
** Block::Driver interface ** ** Block::Driver interface **
*******************************/ *******************************/
Genode::size_t block_size() { return _block_size; } Genode::size_t block_size() { return _block_size; }
Genode::size_t block_count() { return _http.file_size() / _block_size; } Block::sector_t block_count() { return _http.file_size() / _block_size; }
Block::Session::Operations ops() Block::Session::Operations ops()
{ {
@ -49,7 +49,7 @@ class Driver : public Block::Driver
return o; return o;
} }
void read(Genode::size_t block_nr, void read(Block::sector_t block_nr,
Genode::size_t block_count, Genode::size_t block_count,
char *buffer, char *buffer,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)

View File

@ -28,7 +28,7 @@ static bool const verbose = false;
static Genode::Allocator_avl _block_alloc(Genode::env()->heap()); static Genode::Allocator_avl _block_alloc(Genode::env()->heap());
static Block::Connection *_block_connection; static Block::Connection *_block_connection;
static size_t _blk_size = 0; static size_t _blk_size = 0;
static size_t _blk_cnt = 0; static Block::sector_t _blk_cnt = 0;
static Block::Session::Tx::Source *_source; static Block::Session::Tx::Source *_source;
@ -72,7 +72,7 @@ extern "C" DSTATUS disk_initialize (BYTE drv)
} }
if (verbose) if (verbose)
PDBG("We have %zu blocks with a size of %zu bytes", PDBG("We have %llu blocks with a size of %zu bytes",
_blk_cnt, _blk_size); _blk_cnt, _blk_size);
initialized = true; initialized = true;

View File

@ -58,7 +58,7 @@ namespace {
Block::Connection *_block; Block::Connection *_block;
size_t _block_size; size_t _block_size;
size_t _block_count; Block::sector_t _block_count;
Block::Session::Operations _block_ops; Block::Session::Operations _block_ops;
Block::Session::Tx::Source *_tx_source; Block::Session::Tx::Source *_tx_source;
@ -94,7 +94,7 @@ namespace {
_block_buffer = reinterpret_cast<char*>(malloc(BUFFER_BLOCK_NUMBER * _block_size)); _block_buffer = reinterpret_cast<char*>(malloc(BUFFER_BLOCK_NUMBER * _block_size));
if (verbose) { if (verbose) {
PDBG("number of blocks: %zu with block size: %zu (bytes)" PDBG("number of blocks: %llu with block size: %zu (bytes)"
" , readable: %d writeable: %d", " , readable: %d writeable: %d",
_block_count, _block_size, _readable, _writeable); _block_count, _block_size, _readable, _writeable);
} }

View File

@ -142,7 +142,18 @@ class Block::Session_component : public Block::Session_rpc_object
_driver_factory.destroy(&_driver); _driver_factory.destroy(&_driver);
} }
void info(size_t *blk_count, size_t *blk_size, /**
* Destructor
*/
~Session_component() {
_driver_factory.destroy(&_driver); }
/*******************************
** Block session interface **
*******************************/
void info(sector_t *blk_count, size_t *blk_size,
Operations *ops) Operations *ops)
{ {
*blk_count = _driver.block_count(); *blk_count = _driver.block_count();

View File

@ -50,7 +50,7 @@ struct Block::Driver
/** /**
* Request capacity of medium in blocks * Request capacity of medium in blocks
*/ */
virtual Genode::size_t block_count() = 0; virtual Block::sector_t block_count() = 0;
/** /**
* Request operations supported by the device * Request operations supported by the device
@ -64,7 +64,7 @@ struct Block::Driver
* \param block_count number of blocks to read * \param block_count number of blocks to read
* \param buffer output buffer for read request * \param buffer output buffer for read request
*/ */
virtual void read(Genode::size_t block_number, virtual void read(sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char * buffer, char * buffer,
Packet_descriptor &packet) { Packet_descriptor &packet) {
@ -77,7 +77,7 @@ struct Block::Driver
* \param block_count number of blocks to write * \param block_count number of blocks to write
* \param buffer buffer for write request * \param buffer buffer for write request
*/ */
virtual void write(Genode::size_t block_number, virtual void write(sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
const char * buffer, const char * buffer,
Packet_descriptor &packet) { Packet_descriptor &packet) {
@ -90,7 +90,7 @@ struct Block::Driver
* \param block_count number of blocks to read * \param block_count number of blocks to read
* \param phys phyiscal address of read buffer * \param phys phyiscal address of read buffer
*/ */
virtual void read_dma(Genode::size_t block_number, virtual void read_dma(sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Packet_descriptor &packet) { Packet_descriptor &packet) {
@ -103,7 +103,7 @@ struct Block::Driver
* \param block_count number of blocks to write * \param block_count number of blocks to write
* \param phys physical address of write buffer * \param phys physical address of write buffer
*/ */
virtual void write_dma(Genode::size_t block_number, virtual void write_dma(sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Packet_descriptor &packet) { Packet_descriptor &packet) {

View File

@ -51,7 +51,7 @@ namespace Block {
private: private:
Opcode _op; /* requested operation */ Opcode _op; /* requested operation */
Genode::size_t _block_number; /* requested block number */ sector_t _block_number; /* requested block number */
Genode::size_t _block_count; /* number of blocks to transfer */ Genode::size_t _block_count; /* number of blocks to transfer */
unsigned _success :1; /* indicates success of operation */ unsigned _success :1; /* indicates success of operation */
@ -68,13 +68,13 @@ namespace Block {
* Constructor * Constructor
*/ */
Packet_descriptor(Packet_descriptor p, Opcode op, Packet_descriptor(Packet_descriptor p, Opcode op,
Genode::size_t blk_nr, Genode::size_t blk_count = 1) sector_t blk_nr, Genode::size_t blk_count = 1)
: ::Packet_descriptor(p.offset(), p.size()), : ::Packet_descriptor(p.offset(), p.size()),
_op(op), _block_number(blk_nr), _op(op), _block_number(blk_nr),
_block_count(blk_count), _success(false) { } _block_count(blk_count), _success(false) { }
Opcode operation() const { return _op; } Opcode operation() const { return _op; }
Genode::size_t block_number() const { return _block_number; } sector_t block_number() const { return _block_number; }
Genode::size_t block_count() const { return _block_count; } Genode::size_t block_count() const { return _block_count; }
bool succeeded() const { return _success; } bool succeeded() const { return _success; }
@ -125,7 +125,7 @@ namespace Block {
* \param blk_size will contain total size in bytes * \param blk_size will contain total size in bytes
* \param ops supported operations * \param ops supported operations
*/ */
virtual void info(Genode::size_t *blk_count, virtual void info(sector_t *blk_count,
Genode::size_t *blk_size, Genode::size_t *blk_size,
Operations *ops) = 0; Operations *ops) = 0;
@ -149,7 +149,8 @@ namespace Block {
** RPC interface ** ** RPC interface **
*******************/ *******************/
GENODE_RPC(Rpc_info, void, info, Genode::size_t *, Genode::size_t *, Operations *); GENODE_RPC(Rpc_info, void, info, Block::sector_t *,
Genode::size_t *, Operations *);
GENODE_RPC(Rpc_tx_cap, Genode::Capability<Tx>, _tx_cap); GENODE_RPC(Rpc_tx_cap, Genode::Capability<Tx>, _tx_cap);
GENODE_RPC(Rpc_sync, void, sync); GENODE_RPC(Rpc_sync, void, sync);
GENODE_RPC_INTERFACE(Rpc_info, Rpc_tx_cap, Rpc_sync); GENODE_RPC_INTERFACE(Rpc_info, Rpc_tx_cap, Rpc_sync);

View File

@ -47,7 +47,7 @@ namespace Block {
** Block session interface ** ** Block session interface **
*****************************/ *****************************/
void info(Genode::size_t *blk_count, Genode::size_t *blk_size, void info(sector_t *blk_count, Genode::size_t *blk_size,
Operations *ops) Operations *ops)
{ {
call<Rpc_info>(blk_count, blk_size, ops); call<Rpc_info>(blk_count, blk_size, ops);

View File

@ -1947,5 +1947,5 @@ int Ahci_driver::_ncq_command(uint64_t lba, unsigned cnt, addr_t phys, bool w)
return ret; return ret;
} }
size_t Ahci_driver::block_count() { return sata_ahci()->block_cnt; } Block::sector_t Ahci_driver::block_count() { return sata_ahci()->block_cnt; }
size_t Ahci_driver::block_size() { return Sata_ahci::BLOCK_SIZE; } size_t Ahci_driver::block_size() { return Sata_ahci::BLOCK_SIZE; }

View File

@ -52,11 +52,11 @@ class Ahci_driver : public Block::Driver
return o; return o;
} }
size_t block_size(); size_t block_size();
size_t block_count(); Block::sector_t block_count();
bool dma_enabled() { return true; } bool dma_enabled() { return true; }
void read_dma(size_t block_nr, size_t block_cnt, addr_t phys, void read_dma(Block::sector_t block_nr, size_t block_cnt, addr_t phys,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
{ {
if (_ncq_command(block_nr, block_cnt, phys, 0)) if (_ncq_command(block_nr, block_cnt, phys, 0))
@ -64,7 +64,7 @@ class Ahci_driver : public Block::Driver
session->complete_packet(packet); session->complete_packet(packet);
} }
void write_dma(size_t block_nr, size_t block_cnt, addr_t phys, void write_dma(Block::sector_t block_nr, size_t block_cnt, addr_t phys,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
{ {
if (_ncq_command(block_nr, block_cnt, phys, 1)) if (_ncq_command(block_nr, block_cnt, phys, 1))

View File

@ -316,7 +316,7 @@ struct Command_table
/** /**
* Setup FIS and PRD * Setup FIS and PRD
*/ */
void setup_command(uint8_t cmd, uint32_t lba48, uint16_t blk_cnt, addr_t phys_addr) void setup_command(uint8_t cmd, uint64_t lba48, uint16_t blk_cnt, addr_t phys_addr)
{ {
enum { MAX_BYTES = 1 << 22 }; /* 4MB = one PRD */ enum { MAX_BYTES = 1 << 22 }; /* 4MB = one PRD */
uint8_t *fis = (uint8_t *)this; uint8_t *fis = (uint8_t *)this;
@ -332,8 +332,8 @@ struct Command_table
fis[6] = (lba48 >> 16) & 0xff; /* LBA 16 - 23 */ fis[6] = (lba48 >> 16) & 0xff; /* LBA 16 - 23 */
fis[7] = 0x40; /* LBA mode flag */ fis[7] = 0x40; /* LBA mode flag */
fis[8] = (lba48 >> 24) & 0xff; /* LBA 24 - 31 */ fis[8] = (lba48 >> 24) & 0xff; /* LBA 24 - 31 */
fis[9] = 0x0; /* LBA 32 - 39 */ fis[9] = (lba48 >> 32) & 0xff; /* LBA 32 - 39 */
fis[10] = 0x0; /* LBA 40 - 47 */ fis[10] = (lba48 >> 40) & 0xff; /* LBA 40 - 47 */
fis[12] = blk_cnt & 0xff; /* sector count 0 - 7 */ fis[12] = blk_cnt & 0xff; /* sector count 0 - 7 */
fis[13] = (blk_cnt >> 8) & 0xff; /* sector count 8 - 15 */ fis[13] = (blk_cnt >> 8) & 0xff; /* sector count 8 - 15 */
@ -537,24 +537,28 @@ class Ahci_device_base
/** /**
* Issue ATA 'READ_DMA_EXT' command * Issue ATA 'READ_DMA_EXT' command
*/ */
void read(size_t block_number, size_t block_count, addr_t phys) void read(Block::sector_t block_number, size_t block_count,
addr_t phys)
{ {
_cmd_list->w = 0; _cmd_list->w = 0;
enum { READ_DMA_EXT = 0x25 }; enum { READ_DMA_EXT = 0x25 };
_cmd_table->setup_command(READ_DMA_EXT, block_number, block_count, phys); _cmd_table->setup_command(READ_DMA_EXT, block_number,
block_count, phys);
_execute_command(); _execute_command();
} }
/** /**
* Issue ATA 'WRITE_DMA_EXT' command * Issue ATA 'WRITE_DMA_EXT' command
*/ */
void write(size_t block_number, size_t block_count, addr_t phys) void write(Block::sector_t block_number, size_t block_count,
addr_t phys)
{ {
_cmd_list->w = 1; _cmd_list->w = 1;
enum { WRITE_DMA_EXT = 0x35 }; enum { WRITE_DMA_EXT = 0x35 };
_cmd_table->setup_command(WRITE_DMA_EXT, block_number, block_count, phys); _cmd_table->setup_command(WRITE_DMA_EXT, block_number,
block_count, phys);
_execute_command(); _execute_command();
} }

View File

@ -46,7 +46,8 @@ class Ahci_driver_base : public Block::Driver
} }
size_t block_size() { return Ahci_device::block_size(); } size_t block_size() { return Ahci_device::block_size(); }
size_t block_count() { return _device ? _device->block_count() : 0; } Block::sector_t block_count() {
return _device ? _device->block_count() : 0; }
Block::Session::Operations ops() Block::Session::Operations ops()
{ {
@ -58,9 +59,9 @@ class Ahci_driver_base : public Block::Driver
bool dma_enabled() { return true; } bool dma_enabled() { return true; }
void read_dma(size_t block_number, void read_dma(Block::sector_t block_number,
size_t block_count, size_t block_count,
addr_t phys, addr_t phys,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
{ {
_sanity_check(block_number, block_count); _sanity_check(block_number, block_count);
@ -68,9 +69,9 @@ class Ahci_driver_base : public Block::Driver
if (session) session->complete_packet(packet); if (session) session->complete_packet(packet);
} }
void write_dma(size_t block_number, void write_dma(Block::sector_t block_number,
size_t block_count, size_t block_count,
addr_t phys, addr_t phys,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
{ {
_sanity_check(block_number, block_count); _sanity_check(block_number, block_count);

View File

@ -148,7 +148,7 @@ void Ata::Device::read_capacity()
} }
void Ata::Device::_read(Genode::size_t block_nr, void Ata::Device::_read(Block::sector_t block_nr,
Genode::size_t count, Genode::size_t count,
char *buffer, char *buffer,
bool dma) bool dma)
@ -161,7 +161,7 @@ void Ata::Device::_read(Genode::size_t block_nr,
if (dma) { if (dma) {
if (verbose) if (verbose)
PDBG("DMA read: block %zu, c %zu, buffer: %p", PDBG("DMA read: block %llu, c %zu, buffer: %p",
block_nr, c, (void*)(buffer + offset)); block_nr, c, (void*)(buffer + offset));
if (!_lba48) if (!_lba48)
@ -196,7 +196,7 @@ void Ata::Device::_read(Genode::size_t block_nr,
} }
void Ata::Device::_write(Genode::size_t block_nr, void Ata::Device::_write(Block::sector_t block_nr,
Genode::size_t count, Genode::size_t count,
char const *buffer, char const *buffer,
bool dma) bool dma)
@ -209,7 +209,7 @@ void Ata::Device::_write(Genode::size_t block_nr,
if (dma) { if (dma) {
if (verbose) if (verbose)
PDBG("DMA read: block %zu, c %zu, buffer: %p", PDBG("DMA read: block %llu, c %zu, buffer: %p",
block_nr, c, (void*)(buffer + offset)); block_nr, c, (void*)(buffer + offset));
if (!_lba48) if (!_lba48)

View File

@ -61,11 +61,11 @@ namespace Ata {
Genode::Irq_connection *irq() { return _irq; } Genode::Irq_connection *irq() { return _irq; }
Genode::Io_port_session *io() { return _pio; } Genode::Io_port_session *io() { return _pio; }
virtual void _read(Genode::size_t block_number, virtual void _read(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char *out_buffer, char *out_buffer,
bool dma); bool dma);
virtual void _write(Genode::size_t block_number, virtual void _write(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char const *buffer, char const *buffer,
bool dma); bool dma);
@ -112,13 +112,13 @@ namespace Ata {
** Block::Driver interface ** ** Block::Driver interface **
*******************************/ *******************************/
Genode::size_t block_count() { Block::sector_t block_count() {
return _block_end - _block_start + 1; } return _block_end - _block_start + 1; }
Genode::size_t block_size() { return _block_size; } Genode::size_t block_size() { return _block_size; }
virtual Block::Session::Operations ops(); virtual Block::Session::Operations ops();
void read(Genode::size_t block_number, void read(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char *buffer, char *buffer,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
@ -127,7 +127,7 @@ namespace Ata {
session->complete_packet(packet); session->complete_packet(packet);
} }
void write(Genode::size_t block_number, void write(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char const *buffer, char const *buffer,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
@ -136,16 +136,16 @@ namespace Ata {
session->complete_packet(packet); session->complete_packet(packet);
} }
void read_dma(Genode::size_t block_number, void read_dma(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
{ {
_read(block_number, block_count, (char*)phys, true); _read(block_number, block_count, (char*)phys, true);
session->complete_packet(packet); session->complete_packet(packet);
} }
void write_dma(Genode::size_t block_number, void write_dma(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
@ -165,11 +165,11 @@ namespace Ata {
int read_sense(unsigned char *sense, int length); int read_sense(unsigned char *sense, int length);
void read_capacity(); void read_capacity();
void _read(Genode::size_t block_number, void _read(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char *out_buffer, char *out_buffer,
bool dma); bool dma);
void _write(Genode::size_t block_number, void _write(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char const *buffer, char const *buffer,
bool dma); bool dma);

View File

@ -42,7 +42,7 @@ Atapi_device::Atapi_device(unsigned base_cmd, unsigned base_ctrl)
int Atapi_device::read_sense(unsigned char *sense, int length) int Atapi_device::read_sense(unsigned char *sense, int length)
{ {
unsigned char cmd_sense[12]; unsigned char cmd_sense[12];
memset(cmd_sense, 0, 12); memset(cmd_sense, 0, 12);
memset(sense, 0, length); memset(sense, 0, length);
@ -83,7 +83,7 @@ void Atapi_device::read_capacity()
memset(buffer, 0, 8); memset(buffer, 0, 8);
cmd[0] = CMD_READ_CAPACITY; cmd[0] = CMD_READ_CAPACITY;
if (!test_unit_ready()) if (!test_unit_ready())
throw Io_error(); throw Io_error();
@ -100,7 +100,7 @@ void Atapi_device::read_capacity()
} }
void Atapi_device::_read(Genode::size_t block_nr, void Atapi_device::_read(Block::sector_t block_nr,
Genode::size_t count, Genode::size_t count,
char *buffer, char *buffer,
bool dma) bool dma)
@ -127,7 +127,7 @@ void Atapi_device::_read(Genode::size_t block_nr,
if (dma) { if (dma) {
if (verbose) if (verbose)
PDBG("DMA read: block %zu, count %zu, buffer: %p", PDBG("DMA read: block %llu, count %zu, buffer: %p",
block_nr, count, (void*)buffer); block_nr, count, (void*)buffer);
if (dma_pci_packet(dev_num(), 12, cmd, 0, count * _block_size, if (dma_pci_packet(dev_num(), 12, cmd, 0, count * _block_size,
@ -141,7 +141,7 @@ void Atapi_device::_read(Genode::size_t block_nr,
} }
void Atapi_device::_write(Genode::size_t block_number, void Atapi_device::_write(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char const *buffer, char const *buffer,
bool dma) { throw Io_error(); } bool dma) { throw Io_error(); }

View File

@ -84,7 +84,7 @@ class Block::Exynos5_driver : public Block::Driver
Genode::size_t block_size() { return 512; } Genode::size_t block_size() { return 512; }
virtual Genode::size_t block_count() virtual Block::sector_t block_count()
{ {
return _controller.card_info().capacity_mb() * 1024 * 2; return _controller.card_info().capacity_mb() * 1024 * 2;
} }
@ -97,27 +97,7 @@ class Block::Exynos5_driver : public Block::Driver
return o; return o;
} }
void read(Genode::size_t block_number, void read_dma(Block::sector_t block_number,
Genode::size_t block_count,
char *out_buffer,
Packet_descriptor &packet)
{
if (!_controller.read_blocks(block_number, block_count, out_buffer))
throw Io_error();
session->complete_packet(packet);
}
void write(Genode::size_t block_number,
Genode::size_t block_count,
char const *buffer,
Packet_descriptor &packet)
{
if (!_controller.write_blocks(block_number, block_count, buffer))
throw Io_error();
session->complete_packet(packet);
}
void read_dma(Genode::size_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Packet_descriptor &packet) Packet_descriptor &packet)
@ -127,7 +107,7 @@ class Block::Exynos5_driver : public Block::Driver
session->complete_packet(packet); session->complete_packet(packet);
} }
void write_dma(Genode::size_t block_number, void write_dma(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Packet_descriptor &packet) Packet_descriptor &packet)

View File

@ -325,7 +325,7 @@ struct Exynos5_msh_controller : private Dwmmc, Sd_card::Host_controller
using namespace Sd_card; using namespace Sd_card;
powerup(); powerup();
if (!reset(_delayer)) if (!reset(_delayer))
throw Detection_failed(); throw Detection_failed();
@ -628,7 +628,7 @@ struct Exynos5_msh_controller : private Dwmmc, Sd_card::Host_controller
/* return sector count */ /* return sector count */
uint64_t capacity = csd.read<Sd_card::Ext_csd::Sector_count>() * BLOCK_SIZE; uint64_t capacity = csd.read<Sd_card::Ext_csd::Sector_count>() * BLOCK_SIZE;
/* to MB */ /* to MB */
return capacity / (1024 * 1024); return capacity / (1024 * 1024);
} }
@ -638,19 +638,7 @@ struct Exynos5_msh_controller : private Dwmmc, Sd_card::Host_controller
return _card_info; return _card_info;
} }
bool read_blocks(size_t block_number, size_t block_count, char *out_buffer) bool read_blocks_dma(Block::sector_t block_number, size_t block_count,
{
PWRN("'read_blocks' not implemented");
return true;
}
bool write_blocks(size_t block_number, size_t block_count, char const *buffer)
{
PWRN("'write_blocks' not implemented");
return true;
}
bool read_blocks_dma(size_t block_number, size_t block_count,
Genode::addr_t buffer_phys) Genode::addr_t buffer_phys)
{ {
if (!_setup_idmac_descriptor_table(block_count, buffer_phys)) if (!_setup_idmac_descriptor_table(block_count, buffer_phys))
@ -671,7 +659,7 @@ struct Exynos5_msh_controller : private Dwmmc, Sd_card::Host_controller
return complete; return complete;
} }
bool write_blocks_dma(size_t block_number, size_t block_count, bool write_blocks_dma(Block::sector_t block_number, size_t block_count,
Genode::addr_t buffer_phys) Genode::addr_t buffer_phys)
{ {
if (!_setup_idmac_descriptor_table(block_count, buffer_phys)) if (!_setup_idmac_descriptor_table(block_count, buffer_phys))

View File

@ -77,7 +77,7 @@ class Block::Omap4_driver : public Block::Driver
Genode::size_t block_size() { return 512; } Genode::size_t block_size() { return 512; }
virtual Genode::size_t block_count() virtual Block::sector_t block_count()
{ {
return _controller.card_info().capacity_mb() * 1024 * 2; return _controller.card_info().capacity_mb() * 1024 * 2;
} }
@ -90,7 +90,7 @@ class Block::Omap4_driver : public Block::Driver
return o; return o;
} }
void read(Genode::size_t block_number, void read(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char *out_buffer, char *out_buffer,
Packet_descriptor &packet) Packet_descriptor &packet)
@ -100,7 +100,7 @@ class Block::Omap4_driver : public Block::Driver
session->complete_packet(packet); session->complete_packet(packet);
} }
void write(Genode::size_t block_number, void write(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char const *buffer, char const *buffer,
Packet_descriptor &packet) Packet_descriptor &packet)
@ -110,7 +110,7 @@ class Block::Omap4_driver : public Block::Driver
session->complete_packet(packet); session->complete_packet(packet);
} }
void read_dma(Genode::size_t block_number, void read_dma(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Packet_descriptor &packet) Packet_descriptor &packet)
@ -120,7 +120,7 @@ class Block::Omap4_driver : public Block::Driver
session->complete_packet(packet); session->complete_packet(packet);
} }
void write_dma(Genode::size_t block_number, void write_dma(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
Genode::addr_t phys, Genode::addr_t phys,
Packet_descriptor &packet) Packet_descriptor &packet)

View File

@ -78,7 +78,7 @@ class Sd_card : public Block::Driver
/* /*
* TODO report (and support) real capacity not just 512M * TODO report (and support) real capacity not just 512M
*/ */
Genode::size_t block_count() { return 0x20000000 / BLOCK_SIZE; } Block::sector_t block_count() { return 0x20000000 / BLOCK_SIZE; }
Block::Session::Operations ops() Block::Session::Operations ops()
{ {
@ -88,7 +88,7 @@ class Sd_card : public Block::Driver
return o; return o;
} }
void read(Genode::size_t block_number, void read(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char *out_buffer, char *out_buffer,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
@ -110,7 +110,7 @@ class Sd_card : public Block::Driver
session->complete_packet(packet); session->complete_packet(packet);
} }
void write(Genode::size_t block_number, void write(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char const *buffer, char const *buffer,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)

View File

@ -489,7 +489,7 @@ namespace Iso {
Sector::_blk = &_blk; Sector::_blk = &_blk;
Sector::_source = _blk.tx(); Sector::_source = _blk.tx();
size_t blk_cnt = 0; Block::sector_t blk_cnt = 0;
Block::Session::Operations ops; Block::Session::Operations ops;
_blk.info(&blk_cnt, &Sector::_blk_size, &ops); _blk.info(&blk_cnt, &Sector::_blk_size, &ops);
} }

View File

@ -105,7 +105,7 @@ namespace Partition {
_alloc_sem.up(); _alloc_sem.up();
if (!_p.succeeded()) { if (!_p.succeeded()) {
PERR("Could not access block %zu", _p.block_number()); PERR("Could not access block %llu", _p.block_number());
throw Io_error(); throw Io_error();
} }
} }

View File

@ -47,8 +47,8 @@ class Rom_blk : public Block::Driver
** Block-driver interface ** ** Block-driver interface **
****************************/ ****************************/
Genode::size_t block_size() { return _blk_sz; } Genode::size_t block_size() { return _blk_sz; }
Genode::size_t block_count() { return _blk_cnt; } Block::sector_t block_count() { return _blk_cnt; }
Block::Session::Operations ops() Block::Session::Operations ops()
{ {
@ -57,7 +57,7 @@ class Rom_blk : public Block::Driver
return o; return o;
} }
void read(Genode::size_t block_number, void read(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char* buffer, char* buffer,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
@ -65,12 +65,12 @@ class Rom_blk : public Block::Driver
/* sanity check block number */ /* sanity check block number */
if ((block_number + block_count > _file_sz / _blk_sz) if ((block_number + block_count > _file_sz / _blk_sz)
|| block_number < 0) { || block_number < 0) {
PWRN("requested blocks %zd-%zd out of range!", PWRN("requested blocks %lld-%lld out of range!",
block_number, block_number + block_count); block_number, block_number + block_count);
return; return;
} }
size_t offset = block_number * _blk_sz; size_t offset = (size_t) block_number * _blk_sz;
size_t size = block_count * _blk_sz; size_t size = block_count * _blk_sz;
/* copy file content to packet payload */ /* copy file content to packet payload */

View File

@ -158,7 +158,7 @@ int main(int argc, char **argv)
/* check block-connection info */ /* check block-connection info */
Genode::size_t _blk_size = 0; Genode::size_t _blk_size = 0;
size_t blk_cnt = 0; Block::sector_t blk_cnt = 0;
Block::Session::Operations ops; Block::Session::Operations ops;
_blk_con.info(&blk_cnt, &_blk_size, &ops); _blk_con.info(&blk_cnt, &_blk_size, &ops);
if (!ops.supported(Block::Packet_descriptor::READ)) { if (!ops.supported(Block::Packet_descriptor::READ)) {

View File

@ -47,8 +47,8 @@ class Driver : public Block::Driver
** Block::Driver interface ** ** Block::Driver interface **
*******************************/ *******************************/
Genode::size_t block_size() { return BLOCK_SIZE; } Genode::size_t block_size() { return BLOCK_SIZE; }
Genode::size_t block_count() { return _fb_size / BLOCK_SIZE; } Block::sector_t block_count() { return _fb_size / BLOCK_SIZE; }
Block::Session::Operations ops() Block::Session::Operations ops()
{ {
@ -58,14 +58,14 @@ class Driver : public Block::Driver
return ops; return ops;
} }
void read(Genode::size_t block_number, void read(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char *buffer, char *buffer,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
{ {
/* sanity check block number */ /* sanity check block number */
if (block_number + block_count > _fb_size / BLOCK_SIZE) { if (block_number + block_count > _fb_size / BLOCK_SIZE) {
PWRN("Out of range: requested %zd blocks from block %zd", PWRN("Out of range: requested %zd blocks from block %llu",
block_count, block_number); block_count, block_number);
return; return;
} }
@ -77,14 +77,14 @@ class Driver : public Block::Driver
session->complete_packet(packet); session->complete_packet(packet);
} }
void write(Genode::size_t block_number, void write(Block::sector_t block_number,
Genode::size_t block_count, Genode::size_t block_count,
char const *buffer, char const *buffer,
Block::Packet_descriptor &packet) Block::Packet_descriptor &packet)
{ {
/* sanity check block number */ /* sanity check block number */
if (block_number + block_count > _fb_size / BLOCK_SIZE) { if (block_number + block_count > _fb_size / BLOCK_SIZE) {
PWRN("Out of range: requested %zd blocks from block %zd", PWRN("Out of range: requested %zd blocks from block %llu",
block_count, block_number); block_count, block_number);
return; return;
} }

View File

@ -56,7 +56,7 @@ class Sector
_p = _blk.tx()->get_acked_packet(); _p = _blk.tx()->get_acked_packet();
if (!_p.succeeded()) if (!_p.succeeded())
PERR("Could not access block %zu", _p.block_number()); PERR("Could not access block %llu", _p.block_number());
} }
}; };

View File

@ -51,7 +51,7 @@ class Comparer : public Genode::Thread<8192>
Block::Session::Tx::Source *source = _blk_con.tx(); Block::Session::Tx::Source *source = _blk_con.tx();
size_t blk_size = 0; size_t blk_size = 0;
size_t blk_cnt = 0; Block::sector_t blk_cnt = 0;
Genode::addr_t end = Genode::addr_t end =
_addr + Dataspace_client(_rom.dataspace()).size(); _addr + Dataspace_client(_rom.dataspace()).size();
Block::Session::Operations ops; Block::Session::Operations ops;
@ -61,7 +61,7 @@ class Comparer : public Genode::Thread<8192>
PERR("Block device not readable!"); PERR("Block device not readable!");
} }
PINF("We have %zx blocks with a size of %zx bytes", blk_cnt, blk_size); PINF("We have %llu blocks with a size of 0x%zx bytes", blk_cnt, blk_size);
for (size_t i = 0; i < blk_cnt; i += BLOCK_REQ_PARALLEL) { for (size_t i = 0; i < blk_cnt; i += BLOCK_REQ_PARALLEL) {
try { try {

View File

@ -91,7 +91,7 @@ namespace {
Genode::Allocator_avl _alloc; Genode::Allocator_avl _alloc;
Block::Connection _session; Block::Connection _session;
Genode::size_t _blk_size; Genode::size_t _blk_size;
Genode::size_t _blk_cnt; Block::sector_t _blk_cnt;
Block::Session::Operations _blk_ops; Block::Session::Operations _blk_ops;
Genode::Native_capability _irq_cap; Genode::Native_capability _irq_cap;
Genode::Signal_context _tx; Genode::Signal_context _tx;

View File

@ -91,7 +91,7 @@ class Vancouver_disk : public Genode::Thread<8192>, public StaticReceiver<Vancou
Block::Connection *blk_con; Block::Connection *blk_con;
Block::Session::Operations ops; Block::Session::Operations ops;
Genode::size_t blk_size; Genode::size_t blk_size;
Genode::size_t blk_cnt; Block::sector_t blk_cnt;
Vancouver_disk_signal *dispatcher; Vancouver_disk_signal *dispatcher;
} _diskcon[MAX_DISKS]; } _diskcon[MAX_DISKS];