| 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 | /* | 
| Konrad Rzeszutek Wilk | 6dcfb75 | 2011-05-05 12:41:03 -0400 | [diff] [blame] | 48 | * 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 Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame] | 61 | * 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 Smith | 51de695 | 2010-12-22 15:05:00 +0000 | [diff] [blame] | 67 | struct blkif_request_rw { | 
| Jeremy Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame] | 68 | 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 Smith | 51de695 | 2010-12-22 15:05:00 +0000 | [diff] [blame] | 77 | struct 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 Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame] | 87 | struct 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 |  | 
|  | 107 | DEFINE_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 Stabellini | c80a420 | 2010-12-02 17:55:00 +0000 | [diff] [blame] | 113 | /* 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 Fitzhardinge | a42089d | 2007-07-17 18:37:04 -0700 | [diff] [blame] | 134 | #endif /* __XEN_PUBLIC_IO_BLKIF_H__ */ |