127 lines
4.8 KiB
Plaintext
127 lines
4.8 KiB
Plaintext
/*
|
|
* Copyright (c) 2012, ETH Zurich. All rights reserved.
|
|
*
|
|
* This file is distributed under the terms in the attached LICENSE file.
|
|
* If you do not find this file, copies can be found by writing to:
|
|
* ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
|
|
*/
|
|
|
|
/*
|
|
* virtio.dev
|
|
*
|
|
* The following structurs are taken from the Virtio Specification 1.0
|
|
*
|
|
*/
|
|
|
|
device virtio_blk lsbfirst ( addr base ) "Virtio Block Device Specification" {
|
|
|
|
datatype features lsbfirst (32) "Feature bits for block devices" {
|
|
barrier 1 "Device supports request barriers (Legacy)";
|
|
size_max 1 "Maximum size of any single segment in size_max";
|
|
seg_max 1 "Maximum number of segments in a request in seg_max";
|
|
_ 1 "Reserved";
|
|
geometry 1 "Disk-style geometry specified in geometry";
|
|
read_only 1 "Device is read-only";
|
|
blk_size 1 "Block size of disk is in blk_size";
|
|
scsi 1 "Device supports scsi packet commands";
|
|
_ 1 "Reserved";
|
|
flush 1 "Cache flush command support (Legacy)";
|
|
topology 1 "Device exports information on optimal IO alignment";
|
|
_ 12 "Reserved";
|
|
notify_on_empty 1 "(Legacy) The device MUST issue an interrupt if the device runs out of available descriptors";
|
|
_ 2 "Reserved";
|
|
any_layout 1 "(Legacy) his feature indicates that the device accepts arbitrary descriptor layouts";
|
|
ring_indirect_desc 1 "river can use descriptors with the VIRTQ_DESC_F_INDIRECT";
|
|
ring_event_idx 1 "enables the used_event and the avail_event fields";
|
|
_ 2 "Reserved";
|
|
version_1 1 "Distinction Legacy / Version 1 Device";
|
|
};
|
|
|
|
/*
|
|
* Note:
|
|
*/
|
|
datatype req lsbfirst(32) "Request header" {
|
|
rtype 32 "The type of the request";
|
|
ioprio 32 "The IO prioroty (Legacy)";
|
|
sector 64 "The sector where to write/read";
|
|
/* data */
|
|
};
|
|
|
|
/*
|
|
* The cmd field is only present for scsi packet command requests, and
|
|
* indicates the command to perform. This field MUST reside in a single,
|
|
* separate device-readable buffer; command length can be derived from the
|
|
* length of this buffer.
|
|
*/
|
|
datatype scsi_req lsbfirst(32) "SCSI trailer"{
|
|
errors 32 "Errors that may have occurred";
|
|
data_len 32 "Deprecated: Should be ignored.";
|
|
sense_len 32 "The number of bytes in the sense buffer";
|
|
residual 32 "The residual size: total - transferred";
|
|
};
|
|
|
|
constants req_type "Possible request types for the block device" {
|
|
in = 0x00000000 "Request type is an IN operation";
|
|
out = 0x00000001 "Request type is an OUT operation";
|
|
scsi_cmd = 0x00000002 "Request type is an OUT operation";
|
|
scsi_cmd_out = 0x00000003 "Request type is an OUT operation";
|
|
flush = 0x00000004 "Request type is a cache flush";
|
|
flush_out = 0x00000005 "Request type is a cache flush";
|
|
barrier = 0x80000000 "IO Barrier (Legacy)";
|
|
};
|
|
|
|
constants req_status "The status of the request" {
|
|
ok = 0x0 "Everythin ok";
|
|
ioerror = 0x1 "IO error occured";
|
|
unsupp = 0x2 "The request is not supported";
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
* ------------------------------------------------------------------------
|
|
* Reading / Writing the configuration space
|
|
* ------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
|
|
register capacity addr(base, 0x00) "The capacity in 512byte sectors" {
|
|
sectors 64 "Number of 512byte sectors";
|
|
};
|
|
|
|
register seg_size addr(base, 0x08) "The maximum segment size" {
|
|
max 32 "Maximum segment size";
|
|
};
|
|
|
|
register seg_num addr(base, 0x0C) "The maximum number of segments" {
|
|
max 32 "Maximum number of segments";
|
|
};
|
|
|
|
register geometry addr(base, 0x10) "Geometry Information" {
|
|
cylinders 16 "Number of cylinders";
|
|
heads 8 "Number of heads";
|
|
sectors 8 "Number of sectors";
|
|
};
|
|
|
|
|
|
register block_size addr(base, 0x14) "Block Size" {
|
|
size 32 "The size of a block";
|
|
};
|
|
|
|
register topo_blocks addr(base, 0x18) "Toplogy: Logical Blocks" {
|
|
logic_per_phys 8 "Number of logical blocks per physical block";
|
|
offset_aligned 8 "Offset of first aligned logical block";
|
|
};
|
|
|
|
register topo_io_size addr(base, 0x1A) "Topology: minimum IO Size" {
|
|
min 16 "Minimum number of IO size in blocks";
|
|
opt 16 "Maximum number of IO size in blocks";
|
|
};
|
|
|
|
|
|
register writeback addr(base, 0x1E) "Legacy Writeback Register" {
|
|
wb 8 "Write back";
|
|
};
|
|
};
|
|
|