2 * QEMU MegaRAID SAS 8708EM2 Host Bus Adapter emulation
3 * Based on the linux driver code at drivers/scsi/megaraid
5 * Copyright (c) 2009-2012 Hannes Reinecke, SUSE Labs
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.
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.
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/>.
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"
30 #include "qemu/module.h"
31 #include "qemu/hw-version.h"
32 #include "hw/scsi/scsi.h"
33 #include "scsi/constants.h"
35 #include "qapi/error.h"
37 #include "migration/vmstate.h"
38 #include "qom/object.h"
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
50 #define MEGASAS_HBA_SERIAL "QEMU123456"
51 #define NAA_LOCALLY_ASSIGNED_ID 0x3ULL
52 #define IEEE_COMPANY_LOCALLY_ASSIGNED 0x525400
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)
59 typedef struct MegasasCmd
{
68 union mfi_frame
*frame
;
74 struct MegasasState
*state
;
84 MemoryRegion queue_io
;
100 MegasasCmd
*event_cmd
;
101 uint16_t event_locale
;
103 uint32_t event_count
;
104 uint32_t shutdown_event
;
110 uint64_t reply_queue_pa
;
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
;
118 MegasasCmd frames
[MEGASAS_MAX_FRAMES
];
119 DECLARE_BITMAP(frame_map
, MEGASAS_MAX_FRAMES
);
122 typedef struct MegasasState MegasasState
;
124 struct MegasasBaseClass
{
125 PCIDeviceClass parent_class
;
126 const char *product_name
;
127 const char *product_version
;
132 typedef struct MegasasBaseClass MegasasBaseClass
;
134 #define TYPE_MEGASAS_BASE "megasas-base"
135 #define TYPE_MEGASAS_GEN1 "megasas"
136 #define TYPE_MEGASAS_GEN2 "megasas-gen2"
138 DECLARE_OBJ_CHECKERS(MegasasState
, MegasasBaseClass
,
139 MEGASAS
, TYPE_MEGASAS_BASE
)
142 #define MEGASAS_INTR_DISABLED_MASK 0xFFFFFFFF
144 static bool megasas_intr_enabled(MegasasState
*s
)
146 if ((s
->intr_mask
& MEGASAS_INTR_DISABLED_MASK
) !=
147 MEGASAS_INTR_DISABLED_MASK
) {
153 static bool megasas_use_queue64(MegasasState
*s
)
155 return s
->flags
& MEGASAS_MASK_USE_QUEUE64
;
158 static bool megasas_use_msix(MegasasState
*s
)
160 return s
->msix
!= ON_OFF_AUTO_OFF
;
163 static bool megasas_is_jbod(MegasasState
*s
)
165 return s
->flags
& MEGASAS_MASK_USE_JBOD
;
168 static void megasas_frame_set_cmd_status(MegasasState
*s
,
169 unsigned long frame
, uint8_t v
)
171 PCIDevice
*pci
= &s
->parent_obj
;
172 stb_pci_dma(pci
, frame
+ offsetof(struct mfi_frame_header
, cmd_status
),
173 v
, MEMTXATTRS_UNSPECIFIED
);
176 static void megasas_frame_set_scsi_status(MegasasState
*s
,
177 unsigned long frame
, uint8_t v
)
179 PCIDevice
*pci
= &s
->parent_obj
;
180 stb_pci_dma(pci
, frame
+ offsetof(struct mfi_frame_header
, scsi_status
),
181 v
, MEMTXATTRS_UNSPECIFIED
);
184 static inline const char *mfi_frame_desc(unsigned int cmd
)
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"
191 if (cmd
< ARRAY_SIZE(mfi_frame_descs
)) {
192 return mfi_frame_descs
[cmd
];
199 * Context is considered opaque, but the HBA firmware is running
200 * in little endian mode. So convert it to little endian, too.
202 static uint64_t megasas_frame_get_context(MegasasState
*s
,
205 PCIDevice
*pci
= &s
->parent_obj
;
208 ldq_le_pci_dma(pci
, frame
+ offsetof(struct mfi_frame_header
, context
),
209 &val
, MEMTXATTRS_UNSPECIFIED
);
214 static bool megasas_frame_is_ieee_sgl(MegasasCmd
*cmd
)
216 return cmd
->flags
& MFI_FRAME_IEEE_SGL
;
219 static bool megasas_frame_is_sgl64(MegasasCmd
*cmd
)
221 return cmd
->flags
& MFI_FRAME_SGL64
;
224 static bool megasas_frame_is_sense64(MegasasCmd
*cmd
)
226 return cmd
->flags
& MFI_FRAME_SENSE64
;
229 static uint64_t megasas_sgl_get_addr(MegasasCmd
*cmd
,
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
);
239 addr
= le32_to_cpu(sgl
->sg32
->addr
);
244 static uint32_t megasas_sgl_get_len(MegasasCmd
*cmd
,
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
);
254 len
= le32_to_cpu(sgl
->sg32
->len
);
259 static union mfi_sgl
*megasas_sgl_next(MegasasCmd
*cmd
,
262 uint8_t *next
= (uint8_t *)sgl
;
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
);
269 next
+= sizeof(struct mfi_sg32
);
272 if (next
>= (uint8_t *)cmd
->frame
+ cmd
->pa_size
) {
275 return (union mfi_sgl
*)next
;
278 static void megasas_soft_reset(MegasasState
*s
);
280 static int megasas_map_sgl(MegasasState
*s
, MegasasCmd
*cmd
, union mfi_sgl
*sgl
)
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
,
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
;
298 trace_megasas_iovec_sgl_underflow(cmd
->index
, i
);
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
,
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
;
312 if (cmd
->iov_size
> iov_size
) {
313 trace_megasas_iovec_overflow(cmd
->index
, iov_size
, cmd
->iov_size
);
315 } else if (cmd
->iov_size
< iov_size
) {
316 trace_megasas_iovec_underflow(cmd
->index
, iov_size
, cmd
->iov_size
);
321 qemu_sglist_destroy(&cmd
->qsg
);
326 * passthrough sense and io sense are at the same offset
328 static int megasas_build_sense(MegasasCmd
*cmd
, uint8_t *sense_ptr
,
331 PCIDevice
*pcid
= PCI_DEVICE(cmd
->state
);
332 uint32_t pa_hi
= 0, pa_lo
;
336 frame_sense_len
= cmd
->frame
->header
.sense_len
;
337 if (sense_len
> frame_sense_len
) {
338 sense_len
= frame_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
);
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
;
352 static void megasas_write_sense(MegasasCmd
*cmd
, SCSISense sense
)
354 uint8_t sense_buf
[SCSI_SENSE_BUF_SIZE
];
355 uint8_t sense_len
= 18;
357 memset(sense_buf
, 0, sense_len
);
359 sense_buf
[2] = sense
.key
;
361 sense_buf
[12] = sense
.asc
;
362 sense_buf
[13] = sense
.ascq
;
363 megasas_build_sense(cmd
, sense_buf
, sense_len
);
366 static void megasas_copy_sense(MegasasCmd
*cmd
)
368 uint8_t sense_buf
[SCSI_SENSE_BUF_SIZE
];
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
);
377 * Format an INQUIRY CDB
379 static int megasas_setup_inquiry(uint8_t *cdb
, int pg
, int len
)
387 stw_be_p(&cdb
[3], len
);
392 * Encode lba and len into a READ_16/WRITE_16 CDB
394 static void megasas_encode_lba(uint8_t *cdb
, uint64_t lba
,
395 uint32_t len
, bool is_write
)
397 memset(cdb
, 0x0, 16);
403 stq_be_p(&cdb
[2], lba
);
404 stl_be_p(&cdb
[2 + 8], len
);
410 static uint64_t megasas_fw_time(void)
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);
424 * Default disk sata address
425 * 0x1221 is the magic number as
426 * present in real hardware,
427 * so use it here, too.
429 static uint64_t megasas_get_sata_addr(uint16_t id
)
431 uint64_t addr
= (0x1221ULL
<< 48);
432 return addr
| ((uint64_t)id
<< 24);
438 static int megasas_next_index(MegasasState
*s
, int index
, int limit
)
441 if (index
== limit
) {
447 static MegasasCmd
*megasas_lookup_frame(MegasasState
*s
,
450 MegasasCmd
*cmd
= NULL
;
453 index
= s
->reply_queue_head
;
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
];
460 index
= megasas_next_index(s
, index
, s
->fw_cmds
);
467 static void megasas_unmap_frame(MegasasState
*s
, MegasasCmd
*cmd
)
469 PCIDevice
*p
= PCI_DEVICE(s
);
472 pci_dma_unmap(p
, cmd
->frame
, cmd
->pa_size
, 0, 0);
477 qemu_sglist_destroy(&cmd
->qsg
);
478 clear_bit(cmd
->index
, s
->frame_map
);
482 * This absolutely needs to be locked if
483 * qemu ever goes multithreaded.
485 static MegasasCmd
*megasas_enqueue_frame(MegasasState
*s
,
486 hwaddr frame
, uint64_t context
, int count
)
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
;
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
)
499 /* Busy frame found */
500 trace_megasas_qf_mapped(index
);
502 if (index
>= s
->fw_cmds
) {
503 /* All frames busy */
504 trace_megasas_qf_busy(frame
);
507 cmd
= &s
->frames
[index
];
508 set_bit(index
, s
->frame_map
);
509 trace_megasas_qf_new(index
, 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
);
517 megasas_unmap_frame(s
, cmd
);
522 cmd
->pa_size
= frame_size_p
;
523 cmd
->context
= context
;
524 if (!megasas_use_queue64(s
)) {
525 cmd
->context
&= (uint64_t)0xFFFFFFFF;
528 cmd
->dcmd_opcode
= -1;
531 if (s
->consumer_pa
) {
532 ldl_le_pci_dma(pcid
, s
->consumer_pa
, &s
->reply_queue_tail
,
533 MEMTXATTRS_UNSPECIFIED
);
535 trace_megasas_qf_enqueue(cmd
->index
, cmd
->count
, cmd
->context
,
536 s
->reply_queue_head
, s
->reply_queue_tail
, s
->busy
);
541 static void megasas_complete_frame(MegasasState
*s
, uint64_t context
)
543 const MemTxAttrs attrs
= MEMTXATTRS_UNSPECIFIED
;
544 PCIDevice
*pci_dev
= PCI_DEVICE(s
);
545 int tail
, queue_offset
;
547 /* Decrement busy count */
549 if (s
->reply_queue_pa
) {
551 * Put command on the reply queue.
552 * Context is opaque, but emulation is running in
553 * little endian. So convert it.
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
,
560 queue_offset
= s
->reply_queue_head
* sizeof(uint32_t);
561 stl_le_pci_dma(pci_dev
, s
->reply_queue_pa
+ queue_offset
,
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
);
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
,
576 stl_le_pci_dma(pci_dev
, s
->producer_pa
, s
->reply_queue_head
, attrs
);
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);
586 if (s
->doorbell
== 1) {
587 trace_megasas_irq_raise();
588 pci_irq_assert(pci_dev
);
592 trace_megasas_qf_complete_noirq(context
);
596 static void megasas_complete_command(MegasasCmd
*cmd
)
601 cmd
->req
->hba_private
= NULL
;
602 scsi_req_unref(cmd
->req
);
605 megasas_unmap_frame(cmd
->state
, cmd
);
606 megasas_complete_frame(cmd
->state
, cmd
->context
);
609 static void megasas_reset_frames(MegasasState
*s
)
614 for (i
= 0; i
< s
->fw_cmds
; i
++) {
617 megasas_unmap_frame(s
, cmd
);
620 bitmap_zero(s
->frame_map
, MEGASAS_MAX_FRAMES
);
623 static void megasas_abort_command(MegasasCmd
*cmd
)
625 /* Never abort internal commands. */
626 if (cmd
->dcmd_opcode
!= -1) {
629 if (cmd
->req
!= NULL
) {
630 scsi_req_cancel(cmd
->req
);
634 static int megasas_init_firmware(MegasasState
*s
, MegasasCmd
*cmd
)
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
;
642 int ret
= MFI_STAT_OK
;
644 if (s
->reply_queue_pa
) {
645 trace_megasas_initq_mapped(s
->reply_queue_pa
);
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
);
656 ret
= MFI_STAT_MEMORY_NOT_AVAILABLE
;
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
);
663 ret
= MFI_STAT_INVALID_PARAMETER
;
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
;
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
;
690 pci_dma_unmap(pcid
, initq
, initq_size
, 0, 0);
695 static int megasas_map_dcmd(MegasasState
*s
, MegasasCmd
*cmd
)
697 dma_addr_t iov_pa
, iov_size
;
700 cmd
->flags
= le16_to_cpu(cmd
->frame
->header
.flags
);
701 iov_count
= cmd
->frame
->header
.sge_count
;
703 trace_megasas_dcmd_zero_sge(cmd
->index
);
706 } else if (iov_count
> 1) {
707 trace_megasas_dcmd_invalid_sge(cmd
->index
, iov_count
);
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
;
719 static void megasas_finish_dcmd(MegasasCmd
*cmd
, uint32_t iov_size
)
721 trace_megasas_finish_dcmd(cmd
->index
, iov_size
);
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
);
729 cmd
->frame
->dcmd
.sgl
.sg32
->len
= cpu_to_le32(iov_size
);
734 static int megasas_ctrl_get_info(MegasasState
*s
, MegasasCmd
*cmd
)
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
);
742 int num_pd_disks
= 0;
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
,
749 return MFI_STAT_INVALID_PARAMETER
;
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
);
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
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
);
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
));
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
) {
795 ptr
= memory_region_get_ram_ptr(&pci_dev
->rom
);
796 memcpy(biosver
, ptr
+ 0x41, 31);
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
++;
803 info
.current_fw_time
= cpu_to_le32(megasas_fw_time());
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
|
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
|
854 dma_buf_read(&info
, dcmd_size
, &residual
, &cmd
->qsg
,
855 MEMTXATTRS_UNSPECIFIED
);
856 cmd
->iov_size
-= residual
;
860 static int megasas_mfc_get_defaults(MegasasState
*s
, MegasasCmd
*cmd
)
862 struct mfi_defaults info
;
863 size_t dcmd_size
= sizeof(struct mfi_defaults
);
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
,
870 return MFI_STAT_INVALID_PARAMETER
;
873 info
.sas_addr
= cpu_to_le64(s
->sas_addr
);
874 info
.stripe_size
= 3;
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;
887 dma_buf_read(&info
, dcmd_size
, &residual
, &cmd
->qsg
,
888 MEMTXATTRS_UNSPECIFIED
);
889 cmd
->iov_size
-= residual
;
893 static int megasas_dcmd_get_bios_info(MegasasState
*s
, MegasasCmd
*cmd
)
895 struct mfi_bios_data info
;
896 size_t dcmd_size
= sizeof(info
);
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
,
903 return MFI_STAT_INVALID_PARAMETER
;
905 info
.continue_on_error
= 1;
907 if (megasas_is_jbod(s
)) {
908 info
.expose_all_drives
= 1;
911 dma_buf_read(&info
, dcmd_size
, &residual
, &cmd
->qsg
,
912 MEMTXATTRS_UNSPECIFIED
);
913 cmd
->iov_size
-= residual
;
917 static int megasas_dcmd_get_fw_time(MegasasState
*s
, MegasasCmd
*cmd
)
920 size_t dcmd_size
= sizeof(fw_time
);
923 fw_time
= cpu_to_le64(megasas_fw_time());
925 dma_buf_read(&fw_time
, dcmd_size
, &residual
, &cmd
->qsg
,
926 MEMTXATTRS_UNSPECIFIED
);
927 cmd
->iov_size
-= residual
;
931 static int megasas_dcmd_set_fw_time(MegasasState
*s
, MegasasCmd
*cmd
)
935 /* This is a dummy; setting of firmware time is not allowed */
936 memcpy(&fw_time
, cmd
->frame
->dcmd
.mbox
, sizeof(fw_time
));
938 trace_megasas_dcmd_set_fw_time(cmd
->index
, fw_time
);
939 fw_time
= cpu_to_le64(megasas_fw_time());
943 static int megasas_event_info(MegasasState
*s
, MegasasCmd
*cmd
)
945 struct mfi_evt_log_state info
;
946 size_t dcmd_size
= sizeof(info
);
949 memset(&info
, 0, dcmd_size
);
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
);
955 dma_buf_read(&info
, dcmd_size
, &residual
, &cmd
->qsg
,
956 MEMTXATTRS_UNSPECIFIED
);
957 cmd
->iov_size
-= residual
;
961 static int megasas_event_wait(MegasasState
*s
, MegasasCmd
*cmd
)
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
;
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;
975 /* Decrease busy count; event frame doesn't count here */
977 cmd
->iov_size
= sizeof(struct mfi_evt_detail
);
978 return MFI_STAT_INVALID_STATUS
;
981 static int megasas_dcmd_pd_get_list(MegasasState
*s
, MegasasCmd
*cmd
)
983 struct mfi_pd_list info
;
984 size_t dcmd_size
= sizeof(info
);
986 uint32_t offset
, dcmd_limit
, num_pd_disks
= 0, max_pd_disks
;
989 memset(&info
, 0, dcmd_size
);
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
,
995 return MFI_STAT_INVALID_PARAMETER
;
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
;
1002 QTAILQ_FOREACH(kid
, &s
->bus
.qbus
.children
, sibling
) {
1003 SCSIDevice
*sdev
= SCSI_DEVICE(kid
->child
);
1006 if (num_pd_disks
>= max_pd_disks
)
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
));
1019 offset
+= sizeof(struct mfi_pd_address
);
1021 trace_megasas_dcmd_pd_get_list(cmd
->index
, num_pd_disks
,
1022 max_pd_disks
, offset
);
1024 info
.size
= cpu_to_le32(offset
);
1025 info
.count
= cpu_to_le32(num_pd_disks
);
1027 dma_buf_read(&info
, offset
, &residual
, &cmd
->qsg
,
1028 MEMTXATTRS_UNSPECIFIED
);
1029 cmd
->iov_size
-= residual
;
1033 static int megasas_dcmd_pd_list_query(MegasasState
*s
, MegasasCmd
*cmd
)
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
);
1048 static int megasas_pd_get_info_submit(SCSIDevice
*sdev
, int lun
,
1051 struct mfi_pd_info
*info
= cmd
->iov_buf
;
1052 size_t dcmd_size
= sizeof(struct mfi_pd_info
);
1054 uint16_t pd_id
= ((sdev
->id
& 0xFF) << 8) | (lun
& 0xFF);
1057 dma_addr_t residual
;
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
, sizeof(cmdbuf
), cmd
);
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
;
1073 trace_megasas_dcmd_internal_submit(cmd
->index
,
1074 "PD get info std inquiry", lun
);
1075 len
= scsi_req_enqueue(cmd
->req
);
1077 cmd
->iov_size
= len
;
1078 scsi_req_continue(cmd
->req
);
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
, sizeof(cmdbuf
), cmd
);
1085 trace_megasas_dcmd_req_alloc_failed(cmd
->index
,
1086 "PD get info vpd inquiry");
1087 return MFI_STAT_FLASH_ALLOC_FAIL
;
1089 trace_megasas_dcmd_internal_submit(cmd
->index
,
1090 "PD get info vpd inquiry", lun
);
1091 len
= scsi_req_enqueue(cmd
->req
);
1093 cmd
->iov_size
= len
;
1094 scsi_req_continue(cmd
->req
);
1096 return MFI_STAT_INVALID_STATUS
;
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
);
1103 info
->fw_state
= cpu_to_le16(MFI_PD_STATE_ONLINE
);
1106 info
->fw_state
= cpu_to_le16(MFI_PD_STATE_OFFLINE
);
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
;
1133 static int megasas_dcmd_pd_get_info(MegasasState
*s
, MegasasCmd
*cmd
)
1135 size_t dcmd_size
= sizeof(struct mfi_pd_info
);
1137 uint8_t target_id
, lun_id
;
1138 SCSIDevice
*sdev
= NULL
;
1139 int retval
= MFI_STAT_DEVICE_NOT_FOUND
;
1141 if (cmd
->iov_size
< dcmd_size
) {
1142 return MFI_STAT_INVALID_PARAMETER
;
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
);
1153 /* Submit inquiry */
1154 retval
= megasas_pd_get_info_submit(sdev
, pd_id
, cmd
);
1160 static int megasas_dcmd_ld_get_list(MegasasState
*s
, MegasasCmd
*cmd
)
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
;
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
,
1173 return MFI_STAT_INVALID_PARAMETER
;
1176 max_ld_disks
= (cmd
->iov_size
- 8) / 16;
1177 if (megasas_is_jbod(s
)) {
1180 if (max_ld_disks
> MFI_MAX_LD
) {
1181 max_ld_disks
= MFI_MAX_LD
;
1183 QTAILQ_FOREACH(kid
, &s
->bus
.qbus
.children
, sibling
) {
1184 SCSIDevice
*sdev
= SCSI_DEVICE(kid
->child
);
1186 if (num_ld_disks
>= max_ld_disks
) {
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
);
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
);
1199 dma_buf_read(&info
, dcmd_size
, &residual
, &cmd
->qsg
,
1200 MEMTXATTRS_UNSPECIFIED
);
1201 cmd
->iov_size
= dcmd_size
- residual
;
1205 static int megasas_dcmd_ld_list_query(MegasasState
*s
, MegasasCmd
*cmd
)
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
;
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
) {
1222 memset(&info
, 0, dcmd_size
);
1223 if (cmd
->iov_size
< 12) {
1224 trace_megasas_dcmd_invalid_xfer_len(cmd
->index
, cmd
->iov_size
,
1226 return MFI_STAT_INVALID_PARAMETER
;
1228 dcmd_size
= sizeof(uint32_t) * 2 + 3;
1229 max_ld_disks
= cmd
->iov_size
- dcmd_size
;
1230 if (megasas_is_jbod(s
)) {
1233 if (max_ld_disks
> MFI_MAX_LD
) {
1234 max_ld_disks
= MFI_MAX_LD
;
1236 QTAILQ_FOREACH(kid
, &s
->bus
.qbus
.children
, sibling
) {
1237 SCSIDevice
*sdev
= SCSI_DEVICE(kid
->child
);
1239 if (num_ld_disks
>= max_ld_disks
) {
1242 info
.targetid
[num_ld_disks
] = sdev
->lun
;
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
);
1250 dma_buf_read(&info
, dcmd_size
, &residual
, &cmd
->qsg
,
1251 MEMTXATTRS_UNSPECIFIED
);
1252 cmd
->iov_size
= dcmd_size
- residual
;
1256 static int megasas_ld_get_info_submit(SCSIDevice
*sdev
, int lun
,
1259 struct mfi_ld_info
*info
= cmd
->iov_buf
;
1260 size_t dcmd_size
= sizeof(struct mfi_ld_info
);
1263 dma_addr_t residual
;
1264 uint16_t sdev_id
= ((sdev
->id
& 0xFF) << 8) | (lun
& 0xFF);
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
, sizeof(cdb
), cmd
);
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
;
1279 trace_megasas_dcmd_internal_submit(cmd
->index
,
1280 "LD get info vpd inquiry", lun
);
1281 len
= scsi_req_enqueue(cmd
->req
);
1283 cmd
->iov_size
= len
;
1284 scsi_req_continue(cmd
->req
);
1286 return MFI_STAT_INVALID_STATUS
;
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
);
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
;
1310 static int megasas_dcmd_ld_get_info(MegasasState
*s
, MegasasCmd
*cmd
)
1312 struct mfi_ld_info info
;
1313 size_t dcmd_size
= sizeof(info
);
1315 uint32_t max_ld_disks
= s
->fw_luns
;
1316 SCSIDevice
*sdev
= NULL
;
1317 int retval
= MFI_STAT_DEVICE_NOT_FOUND
;
1319 if (cmd
->iov_size
< dcmd_size
) {
1320 return MFI_STAT_INVALID_PARAMETER
;
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
);
1327 if (megasas_is_jbod(s
)) {
1328 return MFI_STAT_DEVICE_NOT_FOUND
;
1331 if (ld_id
< max_ld_disks
) {
1332 sdev
= scsi_device_find(&s
->bus
, 0, ld_id
, 0);
1336 retval
= megasas_ld_get_info_submit(sdev
, ld_id
, cmd
);
1342 static int megasas_dcmd_cfg_read(MegasasState
*s
, MegasasCmd
*cmd
)
1344 uint8_t data
[4096] = { 0 };
1345 struct mfi_config_data
*info
;
1346 int num_pd_disks
= 0, array_offset
, ld_offset
;
1348 dma_addr_t residual
;
1350 if (cmd
->iov_size
> 4096) {
1351 return MFI_STAT_INVALID_PARAMETER
;
1354 QTAILQ_FOREACH(kid
, &s
->bus
.qbus
.children
, sibling
) {
1357 info
= (struct mfi_config_data
*)&data
;
1360 * - One array per SCSI device
1361 * - One logical drive per SCSI device
1362 * spanning the entire device
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
+
1372 if (info
->size
> 4096) {
1373 return MFI_STAT_INVALID_PARAMETER
;
1376 array_offset
= sizeof(struct mfi_config_data
);
1377 ld_offset
= array_offset
+ sizeof(struct mfi_array
) * num_pd_disks
;
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
;
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;
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
);
1423 dma_buf_read(data
, info
->size
, &residual
, &cmd
->qsg
,
1424 MEMTXATTRS_UNSPECIFIED
);
1425 cmd
->iov_size
-= residual
;
1429 static int megasas_dcmd_get_properties(MegasasState
*s
, MegasasCmd
*cmd
)
1431 struct mfi_ctrl_props info
;
1432 size_t dcmd_size
= sizeof(info
);
1433 dma_addr_t residual
;
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
,
1439 return MFI_STAT_INVALID_PARAMETER
;
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;
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;
1456 dma_buf_read(&info
, dcmd_size
, &residual
, &cmd
->qsg
,
1457 MEMTXATTRS_UNSPECIFIED
);
1458 cmd
->iov_size
-= residual
;
1462 static int megasas_cache_flush(MegasasState
*s
, MegasasCmd
*cmd
)
1468 static int megasas_ctrl_shutdown(MegasasState
*s
, MegasasCmd
*cmd
)
1470 s
->fw_state
= MFI_FWSTATE_READY
;
1474 /* Some implementations use CLUSTER RESET LD to simulate a device reset */
1475 static int megasas_cluster_reset_ld(MegasasState
*s
, MegasasCmd
*cmd
)
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
);
1493 static int megasas_dcmd_set_properties(MegasasState
*s
, MegasasCmd
*cmd
)
1495 struct mfi_ctrl_props info
;
1496 size_t dcmd_size
= sizeof(info
);
1498 if (cmd
->iov_size
< dcmd_size
) {
1499 trace_megasas_dcmd_invalid_xfer_len(cmd
->index
, cmd
->iov_size
,
1501 return MFI_STAT_INVALID_PARAMETER
;
1503 dma_buf_write(&info
, dcmd_size
, NULL
, &cmd
->qsg
, MEMTXATTRS_UNSPECIFIED
);
1504 trace_megasas_dcmd_unsupported(cmd
->index
, cmd
->iov_size
);
1508 static int megasas_dcmd_dummy(MegasasState
*s
, MegasasCmd
*cmd
)
1510 trace_megasas_dcmd_dummy(cmd
->index
, cmd
->iov_size
);
1514 static const struct dcmd_cmd_tbl_t
{
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
},
1614 static int megasas_handle_dcmd(MegasasState
*s
, MegasasCmd
*cmd
)
1618 const struct dcmd_cmd_tbl_t
*cmdptr
= dcmd_cmd_tbl
;
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
;
1625 while (cmdptr
->opcode
!= -1 && cmdptr
->opcode
!= cmd
->dcmd_opcode
) {
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
);
1633 trace_megasas_dcmd_enter(cmd
->index
, cmdptr
->desc
, len
);
1634 retval
= cmdptr
->func(s
, cmd
);
1636 if (retval
!= MFI_STAT_INVALID_STATUS
) {
1637 megasas_finish_dcmd(cmd
, len
);
1642 static int megasas_finish_internal_dcmd(MegasasCmd
*cmd
,
1643 SCSIRequest
*req
, dma_addr_t residual
)
1645 int retval
= MFI_STAT_OK
;
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
);
1654 case MFI_DCMD_LD_GET_INFO
:
1655 retval
= megasas_ld_get_info_submit(req
->dev
, lun
, cmd
);
1658 trace_megasas_dcmd_internal_invalid(cmd
->index
, cmd
->dcmd_opcode
);
1659 retval
= MFI_STAT_INVALID_DCMD
;
1662 if (retval
!= MFI_STAT_INVALID_STATUS
) {
1663 megasas_finish_dcmd(cmd
, cmd
->iov_size
);
1668 static int megasas_enqueue_req(MegasasCmd
*cmd
, bool is_write
)
1672 len
= scsi_req_enqueue(cmd
->req
);
1677 if (len
> cmd
->iov_size
) {
1679 trace_megasas_iov_write_overflow(cmd
->index
, len
,
1682 trace_megasas_iov_read_overflow(cmd
->index
, len
,
1686 if (len
< cmd
->iov_size
) {
1688 trace_megasas_iov_write_underflow(cmd
->index
, len
,
1691 trace_megasas_iov_read_underflow(cmd
->index
, len
,
1694 cmd
->iov_size
= len
;
1696 scsi_req_continue(cmd
->req
);
1701 static int megasas_handle_scsi(MegasasState
*s
, MegasasCmd
*cmd
,
1705 int target_id
, lun_id
, cdb_len
;
1707 struct SCSIDevice
*sdev
= NULL
;
1708 bool is_logical
= (frame_cmd
== MFI_CMD_LD_SCSI_IO
);
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
;
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
;
1722 sdev
= scsi_device_find(&s
->bus
, 0, target_id
, lun_id
);
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
);
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
;
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
;
1741 return MFI_STAT_SCSI_DONE_WITH_ERROR
;
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
;
1748 return MFI_STAT_SCSI_DONE_WITH_ERROR
;
1751 cmd
->req
= scsi_req_new(sdev
, cmd
->index
, lun_id
, cdb
, cdb_len
, cmd
);
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
;
1758 return MFI_STAT_SCSI_DONE_WITH_ERROR
;
1761 is_write
= (cmd
->req
->cmd
.mode
== SCSI_XFER_TO_DEV
);
1762 if (cmd
->iov_size
) {
1764 trace_megasas_scsi_write_start(cmd
->index
, cmd
->iov_size
);
1766 trace_megasas_scsi_read_start(cmd
->index
, cmd
->iov_size
);
1769 trace_megasas_scsi_nodata(cmd
->index
);
1771 megasas_enqueue_req(cmd
, is_write
);
1772 return MFI_STAT_INVALID_STATUS
;
1775 static int megasas_handle_io(MegasasState
*s
, MegasasCmd
*cmd
, int frame_cmd
)
1777 uint32_t lba_count
, lba_start_hi
, lba_start_lo
;
1779 bool is_write
= (frame_cmd
== MFI_CMD_LD_WRITE
);
1782 struct SCSIDevice
*sdev
= NULL
;
1783 int target_id
, lun_id
, cdb_len
;
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
;
1790 target_id
= cmd
->frame
->header
.target_id
;
1791 lun_id
= cmd
->frame
->header
.lun_id
;
1792 cdb_len
= cmd
->frame
->header
.cdb_len
;
1794 if (target_id
< MFI_MAX_LD
&& lun_id
== 0) {
1795 sdev
= scsi_device_find(&s
->bus
, 0, target_id
, lun_id
);
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
);
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
;
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
;
1813 return MFI_STAT_SCSI_DONE_WITH_ERROR
;
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
;
1821 return MFI_STAT_SCSI_DONE_WITH_ERROR
;
1824 megasas_encode_lba(cdb
, lba_start
, lba_count
, is_write
);
1825 cmd
->req
= scsi_req_new(sdev
, cmd
->index
,
1826 lun_id
, cdb
, cdb_len
, cmd
);
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
;
1833 return MFI_STAT_SCSI_DONE_WITH_ERROR
;
1835 len
= megasas_enqueue_req(cmd
, is_write
);
1838 trace_megasas_io_write_start(cmd
->index
, lba_start
, lba_count
, len
);
1840 trace_megasas_io_read_start(cmd
->index
, lba_start
, lba_count
, len
);
1843 return MFI_STAT_INVALID_STATUS
;
1846 static QEMUSGList
*megasas_get_sg_list(SCSIRequest
*req
)
1848 MegasasCmd
*cmd
= req
->hba_private
;
1850 if (cmd
->dcmd_opcode
!= -1) {
1857 static void megasas_xfer_complete(SCSIRequest
*req
, uint32_t len
)
1859 MegasasCmd
*cmd
= req
->hba_private
;
1862 trace_megasas_io_complete(cmd
->index
, len
);
1864 if (cmd
->dcmd_opcode
!= -1) {
1865 scsi_req_continue(req
);
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
;
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
);
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
;
1885 memcpy(info
->vpd_page83
, buf
, sizeof(info
->vpd_page83
));
1886 scsi_req_continue(req
);
1891 static void megasas_command_complete(SCSIRequest
*req
, size_t residual
)
1893 MegasasCmd
*cmd
= req
->hba_private
;
1894 uint8_t cmd_status
= MFI_STAT_OK
;
1896 trace_megasas_command_complete(cmd
->index
, req
->status
, residual
);
1898 if (req
->io_canceled
) {
1902 if (cmd
->dcmd_opcode
!= -1) {
1904 * Internal command complete
1906 cmd_status
= megasas_finish_internal_dcmd(cmd
, req
, residual
);
1907 if (cmd_status
== MFI_STAT_INVALID_STATUS
) {
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
;
1916 if (req
->status
== CHECK_CONDITION
) {
1917 megasas_copy_sense(cmd
);
1920 cmd
->frame
->header
.scsi_status
= req
->status
;
1922 cmd
->frame
->header
.cmd_status
= cmd_status
;
1923 megasas_complete_command(cmd
);
1926 static void megasas_command_cancelled(SCSIRequest
*req
)
1928 MegasasCmd
*cmd
= req
->hba_private
;
1933 cmd
->frame
->header
.cmd_status
= MFI_STAT_SCSI_IO_FAILED
;
1934 megasas_complete_command(cmd
);
1937 static int megasas_handle_abort(MegasasState
*s
, MegasasCmd
*cmd
)
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
;
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
;
1947 abort_cmd
= megasas_lookup_frame(s
, abort_addr
);
1949 trace_megasas_abort_no_cmd(cmd
->index
, abort_ctx
);
1953 if (!megasas_use_queue64(s
)) {
1954 abort_ctx
&= (uint64_t)0xFFFFFFFF;
1956 if (abort_cmd
->context
!= abort_ctx
) {
1957 trace_megasas_abort_invalid_context(cmd
->index
, abort_cmd
->context
,
1960 return MFI_STAT_ABORT_NOT_POSSIBLE
;
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
;
1971 static void megasas_handle_frame(MegasasState
*s
, uint64_t frame_addr
,
1972 uint32_t frame_count
)
1974 uint8_t frame_status
= MFI_STAT_INVALID_CMD
;
1975 uint64_t frame_context
;
1980 * Always read 64bit context, top bits will be
1981 * masked out if required in megasas_enqueue_frame()
1983 frame_context
= megasas_frame_get_context(s
, frame_addr
);
1985 cmd
= megasas_enqueue_frame(s
, frame_addr
, frame_context
, frame_count
);
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
);
1995 frame_cmd
= cmd
->frame
->header
.frame_cmd
;
1996 switch (frame_cmd
) {
1998 frame_status
= megasas_init_firmware(s
, cmd
);
2001 frame_status
= megasas_handle_dcmd(s
, cmd
);
2004 frame_status
= megasas_handle_abort(s
, cmd
);
2006 case MFI_CMD_PD_SCSI_IO
:
2007 case MFI_CMD_LD_SCSI_IO
:
2008 frame_status
= megasas_handle_scsi(s
, cmd
, frame_cmd
);
2010 case MFI_CMD_LD_READ
:
2011 case MFI_CMD_LD_WRITE
:
2012 frame_status
= megasas_handle_io(s
, cmd
, frame_cmd
);
2015 trace_megasas_unhandled_frame_cmd(cmd
->index
, frame_cmd
);
2019 if (frame_status
!= MFI_STAT_INVALID_STATUS
) {
2021 cmd
->frame
->header
.cmd_status
= frame_status
;
2023 megasas_frame_set_cmd_status(s
, frame_addr
, frame_status
);
2025 megasas_unmap_frame(s
, cmd
);
2026 megasas_complete_frame(s
, cmd
->context
);
2030 static uint64_t megasas_mmio_read(void *opaque
, hwaddr addr
,
2033 MegasasState
*s
= opaque
;
2034 PCIDevice
*pci_dev
= PCI_DEVICE(s
);
2035 MegasasBaseClass
*base_class
= MEGASAS_GET_CLASS(s
);
2036 uint32_t retval
= 0;
2041 trace_megasas_mmio_readl("MFI_IDB", retval
);
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",
2053 if (megasas_intr_enabled(s
) && s
->doorbell
) {
2054 retval
= base_class
->osts
;
2056 trace_megasas_mmio_readl("MFI_OSTS", retval
);
2059 retval
= s
->intr_mask
;
2060 trace_megasas_mmio_readl("MFI_OMSK", retval
);
2063 retval
= s
->doorbell
? 1 : 0;
2064 trace_megasas_mmio_readl("MFI_ODCR0", retval
);
2068 trace_megasas_mmio_readl("MFI_DIAG", retval
);
2072 trace_megasas_mmio_readl("MFI_OSP1", retval
);
2075 trace_megasas_mmio_invalid_readl(addr
);
2081 static int adp_reset_seq
[] = {0x00, 0x04, 0x0b, 0x02, 0x07, 0x0d};
2083 static void megasas_mmio_write(void *opaque
, hwaddr addr
,
2084 uint64_t val
, unsigned size
)
2086 MegasasState
*s
= opaque
;
2087 PCIDevice
*pci_dev
= PCI_DEVICE(s
);
2088 uint64_t frame_addr
;
2089 uint32_t frame_count
;
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
]);
2101 if (val
& MFI_FWINIT_READY
) {
2102 /* move to FW READY */
2103 megasas_soft_reset(s
);
2105 if (val
& MFI_FWINIT_MFIMODE
) {
2108 if (val
& MFI_FWINIT_STOP_ADP
) {
2109 /* Terminal error, stop processing */
2110 s
->fw_state
= MFI_FWSTATE_FAULT
;
2114 trace_megasas_mmio_writel("MFI_OMSK", 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
);
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);
2128 trace_megasas_intr_enabled();
2131 trace_megasas_intr_disabled();
2132 megasas_soft_reset(s
);
2136 trace_megasas_mmio_writel("MFI_ODCR0", val
);
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
);
2146 trace_megasas_mmio_writel("MFI_IQPH", val
);
2147 /* Received high 32 bits of a 64 bit MFI frame address */
2151 trace_megasas_mmio_writel("MFI_IQPL", val
);
2152 /* Received low 32 bits of a 64 bit MFI frame address */
2155 if (addr
== MFI_IQP
) {
2156 trace_megasas_mmio_writel("MFI_IQP", val
);
2157 /* Received 64 bit MFI frame address */
2160 frame_addr
= (val
& ~0x1F);
2161 /* Add possible 64 bit offset */
2162 frame_addr
|= ((uint64_t)s
->frame_hi
<< 32);
2164 frame_count
= (val
>> 1) & 0xF;
2165 megasas_handle_frame(s
, frame_addr
, frame_count
);
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) {
2173 s
->diag
= MFI_DIAG_WRITE_ENABLE
;
2181 trace_megasas_mmio_writel("MFI_DIAG", val
);
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
);
2192 trace_megasas_mmio_invalid_writel(addr
, val
);
2197 static const MemoryRegionOps megasas_mmio_ops
= {
2198 .read
= megasas_mmio_read
,
2199 .write
= megasas_mmio_write
,
2200 .endianness
= DEVICE_LITTLE_ENDIAN
,
2202 .min_access_size
= 8,
2203 .max_access_size
= 8,
2207 static uint64_t megasas_port_read(void *opaque
, hwaddr addr
,
2210 return megasas_mmio_read(opaque
, addr
& 0xff, size
);
2213 static void megasas_port_write(void *opaque
, hwaddr addr
,
2214 uint64_t val
, unsigned size
)
2216 megasas_mmio_write(opaque
, addr
& 0xff, val
, size
);
2219 static const MemoryRegionOps megasas_port_ops
= {
2220 .read
= megasas_port_read
,
2221 .write
= megasas_port_write
,
2222 .endianness
= DEVICE_LITTLE_ENDIAN
,
2224 .min_access_size
= 4,
2225 .max_access_size
= 4,
2229 static uint64_t megasas_queue_read(void *opaque
, hwaddr addr
,
2235 static void megasas_queue_write(void *opaque
, hwaddr addr
,
2236 uint64_t val
, unsigned size
)
2241 static const MemoryRegionOps megasas_queue_ops
= {
2242 .read
= megasas_queue_read
,
2243 .write
= megasas_queue_write
,
2244 .endianness
= DEVICE_LITTLE_ENDIAN
,
2246 .min_access_size
= 8,
2247 .max_access_size
= 8,
2251 static void megasas_soft_reset(MegasasState
*s
)
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
);
2261 if (s
->fw_state
== MFI_FWSTATE_READY
) {
2265 * The EFI firmware doesn't handle UA,
2266 * so we need to clear the Power On/Reset UA
2267 * after the initial reset.
2269 QTAILQ_FOREACH(kid
, &s
->bus
.qbus
.children
, sibling
) {
2270 SCSIDevice
*sdev
= SCSI_DEVICE(kid
->child
);
2272 sdev
->unit_attention
= SENSE_CODE(NO_SENSE
);
2273 scsi_device_unit_attention_reported(sdev
);
2276 megasas_reset_frames(s
);
2277 s
->reply_queue_len
= s
->fw_cmds
;
2278 s
->reply_queue_pa
= 0;
2281 s
->fw_state
= MFI_FWSTATE_READY
;
2283 s
->intr_mask
= MEGASAS_INTR_DISABLED_MASK
;
2285 s
->flags
&= ~MEGASAS_MASK_USE_QUEUE64
;
2287 s
->boot_event
= s
->event_count
;
2290 static void megasas_scsi_reset(DeviceState
*dev
)
2292 MegasasState
*s
= MEGASAS(dev
);
2294 megasas_soft_reset(s
);
2297 static const VMStateDescription vmstate_megasas_gen1
= {
2300 .minimum_version_id
= 0,
2301 .fields
= (VMStateField
[]) {
2302 VMSTATE_PCI_DEVICE(parent_obj
, MegasasState
),
2303 VMSTATE_MSIX(parent_obj
, MegasasState
),
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()
2315 static const VMStateDescription vmstate_megasas_gen2
= {
2316 .name
= "megasas-gen2",
2318 .minimum_version_id
= 0,
2319 .fields
= (VMStateField
[]) {
2320 VMSTATE_PCI_DEVICE(parent_obj
, MegasasState
),
2321 VMSTATE_MSIX(parent_obj
, MegasasState
),
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()
2333 static void megasas_scsi_uninit(PCIDevice
*d
)
2335 MegasasState
*s
= MEGASAS(d
);
2337 if (megasas_use_msix(s
)) {
2338 msix_uninit(d
, &s
->mmio_io
, &s
->mmio_io
);
2343 static const struct SCSIBusInfo megasas_scsi_info
= {
2345 .max_target
= MFI_MAX_LD
,
2348 .transfer_data
= megasas_xfer_complete
,
2349 .get_sg_list
= megasas_get_sg_list
,
2350 .complete
= megasas_command_complete
,
2351 .cancel
= megasas_command_cancelled
,
2354 static void megasas_scsi_realize(PCIDevice
*dev
, Error
**errp
)
2356 MegasasState
*s
= MEGASAS(dev
);
2357 MegasasBaseClass
*b
= MEGASAS_GET_CLASS(s
);
2363 pci_conf
= dev
->config
;
2365 /* PCI latency timer = 0 */
2366 pci_conf
[PCI_LATENCY_TIMER
] = 0;
2367 /* Interrupt pin 1 */
2368 pci_conf
[PCI_INTERRUPT_PIN
] = 0x01;
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
);
2382 /* With msi=auto, we fall back to MSI off silently */
2383 s
->msi
= ON_OFF_AUTO_OFF
;
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
,
2392 memory_region_init_io(&s
->queue_io
, OBJECT(s
), &megasas_queue_ops
, s
,
2393 "megasas-queue", 0x40000);
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
;
2402 if (pci_is_express(dev
)) {
2403 pcie_endpoint_cap_init(dev
, 0xa0);
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
);
2412 if (megasas_use_msix(s
)) {
2413 msix_vector_use(dev
, 0);
2416 s
->fw_state
= MFI_FWSTATE_READY
;
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
);
2424 if (!s
->hba_serial
) {
2425 s
->hba_serial
= g_strdup(MEGASAS_HBA_SERIAL
);
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
;
2432 s
->fw_sge
= 64 - MFI_PASS_FRAME_SIZE
;
2434 if (s
->fw_cmds
> MEGASAS_MAX_FRAMES
) {
2435 s
->fw_cmds
= MEGASAS_MAX_FRAMES
;
2437 trace_megasas_init(s
->fw_sge
, s
->fw_cmds
,
2438 megasas_is_jbod(s
) ? "jbod" : "raid");
2440 if (megasas_is_jbod(s
)) {
2441 s
->fw_luns
= MFI_MAX_SYS_PDS
;
2443 s
->fw_luns
= MFI_MAX_LD
;
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
;
2454 scsi_bus_init(&s
->bus
, sizeof(s
->bus
), DEVICE(dev
), &megasas_scsi_info
);
2457 static 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(),
2471 static 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(),
2485 typedef struct MegasasInfo
{
2488 const char *product_name
;
2489 const char *product_version
;
2491 uint16_t subsystem_id
;
2495 const VMStateDescription
*vmsd
;
2497 InterfaceInfo
*interfaces
;
2500 static struct MegasasInfo megasas_devices
[] = {
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,
2510 .osts
= MFI_1078_RM
| 1,
2511 .vmsd
= &vmstate_megasas_gen1
,
2512 .props
= megasas_properties_gen1
,
2513 .interfaces
= (InterfaceInfo
[]) {
2514 { INTERFACE_CONVENTIONAL_PCI_DEVICE
},
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,
2526 .osts
= MFI_GEN2_RM
,
2527 .vmsd
= &vmstate_megasas_gen2
,
2528 .props
= megasas_properties_gen2
,
2529 .interfaces
= (InterfaceInfo
[]) {
2530 { INTERFACE_PCIE_DEVICE
},
2536 static void megasas_class_init(ObjectClass
*oc
, void *data
)
2538 DeviceClass
*dc
= DEVICE_CLASS(oc
);
2539 PCIDeviceClass
*pc
= PCI_DEVICE_CLASS(oc
);
2540 MegasasBaseClass
*e
= MEGASAS_CLASS(oc
);
2541 const MegasasInfo
*info
= data
;
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
;
2562 static const TypeInfo megasas_info
= {
2563 .name
= TYPE_MEGASAS_BASE
,
2564 .parent
= TYPE_PCI_DEVICE
,
2565 .instance_size
= sizeof(MegasasState
),
2566 .class_size
= sizeof(MegasasBaseClass
),
2570 static void megasas_register_types(void)
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
= {};
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
;
2585 type_register(&type_info
);
2589 type_init(megasas_register_types
)