Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/virtio/block/virtio_blk.h
Show All 27 Lines | |||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
* | * | ||||
* $FreeBSD$ | * $FreeBSD$ | ||||
*/ | */ | ||||
#ifndef _VIRTIO_BLK_H | #ifndef _VIRTIO_BLK_H | ||||
#define _VIRTIO_BLK_H | #define _VIRTIO_BLK_H | ||||
#define VTBLK_BSIZE 512 | |||||
/* Feature bits */ | /* Feature bits */ | ||||
#define VIRTIO_BLK_F_BARRIER 0x0001 /* Does host support barriers? */ | |||||
#define VIRTIO_BLK_F_SIZE_MAX 0x0002 /* Indicates maximum segment size */ | #define VIRTIO_BLK_F_SIZE_MAX 0x0002 /* Indicates maximum segment size */ | ||||
#define VIRTIO_BLK_F_SEG_MAX 0x0004 /* Indicates maximum # of segments */ | #define VIRTIO_BLK_F_SEG_MAX 0x0004 /* Indicates maximum # of segments */ | ||||
#define VIRTIO_BLK_F_GEOMETRY 0x0010 /* Legacy geometry available */ | #define VIRTIO_BLK_F_GEOMETRY 0x0010 /* Legacy geometry available */ | ||||
#define VIRTIO_BLK_F_RO 0x0020 /* Disk is read-only */ | #define VIRTIO_BLK_F_RO 0x0020 /* Disk is read-only */ | ||||
#define VIRTIO_BLK_F_BLK_SIZE 0x0040 /* Block size of disk is available*/ | #define VIRTIO_BLK_F_BLK_SIZE 0x0040 /* Block size of disk is available*/ | ||||
#define VIRTIO_BLK_F_SCSI 0x0080 /* Supports scsi command passthru */ | |||||
#define VIRTIO_BLK_F_FLUSH 0x0200 /* Flush command supported */ | #define VIRTIO_BLK_F_FLUSH 0x0200 /* Flush command supported */ | ||||
#define VIRTIO_BLK_F_WCE 0x0200 /* Legacy alias for FLUSH */ | |||||
#define VIRTIO_BLK_F_TOPOLOGY 0x0400 /* Topology information is available */ | #define VIRTIO_BLK_F_TOPOLOGY 0x0400 /* Topology information is available */ | ||||
#define VIRTIO_BLK_F_CONFIG_WCE 0x0800 /* Writeback mode available in config */ | #define VIRTIO_BLK_F_CONFIG_WCE 0x0800 /* Writeback mode available in config */ | ||||
#define VIRTIO_BLK_F_MQ 0x1000 /* Support more than one vq */ | #define VIRTIO_BLK_F_MQ 0x1000 /* Support more than one vq */ | ||||
#define VIRTIO_BLK_F_DISCARD 0x2000 /* Trim blocks */ | #define VIRTIO_BLK_F_DISCARD 0x2000 /* DISCARD is supported */ | ||||
#define VIRTIO_BLK_F_WRITE_ZEROES 0x4000 /* Write zeros */ | #define VIRTIO_BLK_F_WRITE_ZEROES 0x4000 /* WRITE ZEROES is supported */ | ||||
/* Legacy feature bits */ | |||||
#define VIRTIO_BLK_F_BARRIER 0x0001 /* Does host support barriers? */ | |||||
#define VIRTIO_BLK_F_SCSI 0x0080 /* Supports scsi command passthru */ | |||||
/* Old (deprecated) name for VIRTIO_BLK_F_FLUSH. */ | |||||
#define VIRTIO_BLK_F_WCE VIRTIO_BLK_F_FLUSH | |||||
#define VIRTIO_BLK_ID_BYTES 20 /* ID string length */ | #define VIRTIO_BLK_ID_BYTES 20 /* ID string length */ | ||||
struct virtio_blk_config { | struct virtio_blk_config { | ||||
/* The capacity (in 512-byte sectors). */ | /* The capacity (in 512-byte sectors). */ | ||||
uint64_t capacity; | uint64_t capacity; | ||||
/* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */ | /* The maximum segment size (if VIRTIO_BLK_F_SIZE_MAX) */ | ||||
uint32_t size_max; | uint32_t size_max; | ||||
/* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */ | /* The maximum number of segments (if VIRTIO_BLK_F_SEG_MAX) */ | ||||
uint32_t seg_max; | uint32_t seg_max; | ||||
Show All 18 Lines | struct virtio_blk_topology { | ||||
uint16_t min_io_size; | uint16_t min_io_size; | ||||
/* Optimal sustained I/O size in logical blocks. */ | /* Optimal sustained I/O size in logical blocks. */ | ||||
uint32_t opt_io_size; | uint32_t opt_io_size; | ||||
} topology; | } topology; | ||||
/* Writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */ | /* Writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */ | ||||
uint8_t wce; | uint8_t wce; | ||||
uint8_t unused; | uint8_t unused; | ||||
/* Number of vqs, only available when VIRTIO_BLK_F_MQ is set */ | /* Number of vqs, only available when VIRTIO_BLK_F_MQ is set */ | ||||
uint16_t num_queues; | uint16_t num_queues; | ||||
/* | |||||
* The next 3 entries are guarded by VIRTIO_BLK_F_DISCARD. | |||||
* | |||||
* The maximum discard sectors (in 512-byte sectors) for | |||||
* one segment. | |||||
*/ | |||||
uint32_t max_discard_sectors; | uint32_t max_discard_sectors; | ||||
/* | |||||
* The maximum number of discard segments in a | |||||
* discard command. | |||||
*/ | |||||
uint32_t max_discard_seg; | uint32_t max_discard_seg; | ||||
/* Discard commands must be aligned to this number of sectors. */ | |||||
uint32_t discard_sector_alignment; | uint32_t discard_sector_alignment; | ||||
/* | |||||
* The next 3 entries are guarded by VIRTIO_BLK_F_WRITE_ZEROES | |||||
* | |||||
* The maximum number of write zeroes sectors (in 512-byte sectors) in | |||||
* one segment. | |||||
*/ | |||||
uint32_t max_write_zeroes_sectors; | uint32_t max_write_zeroes_sectors; | ||||
/* | |||||
* The maximum number of segments in a write zeroes | |||||
* command. | |||||
*/ | |||||
uint32_t max_write_zeroes_seg; | uint32_t max_write_zeroes_seg; | ||||
/* | |||||
* Set if a VIRTIO_BLK_T_WRITE_ZEROES request may result in the | |||||
* deallocation of one or more of the sectors. | |||||
*/ | |||||
uint8_t write_zeroes_may_unmap; | uint8_t write_zeroes_may_unmap; | ||||
uint8_t unused1[3]; | uint8_t unused1[3]; | ||||
} __packed; | } __packed; | ||||
/* | /* | ||||
* Command types | * Command types | ||||
* | * | ||||
* Usage is a bit tricky as some bits are used as flags and some are not. | * Usage is a bit tricky as some bits are used as flags and some are not. | ||||
* | * | ||||
Show All 22 Lines | |||||
#define VIRTIO_BLK_T_DISCARD 11 | #define VIRTIO_BLK_T_DISCARD 11 | ||||
/* Write zeros command */ | /* Write zeros command */ | ||||
#define VIRTIO_BLK_T_WRITE_ZEROES 13 | #define VIRTIO_BLK_T_WRITE_ZEROES 13 | ||||
/* Barrier before this op. */ | /* Barrier before this op. */ | ||||
#define VIRTIO_BLK_T_BARRIER 0x80000000 | #define VIRTIO_BLK_T_BARRIER 0x80000000 | ||||
/* ID string length */ | |||||
#define VIRTIO_BLK_ID_BYTES 20 | |||||
/* Unmap this range (only valid for write zeroes command) */ | /* Unmap this range (only valid for write zeroes command) */ | ||||
#define VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP 0x00000001 | #define VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP 0x00000001 | ||||
/* This is the first element of the read scatter-gather list. */ | /* | ||||
* This comes first in the read scatter-gather list. | |||||
* For legacy virtio, if VIRTIO_F_ANY_LAYOUT is not negotiated, | |||||
* this is the first element of the read scatter-gather list. | |||||
*/ | |||||
struct virtio_blk_outhdr { | struct virtio_blk_outhdr { | ||||
/* VIRTIO_BLK_T* */ | /* VIRTIO_BLK_T* */ | ||||
uint32_t type; | uint32_t type; | ||||
/* io priority. */ | /* io priority. */ | ||||
uint32_t ioprio; | uint32_t ioprio; | ||||
/* Sector (ie. 512 byte offset) */ | /* Sector (ie. 512 byte offset) */ | ||||
uint64_t sector; | uint64_t sector; | ||||
}; | }; | ||||
/* Unmap this range (only valid for write zeroes command) */ | |||||
#define VIRTIO_BLK_WRITE_ZEROES_FLAG_UNMAP 0x00000001 | |||||
/* Discard/write zeroes range for each request. */ | |||||
struct virtio_blk_discard_write_zeroes { | struct virtio_blk_discard_write_zeroes { | ||||
/* Discard/write zeroes start sector */ | |||||
uint64_t sector; | uint64_t sector; | ||||
/* Number of discard/write zeroes sectors */ | |||||
uint32_t num_sectors; | uint32_t num_sectors; | ||||
struct { | /* Flags for this range */ | ||||
uint32_t unmap:1; | uint32_t flags; | ||||
uint32_t reserved:31; | |||||
} flags; | |||||
}; | }; | ||||
struct virtio_scsi_inhdr { | struct virtio_scsi_inhdr { | ||||
uint32_t errors; | uint32_t errors; | ||||
uint32_t data_len; | uint32_t data_len; | ||||
uint32_t sense_len; | uint32_t sense_len; | ||||
uint32_t residual; | uint32_t residual; | ||||
}; | }; | ||||
/* And this is the final byte of the write scatter-gather list. */ | /* And this is the final byte of the write scatter-gather list. */ | ||||
#define VIRTIO_BLK_S_OK 0 | #define VIRTIO_BLK_S_OK 0 | ||||
#define VIRTIO_BLK_S_IOERR 1 | #define VIRTIO_BLK_S_IOERR 1 | ||||
#define VIRTIO_BLK_S_UNSUPP 2 | #define VIRTIO_BLK_S_UNSUPP 2 | ||||
#endif /* _VIRTIO_BLK_H */ | #endif /* _VIRTIO_BLK_H */ |