Jeremy Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame] | 1 | /****************************************************************************** |
| 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 | |
| 27 | typedef uint16_t blkif_vdev_t; |
| 28 | typedef 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 | /* |
| 48 | * Maximum scatter/gather segments per request. |
| 49 | * This is carefully chosen so that sizeof(struct blkif_ring) <= PAGE_SIZE. |
| 50 | * NB. This could be 12 if the ring indexes weren't stored in the same page. |
| 51 | */ |
| 52 | #define BLKIF_MAX_SEGMENTS_PER_REQUEST 11 |
| 53 | |
Owen Smith | 51de695 | 2010-12-22 15:05:00 +0000 | [diff] [blame] | 54 | struct blkif_request_rw { |
Jeremy Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame] | 55 | blkif_sector_t sector_number;/* start sector idx on disk (r/w only) */ |
| 56 | struct blkif_request_segment { |
| 57 | grant_ref_t gref; /* reference to I/O buffer frame */ |
| 58 | /* @first_sect: first sector in frame to transfer (inclusive). */ |
| 59 | /* @last_sect: last sector in frame to transfer (inclusive). */ |
| 60 | uint8_t first_sect, last_sect; |
| 61 | } seg[BLKIF_MAX_SEGMENTS_PER_REQUEST]; |
| 62 | }; |
| 63 | |
Owen Smith | 51de695 | 2010-12-22 15:05:00 +0000 | [diff] [blame] | 64 | struct blkif_request { |
| 65 | uint8_t operation; /* BLKIF_OP_??? */ |
| 66 | uint8_t nr_segments; /* number of segments */ |
| 67 | blkif_vdev_t handle; /* only for read/write requests */ |
| 68 | uint64_t id; /* private guest value, echoed in resp */ |
| 69 | union { |
| 70 | struct blkif_request_rw rw; |
| 71 | } u; |
| 72 | }; |
| 73 | |
Jeremy Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame] | 74 | struct blkif_response { |
| 75 | uint64_t id; /* copied from request */ |
| 76 | uint8_t operation; /* copied from request */ |
| 77 | int16_t status; /* BLKIF_RSP_??? */ |
| 78 | }; |
| 79 | |
| 80 | /* |
| 81 | * STATUS RETURN CODES. |
| 82 | */ |
| 83 | /* Operation not supported (only happens on barrier writes). */ |
| 84 | #define BLKIF_RSP_EOPNOTSUPP -2 |
| 85 | /* Operation failed for some unspecified reason (-EIO). */ |
| 86 | #define BLKIF_RSP_ERROR -1 |
| 87 | /* Operation completed successfully. */ |
| 88 | #define BLKIF_RSP_OKAY 0 |
| 89 | |
| 90 | /* |
| 91 | * Generate blkif ring structures and types. |
| 92 | */ |
| 93 | |
| 94 | DEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response); |
| 95 | |
| 96 | #define VDISK_CDROM 0x1 |
| 97 | #define VDISK_REMOVABLE 0x2 |
| 98 | #define VDISK_READONLY 0x4 |
| 99 | |
Stefano Stabellini | c80a420 | 2010-12-02 17:55:00 +0000 | [diff] [blame] | 100 | /* Xen-defined major numbers for virtual disks, they look strangely |
| 101 | * familiar */ |
| 102 | #define XEN_IDE0_MAJOR 3 |
| 103 | #define XEN_IDE1_MAJOR 22 |
| 104 | #define XEN_SCSI_DISK0_MAJOR 8 |
| 105 | #define XEN_SCSI_DISK1_MAJOR 65 |
| 106 | #define XEN_SCSI_DISK2_MAJOR 66 |
| 107 | #define XEN_SCSI_DISK3_MAJOR 67 |
| 108 | #define XEN_SCSI_DISK4_MAJOR 68 |
| 109 | #define XEN_SCSI_DISK5_MAJOR 69 |
| 110 | #define XEN_SCSI_DISK6_MAJOR 70 |
| 111 | #define XEN_SCSI_DISK7_MAJOR 71 |
| 112 | #define XEN_SCSI_DISK8_MAJOR 128 |
| 113 | #define XEN_SCSI_DISK9_MAJOR 129 |
| 114 | #define XEN_SCSI_DISK10_MAJOR 130 |
| 115 | #define XEN_SCSI_DISK11_MAJOR 131 |
| 116 | #define XEN_SCSI_DISK12_MAJOR 132 |
| 117 | #define XEN_SCSI_DISK13_MAJOR 133 |
| 118 | #define XEN_SCSI_DISK14_MAJOR 134 |
| 119 | #define XEN_SCSI_DISK15_MAJOR 135 |
| 120 | |
Jeremy Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame] | 121 | #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ |