blob: 3d5d6db864fe9781e2fc79214474f7101c84187c [file] [log] [blame]
Jeremy Fitzhardingea42089d2007-07-17 18:37:04 -07001/******************************************************************************
2 * blkif.h
3 *
4 * Unified block-device I/O interface for Xen guest OSes.
5 *
6 * Copyright (c) 2003-2004, Keir Fraser
7 */
8
9#ifndef __XEN_PUBLIC_IO_BLKIF_H__
10#define __XEN_PUBLIC_IO_BLKIF_H__
11
12#include "ring.h"
13#include "../grant_table.h"
14
15/*
16 * Front->back notifications: When enqueuing a new request, sending a
17 * notification can be made conditional on req_event (i.e., the generic
18 * hold-off mechanism provided by the ring macros). Backends must set
19 * req_event appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()).
20 *
21 * Back->front notifications: When enqueuing a new response, sending a
22 * notification can be made conditional on rsp_event (i.e., the generic
23 * hold-off mechanism provided by the ring macros). Frontends must set
24 * rsp_event appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()).
25 */
26
27typedef uint16_t blkif_vdev_t;
28typedef uint64_t blkif_sector_t;
29
30/*
31 * REQUEST CODES.
32 */
33#define BLKIF_OP_READ 0
34#define BLKIF_OP_WRITE 1
35/*
36 * Recognised only if "feature-barrier" is present in backend xenbus info.
37 * The "feature_barrier" node contains a boolean indicating whether barrier
38 * requests are likely to succeed or fail. Either way, a barrier request
39 * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
40 * the underlying block-device hardware. The boolean simply indicates whether
41 * or not it is worthwhile for the frontend to attempt barrier requests.
42 * If a backend does not recognise BLKIF_OP_WRITE_BARRIER, it should *not*
43 * create the "feature-barrier" node!
44 */
45#define BLKIF_OP_WRITE_BARRIER 2
46
47/*
Konrad Rzeszutek Wilk6dcfb752011-05-05 12:41:03 -040048 * Recognised if "feature-flush-cache" is present in backend xenbus
49 * info. A flush will ask the underlying storage hardware to flush its
50 * non-volatile caches as appropriate. The "feature-flush-cache" node
51 * contains a boolean indicating whether flush requests are likely to
52 * succeed or fail. Either way, a flush request may fail at any time
53 * with BLKIF_RSP_EOPNOTSUPP if it is unsupported by the underlying
54 * block-device hardware. The boolean simply indicates whether or not it
55 * is worthwhile for the frontend to attempt flushes. If a backend does
56 * not recognise BLKIF_OP_WRITE_FLUSH_CACHE, it should *not* create the
57 * "feature-flush-cache" node!
58 */
59#define BLKIF_OP_FLUSH_DISKCACHE 3
60/*
Jeremy Fitzhardingea42089d2007-07-17 18:37:04 -070061 * Maximum scatter/gather segments per request.
62 * This is carefully chosen so that sizeof(struct blkif_ring) <= PAGE_SIZE.
63 * NB. This could be 12 if the ring indexes weren't stored in the same page.
64 */
65#define BLKIF_MAX_SEGMENTS_PER_REQUEST 11
66
Owen Smith51de6952010-12-22 15:05:00 +000067struct blkif_request_rw {
Jeremy Fitzhardingea42089d2007-07-17 18:37:04 -070068 blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */
69 struct blkif_request_segment {
70 grant_ref_t gref; /* reference to I/O buffer frame */
71 /* @first_sect: first sector in frame to transfer (inclusive). */
72 /* @last_sect: last sector in frame to transfer (inclusive). */
73 uint8_t first_sect, last_sect;
74 } seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
75};
76
Owen Smith51de6952010-12-22 15:05:00 +000077struct blkif_request {
78 uint8_t operation; /* BLKIF_OP_??? */
79 uint8_t nr_segments; /* number of segments */
80 blkif_vdev_t handle; /* only for read/write requests */
81 uint64_t id; /* private guest value, echoed in resp */
82 union {
83 struct blkif_request_rw rw;
84 } u;
85};
86
Jeremy Fitzhardingea42089d2007-07-17 18:37:04 -070087struct blkif_response {
88 uint64_t id; /* copied from request */
89 uint8_t operation; /* copied from request */
90 int16_t status; /* BLKIF_RSP_??? */
91};
92
93/*
94 * STATUS RETURN CODES.
95 */
96 /* Operation not supported (only happens on barrier writes). */
97#define BLKIF_RSP_EOPNOTSUPP -2
98 /* Operation failed for some unspecified reason (-EIO). */
99#define BLKIF_RSP_ERROR -1
100 /* Operation completed successfully. */
101#define BLKIF_RSP_OKAY 0
102
103/*
104 * Generate blkif ring structures and types.
105 */
106
107DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response);
108
109#define VDISK_CDROM 0x1
110#define VDISK_REMOVABLE 0x2
111#define VDISK_READONLY 0x4
112
Stefano Stabellinic80a4202010-12-02 17:55:00 +0000113/* Xen-defined major numbers for virtual disks, they look strangely
114 * familiar */
115#define XEN_IDE0_MAJOR 3
116#define XEN_IDE1_MAJOR 22
117#define XEN_SCSI_DISK0_MAJOR 8
118#define XEN_SCSI_DISK1_MAJOR 65
119#define XEN_SCSI_DISK2_MAJOR 66
120#define XEN_SCSI_DISK3_MAJOR 67
121#define XEN_SCSI_DISK4_MAJOR 68
122#define XEN_SCSI_DISK5_MAJOR 69
123#define XEN_SCSI_DISK6_MAJOR 70
124#define XEN_SCSI_DISK7_MAJOR 71
125#define XEN_SCSI_DISK8_MAJOR 128
126#define XEN_SCSI_DISK9_MAJOR 129
127#define XEN_SCSI_DISK10_MAJOR 130
128#define XEN_SCSI_DISK11_MAJOR 131
129#define XEN_SCSI_DISK12_MAJOR 132
130#define XEN_SCSI_DISK13_MAJOR 133
131#define XEN_SCSI_DISK14_MAJOR 134
132#define XEN_SCSI_DISK15_MAJOR 135
133
Jeremy Fitzhardingea42089d2007-07-17 18:37:04 -0700134#endif /* __XEN_PUBLIC_IO_BLKIF_H__ */