qemu/hw/scsi/megasas.c
<<
>>
Prefs
   1/*
   2 * QEMU MegaRAID SAS 8708EM2 Host Bus Adapter emulation
   3 * Based on the linux driver code at drivers/scsi/megaraid
   4 *
   5 * Copyright (c) 2009-2012 Hannes Reinecke, SUSE Labs
   6 *
   7 * This library is free software; you can redistribute it and/or
   8 * modify it under the terms of the GNU Lesser General Public
   9 * License as published by the Free Software Foundation; either
  10 * version 2.1 of the License, or (at your option) any later version.
  11 *
  12 * This library is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * Lesser General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU Lesser General Public
  18 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  19 */
  20
  21#include "qemu/osdep.h"
  22#include "hw/pci/pci.h"
  23#include "hw/qdev-properties.h"
  24#include "sysemu/dma.h"
  25#include "sysemu/block-backend.h"
  26#include "sysemu/rtc.h"
  27#include "hw/pci/msi.h"
  28#include "hw/pci/msix.h"
  29#include "qemu/iov.h"
  30#include "qemu/module.h"
  31#include "qemu/hw-version.h"
  32#include "hw/scsi/scsi.h"
  33#include "scsi/constants.h"
  34#include "trace.h"
  35#include "qapi/error.h"
  36#include "mfi.h"
  37#include "migration/vmstate.h"
  38#include "qom/object.h"
  39
  40#define MEGASAS_VERSION_GEN1 "1.70"
  41#define MEGASAS_VERSION_GEN2 "1.80"
  42#define MEGASAS_MAX_FRAMES 2048         /* Firmware limit at 65535 */
  43#define MEGASAS_DEFAULT_FRAMES 1000     /* Windows requires this */
  44#define MEGASAS_GEN2_DEFAULT_FRAMES 1008     /* Windows requires this */
  45#define MEGASAS_MAX_SGE 128             /* Firmware limit */
  46#define MEGASAS_DEFAULT_SGE 80
  47#define MEGASAS_MAX_SECTORS 0xFFFF      /* No real limit */
  48#define MEGASAS_MAX_ARRAYS 128
  49
  50#define MEGASAS_HBA_SERIAL "QEMU123456"
  51#define NAA_LOCALLY_ASSIGNED_ID 0x3ULL
  52#define IEEE_COMPANY_LOCALLY_ASSIGNED 0x525400
  53
  54#define MEGASAS_FLAG_USE_JBOD      0
  55#define MEGASAS_MASK_USE_JBOD      (1 << MEGASAS_FLAG_USE_JBOD)
  56#define MEGASAS_FLAG_USE_QUEUE64   1
  57#define MEGASAS_MASK_USE_QUEUE64   (1 << MEGASAS_FLAG_USE_QUEUE64)
  58
  59typedef struct MegasasCmd {
  60    uint32_t index;
  61    uint16_t flags;
  62    uint16_t count;
  63    uint64_t context;
  64
  65    hwaddr pa;
  66    hwaddr pa_size;
  67    uint32_t dcmd_opcode;
  68    union mfi_frame *frame;
  69    SCSIRequest *req;
  70    QEMUSGList qsg;
  71    void *iov_buf;
  72    size_t iov_size;
  73    size_t iov_offset;
  74    struct MegasasState *state;
  75} MegasasCmd;
  76
  77struct MegasasState {
  78    /*< private >*/
  79    PCIDevice parent_obj;
  80    /*< public >*/
  81
  82    MemoryRegion mmio_io;
  83    MemoryRegion port_io;
  84    MemoryRegion queue_io;
  85    uint32_t frame_hi;
  86
  87    uint32_t fw_state;
  88    uint32_t fw_sge;
  89    uint32_t fw_cmds;
  90    uint32_t flags;
  91    uint32_t fw_luns;
  92    uint32_t intr_mask;
  93    uint32_t doorbell;
  94    uint32_t busy;
  95    uint32_t diag;
  96    uint32_t adp_reset;
  97    OnOffAuto msi;
  98    OnOffAuto msix;
  99
 100    MegasasCmd *event_cmd;
 101    uint16_t event_locale;
 102    int event_class;
 103    uint32_t event_count;
 104    uint32_t shutdown_event;
 105    uint32_t boot_event;
 106
 107    uint64_t sas_addr;
 108    char *hba_serial;
 109
 110    uint64_t reply_queue_pa;
 111    void *reply_queue;
 112    uint16_t reply_queue_len;
 113    uint32_t reply_queue_head;
 114    uint32_t reply_queue_tail;
 115    uint64_t consumer_pa;
 116    uint64_t producer_pa;
 117
 118    MegasasCmd frames[MEGASAS_MAX_FRAMES];
 119    DECLARE_BITMAP(frame_map, MEGASAS_MAX_FRAMES);
 120    SCSIBus bus;
 121};
 122typedef struct MegasasState MegasasState;
 123
 124struct MegasasBaseClass {
 125    PCIDeviceClass parent_class;
 126    const char *product_name;
 127    const char *product_version;
 128    int mmio_bar;
 129    int ioport_bar;
 130    int osts;
 131};
 132typedef struct MegasasBaseClass MegasasBaseClass;
 133
 134#define TYPE_MEGASAS_BASE "megasas-base"
 135#define TYPE_MEGASAS_GEN1 "megasas"
 136#define TYPE_MEGASAS_GEN2 "megasas-gen2"
 137
 138DECLARE_OBJ_CHECKERS(MegasasState, MegasasBaseClass,
 139                     MEGASAS, TYPE_MEGASAS_BASE)
 140
 141
 142#define MEGASAS_INTR_DISABLED_MASK 0xFFFFFFFF
 143
 144static bool megasas_intr_enabled(MegasasState *s)
 145{
 146    if ((s->intr_mask & MEGASAS_INTR_DISABLED_MASK) !=
 147        MEGASAS_INTR_DISABLED_MASK) {
 148        return true;
 149    }
 150    return false;
 151}
 152
 153static bool megasas_use_queue64(MegasasState *s)
 154{
 155    return s->flags & MEGASAS_MASK_USE_QUEUE64;
 156}
 157
 158static bool megasas_use_msix(MegasasState *s)
 159{
 160    return s->msix != ON_OFF_AUTO_OFF;
 161}
 162
 163static bool megasas_is_jbod(MegasasState *s)
 164{
 165    return s->flags & MEGASAS_MASK_USE_JBOD;
 166}
 167
 168static void megasas_frame_set_cmd_status(MegasasState *s,
 169                                         unsigned long frame, uint8_t v)
 170{
 171    PCIDevice *pci = &s->parent_obj;
 172    stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, cmd_status),
 173                v, MEMTXATTRS_UNSPECIFIED);
 174}
 175
 176static void megasas_frame_set_scsi_status(MegasasState *s,
 177                                          unsigned long frame, uint8_t v)
 178{
 179    PCIDevice *pci = &s->parent_obj;
 180    stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, scsi_status),
 181                v, MEMTXATTRS_UNSPECIFIED);
 182}
 183
 184static inline const char *mfi_frame_desc(unsigned int cmd)
 185{
 186    static const char *mfi_frame_descs[] = {
 187        "MFI init", "LD Read", "LD Write", "LD SCSI", "PD SCSI",
 188        "MFI Doorbell", "MFI Abort", "MFI SMP", "MFI Stop"
 189    };
 190
 191    if (cmd < ARRAY_SIZE(mfi_frame_descs)) {
 192        return mfi_frame_descs[cmd];
 193    }
 194
 195    return "Unknown";
 196}
 197
 198/*
 199 * Context is considered opaque, but the HBA firmware is running
 200 * in little endian mode. So convert it to little endian, too.
 201 */
 202static uint64_t megasas_frame_get_context(MegasasState *s,
 203                                          unsigned long frame)
 204{
 205    PCIDevice *pci = &s->parent_obj;
 206    uint64_t val;
 207
 208    ldq_le_pci_dma(pci, frame + offsetof(struct mfi_frame_header, context),
 209                   &val, MEMTXATTRS_UNSPECIFIED);
 210
 211    return val;
 212}
 213
 214static bool megasas_frame_is_ieee_sgl(MegasasCmd *cmd)
 215{
 216    return cmd->flags & MFI_FRAME_IEEE_SGL;
 217}
 218
 219static bool megasas_frame_is_sgl64(MegasasCmd *cmd)
 220{
 221    return cmd->flags & MFI_FRAME_SGL64;
 222}
 223
 224static bool megasas_frame_is_sense64(MegasasCmd *cmd)
 225{
 226    return cmd->flags & MFI_FRAME_SENSE64;
 227}
 228
 229static uint64_t megasas_sgl_get_addr(MegasasCmd *cmd,
 230                                     union mfi_sgl *sgl)
 231{
 232    uint64_t addr;
 233
 234    if (megasas_frame_is_ieee_sgl(cmd)) {
 235        addr = le64_to_cpu(sgl->sg_skinny->addr);
 236    } else if (megasas_frame_is_sgl64(cmd)) {
 237        addr = le64_to_cpu(sgl->sg64->addr);
 238    } else {
 239        addr = le32_to_cpu(sgl->sg32->addr);
 240    }
 241    return addr;
 242}
 243
 244static uint32_t megasas_sgl_get_len(MegasasCmd *cmd,
 245                                    union mfi_sgl *sgl)
 246{
 247    uint32_t len;
 248
 249    if (megasas_frame_is_ieee_sgl(cmd)) {
 250        len = le32_to_cpu(sgl->sg_skinny->len);
 251    } else if (megasas_frame_is_sgl64(cmd)) {
 252        len = le32_to_cpu(sgl->sg64->len);
 253    } else {
 254        len = le32_to_cpu(sgl->sg32->len);
 255    }
 256    return len;
 257}
 258
 259static union mfi_sgl *megasas_sgl_next(MegasasCmd *cmd,
 260                                       union mfi_sgl *sgl)
 261{
 262    uint8_t *next = (uint8_t *)sgl;
 263
 264    if (megasas_frame_is_ieee_sgl(cmd)) {
 265        next += sizeof(struct mfi_sg_skinny);
 266    } else if (megasas_frame_is_sgl64(cmd)) {
 267        next += sizeof(struct mfi_sg64);
 268    } else {
 269        next += sizeof(struct mfi_sg32);
 270    }
 271
 272    if (next >= (uint8_t *)cmd->frame + cmd->pa_size) {
 273        return NULL;
 274    }
 275    return (union mfi_sgl *)next;
 276}
 277
 278static void megasas_soft_reset(MegasasState *s);
 279
 280static int megasas_map_sgl(MegasasState *s, MegasasCmd *cmd, union mfi_sgl *sgl)
 281{
 282    int i;
 283    int iov_count = 0;
 284    size_t iov_size = 0;
 285
 286    cmd->flags = le16_to_cpu(cmd->frame->header.flags);
 287    iov_count = cmd->frame->header.sge_count;
 288    if (!iov_count || iov_count > MEGASAS_MAX_SGE) {
 289        trace_megasas_iovec_sgl_overflow(cmd->index, iov_count,
 290                                         MEGASAS_MAX_SGE);
 291        return -1;
 292    }
 293    pci_dma_sglist_init(&cmd->qsg, PCI_DEVICE(s), iov_count);
 294    for (i = 0; i < iov_count; i++) {
 295        dma_addr_t iov_pa, iov_size_p;
 296
 297        if (!sgl) {
 298            trace_megasas_iovec_sgl_underflow(cmd->index, i);
 299            goto unmap;
 300        }
 301        iov_pa = megasas_sgl_get_addr(cmd, sgl);
 302        iov_size_p = megasas_sgl_get_len(cmd, sgl);
 303        if (!iov_pa || !iov_size_p) {
 304            trace_megasas_iovec_sgl_invalid(cmd->index, i,
 305                                            iov_pa, iov_size_p);
 306            goto unmap;
 307        }
 308        qemu_sglist_add(&cmd->qsg, iov_pa, iov_size_p);
 309        sgl = megasas_sgl_next(cmd, sgl);
 310        iov_size += (size_t)iov_size_p;
 311    }
 312    if (cmd->iov_size > iov_size) {
 313        trace_megasas_iovec_overflow(cmd->index, iov_size, cmd->iov_size);
 314        goto unmap;
 315    } else if (cmd->iov_size < iov_size) {
 316        trace_megasas_iovec_underflow(cmd->index, iov_size, cmd->iov_size);
 317    }
 318    cmd->iov_offset = 0;
 319    return 0;
 320unmap:
 321    qemu_sglist_destroy(&cmd->qsg);
 322    return -1;
 323}
 324
 325/*
 326 * passthrough sense and io sense are at the same offset
 327 */
 328static int megasas_build_sense(MegasasCmd *cmd, uint8_t *sense_ptr,
 329    uint8_t sense_len)
 330{
 331    PCIDevice *pcid = PCI_DEVICE(cmd->state);
 332    uint32_t pa_hi = 0, pa_lo;
 333    hwaddr pa;
 334    int frame_sense_len;
 335
 336    frame_sense_len = cmd->frame->header.sense_len;
 337    if (sense_len > frame_sense_len) {
 338        sense_len = frame_sense_len;
 339    }
 340    if (sense_len) {
 341        pa_lo = le32_to_cpu(cmd->frame->pass.sense_addr_lo);
 342        if (megasas_frame_is_sense64(cmd)) {
 343            pa_hi = le32_to_cpu(cmd->frame->pass.sense_addr_hi);
 344        }
 345        pa = ((uint64_t) pa_hi << 32) | pa_lo;
 346        pci_dma_write(pcid, pa, sense_ptr, sense_len);
 347        cmd->frame->header.sense_len = sense_len;
 348    }
 349    return sense_len;
 350}
 351
 352static void megasas_write_sense(MegasasCmd *cmd, SCSISense sense)
 353{
 354    uint8_t sense_buf[SCSI_SENSE_BUF_SIZE];
 355    uint8_t sense_len = 18;
 356
 357    memset(sense_buf, 0, sense_len);
 358    sense_buf[0] = 0xf0;
 359    sense_buf[2] = sense.key;
 360    sense_buf[7] = 10;
 361    sense_buf[12] = sense.asc;
 362    sense_buf[13] = sense.ascq;
 363    megasas_build_sense(cmd, sense_buf, sense_len);
 364}
 365
 366static void megasas_copy_sense(MegasasCmd *cmd)
 367{
 368    uint8_t sense_buf[SCSI_SENSE_BUF_SIZE];
 369    uint8_t sense_len;
 370
 371    sense_len = scsi_req_get_sense(cmd->req, sense_buf,
 372                                   SCSI_SENSE_BUF_SIZE);
 373    megasas_build_sense(cmd, sense_buf, sense_len);
 374}
 375
 376/*
 377 * Format an INQUIRY CDB
 378 */
 379static int megasas_setup_inquiry(uint8_t *cdb, int pg, int len)
 380{
 381    memset(cdb, 0, 6);
 382    cdb[0] = INQUIRY;
 383    if (pg > 0) {
 384        cdb[1] = 0x1;
 385        cdb[2] = pg;
 386    }
 387    stw_be_p(&cdb[3], len);
 388    return len;
 389}
 390
 391/*
 392 * Encode lba and len into a READ_16/WRITE_16 CDB
 393 */
 394static void megasas_encode_lba(uint8_t *cdb, uint64_t lba,
 395                               uint32_t len, bool is_write)
 396{
 397    memset(cdb, 0x0, 16);
 398    if (is_write) {
 399        cdb[0] = WRITE_16;
 400    } else {
 401        cdb[0] = READ_16;
 402    }
 403    stq_be_p(&cdb[2], lba);
 404    stl_be_p(&cdb[2 + 8], len);
 405}
 406
 407/*
 408 * Utility functions
 409 */
 410static uint64_t megasas_fw_time(void)
 411{
 412    struct tm curtime;
 413
 414    qemu_get_timedate(&curtime, 0);
 415    return ((uint64_t)curtime.tm_sec & 0xff) << 48 |
 416        ((uint64_t)curtime.tm_min & 0xff)  << 40 |
 417        ((uint64_t)curtime.tm_hour & 0xff) << 32 |
 418        ((uint64_t)curtime.tm_mday & 0xff) << 24 |
 419        ((uint64_t)curtime.tm_mon & 0xff)  << 16 |
 420        ((uint64_t)(curtime.tm_year + 1900) & 0xffff);
 421}
 422
 423/*
 424 * Default disk sata address
 425 * 0x1221 is the magic number as
 426 * present in real hardware,
 427 * so use it here, too.
 428 */
 429static uint64_t megasas_get_sata_addr(uint16_t id)
 430{
 431    uint64_t addr = (0x1221ULL << 48);
 432    return addr | ((uint64_t)id << 24);
 433}
 434
 435/*
 436 * Frame handling
 437 */
 438static int megasas_next_index(MegasasState *s, int index, int limit)
 439{
 440    index++;
 441    if (index == limit) {
 442        index = 0;
 443    }
 444    return index;
 445}
 446
 447static MegasasCmd *megasas_lookup_frame(MegasasState *s,
 448    hwaddr frame)
 449{
 450    MegasasCmd *cmd = NULL;
 451    int num = 0, index;
 452
 453    index = s->reply_queue_head;
 454
 455    while (num < s->fw_cmds && index < MEGASAS_MAX_FRAMES) {
 456        if (s->frames[index].pa && s->frames[index].pa == frame) {
 457            cmd = &s->frames[index];
 458            break;
 459        }
 460        index = megasas_next_index(s, index, s->fw_cmds);
 461        num++;
 462    }
 463
 464    return cmd;
 465}
 466
 467static void megasas_unmap_frame(MegasasState *s, MegasasCmd *cmd)
 468{
 469    PCIDevice *p = PCI_DEVICE(s);
 470
 471    if (cmd->pa_size) {
 472        pci_dma_unmap(p, cmd->frame, cmd->pa_size, 0, 0);
 473    }
 474    cmd->frame = NULL;
 475    cmd->pa = 0;
 476    cmd->pa_size = 0;
 477    qemu_sglist_destroy(&cmd->qsg);
 478    clear_bit(cmd->index, s->frame_map);
 479}
 480
 481/*
 482 * This absolutely needs to be locked if
 483 * qemu ever goes multithreaded.
 484 */
 485static MegasasCmd *megasas_enqueue_frame(MegasasState *s,
 486    hwaddr frame, uint64_t context, int count)
 487{
 488    PCIDevice *pcid = PCI_DEVICE(s);
 489    MegasasCmd *cmd = NULL;
 490    int frame_size = MEGASAS_MAX_SGE * sizeof(union mfi_sgl);
 491    hwaddr frame_size_p = frame_size;
 492    unsigned long index;
 493
 494    index = 0;
 495    while (index < s->fw_cmds) {
 496        index = find_next_zero_bit(s->frame_map, s->fw_cmds, index);
 497        if (!s->frames[index].pa)
 498            break;
 499        /* Busy frame found */
 500        trace_megasas_qf_mapped(index);
 501    }
 502    if (index >= s->fw_cmds) {
 503        /* All frames busy */
 504        trace_megasas_qf_busy(frame);
 505        return NULL;
 506    }
 507    cmd = &s->frames[index];
 508    set_bit(index, s->frame_map);
 509    trace_megasas_qf_new(index, frame);
 510
 511    cmd->pa = frame;
 512    /* Map all possible frames */
 513    cmd->frame = pci_dma_map(pcid, frame, &frame_size_p, 0);
 514    if (!cmd->frame || frame_size_p != frame_size) {
 515        trace_megasas_qf_map_failed(cmd->index, (unsigned long)frame);
 516        if (cmd->frame) {
 517            megasas_unmap_frame(s, cmd);
 518        }
 519        s->event_count++;
 520        return NULL;
 521    }
 522    cmd->pa_size = frame_size_p;
 523    cmd->context = context;
 524    if (!megasas_use_queue64(s)) {
 525        cmd->context &= (uint64_t)0xFFFFFFFF;
 526    }
 527    cmd->count = count;
 528    cmd->dcmd_opcode = -1;
 529    s->busy++;
 530
 531    if (s->consumer_pa) {
 532        ldl_le_pci_dma(pcid, s->consumer_pa, &s->reply_queue_tail,
 533                       MEMTXATTRS_UNSPECIFIED);
 534    }
 535    trace_megasas_qf_enqueue(cmd->index, cmd->count, cmd->context,
 536                             s->reply_queue_head, s->reply_queue_tail, s->busy);
 537
 538    return cmd;
 539}
 540
 541static void megasas_complete_frame(MegasasState *s, uint64_t context)
 542{
 543    const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
 544    PCIDevice *pci_dev = PCI_DEVICE(s);
 545    int tail, queue_offset;
 546
 547    /* Decrement busy count */
 548    s->busy--;
 549    if (s->reply_queue_pa) {
 550        /*
 551         * Put command on the reply queue.
 552         * Context is opaque, but emulation is running in
 553         * little endian. So convert it.
 554         */
 555        if (megasas_use_queue64(s)) {
 556            queue_offset = s->reply_queue_head * sizeof(uint64_t);
 557            stq_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset,
 558                           context, attrs);
 559        } else {
 560            queue_offset = s->reply_queue_head * sizeof(uint32_t);
 561            stl_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset,
 562                           context, attrs);
 563        }
 564        ldl_le_pci_dma(pci_dev, s->consumer_pa, &s->reply_queue_tail, attrs);
 565        trace_megasas_qf_complete(context, s->reply_queue_head,
 566                                  s->reply_queue_tail, s->busy);
 567    }
 568
 569    if (megasas_intr_enabled(s)) {
 570        /* Update reply queue pointer */
 571        ldl_le_pci_dma(pci_dev, s->consumer_pa, &s->reply_queue_tail, attrs);
 572        tail = s->reply_queue_head;
 573        s->reply_queue_head = megasas_next_index(s, tail, s->fw_cmds);
 574        trace_megasas_qf_update(s->reply_queue_head, s->reply_queue_tail,
 575                                s->busy);
 576        stl_le_pci_dma(pci_dev, s->producer_pa, s->reply_queue_head, attrs);
 577        /* Notify HBA */
 578        if (msix_enabled(pci_dev)) {
 579            trace_megasas_msix_raise(0);
 580            msix_notify(pci_dev, 0);
 581        } else if (msi_enabled(pci_dev)) {
 582            trace_megasas_msi_raise(0);
 583            msi_notify(pci_dev, 0);
 584        } else {
 585            s->doorbell++;
 586            if (s->doorbell == 1) {
 587                trace_megasas_irq_raise();
 588                pci_irq_assert(pci_dev);
 589            }
 590        }
 591    } else {
 592        trace_megasas_qf_complete_noirq(context);
 593    }
 594}
 595
 596static void megasas_complete_command(MegasasCmd *cmd)
 597{
 598    cmd->iov_size = 0;
 599    cmd->iov_offset = 0;
 600
 601    cmd->req->hba_private = NULL;
 602    scsi_req_unref(cmd->req);
 603    cmd->req = NULL;
 604
 605    megasas_unmap_frame(cmd->state, cmd);
 606    megasas_complete_frame(cmd->state, cmd->context);
 607}
 608
 609static void megasas_reset_frames(MegasasState *s)
 610{
 611    int i;
 612    MegasasCmd *cmd;
 613
 614    for (i = 0; i < s->fw_cmds; i++) {
 615        cmd = &s->frames[i];
 616        if (cmd->pa) {
 617            megasas_unmap_frame(s, cmd);
 618        }
 619    }
 620    bitmap_zero(s->frame_map, MEGASAS_MAX_FRAMES);
 621}
 622
 623static void megasas_abort_command(MegasasCmd *cmd)
 624{
 625    /* Never abort internal commands.  */
 626    if (cmd->dcmd_opcode != -1) {
 627        return;
 628    }
 629    if (cmd->req != NULL) {
 630        scsi_req_cancel(cmd->req);
 631    }
 632}
 633
 634static int megasas_init_firmware(MegasasState *s, MegasasCmd *cmd)
 635{
 636    const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
 637    PCIDevice *pcid = PCI_DEVICE(s);
 638    uint32_t pa_hi, pa_lo;
 639    hwaddr iq_pa, initq_size = sizeof(struct mfi_init_qinfo);
 640    struct mfi_init_qinfo *initq = NULL;
 641    uint32_t flags;
 642    int ret = MFI_STAT_OK;
 643
 644    if (s->reply_queue_pa) {
 645        trace_megasas_initq_mapped(s->reply_queue_pa);
 646        goto out;
 647    }
 648    pa_lo = le32_to_cpu(cmd->frame->init.qinfo_new_addr_lo);
 649    pa_hi = le32_to_cpu(cmd->frame->init.qinfo_new_addr_hi);
 650    iq_pa = (((uint64_t) pa_hi << 32) | pa_lo);
 651    trace_megasas_init_firmware((uint64_t)iq_pa);
 652    initq = pci_dma_map(pcid, iq_pa, &initq_size, 0);
 653    if (!initq || initq_size != sizeof(*initq)) {
 654        trace_megasas_initq_map_failed(cmd->index);
 655        s->event_count++;
 656        ret = MFI_STAT_MEMORY_NOT_AVAILABLE;
 657        goto out;
 658    }
 659    s->reply_queue_len = le32_to_cpu(initq->rq_entries) & 0xFFFF;
 660    if (s->reply_queue_len > s->fw_cmds) {
 661        trace_megasas_initq_mismatch(s->reply_queue_len, s->fw_cmds);
 662        s->event_count++;
 663        ret = MFI_STAT_INVALID_PARAMETER;
 664        goto out;
 665    }
 666    pa_lo = le32_to_cpu(initq->rq_addr_lo);
 667    pa_hi = le32_to_cpu(initq->rq_addr_hi);
 668    s->reply_queue_pa = ((uint64_t) pa_hi << 32) | pa_lo;
 669    pa_lo = le32_to_cpu(initq->ci_addr_lo);
 670    pa_hi = le32_to_cpu(initq->ci_addr_hi);
 671    s->consumer_pa = ((uint64_t) pa_hi << 32) | pa_lo;
 672    pa_lo = le32_to_cpu(initq->pi_addr_lo);
 673    pa_hi = le32_to_cpu(initq->pi_addr_hi);
 674    s->producer_pa = ((uint64_t) pa_hi << 32) | pa_lo;
 675    ldl_le_pci_dma(pcid, s->producer_pa, &s->reply_queue_head, attrs);
 676    s->reply_queue_head %= MEGASAS_MAX_FRAMES;
 677    ldl_le_pci_dma(pcid, s->consumer_pa, &s->reply_queue_tail, attrs);
 678    s->reply_queue_tail %= MEGASAS_MAX_FRAMES;
 679    flags = le32_to_cpu(initq->flags);
 680    if (flags & MFI_QUEUE_FLAG_CONTEXT64) {
 681        s->flags |= MEGASAS_MASK_USE_QUEUE64;
 682    }
 683    trace_megasas_init_queue((unsigned long)s->reply_queue_pa,
 684                             s->reply_queue_len, s->reply_queue_head,
 685                             s->reply_queue_tail, flags);
 686    megasas_reset_frames(s);
 687    s->fw_state = MFI_FWSTATE_OPERATIONAL;
 688out:
 689    if (initq) {
 690        pci_dma_unmap(pcid, initq, initq_size, 0, 0);
 691    }
 692    return ret;
 693}
 694
 695static int megasas_map_dcmd(MegasasState *s, MegasasCmd *cmd)
 696{
 697    dma_addr_t iov_pa, iov_size;
 698    int iov_count;
 699
 700    cmd->flags = le16_to_cpu(cmd->frame->header.flags);
 701    iov_count = cmd->frame->header.sge_count;
 702    if (!iov_count) {
 703        trace_megasas_dcmd_zero_sge(cmd->index);
 704        cmd->iov_size = 0;
 705        return 0;
 706    } else if (iov_count > 1) {
 707        trace_megasas_dcmd_invalid_sge(cmd->index, iov_count);
 708        cmd->iov_size = 0;
 709        return -EINVAL;
 710    }
 711    iov_pa = megasas_sgl_get_addr(cmd, &cmd->frame->dcmd.sgl);
 712    iov_size = megasas_sgl_get_len(cmd, &cmd->frame->dcmd.sgl);
 713    pci_dma_sglist_init(&cmd->qsg, PCI_DEVICE(s), 1);
 714    qemu_sglist_add(&cmd->qsg, iov_pa, iov_size);
 715    cmd->iov_size = iov_size;
 716    return 0;
 717}
 718
 719static void megasas_finish_dcmd(MegasasCmd *cmd, uint32_t iov_size)
 720{
 721    trace_megasas_finish_dcmd(cmd->index, iov_size);
 722
 723    if (iov_size > cmd->iov_size) {
 724        if (megasas_frame_is_ieee_sgl(cmd)) {
 725            cmd->frame->dcmd.sgl.sg_skinny->len = cpu_to_le32(iov_size);
 726        } else if (megasas_frame_is_sgl64(cmd)) {
 727            cmd->frame->dcmd.sgl.sg64->len = cpu_to_le32(iov_size);
 728        } else {
 729            cmd->frame->dcmd.sgl.sg32->len = cpu_to_le32(iov_size);
 730        }
 731    }
 732}
 733
 734static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
 735{
 736    PCIDevice *pci_dev = PCI_DEVICE(s);
 737    PCIDeviceClass *pci_class = PCI_DEVICE_GET_CLASS(pci_dev);
 738    MegasasBaseClass *base_class = MEGASAS_GET_CLASS(s);
 739    struct mfi_ctrl_info info;
 740    size_t dcmd_size = sizeof(info);
 741    BusChild *kid;
 742    int num_pd_disks = 0;
 743    dma_addr_t residual;
 744
 745    memset(&info, 0x0, dcmd_size);
 746    if (cmd->iov_size < dcmd_size) {
 747        trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
 748                                            dcmd_size);
 749        return MFI_STAT_INVALID_PARAMETER;
 750    }
 751
 752    info.pci.vendor = cpu_to_le16(pci_class->vendor_id);
 753    info.pci.device = cpu_to_le16(pci_class->device_id);
 754    info.pci.subvendor = cpu_to_le16(pci_class->subsystem_vendor_id);
 755    info.pci.subdevice = cpu_to_le16(pci_class->subsystem_id);
 756
 757    /*
 758     * For some reason the firmware supports
 759     * only up to 8 device ports.
 760     * Despite supporting a far larger number
 761     * of devices for the physical devices.
 762     * So just display the first 8 devices
 763     * in the device port list, independent
 764     * of how many logical devices are actually
 765     * present.
 766     */
 767    info.host.type = MFI_INFO_HOST_PCIE;
 768    info.device.type = MFI_INFO_DEV_SAS3G;
 769    info.device.port_count = 8;
 770    QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
 771        SCSIDevice *sdev = SCSI_DEVICE(kid->child);
 772        uint16_t pd_id;
 773
 774        if (num_pd_disks < 8) {
 775            pd_id = ((sdev->id & 0xFF) << 8) | (sdev->lun & 0xFF);
 776            info.device.port_addr[num_pd_disks] =
 777                cpu_to_le64(megasas_get_sata_addr(pd_id));
 778        }
 779        num_pd_disks++;
 780    }
 781
 782    memcpy(info.product_name, base_class->product_name, 24);
 783    snprintf(info.serial_number, 32, "%s", s->hba_serial);
 784    snprintf(info.package_version, 0x60, "%s-QEMU", qemu_hw_version());
 785    memcpy(info.image_component[0].name, "APP", 3);
 786    snprintf(info.image_component[0].version, 10, "%s-QEMU",
 787             base_class->product_version);
 788    memcpy(info.image_component[0].build_date, "Apr  1 2014", 11);
 789    memcpy(info.image_component[0].build_time, "12:34:56", 8);
 790    info.image_component_count = 1;
 791    if (pci_dev->has_rom) {
 792        uint8_t biosver[32];
 793        uint8_t *ptr;
 794
 795        ptr = memory_region_get_ram_ptr(&pci_dev->rom);
 796        memcpy(biosver, ptr + 0x41, 31);
 797        biosver[31] = 0;
 798        memcpy(info.image_component[1].name, "BIOS", 4);
 799        memcpy(info.image_component[1].version, biosver,
 800               strlen((const char *)biosver));
 801        info.image_component_count++;
 802    }
 803    info.current_fw_time = cpu_to_le32(megasas_fw_time());
 804    info.max_arms = 32;
 805    info.max_spans = 8;
 806    info.max_arrays = MEGASAS_MAX_ARRAYS;
 807    info.max_lds = MFI_MAX_LD;
 808    info.max_cmds = cpu_to_le16(s->fw_cmds);
 809    info.max_sg_elements = cpu_to_le16(s->fw_sge);
 810    info.max_request_size = cpu_to_le32(MEGASAS_MAX_SECTORS);
 811    if (!megasas_is_jbod(s))
 812        info.lds_present = cpu_to_le16(num_pd_disks);
 813    info.pd_present = cpu_to_le16(num_pd_disks);
 814    info.pd_disks_present = cpu_to_le16(num_pd_disks);
 815    info.hw_present = cpu_to_le32(MFI_INFO_HW_NVRAM |
 816                                   MFI_INFO_HW_MEM |
 817                                   MFI_INFO_HW_FLASH);
 818    info.memory_size = cpu_to_le16(512);
 819    info.nvram_size = cpu_to_le16(32);
 820    info.flash_size = cpu_to_le16(16);
 821    info.raid_levels = cpu_to_le32(MFI_INFO_RAID_0);
 822    info.adapter_ops = cpu_to_le32(MFI_INFO_AOPS_RBLD_RATE |
 823                                    MFI_INFO_AOPS_SELF_DIAGNOSTIC |
 824                                    MFI_INFO_AOPS_MIXED_ARRAY);
 825    info.ld_ops = cpu_to_le32(MFI_INFO_LDOPS_DISK_CACHE_POLICY |
 826                               MFI_INFO_LDOPS_ACCESS_POLICY |
 827                               MFI_INFO_LDOPS_IO_POLICY |
 828                               MFI_INFO_LDOPS_WRITE_POLICY |
 829                               MFI_INFO_LDOPS_READ_POLICY);
 830    info.max_strips_per_io = cpu_to_le16(s->fw_sge);
 831    info.stripe_sz_ops.min = 3;
 832    info.stripe_sz_ops.max = ctz32(MEGASAS_MAX_SECTORS + 1);
 833    info.properties.pred_fail_poll_interval = cpu_to_le16(300);
 834    info.properties.intr_throttle_cnt = cpu_to_le16(16);
 835    info.properties.intr_throttle_timeout = cpu_to_le16(50);
 836    info.properties.rebuild_rate = 30;
 837    info.properties.patrol_read_rate = 30;
 838    info.properties.bgi_rate = 30;
 839    info.properties.cc_rate = 30;
 840    info.properties.recon_rate = 30;
 841    info.properties.cache_flush_interval = 4;
 842    info.properties.spinup_drv_cnt = 2;
 843    info.properties.spinup_delay = 6;
 844    info.properties.ecc_bucket_size = 15;
 845    info.properties.ecc_bucket_leak_rate = cpu_to_le16(1440);
 846    info.properties.expose_encl_devices = 1;
 847    info.properties.OnOffProperties = cpu_to_le32(MFI_CTRL_PROP_EnableJBOD);
 848    info.pd_ops = cpu_to_le32(MFI_INFO_PDOPS_FORCE_ONLINE |
 849                               MFI_INFO_PDOPS_FORCE_OFFLINE);
 850    info.pd_mix_support = cpu_to_le32(MFI_INFO_PDMIX_SAS |
 851                                       MFI_INFO_PDMIX_SATA |
 852                                       MFI_INFO_PDMIX_LD);
 853
 854    dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
 855                 MEMTXATTRS_UNSPECIFIED);
 856    cmd->iov_size -= residual;
 857    return MFI_STAT_OK;
 858}
 859
 860static int megasas_mfc_get_defaults(MegasasState *s, MegasasCmd *cmd)
 861{
 862    struct mfi_defaults info;
 863    size_t dcmd_size = sizeof(struct mfi_defaults);
 864    dma_addr_t residual;
 865
 866    memset(&info, 0x0, dcmd_size);
 867    if (cmd->iov_size < dcmd_size) {
 868        trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
 869                                            dcmd_size);
 870        return MFI_STAT_INVALID_PARAMETER;
 871    }
 872
 873    info.sas_addr = cpu_to_le64(s->sas_addr);
 874    info.stripe_size = 3;
 875    info.flush_time = 4;
 876    info.background_rate = 30;
 877    info.allow_mix_in_enclosure = 1;
 878    info.allow_mix_in_ld = 1;
 879    info.direct_pd_mapping = 1;
 880    /* Enable for BIOS support */
 881    info.bios_enumerate_lds = 1;
 882    info.disable_ctrl_r = 1;
 883    info.expose_enclosure_devices = 1;
 884    info.disable_preboot_cli = 1;
 885    info.cluster_disable = 1;
 886
 887    dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
 888                 MEMTXATTRS_UNSPECIFIED);
 889    cmd->iov_size -= residual;
 890    return MFI_STAT_OK;
 891}
 892
 893static int megasas_dcmd_get_bios_info(MegasasState *s, MegasasCmd *cmd)
 894{
 895    struct mfi_bios_data info;
 896    size_t dcmd_size = sizeof(info);
 897    dma_addr_t residual;
 898
 899    memset(&info, 0x0, dcmd_size);
 900    if (cmd->iov_size < dcmd_size) {
 901        trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
 902                                            dcmd_size);
 903        return MFI_STAT_INVALID_PARAMETER;
 904    }
 905    info.continue_on_error = 1;
 906    info.verbose = 1;
 907    if (megasas_is_jbod(s)) {
 908        info.expose_all_drives = 1;
 909    }
 910
 911    dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
 912                 MEMTXATTRS_UNSPECIFIED);
 913    cmd->iov_size -= residual;
 914    return MFI_STAT_OK;
 915}
 916
 917static int megasas_dcmd_get_fw_time(MegasasState *s, MegasasCmd *cmd)
 918{
 919    uint64_t fw_time;
 920    size_t dcmd_size = sizeof(fw_time);
 921    dma_addr_t residual;
 922
 923    fw_time = cpu_to_le64(megasas_fw_time());
 924
 925    dma_buf_read(&fw_time, dcmd_size, &residual, &cmd->qsg,
 926                 MEMTXATTRS_UNSPECIFIED);
 927    cmd->iov_size -= residual;
 928    return MFI_STAT_OK;
 929}
 930
 931static int megasas_dcmd_set_fw_time(MegasasState *s, MegasasCmd *cmd)
 932{
 933    uint64_t fw_time;
 934
 935    /* This is a dummy; setting of firmware time is not allowed */
 936    memcpy(&fw_time, cmd->frame->dcmd.mbox, sizeof(fw_time));
 937
 938    trace_megasas_dcmd_set_fw_time(cmd->index, fw_time);
 939    fw_time = cpu_to_le64(megasas_fw_time());
 940    return MFI_STAT_OK;
 941}
 942
 943static int megasas_event_info(MegasasState *s, MegasasCmd *cmd)
 944{
 945    struct mfi_evt_log_state info;
 946    size_t dcmd_size = sizeof(info);
 947    dma_addr_t residual;
 948
 949    memset(&info, 0, dcmd_size);
 950
 951    info.newest_seq_num = cpu_to_le32(s->event_count);
 952    info.shutdown_seq_num = cpu_to_le32(s->shutdown_event);
 953    info.boot_seq_num = cpu_to_le32(s->boot_event);
 954
 955    dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
 956                 MEMTXATTRS_UNSPECIFIED);
 957    cmd->iov_size -= residual;
 958    return MFI_STAT_OK;
 959}
 960
 961static int megasas_event_wait(MegasasState *s, MegasasCmd *cmd)
 962{
 963    union mfi_evt event;
 964
 965    if (cmd->iov_size < sizeof(struct mfi_evt_detail)) {
 966        trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
 967                                            sizeof(struct mfi_evt_detail));
 968        return MFI_STAT_INVALID_PARAMETER;
 969    }
 970    s->event_count = cpu_to_le32(cmd->frame->dcmd.mbox[0]);
 971    event.word = cpu_to_le32(cmd->frame->dcmd.mbox[4]);
 972    s->event_locale = event.members.locale;
 973    s->event_class = event.members.class;
 974    s->event_cmd = cmd;
 975    /* Decrease busy count; event frame doesn't count here */
 976    s->busy--;
 977    cmd->iov_size = sizeof(struct mfi_evt_detail);
 978    return MFI_STAT_INVALID_STATUS;
 979}
 980
 981static int megasas_dcmd_pd_get_list(MegasasState *s, MegasasCmd *cmd)
 982{
 983    struct mfi_pd_list info;
 984    size_t dcmd_size = sizeof(info);
 985    BusChild *kid;
 986    uint32_t offset, dcmd_limit, num_pd_disks = 0, max_pd_disks;
 987    dma_addr_t residual;
 988
 989    memset(&info, 0, dcmd_size);
 990    offset = 8;
 991    dcmd_limit = offset + sizeof(struct mfi_pd_address);
 992    if (cmd->iov_size < dcmd_limit) {
 993        trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
 994                                            dcmd_limit);
 995        return MFI_STAT_INVALID_PARAMETER;
 996    }
 997
 998    max_pd_disks = (cmd->iov_size - offset) / sizeof(struct mfi_pd_address);
 999    if (max_pd_disks > MFI_MAX_SYS_PDS) {
1000        max_pd_disks = MFI_MAX_SYS_PDS;
1001    }
1002    QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
1003        SCSIDevice *sdev = SCSI_DEVICE(kid->child);
1004        uint16_t pd_id;
1005
1006        if (num_pd_disks >= max_pd_disks)
1007            break;
1008
1009        pd_id = ((sdev->id & 0xFF) << 8) | (sdev->lun & 0xFF);
1010        info.addr[num_pd_disks].device_id = cpu_to_le16(pd_id);
1011        info.addr[num_pd_disks].encl_device_id = 0xFFFF;
1012        info.addr[num_pd_disks].encl_index = 0;
1013        info.addr[num_pd_disks].slot_number = sdev->id & 0xFF;
1014        info.addr[num_pd_disks].scsi_dev_type = sdev->type;
1015        info.addr[num_pd_disks].connect_port_bitmap = 0x1;
1016        info.addr[num_pd_disks].sas_addr[0] =
1017            cpu_to_le64(megasas_get_sata_addr(pd_id));
1018        num_pd_disks++;
1019        offset += sizeof(struct mfi_pd_address);
1020    }
1021    trace_megasas_dcmd_pd_get_list(cmd->index, num_pd_disks,
1022                                   max_pd_disks, offset);
1023
1024    info.size = cpu_to_le32(offset);
1025    info.count = cpu_to_le32(num_pd_disks);
1026
1027    dma_buf_read(&info, offset, &residual, &cmd->qsg,
1028                 MEMTXATTRS_UNSPECIFIED);
1029    cmd->iov_size -= residual;
1030    return MFI_STAT_OK;
1031}
1032
1033static int megasas_dcmd_pd_list_query(MegasasState *s, MegasasCmd *cmd)
1034{
1035    uint16_t flags;
1036
1037    /* mbox0 contains flags */
1038    flags = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
1039    trace_megasas_dcmd_pd_list_query(cmd->index, flags);
1040    if (flags == MR_PD_QUERY_TYPE_ALL ||
1041        megasas_is_jbod(s)) {
1042        return megasas_dcmd_pd_get_list(s, cmd);
1043    }
1044
1045    return MFI_STAT_OK;
1046}
1047
1048static int megasas_pd_get_info_submit(SCSIDevice *sdev, int lun,
1049                                      MegasasCmd *cmd)
1050{
1051    struct mfi_pd_info *info = cmd->iov_buf;
1052    size_t dcmd_size = sizeof(struct mfi_pd_info);
1053    uint64_t pd_size;
1054    uint16_t pd_id = ((sdev->id & 0xFF) << 8) | (lun & 0xFF);
1055    uint8_t cmdbuf[6];
1056    size_t len;
1057    dma_addr_t residual;
1058
1059    if (!cmd->iov_buf) {
1060        cmd->iov_buf = g_malloc0(dcmd_size);
1061        info = cmd->iov_buf;
1062        info->inquiry_data[0] = 0x7f; /* Force PQual 0x3, PType 0x1f */
1063        info->vpd_page83[0] = 0x7f;
1064        megasas_setup_inquiry(cmdbuf, 0, sizeof(info->inquiry_data));
1065        cmd->req = scsi_req_new(sdev, cmd->index, lun, cmdbuf, cmd);
1066        if (!cmd->req) {
1067            trace_megasas_dcmd_req_alloc_failed(cmd->index,
1068                                                "PD get info std inquiry");
1069            g_free(cmd->iov_buf);
1070            cmd->iov_buf = NULL;
1071            return MFI_STAT_FLASH_ALLOC_FAIL;
1072        }
1073        trace_megasas_dcmd_internal_submit(cmd->index,
1074                                           "PD get info std inquiry", lun);
1075        len = scsi_req_enqueue(cmd->req);
1076        if (len > 0) {
1077            cmd->iov_size = len;
1078            scsi_req_continue(cmd->req);
1079        }
1080        return MFI_STAT_INVALID_STATUS;
1081    } else if (info->inquiry_data[0] != 0x7f && info->vpd_page83[0] == 0x7f) {
1082        megasas_setup_inquiry(cmdbuf, 0x83, sizeof(info->vpd_page83));
1083        cmd->req = scsi_req_new(sdev, cmd->index, lun, cmdbuf, cmd);
1084        if (!cmd->req) {
1085            trace_megasas_dcmd_req_alloc_failed(cmd->index,
1086                                                "PD get info vpd inquiry");
1087            return MFI_STAT_FLASH_ALLOC_FAIL;
1088        }
1089        trace_megasas_dcmd_internal_submit(cmd->index,
1090                                           "PD get info vpd inquiry", lun);
1091        len = scsi_req_enqueue(cmd->req);
1092        if (len > 0) {
1093            cmd->iov_size = len;
1094            scsi_req_continue(cmd->req);
1095        }
1096        return MFI_STAT_INVALID_STATUS;
1097    }
1098    /* Finished, set FW state */
1099    if ((info->inquiry_data[0] >> 5) == 0) {
1100        if (megasas_is_jbod(cmd->state)) {
1101            info->fw_state = cpu_to_le16(MFI_PD_STATE_SYSTEM);
1102        } else {
1103            info->fw_state = cpu_to_le16(MFI_PD_STATE_ONLINE);
1104        }
1105    } else {
1106        info->fw_state = cpu_to_le16(MFI_PD_STATE_OFFLINE);
1107    }
1108
1109    info->ref.v.device_id = cpu_to_le16(pd_id);
1110    info->state.ddf.pd_type = cpu_to_le16(MFI_PD_DDF_TYPE_IN_VD|
1111                                          MFI_PD_DDF_TYPE_INTF_SAS);
1112    blk_get_geometry(sdev->conf.blk, &pd_size);
1113    info->raw_size = cpu_to_le64(pd_size);
1114    info->non_coerced_size = cpu_to_le64(pd_size);
1115    info->coerced_size = cpu_to_le64(pd_size);
1116    info->encl_device_id = 0xFFFF;
1117    info->slot_number = (sdev->id & 0xFF);
1118    info->path_info.count = 1;
1119    info->path_info.sas_addr[0] =
1120        cpu_to_le64(megasas_get_sata_addr(pd_id));
1121    info->connected_port_bitmap = 0x1;
1122    info->device_speed = 1;
1123    info->link_speed = 1;
1124    dma_buf_read(cmd->iov_buf, dcmd_size, &residual, &cmd->qsg,
1125                 MEMTXATTRS_UNSPECIFIED);
1126    cmd->iov_size -= residual;
1127    g_free(cmd->iov_buf);
1128    cmd->iov_size = dcmd_size - residual;
1129    cmd->iov_buf = NULL;
1130    return MFI_STAT_OK;
1131}
1132
1133static int megasas_dcmd_pd_get_info(MegasasState *s, MegasasCmd *cmd)
1134{
1135    size_t dcmd_size = sizeof(struct mfi_pd_info);
1136    uint16_t pd_id;
1137    uint8_t target_id, lun_id;
1138    SCSIDevice *sdev = NULL;
1139    int retval = MFI_STAT_DEVICE_NOT_FOUND;
1140
1141    if (cmd->iov_size < dcmd_size) {
1142        return MFI_STAT_INVALID_PARAMETER;
1143    }
1144
1145    /* mbox0 has the ID */
1146    pd_id = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
1147    target_id = (pd_id >> 8) & 0xFF;
1148    lun_id = pd_id & 0xFF;
1149    sdev = scsi_device_find(&s->bus, 0, target_id, lun_id);
1150    trace_megasas_dcmd_pd_get_info(cmd->index, pd_id);
1151
1152    if (sdev) {
1153        /* Submit inquiry */
1154        retval = megasas_pd_get_info_submit(sdev, pd_id, cmd);
1155    }
1156
1157    return retval;
1158}
1159
1160static int megasas_dcmd_ld_get_list(MegasasState *s, MegasasCmd *cmd)
1161{
1162    struct mfi_ld_list info;
1163    size_t dcmd_size = sizeof(info);
1164    dma_addr_t residual;
1165    uint32_t num_ld_disks = 0, max_ld_disks;
1166    uint64_t ld_size;
1167    BusChild *kid;
1168
1169    memset(&info, 0, dcmd_size);
1170    if (cmd->iov_size > dcmd_size) {
1171        trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
1172                                            dcmd_size);
1173        return MFI_STAT_INVALID_PARAMETER;
1174    }
1175
1176    max_ld_disks = (cmd->iov_size - 8) / 16;
1177    if (megasas_is_jbod(s)) {
1178        max_ld_disks = 0;
1179    }
1180    if (max_ld_disks > MFI_MAX_LD) {
1181        max_ld_disks = MFI_MAX_LD;
1182    }
1183    QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
1184        SCSIDevice *sdev = SCSI_DEVICE(kid->child);
1185
1186        if (num_ld_disks >= max_ld_disks) {
1187            break;
1188        }
1189        /* Logical device size is in blocks */
1190        blk_get_geometry(sdev->conf.blk, &ld_size);
1191        info.ld_list[num_ld_disks].ld.v.target_id = sdev->id;
1192        info.ld_list[num_ld_disks].state = MFI_LD_STATE_OPTIMAL;
1193        info.ld_list[num_ld_disks].size = cpu_to_le64(ld_size);
1194        num_ld_disks++;
1195    }
1196    info.ld_count = cpu_to_le32(num_ld_disks);
1197    trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
1198
1199    dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
1200                 MEMTXATTRS_UNSPECIFIED);
1201    cmd->iov_size = dcmd_size - residual;
1202    return MFI_STAT_OK;
1203}
1204
1205static int megasas_dcmd_ld_list_query(MegasasState *s, MegasasCmd *cmd)
1206{
1207    uint16_t flags;
1208    struct mfi_ld_targetid_list info;
1209    size_t dcmd_size = sizeof(info);
1210    dma_addr_t residual;
1211    uint32_t num_ld_disks = 0, max_ld_disks = s->fw_luns;
1212    BusChild *kid;
1213
1214    /* mbox0 contains flags */
1215    flags = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
1216    trace_megasas_dcmd_ld_list_query(cmd->index, flags);
1217    if (flags != MR_LD_QUERY_TYPE_ALL &&
1218        flags != MR_LD_QUERY_TYPE_EXPOSED_TO_HOST) {
1219        max_ld_disks = 0;
1220    }
1221
1222    memset(&info, 0, dcmd_size);
1223    if (cmd->iov_size < 12) {
1224        trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
1225                                            dcmd_size);
1226        return MFI_STAT_INVALID_PARAMETER;
1227    }
1228    dcmd_size = sizeof(uint32_t) * 2 + 3;
1229    max_ld_disks = cmd->iov_size - dcmd_size;
1230    if (megasas_is_jbod(s)) {
1231        max_ld_disks = 0;
1232    }
1233    if (max_ld_disks > MFI_MAX_LD) {
1234        max_ld_disks = MFI_MAX_LD;
1235    }
1236    QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
1237        SCSIDevice *sdev = SCSI_DEVICE(kid->child);
1238
1239        if (num_ld_disks >= max_ld_disks) {
1240            break;
1241        }
1242        info.targetid[num_ld_disks] = sdev->lun;
1243        num_ld_disks++;
1244        dcmd_size++;
1245    }
1246    info.ld_count = cpu_to_le32(num_ld_disks);
1247    info.size = dcmd_size;
1248    trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
1249
1250    dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
1251                 MEMTXATTRS_UNSPECIFIED);
1252    cmd->iov_size = dcmd_size - residual;
1253    return MFI_STAT_OK;
1254}
1255
1256static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
1257                                      MegasasCmd *cmd)
1258{
1259    struct mfi_ld_info *info = cmd->iov_buf;
1260    size_t dcmd_size = sizeof(struct mfi_ld_info);
1261    uint8_t cdb[6];
1262    ssize_t len;
1263    dma_addr_t residual;
1264    uint16_t sdev_id = ((sdev->id & 0xFF) << 8) | (lun & 0xFF);
1265    uint64_t ld_size;
1266
1267    if (!cmd->iov_buf) {
1268        cmd->iov_buf = g_malloc0(dcmd_size);
1269        info = cmd->iov_buf;
1270        megasas_setup_inquiry(cdb, 0x83, sizeof(info->vpd_page83));
1271        cmd->req = scsi_req_new(sdev, cmd->index, lun, cdb, cmd);
1272        if (!cmd->req) {
1273            trace_megasas_dcmd_req_alloc_failed(cmd->index,
1274                                                "LD get info vpd inquiry");
1275            g_free(cmd->iov_buf);
1276            cmd->iov_buf = NULL;
1277            return MFI_STAT_FLASH_ALLOC_FAIL;
1278        }
1279        trace_megasas_dcmd_internal_submit(cmd->index,
1280                                           "LD get info vpd inquiry", lun);
1281        len = scsi_req_enqueue(cmd->req);
1282        if (len > 0) {
1283            cmd->iov_size = len;
1284            scsi_req_continue(cmd->req);
1285        }
1286        return MFI_STAT_INVALID_STATUS;
1287    }
1288
1289    info->ld_config.params.state = MFI_LD_STATE_OPTIMAL;
1290    info->ld_config.properties.ld.v.target_id = lun;
1291    info->ld_config.params.stripe_size = 3;
1292    info->ld_config.params.num_drives = 1;
1293    info->ld_config.params.is_consistent = 1;
1294    /* Logical device size is in blocks */
1295    blk_get_geometry(sdev->conf.blk, &ld_size);
1296    info->size = cpu_to_le64(ld_size);
1297    memset(info->ld_config.span, 0, sizeof(info->ld_config.span));
1298    info->ld_config.span[0].start_block = 0;
1299    info->ld_config.span[0].num_blocks = info->size;
1300    info->ld_config.span[0].array_ref = cpu_to_le16(sdev_id);
1301
1302    dma_buf_read(cmd->iov_buf, dcmd_size, &residual, &cmd->qsg,
1303                 MEMTXATTRS_UNSPECIFIED);
1304    g_free(cmd->iov_buf);
1305    cmd->iov_size = dcmd_size - residual;
1306    cmd->iov_buf = NULL;
1307    return MFI_STAT_OK;
1308}
1309
1310static int megasas_dcmd_ld_get_info(MegasasState *s, MegasasCmd *cmd)
1311{
1312    struct mfi_ld_info info;
1313    size_t dcmd_size = sizeof(info);
1314    uint16_t ld_id;
1315    uint32_t max_ld_disks = s->fw_luns;
1316    SCSIDevice *sdev = NULL;
1317    int retval = MFI_STAT_DEVICE_NOT_FOUND;
1318
1319    if (cmd->iov_size < dcmd_size) {
1320        return MFI_STAT_INVALID_PARAMETER;
1321    }
1322
1323    /* mbox0 has the ID */
1324    ld_id = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
1325    trace_megasas_dcmd_ld_get_info(cmd->index, ld_id);
1326
1327    if (megasas_is_jbod(s)) {
1328        return MFI_STAT_DEVICE_NOT_FOUND;
1329    }
1330
1331    if (ld_id < max_ld_disks) {
1332        sdev = scsi_device_find(&s->bus, 0, ld_id, 0);
1333    }
1334
1335    if (sdev) {
1336        retval = megasas_ld_get_info_submit(sdev, ld_id, cmd);
1337    }
1338
1339    return retval;
1340}
1341
1342static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd)
1343{
1344    uint8_t data[4096] = { 0 };
1345    struct mfi_config_data *info;
1346    int num_pd_disks = 0, array_offset, ld_offset;
1347    BusChild *kid;
1348    dma_addr_t residual;
1349
1350    if (cmd->iov_size > 4096) {
1351        return MFI_STAT_INVALID_PARAMETER;
1352    }
1353
1354    QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
1355        num_pd_disks++;
1356    }
1357    info = (struct mfi_config_data *)&data;
1358    /*
1359     * Array mapping:
1360     * - One array per SCSI device
1361     * - One logical drive per SCSI device
1362     *   spanning the entire device
1363     */
1364    info->array_count = num_pd_disks;
1365    info->array_size = sizeof(struct mfi_array) * num_pd_disks;
1366    info->log_drv_count = num_pd_disks;
1367    info->log_drv_size = sizeof(struct mfi_ld_config) * num_pd_disks;
1368    info->spares_count = 0;
1369    info->spares_size = sizeof(struct mfi_spare);
1370    info->size = sizeof(struct mfi_config_data) + info->array_size +
1371        info->log_drv_size;
1372    if (info->size > 4096) {
1373        return MFI_STAT_INVALID_PARAMETER;
1374    }
1375
1376    array_offset = sizeof(struct mfi_config_data);
1377    ld_offset = array_offset + sizeof(struct mfi_array) * num_pd_disks;
1378
1379    QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
1380        SCSIDevice *sdev = SCSI_DEVICE(kid->child);
1381        uint16_t sdev_id = ((sdev->id & 0xFF) << 8) | (sdev->lun & 0xFF);
1382        struct mfi_array *array;
1383        struct mfi_ld_config *ld;
1384        uint64_t pd_size;
1385        int i;
1386
1387        array = (struct mfi_array *)(data + array_offset);
1388        blk_get_geometry(sdev->conf.blk, &pd_size);
1389        array->size = cpu_to_le64(pd_size);
1390        array->num_drives = 1;
1391        array->array_ref = cpu_to_le16(sdev_id);
1392        array->pd[0].ref.v.device_id = cpu_to_le16(sdev_id);
1393        array->pd[0].ref.v.seq_num = 0;
1394        array->pd[0].fw_state = MFI_PD_STATE_ONLINE;
1395        array->pd[0].encl.pd = 0xFF;
1396        array->pd[0].encl.slot = (sdev->id & 0xFF);
1397        for (i = 1; i < MFI_MAX_ROW_SIZE; i++) {
1398            array->pd[i].ref.v.device_id = 0xFFFF;
1399            array->pd[i].ref.v.seq_num = 0;
1400            array->pd[i].fw_state = MFI_PD_STATE_UNCONFIGURED_GOOD;
1401            array->pd[i].encl.pd = 0xFF;
1402            array->pd[i].encl.slot = 0xFF;
1403        }
1404        array_offset += sizeof(struct mfi_array);
1405        ld = (struct mfi_ld_config *)(data + ld_offset);
1406        memset(ld, 0, sizeof(struct mfi_ld_config));
1407        ld->properties.ld.v.target_id = sdev->id;
1408        ld->properties.default_cache_policy = MR_LD_CACHE_READ_AHEAD |
1409            MR_LD_CACHE_READ_ADAPTIVE;
1410        ld->properties.current_cache_policy = MR_LD_CACHE_READ_AHEAD |
1411            MR_LD_CACHE_READ_ADAPTIVE;
1412        ld->params.state = MFI_LD_STATE_OPTIMAL;
1413        ld->params.stripe_size = 3;
1414        ld->params.num_drives = 1;
1415        ld->params.span_depth = 1;
1416        ld->params.is_consistent = 1;
1417        ld->span[0].start_block = 0;
1418        ld->span[0].num_blocks = cpu_to_le64(pd_size);
1419        ld->span[0].array_ref = cpu_to_le16(sdev_id);
1420        ld_offset += sizeof(struct mfi_ld_config);
1421    }
1422
1423    dma_buf_read(data, info->size, &residual, &cmd->qsg,
1424                 MEMTXATTRS_UNSPECIFIED);
1425    cmd->iov_size -= residual;
1426    return MFI_STAT_OK;
1427}
1428
1429static int megasas_dcmd_get_properties(MegasasState *s, MegasasCmd *cmd)
1430{
1431    struct mfi_ctrl_props info;
1432    size_t dcmd_size = sizeof(info);
1433    dma_addr_t residual;
1434
1435    memset(&info, 0x0, dcmd_size);
1436    if (cmd->iov_size < dcmd_size) {
1437        trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
1438                                            dcmd_size);
1439        return MFI_STAT_INVALID_PARAMETER;
1440    }
1441    info.pred_fail_poll_interval = cpu_to_le16(300);
1442    info.intr_throttle_cnt = cpu_to_le16(16);
1443    info.intr_throttle_timeout = cpu_to_le16(50);
1444    info.rebuild_rate = 30;
1445    info.patrol_read_rate = 30;
1446    info.bgi_rate = 30;
1447    info.cc_rate = 30;
1448    info.recon_rate = 30;
1449    info.cache_flush_interval = 4;
1450    info.spinup_drv_cnt = 2;
1451    info.spinup_delay = 6;
1452    info.ecc_bucket_size = 15;
1453    info.ecc_bucket_leak_rate = cpu_to_le16(1440);
1454    info.expose_encl_devices = 1;
1455
1456    dma_buf_read(&info, dcmd_size, &residual, &cmd->qsg,
1457                 MEMTXATTRS_UNSPECIFIED);
1458    cmd->iov_size -= residual;
1459    return MFI_STAT_OK;
1460}
1461
1462static int megasas_cache_flush(MegasasState *s, MegasasCmd *cmd)
1463{
1464    blk_drain_all();
1465    return MFI_STAT_OK;
1466}
1467
1468static int megasas_ctrl_shutdown(MegasasState *s, MegasasCmd *cmd)
1469{
1470    s->fw_state = MFI_FWSTATE_READY;
1471    return MFI_STAT_OK;
1472}
1473
1474/* Some implementations use CLUSTER RESET LD to simulate a device reset */
1475static int megasas_cluster_reset_ld(MegasasState *s, MegasasCmd *cmd)
1476{
1477    uint16_t target_id;
1478    int i;
1479
1480    /* mbox0 contains the device index */
1481    target_id = le16_to_cpu(cmd->frame->dcmd.mbox[0]);
1482    trace_megasas_dcmd_reset_ld(cmd->index, target_id);
1483    for (i = 0; i < s->fw_cmds; i++) {
1484        MegasasCmd *tmp_cmd = &s->frames[i];
1485        if (tmp_cmd->req && tmp_cmd->req->dev->id == target_id) {
1486            SCSIDevice *d = tmp_cmd->req->dev;
1487            qdev_reset_all(&d->qdev);
1488        }
1489    }
1490    return MFI_STAT_OK;
1491}
1492
1493static int megasas_dcmd_set_properties(MegasasState *s, MegasasCmd *cmd)
1494{
1495    struct mfi_ctrl_props info;
1496    size_t dcmd_size = sizeof(info);
1497
1498    if (cmd->iov_size < dcmd_size) {
1499        trace_megasas_dcmd_invalid_xfer_len(cmd->index, cmd->iov_size,
1500                                            dcmd_size);
1501        return MFI_STAT_INVALID_PARAMETER;
1502    }
1503    dma_buf_write(&info, dcmd_size, NULL, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
1504    trace_megasas_dcmd_unsupported(cmd->index, cmd->iov_size);
1505    return MFI_STAT_OK;
1506}
1507
1508static int megasas_dcmd_dummy(MegasasState *s, MegasasCmd *cmd)
1509{
1510    trace_megasas_dcmd_dummy(cmd->index, cmd->iov_size);
1511    return MFI_STAT_OK;
1512}
1513
1514static const struct dcmd_cmd_tbl_t {
1515    int opcode;
1516    const char *desc;
1517    int (*func)(MegasasState *s, MegasasCmd *cmd);
1518} dcmd_cmd_tbl[] = {
1519    { MFI_DCMD_CTRL_MFI_HOST_MEM_ALLOC, "CTRL_HOST_MEM_ALLOC",
1520      megasas_dcmd_dummy },
1521    { MFI_DCMD_CTRL_GET_INFO, "CTRL_GET_INFO",
1522      megasas_ctrl_get_info },
1523    { MFI_DCMD_CTRL_GET_PROPERTIES, "CTRL_GET_PROPERTIES",
1524      megasas_dcmd_get_properties },
1525    { MFI_DCMD_CTRL_SET_PROPERTIES, "CTRL_SET_PROPERTIES",
1526      megasas_dcmd_set_properties },
1527    { MFI_DCMD_CTRL_ALARM_GET, "CTRL_ALARM_GET",
1528      megasas_dcmd_dummy },
1529    { MFI_DCMD_CTRL_ALARM_ENABLE, "CTRL_ALARM_ENABLE",
1530      megasas_dcmd_dummy },
1531    { MFI_DCMD_CTRL_ALARM_DISABLE, "CTRL_ALARM_DISABLE",
1532      megasas_dcmd_dummy },
1533    { MFI_DCMD_CTRL_ALARM_SILENCE, "CTRL_ALARM_SILENCE",
1534      megasas_dcmd_dummy },
1535    { MFI_DCMD_CTRL_ALARM_TEST, "CTRL_ALARM_TEST",
1536      megasas_dcmd_dummy },
1537    { MFI_DCMD_CTRL_EVENT_GETINFO, "CTRL_EVENT_GETINFO",
1538      megasas_event_info },
1539    { MFI_DCMD_CTRL_EVENT_GET, "CTRL_EVENT_GET",
1540      megasas_dcmd_dummy },
1541    { MFI_DCMD_CTRL_EVENT_WAIT, "CTRL_EVENT_WAIT",
1542      megasas_event_wait },
1543    { MFI_DCMD_CTRL_SHUTDOWN, "CTRL_SHUTDOWN",
1544      megasas_ctrl_shutdown },
1545    { MFI_DCMD_HIBERNATE_STANDBY, "CTRL_STANDBY",
1546      megasas_dcmd_dummy },
1547    { MFI_DCMD_CTRL_GET_TIME, "CTRL_GET_TIME",
1548      megasas_dcmd_get_fw_time },
1549    { MFI_DCMD_CTRL_SET_TIME, "CTRL_SET_TIME",
1550      megasas_dcmd_set_fw_time },
1551    { MFI_DCMD_CTRL_BIOS_DATA_GET, "CTRL_BIOS_DATA_GET",
1552      megasas_dcmd_get_bios_info },
1553    { MFI_DCMD_CTRL_FACTORY_DEFAULTS, "CTRL_FACTORY_DEFAULTS",
1554      megasas_dcmd_dummy },
1555    { MFI_DCMD_CTRL_MFC_DEFAULTS_GET, "CTRL_MFC_DEFAULTS_GET",
1556      megasas_mfc_get_defaults },
1557    { MFI_DCMD_CTRL_MFC_DEFAULTS_SET, "CTRL_MFC_DEFAULTS_SET",
1558      megasas_dcmd_dummy },
1559    { MFI_DCMD_CTRL_CACHE_FLUSH, "CTRL_CACHE_FLUSH",
1560      megasas_cache_flush },
1561    { MFI_DCMD_PD_GET_LIST, "PD_GET_LIST",
1562      megasas_dcmd_pd_get_list },
1563    { MFI_DCMD_PD_LIST_QUERY, "PD_LIST_QUERY",
1564      megasas_dcmd_pd_list_query },
1565    { MFI_DCMD_PD_GET_INFO, "PD_GET_INFO",
1566      megasas_dcmd_pd_get_info },
1567    { MFI_DCMD_PD_STATE_SET, "PD_STATE_SET",
1568      megasas_dcmd_dummy },
1569    { MFI_DCMD_PD_REBUILD, "PD_REBUILD",
1570      megasas_dcmd_dummy },
1571    { MFI_DCMD_PD_BLINK, "PD_BLINK",
1572      megasas_dcmd_dummy },
1573    { MFI_DCMD_PD_UNBLINK, "PD_UNBLINK",
1574      megasas_dcmd_dummy },
1575    { MFI_DCMD_LD_GET_LIST, "LD_GET_LIST",
1576      megasas_dcmd_ld_get_list},
1577    { MFI_DCMD_LD_LIST_QUERY, "LD_LIST_QUERY",
1578      megasas_dcmd_ld_list_query },
1579    { MFI_DCMD_LD_GET_INFO, "LD_GET_INFO",
1580      megasas_dcmd_ld_get_info },
1581    { MFI_DCMD_LD_GET_PROP, "LD_GET_PROP",
1582      megasas_dcmd_dummy },
1583    { MFI_DCMD_LD_SET_PROP, "LD_SET_PROP",
1584      megasas_dcmd_dummy },
1585    { MFI_DCMD_LD_DELETE, "LD_DELETE",
1586      megasas_dcmd_dummy },
1587    { MFI_DCMD_CFG_READ, "CFG_READ",
1588      megasas_dcmd_cfg_read },
1589    { MFI_DCMD_CFG_ADD, "CFG_ADD",
1590      megasas_dcmd_dummy },
1591    { MFI_DCMD_CFG_CLEAR, "CFG_CLEAR",
1592      megasas_dcmd_dummy },
1593    { MFI_DCMD_CFG_FOREIGN_READ, "CFG_FOREIGN_READ",
1594      megasas_dcmd_dummy },
1595    { MFI_DCMD_CFG_FOREIGN_IMPORT, "CFG_FOREIGN_IMPORT",
1596      megasas_dcmd_dummy },
1597    { MFI_DCMD_BBU_STATUS, "BBU_STATUS",
1598      megasas_dcmd_dummy },
1599    { MFI_DCMD_BBU_CAPACITY_INFO, "BBU_CAPACITY_INFO",
1600      megasas_dcmd_dummy },
1601    { MFI_DCMD_BBU_DESIGN_INFO, "BBU_DESIGN_INFO",
1602      megasas_dcmd_dummy },
1603    { MFI_DCMD_BBU_PROP_GET, "BBU_PROP_GET",
1604      megasas_dcmd_dummy },
1605    { MFI_DCMD_CLUSTER, "CLUSTER",
1606      megasas_dcmd_dummy },
1607    { MFI_DCMD_CLUSTER_RESET_ALL, "CLUSTER_RESET_ALL",
1608      megasas_dcmd_dummy },
1609    { MFI_DCMD_CLUSTER_RESET_LD, "CLUSTER_RESET_LD",
1610      megasas_cluster_reset_ld },
1611    { -1, NULL, NULL }
1612};
1613
1614static int megasas_handle_dcmd(MegasasState *s, MegasasCmd *cmd)
1615{
1616    int retval = 0;
1617    size_t len;
1618    const struct dcmd_cmd_tbl_t *cmdptr = dcmd_cmd_tbl;
1619
1620    cmd->dcmd_opcode = le32_to_cpu(cmd->frame->dcmd.opcode);
1621    trace_megasas_handle_dcmd(cmd->index, cmd->dcmd_opcode);
1622    if (megasas_map_dcmd(s, cmd) < 0) {
1623        return MFI_STAT_MEMORY_NOT_AVAILABLE;
1624    }
1625    while (cmdptr->opcode != -1 && cmdptr->opcode != cmd->dcmd_opcode) {
1626        cmdptr++;
1627    }
1628    len = cmd->iov_size;
1629    if (cmdptr->opcode == -1) {
1630        trace_megasas_dcmd_unhandled(cmd->index, cmd->dcmd_opcode, len);
1631        retval = megasas_dcmd_dummy(s, cmd);
1632    } else {
1633        trace_megasas_dcmd_enter(cmd->index, cmdptr->desc, len);
1634        retval = cmdptr->func(s, cmd);
1635    }
1636    if (retval != MFI_STAT_INVALID_STATUS) {
1637        megasas_finish_dcmd(cmd, len);
1638    }
1639    return retval;
1640}
1641
1642static int megasas_finish_internal_dcmd(MegasasCmd *cmd,
1643                                        SCSIRequest *req, dma_addr_t residual)
1644{
1645    int retval = MFI_STAT_OK;
1646    int lun = req->lun;
1647
1648    trace_megasas_dcmd_internal_finish(cmd->index, cmd->dcmd_opcode, lun);
1649    cmd->iov_size -= residual;
1650    switch (cmd->dcmd_opcode) {
1651    case MFI_DCMD_PD_GET_INFO:
1652        retval = megasas_pd_get_info_submit(req->dev, lun, cmd);
1653        break;
1654    case MFI_DCMD_LD_GET_INFO:
1655        retval = megasas_ld_get_info_submit(req->dev, lun, cmd);
1656        break;
1657    default:
1658        trace_megasas_dcmd_internal_invalid(cmd->index, cmd->dcmd_opcode);
1659        retval = MFI_STAT_INVALID_DCMD;
1660        break;
1661    }
1662    if (retval != MFI_STAT_INVALID_STATUS) {
1663        megasas_finish_dcmd(cmd, cmd->iov_size);
1664    }
1665    return retval;
1666}
1667
1668static int megasas_enqueue_req(MegasasCmd *cmd, bool is_write)
1669{
1670    int len;
1671
1672    len = scsi_req_enqueue(cmd->req);
1673    if (len < 0) {
1674        len = -len;
1675    }
1676    if (len > 0) {
1677        if (len > cmd->iov_size) {
1678            if (is_write) {
1679                trace_megasas_iov_write_overflow(cmd->index, len,
1680                                                 cmd->iov_size);
1681            } else {
1682                trace_megasas_iov_read_overflow(cmd->index, len,
1683                                                cmd->iov_size);
1684            }
1685        }
1686        if (len < cmd->iov_size) {
1687            if (is_write) {
1688                trace_megasas_iov_write_underflow(cmd->index, len,
1689                                                  cmd->iov_size);
1690            } else {
1691                trace_megasas_iov_read_underflow(cmd->index, len,
1692                                                 cmd->iov_size);
1693            }
1694            cmd->iov_size = len;
1695        }
1696        scsi_req_continue(cmd->req);
1697    }
1698    return len;
1699}
1700
1701static int megasas_handle_scsi(MegasasState *s, MegasasCmd *cmd,
1702                               int frame_cmd)
1703{
1704    uint8_t *cdb;
1705    int target_id, lun_id, cdb_len;
1706    bool is_write;
1707    struct SCSIDevice *sdev = NULL;
1708    bool is_logical = (frame_cmd == MFI_CMD_LD_SCSI_IO);
1709
1710    cdb = cmd->frame->pass.cdb;
1711    target_id = cmd->frame->header.target_id;
1712    lun_id = cmd->frame->header.lun_id;
1713    cdb_len = cmd->frame->header.cdb_len;
1714
1715    if (is_logical) {
1716        if (target_id >= MFI_MAX_LD || lun_id != 0) {
1717            trace_megasas_scsi_target_not_present(
1718                mfi_frame_desc(frame_cmd), is_logical, target_id, lun_id);
1719            return MFI_STAT_DEVICE_NOT_FOUND;
1720        }
1721    }
1722    sdev = scsi_device_find(&s->bus, 0, target_id, lun_id);
1723
1724    cmd->iov_size = le32_to_cpu(cmd->frame->header.data_len);
1725    trace_megasas_handle_scsi(mfi_frame_desc(frame_cmd), is_logical,
1726                              target_id, lun_id, sdev, cmd->iov_size);
1727
1728    if (!sdev || (megasas_is_jbod(s) && is_logical)) {
1729        trace_megasas_scsi_target_not_present(
1730            mfi_frame_desc(frame_cmd), is_logical, target_id, lun_id);
1731        return MFI_STAT_DEVICE_NOT_FOUND;
1732    }
1733
1734    if (cdb_len > 16) {
1735        trace_megasas_scsi_invalid_cdb_len(
1736                mfi_frame_desc(frame_cmd), is_logical,
1737                target_id, lun_id, cdb_len);
1738        megasas_write_sense(cmd, SENSE_CODE(INVALID_OPCODE));
1739        cmd->frame->header.scsi_status = CHECK_CONDITION;
1740        s->event_count++;
1741        return MFI_STAT_SCSI_DONE_WITH_ERROR;
1742    }
1743
1744    if (megasas_map_sgl(s, cmd, &cmd->frame->pass.sgl)) {
1745        megasas_write_sense(cmd, SENSE_CODE(TARGET_FAILURE));
1746        cmd->frame->header.scsi_status = CHECK_CONDITION;
1747        s->event_count++;
1748        return MFI_STAT_SCSI_DONE_WITH_ERROR;
1749    }
1750
1751    cmd->req = scsi_req_new(sdev, cmd->index, lun_id, cdb, cmd);
1752    if (!cmd->req) {
1753        trace_megasas_scsi_req_alloc_failed(
1754                mfi_frame_desc(frame_cmd), target_id, lun_id);
1755        megasas_write_sense(cmd, SENSE_CODE(NO_SENSE));
1756        cmd->frame->header.scsi_status = BUSY;
1757        s->event_count++;
1758        return MFI_STAT_SCSI_DONE_WITH_ERROR;
1759    }
1760
1761    is_write = (cmd->req->cmd.mode == SCSI_XFER_TO_DEV);
1762    if (cmd->iov_size) {
1763        if (is_write) {
1764            trace_megasas_scsi_write_start(cmd->index, cmd->iov_size);
1765        } else {
1766            trace_megasas_scsi_read_start(cmd->index, cmd->iov_size);
1767        }
1768    } else {
1769        trace_megasas_scsi_nodata(cmd->index);
1770    }
1771    megasas_enqueue_req(cmd, is_write);
1772    return MFI_STAT_INVALID_STATUS;
1773}
1774
1775static int megasas_handle_io(MegasasState *s, MegasasCmd *cmd, int frame_cmd)
1776{
1777    uint32_t lba_count, lba_start_hi, lba_start_lo;
1778    uint64_t lba_start;
1779    bool is_write = (frame_cmd == MFI_CMD_LD_WRITE);
1780    uint8_t cdb[16];
1781    int len;
1782    struct SCSIDevice *sdev = NULL;
1783    int target_id, lun_id, cdb_len;
1784
1785    lba_count = le32_to_cpu(cmd->frame->io.header.data_len);
1786    lba_start_lo = le32_to_cpu(cmd->frame->io.lba_lo);
1787    lba_start_hi = le32_to_cpu(cmd->frame->io.lba_hi);
1788    lba_start = ((uint64_t)lba_start_hi << 32) | lba_start_lo;
1789
1790    target_id = cmd->frame->header.target_id;
1791    lun_id = cmd->frame->header.lun_id;
1792    cdb_len = cmd->frame->header.cdb_len;
1793
1794    if (target_id < MFI_MAX_LD && lun_id == 0) {
1795        sdev = scsi_device_find(&s->bus, 0, target_id, lun_id);
1796    }
1797
1798    trace_megasas_handle_io(cmd->index,
1799                            mfi_frame_desc(frame_cmd), target_id, lun_id,
1800                            (unsigned long)lba_start, (unsigned long)lba_count);
1801    if (!sdev) {
1802        trace_megasas_io_target_not_present(cmd->index,
1803            mfi_frame_desc(frame_cmd), target_id, lun_id);
1804        return MFI_STAT_DEVICE_NOT_FOUND;
1805    }
1806
1807    if (cdb_len > 16) {
1808        trace_megasas_scsi_invalid_cdb_len(
1809            mfi_frame_desc(frame_cmd), 1, target_id, lun_id, cdb_len);
1810        megasas_write_sense(cmd, SENSE_CODE(INVALID_OPCODE));
1811        cmd->frame->header.scsi_status = CHECK_CONDITION;
1812        s->event_count++;
1813        return MFI_STAT_SCSI_DONE_WITH_ERROR;
1814    }
1815
1816    cmd->iov_size = lba_count * sdev->blocksize;
1817    if (megasas_map_sgl(s, cmd, &cmd->frame->io.sgl)) {
1818        megasas_write_sense(cmd, SENSE_CODE(TARGET_FAILURE));
1819        cmd->frame->header.scsi_status = CHECK_CONDITION;
1820        s->event_count++;
1821        return MFI_STAT_SCSI_DONE_WITH_ERROR;
1822    }
1823
1824    megasas_encode_lba(cdb, lba_start, lba_count, is_write);
1825    cmd->req = scsi_req_new(sdev, cmd->index,
1826                            lun_id, cdb, cmd);
1827    if (!cmd->req) {
1828        trace_megasas_scsi_req_alloc_failed(
1829            mfi_frame_desc(frame_cmd), target_id, lun_id);
1830        megasas_write_sense(cmd, SENSE_CODE(NO_SENSE));
1831        cmd->frame->header.scsi_status = BUSY;
1832        s->event_count++;
1833        return MFI_STAT_SCSI_DONE_WITH_ERROR;
1834    }
1835    len = megasas_enqueue_req(cmd, is_write);
1836    if (len > 0) {
1837        if (is_write) {
1838            trace_megasas_io_write_start(cmd->index, lba_start, lba_count, len);
1839        } else {
1840            trace_megasas_io_read_start(cmd->index, lba_start, lba_count, len);
1841        }
1842    }
1843    return MFI_STAT_INVALID_STATUS;
1844}
1845
1846static QEMUSGList *megasas_get_sg_list(SCSIRequest *req)
1847{
1848    MegasasCmd *cmd = req->hba_private;
1849
1850    if (cmd->dcmd_opcode != -1) {
1851        return NULL;
1852    } else {
1853        return &cmd->qsg;
1854    }
1855}
1856
1857static void megasas_xfer_complete(SCSIRequest *req, uint32_t len)
1858{
1859    MegasasCmd *cmd = req->hba_private;
1860    uint8_t *buf;
1861
1862    trace_megasas_io_complete(cmd->index, len);
1863
1864    if (cmd->dcmd_opcode != -1) {
1865        scsi_req_continue(req);
1866        return;
1867    }
1868
1869    buf = scsi_req_get_buf(req);
1870    if (cmd->dcmd_opcode == MFI_DCMD_PD_GET_INFO && cmd->iov_buf) {
1871        struct mfi_pd_info *info = cmd->iov_buf;
1872
1873        if (info->inquiry_data[0] == 0x7f) {
1874            memset(info->inquiry_data, 0, sizeof(info->inquiry_data));
1875            memcpy(info->inquiry_data, buf, len);
1876        } else if (info->vpd_page83[0] == 0x7f) {
1877            memset(info->vpd_page83, 0, sizeof(info->vpd_page83));
1878            memcpy(info->vpd_page83, buf, len);
1879        }
1880        scsi_req_continue(req);
1881    } else if (cmd->dcmd_opcode == MFI_DCMD_LD_GET_INFO) {
1882        struct mfi_ld_info *info = cmd->iov_buf;
1883
1884        if (cmd->iov_buf) {
1885            memcpy(info->vpd_page83, buf, sizeof(info->vpd_page83));
1886            scsi_req_continue(req);
1887        }
1888    }
1889}
1890
1891static void megasas_command_complete(SCSIRequest *req, size_t residual)
1892{
1893    MegasasCmd *cmd = req->hba_private;
1894    uint8_t cmd_status = MFI_STAT_OK;
1895
1896    trace_megasas_command_complete(cmd->index, req->status, residual);
1897
1898    if (req->io_canceled) {
1899        return;
1900    }
1901
1902    if (cmd->dcmd_opcode != -1) {
1903        /*
1904         * Internal command complete
1905         */
1906        cmd_status = megasas_finish_internal_dcmd(cmd, req, residual);
1907        if (cmd_status == MFI_STAT_INVALID_STATUS) {
1908            return;
1909        }
1910    } else {
1911        trace_megasas_scsi_complete(cmd->index, req->status,
1912                                    cmd->iov_size, req->cmd.xfer);
1913        if (req->status != GOOD) {
1914            cmd_status = MFI_STAT_SCSI_DONE_WITH_ERROR;
1915        }
1916        if (req->status == CHECK_CONDITION) {
1917            megasas_copy_sense(cmd);
1918        }
1919
1920        cmd->frame->header.scsi_status = req->status;
1921    }
1922    cmd->frame->header.cmd_status = cmd_status;
1923    megasas_complete_command(cmd);
1924}
1925
1926static void megasas_command_cancelled(SCSIRequest *req)
1927{
1928    MegasasCmd *cmd = req->hba_private;
1929
1930    if (!cmd) {
1931        return;
1932    }
1933    cmd->frame->header.cmd_status = MFI_STAT_SCSI_IO_FAILED;
1934    megasas_complete_command(cmd);
1935}
1936
1937static int megasas_handle_abort(MegasasState *s, MegasasCmd *cmd)
1938{
1939    uint64_t abort_ctx = le64_to_cpu(cmd->frame->abort.abort_context);
1940    hwaddr abort_addr, addr_hi, addr_lo;
1941    MegasasCmd *abort_cmd;
1942
1943    addr_hi = le32_to_cpu(cmd->frame->abort.abort_mfi_addr_hi);
1944    addr_lo = le32_to_cpu(cmd->frame->abort.abort_mfi_addr_lo);
1945    abort_addr = ((uint64_t)addr_hi << 32) | addr_lo;
1946
1947    abort_cmd = megasas_lookup_frame(s, abort_addr);
1948    if (!abort_cmd) {
1949        trace_megasas_abort_no_cmd(cmd->index, abort_ctx);
1950        s->event_count++;
1951        return MFI_STAT_OK;
1952    }
1953    if (!megasas_use_queue64(s)) {
1954        abort_ctx &= (uint64_t)0xFFFFFFFF;
1955    }
1956    if (abort_cmd->context != abort_ctx) {
1957        trace_megasas_abort_invalid_context(cmd->index, abort_cmd->context,
1958                                            abort_cmd->index);
1959        s->event_count++;
1960        return MFI_STAT_ABORT_NOT_POSSIBLE;
1961    }
1962    trace_megasas_abort_frame(cmd->index, abort_cmd->index);
1963    megasas_abort_command(abort_cmd);
1964    if (!s->event_cmd || abort_cmd != s->event_cmd) {
1965        s->event_cmd = NULL;
1966    }
1967    s->event_count++;
1968    return MFI_STAT_OK;
1969}
1970
1971static void megasas_handle_frame(MegasasState *s, uint64_t frame_addr,
1972                                 uint32_t frame_count)
1973{
1974    uint8_t frame_status = MFI_STAT_INVALID_CMD;
1975    uint64_t frame_context;
1976    int frame_cmd;
1977    MegasasCmd *cmd;
1978
1979    /*
1980     * Always read 64bit context, top bits will be
1981     * masked out if required in megasas_enqueue_frame()
1982     */
1983    frame_context = megasas_frame_get_context(s, frame_addr);
1984
1985    cmd = megasas_enqueue_frame(s, frame_addr, frame_context, frame_count);
1986    if (!cmd) {
1987        /* reply queue full */
1988        trace_megasas_frame_busy(frame_addr);
1989        megasas_frame_set_scsi_status(s, frame_addr, BUSY);
1990        megasas_frame_set_cmd_status(s, frame_addr, MFI_STAT_SCSI_DONE_WITH_ERROR);
1991        megasas_complete_frame(s, frame_context);
1992        s->event_count++;
1993        return;
1994    }
1995    frame_cmd = cmd->frame->header.frame_cmd;
1996    switch (frame_cmd) {
1997    case MFI_CMD_INIT:
1998        frame_status = megasas_init_firmware(s, cmd);
1999        break;
2000    case MFI_CMD_DCMD:
2001        frame_status = megasas_handle_dcmd(s, cmd);
2002        break;
2003    case MFI_CMD_ABORT:
2004        frame_status = megasas_handle_abort(s, cmd);
2005        break;
2006    case MFI_CMD_PD_SCSI_IO:
2007    case MFI_CMD_LD_SCSI_IO:
2008        frame_status = megasas_handle_scsi(s, cmd, frame_cmd);
2009        break;
2010    case MFI_CMD_LD_READ:
2011    case MFI_CMD_LD_WRITE:
2012        frame_status = megasas_handle_io(s, cmd, frame_cmd);
2013        break;
2014    default:
2015        trace_megasas_unhandled_frame_cmd(cmd->index, frame_cmd);
2016        s->event_count++;
2017        break;
2018    }
2019    if (frame_status != MFI_STAT_INVALID_STATUS) {
2020        if (cmd->frame) {
2021            cmd->frame->header.cmd_status = frame_status;
2022        } else {
2023            megasas_frame_set_cmd_status(s, frame_addr, frame_status);
2024        }
2025        megasas_unmap_frame(s, cmd);
2026        megasas_complete_frame(s, cmd->context);
2027    }
2028}
2029
2030static uint64_t megasas_mmio_read(void *opaque, hwaddr addr,
2031                                  unsigned size)
2032{
2033    MegasasState *s = opaque;
2034    PCIDevice *pci_dev = PCI_DEVICE(s);
2035    MegasasBaseClass *base_class = MEGASAS_GET_CLASS(s);
2036    uint32_t retval = 0;
2037
2038    switch (addr) {
2039    case MFI_IDB:
2040        retval = 0;
2041        trace_megasas_mmio_readl("MFI_IDB", retval);
2042        break;
2043    case MFI_OMSG0:
2044    case MFI_OSP0:
2045        retval = (msix_present(pci_dev) ? MFI_FWSTATE_MSIX_SUPPORTED : 0) |
2046            (s->fw_state & MFI_FWSTATE_MASK) |
2047            ((s->fw_sge & 0xff) << 16) |
2048            (s->fw_cmds & 0xFFFF);
2049        trace_megasas_mmio_readl(addr == MFI_OMSG0 ? "MFI_OMSG0" : "MFI_OSP0",
2050                                 retval);
2051        break;
2052    case MFI_OSTS:
2053        if (megasas_intr_enabled(s) && s->doorbell) {
2054            retval = base_class->osts;
2055        }
2056        trace_megasas_mmio_readl("MFI_OSTS", retval);
2057        break;
2058    case MFI_OMSK:
2059        retval = s->intr_mask;
2060        trace_megasas_mmio_readl("MFI_OMSK", retval);
2061        break;
2062    case MFI_ODCR0:
2063        retval = s->doorbell ? 1 : 0;
2064        trace_megasas_mmio_readl("MFI_ODCR0", retval);
2065        break;
2066    case MFI_DIAG:
2067        retval = s->diag;
2068        trace_megasas_mmio_readl("MFI_DIAG", retval);
2069        break;
2070    case MFI_OSP1:
2071        retval = 15;
2072        trace_megasas_mmio_readl("MFI_OSP1", retval);
2073        break;
2074    default:
2075        trace_megasas_mmio_invalid_readl(addr);
2076        break;
2077    }
2078    return retval;
2079}
2080
2081static int adp_reset_seq[] = {0x00, 0x04, 0x0b, 0x02, 0x07, 0x0d};
2082
2083static void megasas_mmio_write(void *opaque, hwaddr addr,
2084                               uint64_t val, unsigned size)
2085{
2086    MegasasState *s = opaque;
2087    PCIDevice *pci_dev = PCI_DEVICE(s);
2088    uint64_t frame_addr;
2089    uint32_t frame_count;
2090    int i;
2091
2092    switch (addr) {
2093    case MFI_IDB:
2094        trace_megasas_mmio_writel("MFI_IDB", val);
2095        if (val & MFI_FWINIT_ABORT) {
2096            /* Abort all pending cmds */
2097            for (i = 0; i < s->fw_cmds; i++) {
2098                megasas_abort_command(&s->frames[i]);
2099            }
2100        }
2101        if (val & MFI_FWINIT_READY) {
2102            /* move to FW READY */
2103            megasas_soft_reset(s);
2104        }
2105        if (val & MFI_FWINIT_MFIMODE) {
2106            /* discard MFIs */
2107        }
2108        if (val & MFI_FWINIT_STOP_ADP) {
2109            /* Terminal error, stop processing */
2110            s->fw_state = MFI_FWSTATE_FAULT;
2111        }
2112        break;
2113    case MFI_OMSK:
2114        trace_megasas_mmio_writel("MFI_OMSK", val);
2115        s->intr_mask = val;
2116        if (!megasas_intr_enabled(s) &&
2117            !msi_enabled(pci_dev) &&
2118            !msix_enabled(pci_dev)) {
2119            trace_megasas_irq_lower();
2120            pci_irq_deassert(pci_dev);
2121        }
2122        if (megasas_intr_enabled(s)) {
2123            if (msix_enabled(pci_dev)) {
2124                trace_megasas_msix_enabled(0);
2125            } else if (msi_enabled(pci_dev)) {
2126                trace_megasas_msi_enabled(0);
2127            } else {
2128                trace_megasas_intr_enabled();
2129            }
2130        } else {
2131            trace_megasas_intr_disabled();
2132            megasas_soft_reset(s);
2133        }
2134        break;
2135    case MFI_ODCR0:
2136        trace_megasas_mmio_writel("MFI_ODCR0", val);
2137        s->doorbell = 0;
2138        if (megasas_intr_enabled(s)) {
2139            if (!msix_enabled(pci_dev) && !msi_enabled(pci_dev)) {
2140                trace_megasas_irq_lower();
2141                pci_irq_deassert(pci_dev);
2142            }
2143        }
2144        break;
2145    case MFI_IQPH:
2146        trace_megasas_mmio_writel("MFI_IQPH", val);
2147        /* Received high 32 bits of a 64 bit MFI frame address */
2148        s->frame_hi = val;
2149        break;
2150    case MFI_IQPL:
2151        trace_megasas_mmio_writel("MFI_IQPL", val);
2152        /* Received low 32 bits of a 64 bit MFI frame address */
2153        /* Fallthrough */
2154    case MFI_IQP:
2155        if (addr == MFI_IQP) {
2156            trace_megasas_mmio_writel("MFI_IQP", val);
2157            /* Received 64 bit MFI frame address */
2158            s->frame_hi = 0;
2159        }
2160        frame_addr = (val & ~0x1F);
2161        /* Add possible 64 bit offset */
2162        frame_addr |= ((uint64_t)s->frame_hi << 32);
2163        s->frame_hi = 0;
2164        frame_count = (val >> 1) & 0xF;
2165        megasas_handle_frame(s, frame_addr, frame_count);
2166        break;
2167    case MFI_SEQ:
2168        trace_megasas_mmio_writel("MFI_SEQ", val);
2169        /* Magic sequence to start ADP reset */
2170        if (adp_reset_seq[s->adp_reset++] == val) {
2171            if (s->adp_reset == 6) {
2172                s->adp_reset = 0;
2173                s->diag = MFI_DIAG_WRITE_ENABLE;
2174            }
2175        } else {
2176            s->adp_reset = 0;
2177            s->diag = 0;
2178        }
2179        break;
2180    case MFI_DIAG:
2181        trace_megasas_mmio_writel("MFI_DIAG", val);
2182        /* ADP reset */
2183        if ((s->diag & MFI_DIAG_WRITE_ENABLE) &&
2184            (val & MFI_DIAG_RESET_ADP)) {
2185            s->diag |= MFI_DIAG_RESET_ADP;
2186            megasas_soft_reset(s);
2187            s->adp_reset = 0;
2188            s->diag = 0;
2189        }
2190        break;
2191    default:
2192        trace_megasas_mmio_invalid_writel(addr, val);
2193        break;
2194    }
2195}
2196
2197static const MemoryRegionOps megasas_mmio_ops = {
2198    .read = megasas_mmio_read,
2199    .write = megasas_mmio_write,
2200    .endianness = DEVICE_LITTLE_ENDIAN,
2201    .impl = {
2202        .min_access_size = 8,
2203        .max_access_size = 8,
2204    }
2205};
2206
2207static uint64_t megasas_port_read(void *opaque, hwaddr addr,
2208                                  unsigned size)
2209{
2210    return megasas_mmio_read(opaque, addr & 0xff, size);
2211}
2212
2213static void megasas_port_write(void *opaque, hwaddr addr,
2214                               uint64_t val, unsigned size)
2215{
2216    megasas_mmio_write(opaque, addr & 0xff, val, size);
2217}
2218
2219static const MemoryRegionOps megasas_port_ops = {
2220    .read = megasas_port_read,
2221    .write = megasas_port_write,
2222    .endianness = DEVICE_LITTLE_ENDIAN,
2223    .impl = {
2224        .min_access_size = 4,
2225        .max_access_size = 4,
2226    }
2227};
2228
2229static uint64_t megasas_queue_read(void *opaque, hwaddr addr,
2230                                   unsigned size)
2231{
2232    return 0;
2233}
2234
2235static void megasas_queue_write(void *opaque, hwaddr addr,
2236                               uint64_t val, unsigned size)
2237{
2238    return;
2239}
2240
2241static const MemoryRegionOps megasas_queue_ops = {
2242    .read = megasas_queue_read,
2243    .write = megasas_queue_write,
2244    .endianness = DEVICE_LITTLE_ENDIAN,
2245    .impl = {
2246        .min_access_size = 8,
2247        .max_access_size = 8,
2248    }
2249};
2250
2251static void megasas_soft_reset(MegasasState *s)
2252{
2253    int i;
2254    MegasasCmd *cmd;
2255
2256    trace_megasas_reset(s->fw_state);
2257    for (i = 0; i < s->fw_cmds; i++) {
2258        cmd = &s->frames[i];
2259        megasas_abort_command(cmd);
2260    }
2261    if (s->fw_state == MFI_FWSTATE_READY) {
2262        BusChild *kid;
2263
2264        /*
2265         * The EFI firmware doesn't handle UA,
2266         * so we need to clear the Power On/Reset UA
2267         * after the initial reset.
2268         */
2269        QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
2270            SCSIDevice *sdev = SCSI_DEVICE(kid->child);
2271
2272            sdev->unit_attention = SENSE_CODE(NO_SENSE);
2273            scsi_device_unit_attention_reported(sdev);
2274        }
2275    }
2276    megasas_reset_frames(s);
2277    s->reply_queue_len = s->fw_cmds;
2278    s->reply_queue_pa = 0;
2279    s->consumer_pa = 0;
2280    s->producer_pa = 0;
2281    s->fw_state = MFI_FWSTATE_READY;
2282    s->doorbell = 0;
2283    s->intr_mask = MEGASAS_INTR_DISABLED_MASK;
2284    s->frame_hi = 0;
2285    s->flags &= ~MEGASAS_MASK_USE_QUEUE64;
2286    s->event_count++;
2287    s->boot_event = s->event_count;
2288}
2289
2290static void megasas_scsi_reset(DeviceState *dev)
2291{
2292    MegasasState *s = MEGASAS(dev);
2293
2294    megasas_soft_reset(s);
2295}
2296
2297static const VMStateDescription vmstate_megasas_gen1 = {
2298    .name = "megasas",
2299    .version_id = 0,
2300    .minimum_version_id = 0,
2301    .fields = (VMStateField[]) {
2302        VMSTATE_PCI_DEVICE(parent_obj, MegasasState),
2303        VMSTATE_MSIX(parent_obj, MegasasState),
2304
2305        VMSTATE_UINT32(fw_state, MegasasState),
2306        VMSTATE_UINT32(intr_mask, MegasasState),
2307        VMSTATE_UINT32(doorbell, MegasasState),
2308        VMSTATE_UINT64(reply_queue_pa, MegasasState),
2309        VMSTATE_UINT64(consumer_pa, MegasasState),
2310        VMSTATE_UINT64(producer_pa, MegasasState),
2311        VMSTATE_END_OF_LIST()
2312    }
2313};
2314
2315static const VMStateDescription vmstate_megasas_gen2 = {
2316    .name = "megasas-gen2",
2317    .version_id = 0,
2318    .minimum_version_id = 0,
2319    .fields      = (VMStateField[]) {
2320        VMSTATE_PCI_DEVICE(parent_obj, MegasasState),
2321        VMSTATE_MSIX(parent_obj, MegasasState),
2322
2323        VMSTATE_UINT32(fw_state, MegasasState),
2324        VMSTATE_UINT32(intr_mask, MegasasState),
2325        VMSTATE_UINT32(doorbell, MegasasState),
2326        VMSTATE_UINT64(reply_queue_pa, MegasasState),
2327        VMSTATE_UINT64(consumer_pa, MegasasState),
2328        VMSTATE_UINT64(producer_pa, MegasasState),
2329        VMSTATE_END_OF_LIST()
2330    }
2331};
2332
2333static void megasas_scsi_uninit(PCIDevice *d)
2334{
2335    MegasasState *s = MEGASAS(d);
2336
2337    if (megasas_use_msix(s)) {
2338        msix_uninit(d, &s->mmio_io, &s->mmio_io);
2339    }
2340    msi_uninit(d);
2341}
2342
2343static const struct SCSIBusInfo megasas_scsi_info = {
2344    .tcq = true,
2345    .max_target = MFI_MAX_LD,
2346    .max_lun = 255,
2347
2348    .transfer_data = megasas_xfer_complete,
2349    .get_sg_list = megasas_get_sg_list,
2350    .complete = megasas_command_complete,
2351    .cancel = megasas_command_cancelled,
2352};
2353
2354static void megasas_scsi_realize(PCIDevice *dev, Error **errp)
2355{
2356    MegasasState *s = MEGASAS(dev);
2357    MegasasBaseClass *b = MEGASAS_GET_CLASS(s);
2358    uint8_t *pci_conf;
2359    int i, bar_type;
2360    Error *err = NULL;
2361    int ret;
2362
2363    pci_conf = dev->config;
2364
2365    /* PCI latency timer = 0 */
2366    pci_conf[PCI_LATENCY_TIMER] = 0;
2367    /* Interrupt pin 1 */
2368    pci_conf[PCI_INTERRUPT_PIN] = 0x01;
2369
2370    if (s->msi != ON_OFF_AUTO_OFF) {
2371        ret = msi_init(dev, 0x50, 1, true, false, &err);
2372        /* Any error other than -ENOTSUP(board's MSI support is broken)
2373         * is a programming error */
2374        assert(!ret || ret == -ENOTSUP);
2375        if (ret && s->msi == ON_OFF_AUTO_ON) {
2376            /* Can't satisfy user's explicit msi=on request, fail */
2377            error_append_hint(&err, "You have to use msi=auto (default) or "
2378                    "msi=off with this machine type.\n");
2379            error_propagate(errp, err);
2380            return;
2381        } else if (ret) {
2382            /* With msi=auto, we fall back to MSI off silently */
2383            s->msi = ON_OFF_AUTO_OFF;
2384            error_free(err);
2385        }
2386    }
2387
2388    memory_region_init_io(&s->mmio_io, OBJECT(s), &megasas_mmio_ops, s,
2389                          "megasas-mmio", 0x4000);
2390    memory_region_init_io(&s->port_io, OBJECT(s), &megasas_port_ops, s,
2391                          "megasas-io", 256);
2392    memory_region_init_io(&s->queue_io, OBJECT(s), &megasas_queue_ops, s,
2393                          "megasas-queue", 0x40000);
2394
2395    if (megasas_use_msix(s) &&
2396        msix_init(dev, 15, &s->mmio_io, b->mmio_bar, 0x2000,
2397                  &s->mmio_io, b->mmio_bar, 0x3800, 0x68, NULL)) {
2398        /* TODO: check msix_init's error, and should fail on msix=on */
2399        s->msix = ON_OFF_AUTO_OFF;
2400    }
2401
2402    if (pci_is_express(dev)) {
2403        pcie_endpoint_cap_init(dev, 0xa0);
2404    }
2405
2406    bar_type = PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64;
2407    pci_register_bar(dev, b->ioport_bar,
2408                     PCI_BASE_ADDRESS_SPACE_IO, &s->port_io);
2409    pci_register_bar(dev, b->mmio_bar, bar_type, &s->mmio_io);
2410    pci_register_bar(dev, 3, bar_type, &s->queue_io);
2411
2412    if (megasas_use_msix(s)) {
2413        msix_vector_use(dev, 0);
2414    }
2415
2416    s->fw_state = MFI_FWSTATE_READY;
2417    if (!s->sas_addr) {
2418        s->sas_addr = ((NAA_LOCALLY_ASSIGNED_ID << 24) |
2419                       IEEE_COMPANY_LOCALLY_ASSIGNED) << 36;
2420        s->sas_addr |= pci_dev_bus_num(dev) << 16;
2421        s->sas_addr |= PCI_SLOT(dev->devfn) << 8;
2422        s->sas_addr |= PCI_FUNC(dev->devfn);
2423    }
2424    if (!s->hba_serial) {
2425        s->hba_serial = g_strdup(MEGASAS_HBA_SERIAL);
2426    }
2427    if (s->fw_sge >= MEGASAS_MAX_SGE - MFI_PASS_FRAME_SIZE) {
2428        s->fw_sge = MEGASAS_MAX_SGE - MFI_PASS_FRAME_SIZE;
2429    } else if (s->fw_sge >= 128 - MFI_PASS_FRAME_SIZE) {
2430        s->fw_sge = 128 - MFI_PASS_FRAME_SIZE;
2431    } else {
2432        s->fw_sge = 64 - MFI_PASS_FRAME_SIZE;
2433    }
2434    if (s->fw_cmds > MEGASAS_MAX_FRAMES) {
2435        s->fw_cmds = MEGASAS_MAX_FRAMES;
2436    }
2437    trace_megasas_init(s->fw_sge, s->fw_cmds,
2438                       megasas_is_jbod(s) ? "jbod" : "raid");
2439
2440    if (megasas_is_jbod(s)) {
2441        s->fw_luns = MFI_MAX_SYS_PDS;
2442    } else {
2443        s->fw_luns = MFI_MAX_LD;
2444    }
2445    s->producer_pa = 0;
2446    s->consumer_pa = 0;
2447    for (i = 0; i < s->fw_cmds; i++) {
2448        s->frames[i].index = i;
2449        s->frames[i].context = -1;
2450        s->frames[i].pa = 0;
2451        s->frames[i].state = s;
2452    }
2453
2454    scsi_bus_init(&s->bus, sizeof(s->bus), DEVICE(dev), &megasas_scsi_info);
2455}
2456
2457static Property megasas_properties_gen1[] = {
2458    DEFINE_PROP_UINT32("max_sge", MegasasState, fw_sge,
2459                       MEGASAS_DEFAULT_SGE),
2460    DEFINE_PROP_UINT32("max_cmds", MegasasState, fw_cmds,
2461                       MEGASAS_DEFAULT_FRAMES),
2462    DEFINE_PROP_STRING("hba_serial", MegasasState, hba_serial),
2463    DEFINE_PROP_UINT64("sas_address", MegasasState, sas_addr, 0),
2464    DEFINE_PROP_ON_OFF_AUTO("msi", MegasasState, msi, ON_OFF_AUTO_AUTO),
2465    DEFINE_PROP_ON_OFF_AUTO("msix", MegasasState, msix, ON_OFF_AUTO_AUTO),
2466    DEFINE_PROP_BIT("use_jbod", MegasasState, flags,
2467                    MEGASAS_FLAG_USE_JBOD, false),
2468    DEFINE_PROP_END_OF_LIST(),
2469};
2470
2471static Property megasas_properties_gen2[] = {
2472    DEFINE_PROP_UINT32("max_sge", MegasasState, fw_sge,
2473                       MEGASAS_DEFAULT_SGE),
2474    DEFINE_PROP_UINT32("max_cmds", MegasasState, fw_cmds,
2475                       MEGASAS_GEN2_DEFAULT_FRAMES),
2476    DEFINE_PROP_STRING("hba_serial", MegasasState, hba_serial),
2477    DEFINE_PROP_UINT64("sas_address", MegasasState, sas_addr, 0),
2478    DEFINE_PROP_ON_OFF_AUTO("msi", MegasasState, msi, ON_OFF_AUTO_AUTO),
2479    DEFINE_PROP_ON_OFF_AUTO("msix", MegasasState, msix, ON_OFF_AUTO_AUTO),
2480    DEFINE_PROP_BIT("use_jbod", MegasasState, flags,
2481                    MEGASAS_FLAG_USE_JBOD, false),
2482    DEFINE_PROP_END_OF_LIST(),
2483};
2484
2485typedef struct MegasasInfo {
2486    const char *name;
2487    const char *desc;
2488    const char *product_name;
2489    const char *product_version;
2490    uint16_t device_id;
2491    uint16_t subsystem_id;
2492    int ioport_bar;
2493    int mmio_bar;
2494    int osts;
2495    const VMStateDescription *vmsd;
2496    Property *props;
2497    InterfaceInfo *interfaces;
2498} MegasasInfo;
2499
2500static struct MegasasInfo megasas_devices[] = {
2501    {
2502        .name = TYPE_MEGASAS_GEN1,
2503        .desc = "LSI MegaRAID SAS 1078",
2504        .product_name = "LSI MegaRAID SAS 8708EM2",
2505        .product_version = MEGASAS_VERSION_GEN1,
2506        .device_id = PCI_DEVICE_ID_LSI_SAS1078,
2507        .subsystem_id = 0x1013,
2508        .ioport_bar = 2,
2509        .mmio_bar = 0,
2510        .osts = MFI_1078_RM | 1,
2511        .vmsd = &vmstate_megasas_gen1,
2512        .props = megasas_properties_gen1,
2513        .interfaces = (InterfaceInfo[]) {
2514            { INTERFACE_CONVENTIONAL_PCI_DEVICE },
2515            { },
2516        },
2517    },{
2518        .name = TYPE_MEGASAS_GEN2,
2519        .desc = "LSI MegaRAID SAS 2108",
2520        .product_name = "LSI MegaRAID SAS 9260-8i",
2521        .product_version = MEGASAS_VERSION_GEN2,
2522        .device_id = PCI_DEVICE_ID_LSI_SAS0079,
2523        .subsystem_id = 0x9261,
2524        .ioport_bar = 0,
2525        .mmio_bar = 1,
2526        .osts = MFI_GEN2_RM,
2527        .vmsd = &vmstate_megasas_gen2,
2528        .props = megasas_properties_gen2,
2529        .interfaces = (InterfaceInfo[]) {
2530            { INTERFACE_PCIE_DEVICE },
2531            { }
2532        },
2533    }
2534};
2535
2536static void megasas_class_init(ObjectClass *oc, void *data)
2537{
2538    DeviceClass *dc = DEVICE_CLASS(oc);
2539    PCIDeviceClass *pc = PCI_DEVICE_CLASS(oc);
2540    MegasasBaseClass *e = MEGASAS_CLASS(oc);
2541    const MegasasInfo *info = data;
2542
2543    pc->realize = megasas_scsi_realize;
2544    pc->exit = megasas_scsi_uninit;
2545    pc->vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
2546    pc->device_id = info->device_id;
2547    pc->subsystem_vendor_id = PCI_VENDOR_ID_LSI_LOGIC;
2548    pc->subsystem_id = info->subsystem_id;
2549    pc->class_id = PCI_CLASS_STORAGE_RAID;
2550    e->mmio_bar = info->mmio_bar;
2551    e->ioport_bar = info->ioport_bar;
2552    e->osts = info->osts;
2553    e->product_name = info->product_name;
2554    e->product_version = info->product_version;
2555    device_class_set_props(dc, info->props);
2556    dc->reset = megasas_scsi_reset;
2557    dc->vmsd = info->vmsd;
2558    set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
2559    dc->desc = info->desc;
2560}
2561
2562static const TypeInfo megasas_info = {
2563    .name  = TYPE_MEGASAS_BASE,
2564    .parent = TYPE_PCI_DEVICE,
2565    .instance_size = sizeof(MegasasState),
2566    .class_size = sizeof(MegasasBaseClass),
2567    .abstract = true,
2568};
2569
2570static void megasas_register_types(void)
2571{
2572    int i;
2573
2574    type_register_static(&megasas_info);
2575    for (i = 0; i < ARRAY_SIZE(megasas_devices); i++) {
2576        const MegasasInfo *info = &megasas_devices[i];
2577        TypeInfo type_info = {};
2578
2579        type_info.name = info->name;
2580        type_info.parent = TYPE_MEGASAS_BASE;
2581        type_info.class_data = (void *)info;
2582        type_info.class_init = megasas_class_init;
2583        type_info.interfaces = info->interfaces;
2584
2585        type_register(&type_info);
2586    }
2587}
2588
2589type_init(megasas_register_types)
2590