qemu/pc-bios/s390-ccw/virtio-scsi.h
<<
>>
Prefs
   1/*
   2 * Virtio-SCSI definitions for s390 machine loader for qemu
   3 *
   4 * Copyright 2015 IBM Corp.
   5 * Author: Eugene "jno" Dvurechenski <jno@linux.vnet.ibm.com>
   6 *
   7 * This work is licensed under the terms of the GNU GPL, version 2 or (at
   8 * your option) any later version. See the COPYING file in the top-level
   9 * directory.
  10 */
  11
  12#ifndef VIRTIO_SCSI_H
  13#define VIRTIO_SCSI_H
  14
  15#include "s390-ccw.h"
  16#include "virtio.h"
  17#include "scsi.h"
  18
  19#define VIRTIO_SCSI_CDB_SIZE   SCSI_DEFAULT_CDB_SIZE
  20#define VIRTIO_SCSI_SENSE_SIZE SCSI_DEFAULT_SENSE_SIZE
  21
  22/* command-specific response values */
  23#define VIRTIO_SCSI_S_OK                     0x00
  24#define VIRTIO_SCSI_S_BAD_TARGET             0x03
  25
  26#define QEMU_CDROM_SIGNATURE "QEMU CD-ROM     "
  27
  28enum virtio_scsi_vq_id {
  29    VR_CONTROL  = 0,
  30    VR_EVENT    = 1,
  31    VR_REQUEST  = 2,
  32};
  33
  34struct VirtioScsiCmdReq {
  35    ScsiLun lun;
  36    uint64_t id;
  37    uint8_t task_attr;   /* = 0 = VIRTIO_SCSI_S_SIMPLE */
  38    uint8_t prio;
  39    uint8_t crn;         /* = 0 */
  40    uint8_t cdb[VIRTIO_SCSI_CDB_SIZE];
  41} __attribute__((packed));
  42typedef struct VirtioScsiCmdReq VirtioScsiCmdReq;
  43
  44struct VirtioScsiCmdResp {
  45        uint32_t sense_len;
  46        uint32_t residual;
  47        uint16_t status_qualifier;
  48        uint8_t status;      /* first check for .response    */
  49        uint8_t response;    /* then for .status             */
  50        uint8_t sense[VIRTIO_SCSI_SENSE_SIZE];
  51} __attribute__((packed));
  52typedef struct VirtioScsiCmdResp VirtioScsiCmdResp;
  53
  54static inline const char *virtio_scsi_response_msg(const VirtioScsiCmdResp *r)
  55{
  56    static char err_msg[] = "VS RESP=XX";
  57    uint8_t v = r->response;
  58
  59    fill_hex_val(err_msg + 8, &v, 1);
  60    return err_msg;
  61}
  62
  63static inline bool virtio_scsi_response_ok(const VirtioScsiCmdResp *r)
  64{
  65        return r->response == VIRTIO_SCSI_S_OK && r->status == CDB_STATUS_GOOD;
  66}
  67
  68void virtio_scsi_setup(VDev *vdev);
  69int virtio_scsi_read_many(VDev *vdev,
  70                          ulong sector, void *load_addr, int sec_num);
  71
  72#endif /* VIRTIO_SCSI_H */
  73