4baf42a883c375bd8b59494efdd267af50a8954a
[barrelfish] / devices / virtio / virtio_blk.dev
1 /*
2  * Copyright (c) 2012, ETH Zurich. All rights reserved.
3  *
4  * This file is distributed under the terms in the attached LICENSE file.
5  * If you do not find this file, copies can be found by writing to:
6  * ETH Zurich D-INFK, Universitaetsstrasse 6, CH-8092 Zurich. Attn: Systems Group.
7  */
8
9 /*
10  * virtio.dev
11  *
12  * The following structurs are taken from the Virtio Specification 1.0
13  *
14  */
15  
16 device virtio_blk lsbfirst ( addr base ) "Virtio Block Device Specification" {
17    
18     datatype features lsbfirst (32)  "Feature bits for block devices"  {
19         barrier             1 "Device supports request barriers (Legacy)";
20         size_max            1 "Maximum size of any single segment in size_max";
21         seg_max             1 "Maximum number of segments in a request in seg_max";
22         _                   1 "Reserved";
23         geometry            1 "Disk-style geometry specified in geometry";
24         read_only           1 "Device is read-only";
25         blk_size            1 "Block size of disk is in blk_size";
26         scsi                1 "Device supports scsi packet commands";
27         _                   1 "Reserved";
28         flush               1 "Cache flush command support (Legacy)";
29         topology            1 "Device exports information on optimal IO alignment";
30         /* reserved bits */
31         _                  12 "";
32         notify_on_empty     1 "(Legacy) The device MUST issue an interrupt if the device runs out of available descriptors"; 
33         _                   2 "";
34         any_layout          1 "(Legacy) his feature indicates that the device accepts arbitrary descriptor layouts";
35         ring_indirect_desc  1 "river can use descriptors with the VIRTQ_DESC_F_INDIRECT";
36         ring_event_idx      1 "enables the used_event and the avail_event fields";
37         _                   2 "Reserved";
38         version_1           1 "Distinction Legacy / Version 1 Device";
39     };
40     
41     /*
42      * Note: 
43      */
44     datatype req lsbfirst(32)  "Request header" {
45         rtype    32 "The type of the request";
46         ioprio  32 "The IO prioroty (Legacy)";
47         sector  64 "The sector where to write/read";
48         /* data */
49     };
50     
51     /*
52      * The cmd field is only present for scsi packet command requests, and 
53      * indicates the command to perform. This field MUST reside in a single, 
54      * separate device-readable buffer; command length can be derived from the 
55      * length of this buffer.
56      */
57     datatype scsi_req lsbfirst(32) "SCSI trailer"{
58         /* request header */
59         /* cmd */
60         /* data */
61         /* sense buffer */
62         errors      32  "Errors that may have occurred";
63         data_len    32  "Deprecated: Should be ignored.";
64         sense_len   32  "The number of bytes in the sense buffer";
65         residual    32  "The residual size: total - transferred";
66         status       8  "Request status";
67         _           24  "To make mackerel happy";
68     };
69     
70     constants req_type "Possible request types for the block device" {
71         in           = 0x00000000 "Request type is an IN operation";
72         out          = 0x00000001 "Request type is an OUT operation";
73         scsi_cmd     = 0x00000002 "Request type is an OUT operation";
74         scsi_cmd_out = 0x00000003 "Request type is an OUT operation";
75         flush        = 0x00000004 "Request type is a cache flush";
76         flush_out    = 0x00000005 "Request type is a cache flush";
77         barrier      = 0x80000000 "IO Barrier (Legacy)";
78     };
79     
80     constants req_status "The status of the request" {
81         ok      = 0x0 "Everythin ok";
82         ioerror = 0x1 "IO error occured";
83         unsupp  = 0x2 "The request is not supported";
84     };
85     
86    register capacity addr(base, 0x00) "The capacity in 512byte sectors" {
87        sectors  64  "Number of 512byte sectors";
88    };
89    
90    register size_max addr(base, 0x08) "The maximum segment size" {
91        size 32 "Maximum segment size";
92    };
93    
94    register seg_max addr(base, 0x0C) "The maximum number of segments" {
95        num 32 "Number of segments";
96    };
97    
98    register geo_cylinders addr(base, 0x10) "Geometry Information: Cylinders" {
99        num 16 "Geometry: Number of cylinders";
100    };
101    
102    register geo_heads addr(base, 0x12) "Geometry Information: Heads" {
103        num 8 "Geometry: Number of heads";
104    };
105    
106    register geo_sectors addr(base, 0x13) "Geometry Information: Sectors" {
107        num 8 "Geometry: Number of sectors";
108    };
109    
110    register block_size addr(base, 0x14) "Block Size" {
111        size 32 "The size of a block";
112    };
113    
114    register phys_block_exp addr(base, 0x18) "Toplogy: Logical Blocks" {
115        exp 8 "Number of logical blocks per physical block";
116    };
117    
118    register align_offset addr(base, 0x19) "Topology: Align Offset" {
119       off 8 "Offset of first aligned logical block";
120    };
121    
122    register min_io addr(base, 0x1A) "Topology: minimum IO Size" {
123        size 16 "Minimum number of IO size in blocks";
124    };
125    
126    register opt_io addr(base, 0x1C) "Topology: maximum IO Size" {
127        size 32 "Maximum number of IO size in  blocks";
128    };
129    
130    register writeback addr(base, 0x20) "Legacy Writeback Register" {
131        wb   8 "Write back";
132    };
133  };
134