/*      $NetBSD: vioscsireg.h,v 1.2 2021/08/26 21:33:36 andvar Exp $    */
/*      $OpenBSD: vioscsireg.h,v 1.1 2013/12/20 21:50:49 matthew Exp $  */
/*
* Copyright (c) 2013 Google Inc.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

/* Configuration registers */
#define VIRTIO_SCSI_CONFIG_NUM_QUEUES           0 /* 32bit */
#define VIRTIO_SCSI_CONFIG_SEG_MAX              4 /* 32bit */
#define VIRTIO_SCSI_CONFIG_MAX_SECTORS          8 /* 32bit */
#define VIRTIO_SCSI_CONFIG_CMD_PER_LUN          12 /* 32bit */
#define VIRTIO_SCSI_CONFIG_EVENT_INFO_SIZE      16 /* 32bit */
#define VIRTIO_SCSI_CONFIG_SENSE_SIZE           20 /* 32bit */
#define VIRTIO_SCSI_CONFIG_CDB_SIZE             24 /* 32bit */
#define VIRTIO_SCSI_CONFIG_MAX_CHANNEL          28 /* 16bit */
#define VIRTIO_SCSI_CONFIG_MAX_TARGET           30 /* 16bit */
#define VIRTIO_SCSI_CONFIG_MAX_LUN              32 /* 32bit */

/* Feature bits */
#define VIRTIO_SCSI_F_INOUT                     (1<<0)
#define VIRTIO_SCSI_F_HOTPLUG                   (1<<1)

/* Response status values */
#define VIRTIO_SCSI_S_OK                        0
#define VIRTIO_SCSI_S_OVERRUN                   1
#define VIRTIO_SCSI_S_ABORTED                   2
#define VIRTIO_SCSI_S_BAD_TARGET                3
#define VIRTIO_SCSI_S_RESET                     4
#define VIRTIO_SCSI_S_BUSY                      5
#define VIRTIO_SCSI_S_TRANSPORT_FAILURE         6
#define VIRTIO_SCSI_S_TARGET_FAILURE            7
#define VIRTIO_SCSI_S_NEXUS_FAILURE             8
#define VIRTIO_SCSI_S_FAILURE                   9

/* Task attributes */
#define VIRTIO_SCSI_S_SIMPLE                    0
#define VIRTIO_SCSI_S_ORDERED                   1
#define VIRTIO_SCSI_S_HEAD                      2
#define VIRTIO_SCSI_S_ACA                       3

/* Request header structure */
struct virtio_scsi_req_hdr {
       uint8_t         lun[8];
       uint64_t        id;
       uint8_t         task_attr;
       uint8_t         prio;
       uint8_t         crn;
       uint8_t         cdb[32];
} __packed;
/* Followed by data-out. */

/* Response header structure */
struct virtio_scsi_res_hdr {
       uint32_t        sense_len;
       uint32_t        residual;
       uint16_t        status_qualifier;
       uint8_t         status;
       uint8_t         response;
       uint8_t         sense[96];
} __packed;
/* Followed by data-in. */