1 // Copyright 2017 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #include <stdint.h>
8 #include <zircon/compiler.h>
9 
10 // clang-format off
11 #define VIRTIO_BLK_F_BARRIER    (1u << 0)
12 #define VIRTIO_BLK_F_SIZE_MAX   (1u << 1)
13 #define VIRTIO_BLK_F_SEG_MAX    (1u << 2)
14 #define VIRTIO_BLK_F_GEOMETRY   (1u << 4)
15 #define VIRTIO_BLK_F_RO         (1u << 5)
16 #define VIRTIO_BLK_F_BLK_SIZE   (1u << 6)
17 #define VIRTIO_BLK_F_SCSI       (1u << 7)
18 #define VIRTIO_BLK_F_FLUSH      (1u << 9)
19 #define VIRTIO_BLK_F_TOPOLOGY   (1u << 10)
20 #define VIRTIO_BLK_F_CONFIG_WCE (1u << 11)
21 
22 #define VIRTIO_BLK_T_IN         0
23 #define VIRTIO_BLK_T_OUT        1
24 #define VIRTIO_BLK_T_FLUSH      4
25 #define VIRTIO_BLK_T_GET_ID     8
26 
27 #define VIRTIO_BLK_S_OK         0
28 #define VIRTIO_BLK_S_IOERR      1
29 #define VIRTIO_BLK_S_UNSUPP     2
30 
31 #define VIRTIO_BLK_ID_BYTES     20
32 // clang-format on
33 
34 __BEGIN_CDECLS
35 
36 typedef struct virtio_blk_geometry {
37     uint16_t cylinders;
38     uint8_t heads;
39     uint8_t sectors;
40 } __PACKED virtio_blk_geometry_t;
41 
42 typedef struct virtio_blk_config {
43     uint64_t capacity;
44     uint32_t size_max;
45     uint32_t seg_max;
46     virtio_blk_geometry_t geometry;
47     uint32_t blk_size;
48 } __PACKED virtio_blk_config_t;
49 
50 typedef struct virtio_blk_req {
51     uint32_t type;
52     uint32_t ioprio;
53     uint64_t sector;
54 } __PACKED virtio_blk_req_t;
55 
56 __END_CDECLS
57