Home | History | Annotate | Download | only in IndustryStandard
      1 /** @file
      2 
      3   Virtio SCSI Host Device specific type and macro definitions corresponding to
      4   the 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_SCSI_H_
     19 #define _VIRTIO_SCSI_H_
     20 
     21 #include <IndustryStandard/Virtio.h>
     22 
     23 
     24 //
     25 // virtio-0.9.5, Appendix I: SCSI Host Device
     26 //
     27 #pragma pack(1)
     28 typedef struct {
     29   UINT32     NumQueues;
     30   UINT32     SegMax;
     31   UINT32     MaxSectors;
     32   UINT32     CmdPerLun;
     33   UINT32     EventInfoSize;
     34   UINT32     SenseSize;
     35   UINT32     CdbSize;
     36   UINT16     MaxChannel;
     37   UINT16     MaxTarget;
     38   UINT32     MaxLun;
     39 } VIRTIO_SCSI_CONFIG;
     40 #pragma pack()
     41 
     42 #define OFFSET_OF_VSCSI(Field) OFFSET_OF (VIRTIO_SCSI_CONFIG, Field)
     43 #define SIZE_OF_VSCSI(Field)   (sizeof ((VIRTIO_SCSI_CONFIG *) 0)->Field)
     44 
     45 #define VIRTIO_SCSI_F_INOUT   BIT0
     46 #define VIRTIO_SCSI_F_HOTPLUG BIT1
     47 
     48 //
     49 // We expect these maximum sizes from the host. Also we force the CdbLength and
     50 // SenseDataLength parameters of EFI_EXT_SCSI_PASS_THRU_PROTOCOL.PassThru() not
     51 // to exceed these limits. See UEFI 2.3.1 errata C 14.7.
     52 //
     53 #define VIRTIO_SCSI_CDB_SIZE   32
     54 #define VIRTIO_SCSI_SENSE_SIZE 96
     55 
     56 //
     57 // We pass the dynamically sized buffers ("dataout", "datain") in separate ring
     58 // descriptors.
     59 //
     60 #pragma pack(1)
     61 typedef struct {
     62   UINT8  Lun[8];
     63   UINT64 Id;
     64   UINT8  TaskAttr;
     65   UINT8  Prio;
     66   UINT8  Crn;
     67   UINT8  Cdb[VIRTIO_SCSI_CDB_SIZE];
     68 } VIRTIO_SCSI_REQ;
     69 
     70 typedef struct {
     71   UINT32 SenseLen;
     72   UINT32 Residual;
     73   UINT16 StatusQualifier;
     74   UINT8  Status;
     75   UINT8  Response;
     76   UINT8  Sense[VIRTIO_SCSI_SENSE_SIZE];
     77 } VIRTIO_SCSI_RESP;
     78 #pragma pack()
     79 
     80 //
     81 // selector of first virtio queue usable for request transfer
     82 //
     83 #define VIRTIO_SCSI_REQUEST_QUEUE 2
     84 
     85 //
     86 // host response codes
     87 //
     88 #define VIRTIO_SCSI_S_OK                0
     89 #define VIRTIO_SCSI_S_OVERRUN           1
     90 #define VIRTIO_SCSI_S_ABORTED           2
     91 #define VIRTIO_SCSI_S_BAD_TARGET        3
     92 #define VIRTIO_SCSI_S_RESET             4
     93 #define VIRTIO_SCSI_S_BUSY              5
     94 #define VIRTIO_SCSI_S_TRANSPORT_FAILURE 6
     95 #define VIRTIO_SCSI_S_TARGET_FAILURE    7
     96 #define VIRTIO_SCSI_S_NEXUS_FAILURE     8
     97 #define VIRTIO_SCSI_S_FAILURE           9
     98 
     99 #endif // _VIRTIO_SCSI_H_
    100