18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/******************************************************************************
38c2ecf20Sopenharmony_ci * blkif.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Unified block-device I/O interface for Xen guest OSes.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Copyright (c) 2003-2004, Keir Fraser
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#ifndef __XEN_PUBLIC_IO_BLKIF_H__
118c2ecf20Sopenharmony_ci#define __XEN_PUBLIC_IO_BLKIF_H__
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <xen/interface/io/ring.h>
148c2ecf20Sopenharmony_ci#include <xen/interface/grant_table.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci/*
178c2ecf20Sopenharmony_ci * Front->back notifications: When enqueuing a new request, sending a
188c2ecf20Sopenharmony_ci * notification can be made conditional on req_event (i.e., the generic
198c2ecf20Sopenharmony_ci * hold-off mechanism provided by the ring macros). Backends must set
208c2ecf20Sopenharmony_ci * req_event appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()).
218c2ecf20Sopenharmony_ci *
228c2ecf20Sopenharmony_ci * Back->front notifications: When enqueuing a new response, sending a
238c2ecf20Sopenharmony_ci * notification can be made conditional on rsp_event (i.e., the generic
248c2ecf20Sopenharmony_ci * hold-off mechanism provided by the ring macros). Frontends must set
258c2ecf20Sopenharmony_ci * rsp_event appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()).
268c2ecf20Sopenharmony_ci */
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_citypedef uint16_t blkif_vdev_t;
298c2ecf20Sopenharmony_citypedef uint64_t blkif_sector_t;
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci/*
328c2ecf20Sopenharmony_ci * Multiple hardware queues/rings:
338c2ecf20Sopenharmony_ci * If supported, the backend will write the key "multi-queue-max-queues" to
348c2ecf20Sopenharmony_ci * the directory for that vbd, and set its value to the maximum supported
358c2ecf20Sopenharmony_ci * number of queues.
368c2ecf20Sopenharmony_ci * Frontends that are aware of this feature and wish to use it can write the
378c2ecf20Sopenharmony_ci * key "multi-queue-num-queues" with the number they wish to use, which must be
388c2ecf20Sopenharmony_ci * greater than zero, and no more than the value reported by the backend in
398c2ecf20Sopenharmony_ci * "multi-queue-max-queues".
408c2ecf20Sopenharmony_ci *
418c2ecf20Sopenharmony_ci * For frontends requesting just one queue, the usual event-channel and
428c2ecf20Sopenharmony_ci * ring-ref keys are written as before, simplifying the backend processing
438c2ecf20Sopenharmony_ci * to avoid distinguishing between a frontend that doesn't understand the
448c2ecf20Sopenharmony_ci * multi-queue feature, and one that does, but requested only one queue.
458c2ecf20Sopenharmony_ci *
468c2ecf20Sopenharmony_ci * Frontends requesting two or more queues must not write the toplevel
478c2ecf20Sopenharmony_ci * event-channel and ring-ref keys, instead writing those keys under sub-keys
488c2ecf20Sopenharmony_ci * having the name "queue-N" where N is the integer ID of the queue/ring for
498c2ecf20Sopenharmony_ci * which those keys belong. Queues are indexed from zero.
508c2ecf20Sopenharmony_ci * For example, a frontend with two queues must write the following set of
518c2ecf20Sopenharmony_ci * queue-related keys:
528c2ecf20Sopenharmony_ci *
538c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/multi-queue-num-queues = "2"
548c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-0 = ""
558c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-0/ring-ref = "<ring-ref#0>"
568c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-0/event-channel = "<evtchn#0>"
578c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-1 = ""
588c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-1/ring-ref = "<ring-ref#1>"
598c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-1/event-channel = "<evtchn#1>"
608c2ecf20Sopenharmony_ci *
618c2ecf20Sopenharmony_ci * It is also possible to use multiple queues/rings together with
628c2ecf20Sopenharmony_ci * feature multi-page ring buffer.
638c2ecf20Sopenharmony_ci * For example, a frontend requests two queues/rings and the size of each ring
648c2ecf20Sopenharmony_ci * buffer is two pages must write the following set of related keys:
658c2ecf20Sopenharmony_ci *
668c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/multi-queue-num-queues = "2"
678c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/ring-page-order = "1"
688c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-0 = ""
698c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-0/ring-ref0 = "<ring-ref#0>"
708c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-0/ring-ref1 = "<ring-ref#1>"
718c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-0/event-channel = "<evtchn#0>"
728c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-1 = ""
738c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-1/ring-ref0 = "<ring-ref#2>"
748c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-1/ring-ref1 = "<ring-ref#3>"
758c2ecf20Sopenharmony_ci * /local/domain/1/device/vbd/0/queue-1/event-channel = "<evtchn#1>"
768c2ecf20Sopenharmony_ci *
778c2ecf20Sopenharmony_ci */
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci/*
808c2ecf20Sopenharmony_ci * REQUEST CODES.
818c2ecf20Sopenharmony_ci */
828c2ecf20Sopenharmony_ci#define BLKIF_OP_READ              0
838c2ecf20Sopenharmony_ci#define BLKIF_OP_WRITE             1
848c2ecf20Sopenharmony_ci/*
858c2ecf20Sopenharmony_ci * Recognised only if "feature-barrier" is present in backend xenbus info.
868c2ecf20Sopenharmony_ci * The "feature_barrier" node contains a boolean indicating whether barrier
878c2ecf20Sopenharmony_ci * requests are likely to succeed or fail. Either way, a barrier request
888c2ecf20Sopenharmony_ci * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
898c2ecf20Sopenharmony_ci * the underlying block-device hardware. The boolean simply indicates whether
908c2ecf20Sopenharmony_ci * or not it is worthwhile for the frontend to attempt barrier requests.
918c2ecf20Sopenharmony_ci * If a backend does not recognise BLKIF_OP_WRITE_BARRIER, it should *not*
928c2ecf20Sopenharmony_ci * create the "feature-barrier" node!
938c2ecf20Sopenharmony_ci */
948c2ecf20Sopenharmony_ci#define BLKIF_OP_WRITE_BARRIER     2
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci/*
978c2ecf20Sopenharmony_ci * Recognised if "feature-flush-cache" is present in backend xenbus
988c2ecf20Sopenharmony_ci * info.  A flush will ask the underlying storage hardware to flush its
998c2ecf20Sopenharmony_ci * non-volatile caches as appropriate.  The "feature-flush-cache" node
1008c2ecf20Sopenharmony_ci * contains a boolean indicating whether flush requests are likely to
1018c2ecf20Sopenharmony_ci * succeed or fail. Either way, a flush request may fail at any time
1028c2ecf20Sopenharmony_ci * with BLKIF_RSP_EOPNOTSUPP if it is unsupported by the underlying
1038c2ecf20Sopenharmony_ci * block-device hardware. The boolean simply indicates whether or not it
1048c2ecf20Sopenharmony_ci * is worthwhile for the frontend to attempt flushes.  If a backend does
1058c2ecf20Sopenharmony_ci * not recognise BLKIF_OP_WRITE_FLUSH_CACHE, it should *not* create the
1068c2ecf20Sopenharmony_ci * "feature-flush-cache" node!
1078c2ecf20Sopenharmony_ci */
1088c2ecf20Sopenharmony_ci#define BLKIF_OP_FLUSH_DISKCACHE   3
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci/*
1118c2ecf20Sopenharmony_ci * Recognised only if "feature-discard" is present in backend xenbus info.
1128c2ecf20Sopenharmony_ci * The "feature-discard" node contains a boolean indicating whether trim
1138c2ecf20Sopenharmony_ci * (ATA) or unmap (SCSI) - conviently called discard requests are likely
1148c2ecf20Sopenharmony_ci * to succeed or fail. Either way, a discard request
1158c2ecf20Sopenharmony_ci * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
1168c2ecf20Sopenharmony_ci * the underlying block-device hardware. The boolean simply indicates whether
1178c2ecf20Sopenharmony_ci * or not it is worthwhile for the frontend to attempt discard requests.
1188c2ecf20Sopenharmony_ci * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
1198c2ecf20Sopenharmony_ci * create the "feature-discard" node!
1208c2ecf20Sopenharmony_ci *
1218c2ecf20Sopenharmony_ci * Discard operation is a request for the underlying block device to mark
1228c2ecf20Sopenharmony_ci * extents to be erased. However, discard does not guarantee that the blocks
1238c2ecf20Sopenharmony_ci * will be erased from the device - it is just a hint to the device
1248c2ecf20Sopenharmony_ci * controller that these blocks are no longer in use. What the device
1258c2ecf20Sopenharmony_ci * controller does with that information is left to the controller.
1268c2ecf20Sopenharmony_ci * Discard operations are passed with sector_number as the
1278c2ecf20Sopenharmony_ci * sector index to begin discard operations at and nr_sectors as the number of
1288c2ecf20Sopenharmony_ci * sectors to be discarded. The specified sectors should be discarded if the
1298c2ecf20Sopenharmony_ci * underlying block device supports trim (ATA) or unmap (SCSI) operations,
1308c2ecf20Sopenharmony_ci * or a BLKIF_RSP_EOPNOTSUPP  should be returned.
1318c2ecf20Sopenharmony_ci * More information about trim/unmap operations at:
1328c2ecf20Sopenharmony_ci * http://t13.org/Documents/UploadedDocuments/docs2008/
1338c2ecf20Sopenharmony_ci *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
1348c2ecf20Sopenharmony_ci * http://www.seagate.com/staticfiles/support/disc/manuals/
1358c2ecf20Sopenharmony_ci *     Interface%20manuals/100293068c.pdf
1368c2ecf20Sopenharmony_ci * The backend can optionally provide three extra XenBus attributes to
1378c2ecf20Sopenharmony_ci * further optimize the discard functionality:
1388c2ecf20Sopenharmony_ci * 'discard-alignment' - Devices that support discard functionality may
1398c2ecf20Sopenharmony_ci * internally allocate space in units that are bigger than the exported
1408c2ecf20Sopenharmony_ci * logical block size. The discard-alignment parameter indicates how many bytes
1418c2ecf20Sopenharmony_ci * the beginning of the partition is offset from the internal allocation unit's
1428c2ecf20Sopenharmony_ci * natural alignment.
1438c2ecf20Sopenharmony_ci * 'discard-granularity'  - Devices that support discard functionality may
1448c2ecf20Sopenharmony_ci * internally allocate space using units that are bigger than the logical block
1458c2ecf20Sopenharmony_ci * size. The discard-granularity parameter indicates the size of the internal
1468c2ecf20Sopenharmony_ci * allocation unit in bytes if reported by the device. Otherwise the
1478c2ecf20Sopenharmony_ci * discard-granularity will be set to match the device's physical block size.
1488c2ecf20Sopenharmony_ci * 'discard-secure' - All copies of the discarded sectors (potentially created
1498c2ecf20Sopenharmony_ci * by garbage collection) must also be erased.  To use this feature, the flag
1508c2ecf20Sopenharmony_ci * BLKIF_DISCARD_SECURE must be set in the blkif_request_trim.
1518c2ecf20Sopenharmony_ci */
1528c2ecf20Sopenharmony_ci#define BLKIF_OP_DISCARD           5
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci/*
1558c2ecf20Sopenharmony_ci * Recognized if "feature-max-indirect-segments" in present in the backend
1568c2ecf20Sopenharmony_ci * xenbus info. The "feature-max-indirect-segments" node contains the maximum
1578c2ecf20Sopenharmony_ci * number of segments allowed by the backend per request. If the node is
1588c2ecf20Sopenharmony_ci * present, the frontend might use blkif_request_indirect structs in order to
1598c2ecf20Sopenharmony_ci * issue requests with more than BLKIF_MAX_SEGMENTS_PER_REQUEST (11). The
1608c2ecf20Sopenharmony_ci * maximum number of indirect segments is fixed by the backend, but the
1618c2ecf20Sopenharmony_ci * frontend can issue requests with any number of indirect segments as long as
1628c2ecf20Sopenharmony_ci * it's less than the number provided by the backend. The indirect_grefs field
1638c2ecf20Sopenharmony_ci * in blkif_request_indirect should be filled by the frontend with the
1648c2ecf20Sopenharmony_ci * grant references of the pages that are holding the indirect segments.
1658c2ecf20Sopenharmony_ci * These pages are filled with an array of blkif_request_segment that hold the
1668c2ecf20Sopenharmony_ci * information about the segments. The number of indirect pages to use is
1678c2ecf20Sopenharmony_ci * determined by the number of segments an indirect request contains. Every
1688c2ecf20Sopenharmony_ci * indirect page can contain a maximum of
1698c2ecf20Sopenharmony_ci * (PAGE_SIZE / sizeof(struct blkif_request_segment)) segments, so to
1708c2ecf20Sopenharmony_ci * calculate the number of indirect pages to use we have to do
1718c2ecf20Sopenharmony_ci * ceil(indirect_segments / (PAGE_SIZE / sizeof(struct blkif_request_segment))).
1728c2ecf20Sopenharmony_ci *
1738c2ecf20Sopenharmony_ci * If a backend does not recognize BLKIF_OP_INDIRECT, it should *not*
1748c2ecf20Sopenharmony_ci * create the "feature-max-indirect-segments" node!
1758c2ecf20Sopenharmony_ci */
1768c2ecf20Sopenharmony_ci#define BLKIF_OP_INDIRECT          6
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci/*
1798c2ecf20Sopenharmony_ci * Maximum scatter/gather segments per request.
1808c2ecf20Sopenharmony_ci * This is carefully chosen so that sizeof(struct blkif_ring) <= PAGE_SIZE.
1818c2ecf20Sopenharmony_ci * NB. This could be 12 if the ring indexes weren't stored in the same page.
1828c2ecf20Sopenharmony_ci */
1838c2ecf20Sopenharmony_ci#define BLKIF_MAX_SEGMENTS_PER_REQUEST 11
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci#define BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST 8
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_cistruct blkif_request_segment {
1888c2ecf20Sopenharmony_ci		grant_ref_t gref;        /* reference to I/O buffer frame        */
1898c2ecf20Sopenharmony_ci		/* @first_sect: first sector in frame to transfer (inclusive).   */
1908c2ecf20Sopenharmony_ci		/* @last_sect: last sector in frame to transfer (inclusive).     */
1918c2ecf20Sopenharmony_ci		uint8_t     first_sect, last_sect;
1928c2ecf20Sopenharmony_ci};
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_cistruct blkif_request_rw {
1958c2ecf20Sopenharmony_ci	uint8_t        nr_segments;  /* number of segments                   */
1968c2ecf20Sopenharmony_ci	blkif_vdev_t   handle;       /* only for read/write requests         */
1978c2ecf20Sopenharmony_ci#ifndef CONFIG_X86_32
1988c2ecf20Sopenharmony_ci	uint32_t       _pad1;	     /* offsetof(blkif_request,u.rw.id) == 8 */
1998c2ecf20Sopenharmony_ci#endif
2008c2ecf20Sopenharmony_ci	uint64_t       id;           /* private guest value, echoed in resp  */
2018c2ecf20Sopenharmony_ci	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
2028c2ecf20Sopenharmony_ci	struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
2038c2ecf20Sopenharmony_ci} __attribute__((__packed__));
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_cistruct blkif_request_discard {
2068c2ecf20Sopenharmony_ci	uint8_t        flag;         /* BLKIF_DISCARD_SECURE or zero.        */
2078c2ecf20Sopenharmony_ci#define BLKIF_DISCARD_SECURE (1<<0)  /* ignored if discard-secure=0          */
2088c2ecf20Sopenharmony_ci	blkif_vdev_t   _pad1;        /* only for read/write requests         */
2098c2ecf20Sopenharmony_ci#ifndef CONFIG_X86_32
2108c2ecf20Sopenharmony_ci	uint32_t       _pad2;        /* offsetof(blkif_req..,u.discard.id)==8*/
2118c2ecf20Sopenharmony_ci#endif
2128c2ecf20Sopenharmony_ci	uint64_t       id;           /* private guest value, echoed in resp  */
2138c2ecf20Sopenharmony_ci	blkif_sector_t sector_number;
2148c2ecf20Sopenharmony_ci	uint64_t       nr_sectors;
2158c2ecf20Sopenharmony_ci	uint8_t        _pad3;
2168c2ecf20Sopenharmony_ci} __attribute__((__packed__));
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_cistruct blkif_request_other {
2198c2ecf20Sopenharmony_ci	uint8_t      _pad1;
2208c2ecf20Sopenharmony_ci	blkif_vdev_t _pad2;        /* only for read/write requests         */
2218c2ecf20Sopenharmony_ci#ifndef CONFIG_X86_32
2228c2ecf20Sopenharmony_ci	uint32_t     _pad3;        /* offsetof(blkif_req..,u.other.id)==8*/
2238c2ecf20Sopenharmony_ci#endif
2248c2ecf20Sopenharmony_ci	uint64_t     id;           /* private guest value, echoed in resp  */
2258c2ecf20Sopenharmony_ci} __attribute__((__packed__));
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_cistruct blkif_request_indirect {
2288c2ecf20Sopenharmony_ci	uint8_t        indirect_op;
2298c2ecf20Sopenharmony_ci	uint16_t       nr_segments;
2308c2ecf20Sopenharmony_ci#ifndef CONFIG_X86_32
2318c2ecf20Sopenharmony_ci	uint32_t       _pad1;        /* offsetof(blkif_...,u.indirect.id) == 8 */
2328c2ecf20Sopenharmony_ci#endif
2338c2ecf20Sopenharmony_ci	uint64_t       id;
2348c2ecf20Sopenharmony_ci	blkif_sector_t sector_number;
2358c2ecf20Sopenharmony_ci	blkif_vdev_t   handle;
2368c2ecf20Sopenharmony_ci	uint16_t       _pad2;
2378c2ecf20Sopenharmony_ci	grant_ref_t    indirect_grefs[BLKIF_MAX_INDIRECT_PAGES_PER_REQUEST];
2388c2ecf20Sopenharmony_ci#ifndef CONFIG_X86_32
2398c2ecf20Sopenharmony_ci	uint32_t      _pad3;         /* make it 64 byte aligned */
2408c2ecf20Sopenharmony_ci#else
2418c2ecf20Sopenharmony_ci	uint64_t      _pad3;         /* make it 64 byte aligned */
2428c2ecf20Sopenharmony_ci#endif
2438c2ecf20Sopenharmony_ci} __attribute__((__packed__));
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_cistruct blkif_request {
2468c2ecf20Sopenharmony_ci	uint8_t        operation;    /* BLKIF_OP_???                         */
2478c2ecf20Sopenharmony_ci	union {
2488c2ecf20Sopenharmony_ci		struct blkif_request_rw rw;
2498c2ecf20Sopenharmony_ci		struct blkif_request_discard discard;
2508c2ecf20Sopenharmony_ci		struct blkif_request_other other;
2518c2ecf20Sopenharmony_ci		struct blkif_request_indirect indirect;
2528c2ecf20Sopenharmony_ci	} u;
2538c2ecf20Sopenharmony_ci} __attribute__((__packed__));
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_cistruct blkif_response {
2568c2ecf20Sopenharmony_ci	uint64_t        id;              /* copied from request */
2578c2ecf20Sopenharmony_ci	uint8_t         operation;       /* copied from request */
2588c2ecf20Sopenharmony_ci	int16_t         status;          /* BLKIF_RSP_???       */
2598c2ecf20Sopenharmony_ci};
2608c2ecf20Sopenharmony_ci
2618c2ecf20Sopenharmony_ci/*
2628c2ecf20Sopenharmony_ci * STATUS RETURN CODES.
2638c2ecf20Sopenharmony_ci */
2648c2ecf20Sopenharmony_ci /* Operation not supported (only happens on barrier writes). */
2658c2ecf20Sopenharmony_ci#define BLKIF_RSP_EOPNOTSUPP  -2
2668c2ecf20Sopenharmony_ci /* Operation failed for some unspecified reason (-EIO). */
2678c2ecf20Sopenharmony_ci#define BLKIF_RSP_ERROR       -1
2688c2ecf20Sopenharmony_ci /* Operation completed successfully. */
2698c2ecf20Sopenharmony_ci#define BLKIF_RSP_OKAY         0
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ci/*
2728c2ecf20Sopenharmony_ci * Generate blkif ring structures and types.
2738c2ecf20Sopenharmony_ci */
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ciDEFINE_RING_TYPES(blkif, struct blkif_request, struct blkif_response);
2768c2ecf20Sopenharmony_ci
2778c2ecf20Sopenharmony_ci#define VDISK_CDROM        0x1
2788c2ecf20Sopenharmony_ci#define VDISK_REMOVABLE    0x2
2798c2ecf20Sopenharmony_ci#define VDISK_READONLY     0x4
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci/* Xen-defined major numbers for virtual disks, they look strangely
2828c2ecf20Sopenharmony_ci * familiar */
2838c2ecf20Sopenharmony_ci#define XEN_IDE0_MAJOR	3
2848c2ecf20Sopenharmony_ci#define XEN_IDE1_MAJOR	22
2858c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK0_MAJOR	8
2868c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK1_MAJOR	65
2878c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK2_MAJOR	66
2888c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK3_MAJOR	67
2898c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK4_MAJOR	68
2908c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK5_MAJOR	69
2918c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK6_MAJOR	70
2928c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK7_MAJOR	71
2938c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK8_MAJOR	128
2948c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK9_MAJOR	129
2958c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK10_MAJOR	130
2968c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK11_MAJOR	131
2978c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK12_MAJOR	132
2988c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK13_MAJOR	133
2998c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK14_MAJOR	134
3008c2ecf20Sopenharmony_ci#define XEN_SCSI_DISK15_MAJOR	135
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci#endif /* __XEN_PUBLIC_IO_BLKIF_H__ */
303