aos/devices/virtio/virtio_blk.dev
Daniel Schwyn 6d444bf552 Main handout
Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>
2022-03-03 14:57:51 +01:00

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";
};
};