Home | History | Annotate | Download | only in IndustryStandard
      1 /** @file
      2 
      3   Virtio Block Device specific type and macro definitions corresponding to the
      4   virtio-0.9.5 specification.
      5 
      6   Copyright (C) 2012, Red Hat, Inc.
      7 
      8   This program and the accompanying materials are licensed and made available
      9   under the terms and conditions of the BSD License which accompanies this
     10   distribution. The full text of the license may be found at
     11   http://opensource.org/licenses/bsd-license.php
     12 
     13   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
     14   WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     15 
     16 **/
     17 
     18 #ifndef _VIRTIO_BLK_H_
     19 #define _VIRTIO_BLK_H_
     20 
     21 #include <IndustryStandard/Virtio.h>
     22 
     23 
     24 //
     25 // virtio-0.9.5, Appendix D: Block Device
     26 //
     27 #pragma pack(1)
     28 typedef struct {
     29   UINT8  PhysicalBlockExp; // # of logical blocks per physical block (log2)
     30   UINT8  AlignmentOffset;  // offset of first aligned logical block
     31   UINT16 MinIoSize;        // suggested minimum I/O size in blocks
     32   UINT32 OptIoSize;        // optimal (suggested maximum) I/O size in blocks
     33 } VIRTIO_BLK_TOPOLOGY;
     34 
     35 typedef struct {
     36   UINT64              Capacity;
     37   UINT32              SizeMax;
     38   UINT32              SegMax;
     39   UINT16              Cylinders;
     40   UINT8               Heads;
     41   UINT8               Sectors;
     42   UINT32              BlkSize;
     43   VIRTIO_BLK_TOPOLOGY Topology;
     44 } VIRTIO_BLK_CONFIG;
     45 #pragma pack()
     46 
     47 #define OFFSET_OF_VBLK(Field) OFFSET_OF (VIRTIO_BLK_CONFIG, Field)
     48 #define SIZE_OF_VBLK(Field)   (sizeof ((VIRTIO_BLK_CONFIG *) 0)->Field)
     49 
     50 #define VIRTIO_BLK_F_BARRIER  BIT0
     51 #define VIRTIO_BLK_F_SIZE_MAX BIT1
     52 #define VIRTIO_BLK_F_SEG_MAX  BIT2
     53 #define VIRTIO_BLK_F_GEOMETRY BIT4
     54 #define VIRTIO_BLK_F_RO       BIT5
     55 #define VIRTIO_BLK_F_BLK_SIZE BIT6  // treated as "logical block size" in
     56                                     // practice; actual host side
     57                                     // implementation negotiates "optimal"
     58                                     // block size separately, via
     59                                     // VIRTIO_BLK_F_TOPOLOGY
     60 #define VIRTIO_BLK_F_SCSI     BIT7
     61 #define VIRTIO_BLK_F_FLUSH    BIT9  // identical to "write cache enabled"
     62 #define VIRTIO_BLK_F_TOPOLOGY BIT10 // information on optimal I/O alignment
     63 
     64 //
     65 // We keep the status byte separate from the rest of the virtio-blk request
     66 // header. See description of historical scattering at the end of Appendix D:
     67 // we're going to put the status byte in a separate VRING_DESC.
     68 //
     69 #pragma pack(1)
     70 typedef struct {
     71   UINT32 Type;
     72   UINT32 IoPrio;
     73   UINT64 Sector;
     74 } VIRTIO_BLK_REQ;
     75 #pragma pack()
     76 
     77 #define VIRTIO_BLK_T_IN           0x00000000
     78 #define VIRTIO_BLK_T_OUT          0x00000001
     79 #define VIRTIO_BLK_T_SCSI_CMD     0x00000002
     80 #define VIRTIO_BLK_T_SCSI_CMD_OUT 0x00000003
     81 #define VIRTIO_BLK_T_FLUSH        0x00000004
     82 #define VIRTIO_BLK_T_FLUSH_OUT    0x00000005
     83 #define VIRTIO_BLK_T_BARRIER      BIT31
     84 
     85 #define VIRTIO_BLK_S_OK           0x00
     86 #define VIRTIO_BLK_S_IOERR        0x01
     87 #define VIRTIO_BLK_S_UNSUPP       0x02
     88 
     89 #endif // _VIRTIO_BLK_H_
     90