28
#include "qemu/osdep.h"
29
#include "qapi/error.h"
30
#include "qemu/main-loop.h"
31
#include "qemu/module.h"
32
#include "hw/scsi/scsi.h"
33
#include "migration/vmstate.h"
34
#include "scsi/constants.h"
35
#include "hw/pci/msi.h"
36
#include "hw/qdev-properties.h"
37
#include "vmw_pvscsi.h"
39
#include "qom/object.h"
42
#define PVSCSI_USE_64BIT (true)
43
#define PVSCSI_PER_VECTOR_MASK (false)
45
#define PVSCSI_MAX_DEVS (64)
46
#define PVSCSI_MSIX_NUM_VECTORS (1)
48
#define PVSCSI_MAX_SG_ELEM 2048
50
#define PVSCSI_MAX_CMD_DATA_WORDS \
51
(sizeof(PVSCSICmdDescSetupRings)/sizeof(uint32_t))
53
#define RS_GET_FIELD(pval, m, field) \
54
ldl_le_pci_dma(&container_of(m, PVSCSIState, rings)->parent_obj, \
55
(m)->rs_pa + offsetof(struct PVSCSIRingsState, field), \
56
pval, MEMTXATTRS_UNSPECIFIED)
57
#define RS_SET_FIELD(m, field, val) \
58
(stl_le_pci_dma(&container_of(m, PVSCSIState, rings)->parent_obj, \
59
(m)->rs_pa + offsetof(struct PVSCSIRingsState, field), val, \
60
MEMTXATTRS_UNSPECIFIED))
63
PCIDeviceClass parent_class;
64
DeviceRealize parent_dc_realize;
67
#define TYPE_PVSCSI "pvscsi"
68
OBJECT_DECLARE_TYPE(PVSCSIState, PVSCSIClass, PVSCSI)
72
#define PVSCSI_COMPAT_OLD_PCI_CONFIGURATION_BIT 0
73
#define PVSCSI_COMPAT_OLD_PCI_CONFIGURATION \
74
(1 << PVSCSI_COMPAT_OLD_PCI_CONFIGURATION_BIT)
75
#define PVSCSI_COMPAT_DISABLE_PCIE_BIT 1
76
#define PVSCSI_COMPAT_DISABLE_PCIE \
77
(1 << PVSCSI_COMPAT_DISABLE_PCIE_BIT)
79
#define PVSCSI_USE_OLD_PCI_CONFIGURATION(s) \
80
((s)->compat_flags & PVSCSI_COMPAT_OLD_PCI_CONFIGURATION)
81
#define PVSCSI_MSI_OFFSET(s) \
82
(PVSCSI_USE_OLD_PCI_CONFIGURATION(s) ? 0x50 : 0x7c)
83
#define PVSCSI_EXP_EP_OFFSET (0x40)
85
typedef struct PVSCSIRingInfo {
87
uint32_t txr_len_mask;
88
uint32_t rxr_len_mask;
89
uint32_t msg_len_mask;
90
uint64_t req_ring_pages_pa[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];
91
uint64_t cmp_ring_pages_pa[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES];
92
uint64_t msg_ring_pages_pa[PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES];
93
uint64_t consumed_ptr;
94
uint64_t filled_cmp_ptr;
95
uint64_t filled_msg_ptr;
98
typedef struct PVSCSISGState {
104
typedef QTAILQ_HEAD(, PVSCSIRequest) PVSCSIRequestList;
107
PCIDevice parent_obj;
108
MemoryRegion io_space;
110
QEMUBH *completion_worker;
111
PVSCSIRequestList pending_queue;
112
PVSCSIRequestList completion_queue;
114
uint64_t reg_interrupt_status;
115
uint64_t reg_interrupt_enabled;
116
uint64_t reg_command_status;
120
uint32_t curr_cmd_data_cntr;
123
uint32_t curr_cmd_data[PVSCSI_MAX_CMD_DATA_WORDS];
125
uint8_t rings_info_valid;
126
uint8_t msg_ring_info_valid;
130
PVSCSIRingInfo rings;
133
uint32_t compat_flags;
136
typedef struct PVSCSIRequest {
144
struct PVSCSIRingReqDesc req;
145
struct PVSCSIRingCmpDesc cmp;
146
QTAILQ_ENTRY(PVSCSIRequest) next;
151
pvscsi_log2(uint32_t input)
155
while (input >> ++log) {
161
pvscsi_ring_init_data(PVSCSIRingInfo *m, PVSCSICmdDescSetupRings *ri)
164
uint32_t txr_len_log2, rxr_len_log2;
165
uint32_t req_ring_size, cmp_ring_size;
166
m->rs_pa = ri->ringsStatePPN << VMW_PAGE_SHIFT;
168
req_ring_size = ri->reqRingNumPages * PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE;
169
cmp_ring_size = ri->cmpRingNumPages * PVSCSI_MAX_NUM_CMP_ENTRIES_PER_PAGE;
170
txr_len_log2 = pvscsi_log2(req_ring_size - 1);
171
rxr_len_log2 = pvscsi_log2(cmp_ring_size - 1);
173
m->txr_len_mask = MASK(txr_len_log2);
174
m->rxr_len_mask = MASK(rxr_len_log2);
177
m->filled_cmp_ptr = 0;
179
for (i = 0; i < ri->reqRingNumPages; i++) {
180
m->req_ring_pages_pa[i] = ri->reqRingPPNs[i] << VMW_PAGE_SHIFT;
183
for (i = 0; i < ri->cmpRingNumPages; i++) {
184
m->cmp_ring_pages_pa[i] = ri->cmpRingPPNs[i] << VMW_PAGE_SHIFT;
187
RS_SET_FIELD(m, reqProdIdx, 0);
188
RS_SET_FIELD(m, reqConsIdx, 0);
189
RS_SET_FIELD(m, reqNumEntriesLog2, txr_len_log2);
191
RS_SET_FIELD(m, cmpProdIdx, 0);
192
RS_SET_FIELD(m, cmpConsIdx, 0);
193
RS_SET_FIELD(m, cmpNumEntriesLog2, rxr_len_log2);
195
trace_pvscsi_ring_init_data(txr_len_log2, rxr_len_log2);
202
pvscsi_ring_init_msg(PVSCSIRingInfo *m, PVSCSICmdDescSetupMsgRing *ri)
208
if (!ri->numPages || ri->numPages > PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES) {
211
ring_size = ri->numPages * PVSCSI_MAX_NUM_MSG_ENTRIES_PER_PAGE;
212
len_log2 = pvscsi_log2(ring_size - 1);
214
m->msg_len_mask = MASK(len_log2);
216
m->filled_msg_ptr = 0;
218
for (i = 0; i < ri->numPages; i++) {
219
m->msg_ring_pages_pa[i] = ri->ringPPNs[i] << VMW_PAGE_SHIFT;
222
RS_SET_FIELD(m, msgProdIdx, 0);
223
RS_SET_FIELD(m, msgConsIdx, 0);
224
RS_SET_FIELD(m, msgNumEntriesLog2, len_log2);
226
trace_pvscsi_ring_init_msg(len_log2);
235
pvscsi_ring_cleanup(PVSCSIRingInfo *mgr)
238
mgr->txr_len_mask = 0;
239
mgr->rxr_len_mask = 0;
240
mgr->msg_len_mask = 0;
241
mgr->consumed_ptr = 0;
242
mgr->filled_cmp_ptr = 0;
243
mgr->filled_msg_ptr = 0;
244
memset(mgr->req_ring_pages_pa, 0, sizeof(mgr->req_ring_pages_pa));
245
memset(mgr->cmp_ring_pages_pa, 0, sizeof(mgr->cmp_ring_pages_pa));
246
memset(mgr->msg_ring_pages_pa, 0, sizeof(mgr->msg_ring_pages_pa));
250
pvscsi_ring_pop_req_descr(PVSCSIRingInfo *mgr)
253
uint32_t ring_size = PVSCSI_MAX_NUM_PAGES_REQ_RING
254
* PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE;
256
RS_GET_FIELD(&ready_ptr, mgr, reqProdIdx);
257
if (ready_ptr != mgr->consumed_ptr
258
&& ready_ptr - mgr->consumed_ptr < ring_size) {
259
uint32_t next_ready_ptr =
260
mgr->consumed_ptr++ & mgr->txr_len_mask;
261
uint32_t next_ready_page =
262
next_ready_ptr / PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE;
263
uint32_t inpage_idx =
264
next_ready_ptr % PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE;
266
return mgr->req_ring_pages_pa[next_ready_page] +
267
inpage_idx * sizeof(PVSCSIRingReqDesc);
274
pvscsi_ring_flush_req(PVSCSIRingInfo *mgr)
276
RS_SET_FIELD(mgr, reqConsIdx, mgr->consumed_ptr);
280
pvscsi_ring_pop_cmp_descr(PVSCSIRingInfo *mgr)
290
uint32_t free_cmp_ptr =
291
mgr->filled_cmp_ptr++ & mgr->rxr_len_mask;
292
uint32_t free_cmp_page =
293
free_cmp_ptr / PVSCSI_MAX_NUM_CMP_ENTRIES_PER_PAGE;
294
uint32_t inpage_idx =
295
free_cmp_ptr % PVSCSI_MAX_NUM_CMP_ENTRIES_PER_PAGE;
296
return mgr->cmp_ring_pages_pa[free_cmp_page] +
297
inpage_idx * sizeof(PVSCSIRingCmpDesc);
301
pvscsi_ring_pop_msg_descr(PVSCSIRingInfo *mgr)
303
uint32_t free_msg_ptr =
304
mgr->filled_msg_ptr++ & mgr->msg_len_mask;
305
uint32_t free_msg_page =
306
free_msg_ptr / PVSCSI_MAX_NUM_MSG_ENTRIES_PER_PAGE;
307
uint32_t inpage_idx =
308
free_msg_ptr % PVSCSI_MAX_NUM_MSG_ENTRIES_PER_PAGE;
309
return mgr->msg_ring_pages_pa[free_msg_page] +
310
inpage_idx * sizeof(PVSCSIRingMsgDesc);
314
pvscsi_ring_flush_cmp(PVSCSIRingInfo *mgr)
319
trace_pvscsi_ring_flush_cmp(mgr->filled_cmp_ptr);
321
RS_SET_FIELD(mgr, cmpProdIdx, mgr->filled_cmp_ptr);
325
pvscsi_ring_msg_has_room(PVSCSIRingInfo *mgr)
330
RS_GET_FIELD(&prodIdx, mgr, msgProdIdx);
331
RS_GET_FIELD(&consIdx, mgr, msgConsIdx);
333
return (prodIdx - consIdx) < (mgr->msg_len_mask + 1);
337
pvscsi_ring_flush_msg(PVSCSIRingInfo *mgr)
342
trace_pvscsi_ring_flush_msg(mgr->filled_msg_ptr);
344
RS_SET_FIELD(mgr, msgProdIdx, mgr->filled_msg_ptr);
348
pvscsi_reset_state(PVSCSIState *s)
350
s->curr_cmd = PVSCSI_CMD_FIRST;
351
s->curr_cmd_data_cntr = 0;
352
s->reg_command_status = PVSCSI_COMMAND_PROCESSING_SUCCEEDED;
353
s->reg_interrupt_status = 0;
354
pvscsi_ring_cleanup(&s->rings);
355
s->rings_info_valid = FALSE;
356
s->msg_ring_info_valid = FALSE;
357
QTAILQ_INIT(&s->pending_queue);
358
QTAILQ_INIT(&s->completion_queue);
362
pvscsi_update_irq_status(PVSCSIState *s)
364
PCIDevice *d = PCI_DEVICE(s);
365
bool should_raise = s->reg_interrupt_enabled & s->reg_interrupt_status;
367
trace_pvscsi_update_irq_level(should_raise, s->reg_interrupt_enabled,
368
s->reg_interrupt_status);
370
if (msi_enabled(d)) {
372
trace_pvscsi_update_irq_msi();
373
msi_notify(d, PVSCSI_VECTOR_COMPLETION);
378
pci_set_irq(d, !!should_raise);
382
pvscsi_raise_completion_interrupt(PVSCSIState *s)
384
s->reg_interrupt_status |= PVSCSI_INTR_CMPL_0;
389
pvscsi_update_irq_status(s);
393
pvscsi_raise_message_interrupt(PVSCSIState *s)
395
s->reg_interrupt_status |= PVSCSI_INTR_MSG_0;
400
pvscsi_update_irq_status(s);
404
pvscsi_cmp_ring_put(PVSCSIState *s, struct PVSCSIRingCmpDesc *cmp_desc)
408
cmp_descr_pa = pvscsi_ring_pop_cmp_descr(&s->rings);
409
trace_pvscsi_cmp_ring_put(cmp_descr_pa);
410
cpu_physical_memory_write(cmp_descr_pa, cmp_desc, sizeof(*cmp_desc));
414
pvscsi_msg_ring_put(PVSCSIState *s, struct PVSCSIRingMsgDesc *msg_desc)
418
msg_descr_pa = pvscsi_ring_pop_msg_descr(&s->rings);
419
trace_pvscsi_msg_ring_put(msg_descr_pa);
420
cpu_physical_memory_write(msg_descr_pa, msg_desc, sizeof(*msg_desc));
424
pvscsi_process_completion_queue(void *opaque)
426
PVSCSIState *s = opaque;
427
PVSCSIRequest *pvscsi_req;
428
bool has_completed = false;
430
while (!QTAILQ_EMPTY(&s->completion_queue)) {
431
pvscsi_req = QTAILQ_FIRST(&s->completion_queue);
432
QTAILQ_REMOVE(&s->completion_queue, pvscsi_req, next);
433
pvscsi_cmp_ring_put(s, &pvscsi_req->cmp);
435
has_completed = true;
439
pvscsi_ring_flush_cmp(&s->rings);
440
pvscsi_raise_completion_interrupt(s);
445
pvscsi_reset_adapter(PVSCSIState *s)
448
bus_cold_reset(BUS(&s->bus));
450
pvscsi_process_completion_queue(s);
451
assert(QTAILQ_EMPTY(&s->pending_queue));
452
pvscsi_reset_state(s);
456
pvscsi_schedule_completion_processing(PVSCSIState *s)
459
if (!QTAILQ_EMPTY(&s->completion_queue)) {
460
qemu_bh_schedule(s->completion_worker);
465
pvscsi_complete_request(PVSCSIState *s, PVSCSIRequest *r)
467
assert(!r->completed);
469
trace_pvscsi_complete_request(r->cmp.context, r->cmp.dataLen,
471
if (r->sreq != NULL) {
472
scsi_req_unref(r->sreq);
476
QTAILQ_REMOVE(&s->pending_queue, r, next);
477
QTAILQ_INSERT_TAIL(&s->completion_queue, r, next);
478
pvscsi_schedule_completion_processing(s);
481
static QEMUSGList *pvscsi_get_sg_list(SCSIRequest *r)
483
PVSCSIRequest *req = r->hba_private;
485
trace_pvscsi_get_sg_list(req->sgl.nsg, req->sgl.size);
491
pvscsi_get_next_sg_elem(PVSCSISGState *sg)
493
struct PVSCSISGElement elem;
495
cpu_physical_memory_read(sg->elemAddr, &elem, sizeof(elem));
496
if ((elem.flags & ~PVSCSI_KNOWN_FLAGS) != 0) {
503
trace_pvscsi_get_next_sg_elem(elem.flags);
506
sg->elemAddr += sizeof(elem);
507
sg->dataAddr = elem.addr;
508
sg->resid = elem.length;
512
pvscsi_write_sense(PVSCSIRequest *r, uint8_t *sense, int len)
514
r->cmp.senseLen = MIN(r->req.senseLen, len);
515
r->sense_key = sense[(sense[0] & 2) ? 1 : 2];
516
cpu_physical_memory_write(r->req.senseAddr, sense, r->cmp.senseLen);
520
pvscsi_command_failed(SCSIRequest *req)
522
PVSCSIRequest *pvscsi_req = req->hba_private;
526
trace_pvscsi_command_complete_not_found(req->tag);
531
switch (req->host_status) {
532
case SCSI_HOST_NO_LUN:
533
pvscsi_req->cmp.hostStatus = BTSTAT_LUNMISMATCH;
536
pvscsi_req->cmp.hostStatus = BTSTAT_ABORTQUEUE;
538
case SCSI_HOST_TIME_OUT:
539
case SCSI_HOST_ABORTED:
540
pvscsi_req->cmp.hostStatus = BTSTAT_SENTRST;
542
case SCSI_HOST_BAD_RESPONSE:
543
pvscsi_req->cmp.hostStatus = BTSTAT_SELTIMEO;
545
case SCSI_HOST_RESET:
546
pvscsi_req->cmp.hostStatus = BTSTAT_BUSRESET;
549
pvscsi_req->cmp.hostStatus = BTSTAT_HASOFTWARE;
552
pvscsi_req->cmp.scsiStatus = GOOD;
553
qemu_sglist_destroy(&pvscsi_req->sgl);
554
pvscsi_complete_request(s, pvscsi_req);
558
pvscsi_command_complete(SCSIRequest *req, size_t resid)
560
PVSCSIRequest *pvscsi_req = req->hba_private;
564
trace_pvscsi_command_complete_not_found(req->tag);
571
trace_pvscsi_command_complete_data_run();
572
pvscsi_req->cmp.hostStatus = BTSTAT_DATARUN;
575
pvscsi_req->cmp.scsiStatus = req->status;
576
if (pvscsi_req->cmp.scsiStatus == CHECK_CONDITION) {
577
uint8_t sense[SCSI_SENSE_BUF_SIZE];
579
scsi_req_get_sense(pvscsi_req->sreq, sense, sizeof(sense));
581
trace_pvscsi_command_complete_sense_len(sense_len);
582
pvscsi_write_sense(pvscsi_req, sense, sense_len);
584
qemu_sglist_destroy(&pvscsi_req->sgl);
585
pvscsi_complete_request(s, pvscsi_req);
589
pvscsi_send_msg(PVSCSIState *s, SCSIDevice *dev, uint32_t msg_type)
591
if (s->msg_ring_info_valid && pvscsi_ring_msg_has_room(&s->rings)) {
592
PVSCSIMsgDescDevStatusChanged msg = {0};
595
msg.bus = dev->channel;
596
msg.target = dev->id;
597
msg.lun[1] = dev->lun;
599
pvscsi_msg_ring_put(s, (PVSCSIRingMsgDesc *)&msg);
600
pvscsi_ring_flush_msg(&s->rings);
601
pvscsi_raise_message_interrupt(s);
606
pvscsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp)
608
PVSCSIState *s = PVSCSI(hotplug_dev);
610
pvscsi_send_msg(s, SCSI_DEVICE(dev), PVSCSI_MSG_DEV_ADDED);
614
pvscsi_hot_unplug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp)
616
PVSCSIState *s = PVSCSI(hotplug_dev);
618
pvscsi_send_msg(s, SCSI_DEVICE(dev), PVSCSI_MSG_DEV_REMOVED);
619
qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
623
pvscsi_request_cancelled(SCSIRequest *req)
625
PVSCSIRequest *pvscsi_req = req->hba_private;
626
PVSCSIState *s = pvscsi_req->dev;
628
if (pvscsi_req->completed) {
632
if (pvscsi_req->dev->resetting) {
633
pvscsi_req->cmp.hostStatus = BTSTAT_BUSRESET;
635
pvscsi_req->cmp.hostStatus = BTSTAT_ABORTQUEUE;
638
pvscsi_complete_request(s, pvscsi_req);
642
pvscsi_device_find(PVSCSIState *s, int channel, int target,
643
uint8_t *requested_lun, uint8_t *target_lun)
645
if (requested_lun[0] || requested_lun[2] || requested_lun[3] ||
646
requested_lun[4] || requested_lun[5] || requested_lun[6] ||
647
requested_lun[7] || (target > PVSCSI_MAX_DEVS)) {
650
*target_lun = requested_lun[1];
651
return scsi_device_find(&s->bus, channel, target, *target_lun);
655
static PVSCSIRequest *
656
pvscsi_queue_pending_descriptor(PVSCSIState *s, SCSIDevice **d,
657
struct PVSCSIRingReqDesc *descr)
659
PVSCSIRequest *pvscsi_req;
662
pvscsi_req = g_malloc0(sizeof(*pvscsi_req));
664
pvscsi_req->req = *descr;
665
pvscsi_req->cmp.context = pvscsi_req->req.context;
666
QTAILQ_INSERT_TAIL(&s->pending_queue, pvscsi_req, next);
668
*d = pvscsi_device_find(s, descr->bus, descr->target, descr->lun, &lun);
670
pvscsi_req->lun = lun;
677
pvscsi_convert_sglist(PVSCSIRequest *r)
679
uint32_t chunk_size, elmcnt = 0;
680
uint64_t data_length = r->req.dataLen;
681
PVSCSISGState sg = r->sg;
682
while (data_length && elmcnt < PVSCSI_MAX_SG_ELEM) {
683
while (!sg.resid && elmcnt++ < PVSCSI_MAX_SG_ELEM) {
684
pvscsi_get_next_sg_elem(&sg);
685
trace_pvscsi_convert_sglist(r->req.context, r->sg.dataAddr,
688
chunk_size = MIN(data_length, sg.resid);
690
qemu_sglist_add(&r->sgl, sg.dataAddr, chunk_size);
693
sg.dataAddr += chunk_size;
694
data_length -= chunk_size;
695
sg.resid -= chunk_size;
700
pvscsi_build_sglist(PVSCSIState *s, PVSCSIRequest *r)
702
PCIDevice *d = PCI_DEVICE(s);
704
pci_dma_sglist_init(&r->sgl, d, 1);
705
if (r->req.flags & PVSCSI_FLAG_CMD_WITH_SG_LIST) {
706
pvscsi_convert_sglist(r);
708
qemu_sglist_add(&r->sgl, r->req.dataAddr, r->req.dataLen);
713
pvscsi_process_request_descriptor(PVSCSIState *s,
714
struct PVSCSIRingReqDesc *descr)
717
PVSCSIRequest *r = pvscsi_queue_pending_descriptor(s, &d, descr);
720
trace_pvscsi_process_req_descr(descr->cdb[0], descr->context);
723
r->cmp.hostStatus = BTSTAT_SELTIMEO;
724
trace_pvscsi_process_req_descr_unknown_device();
725
pvscsi_complete_request(s, r);
729
if (descr->flags & PVSCSI_FLAG_CMD_WITH_SG_LIST) {
730
r->sg.elemAddr = descr->dataAddr;
733
r->sreq = scsi_req_new(d, descr->context, r->lun, descr->cdb, descr->cdbLen, r);
734
if (r->sreq->cmd.mode == SCSI_XFER_FROM_DEV &&
735
(descr->flags & PVSCSI_FLAG_CMD_DIR_TODEVICE)) {
736
r->cmp.hostStatus = BTSTAT_BADMSG;
737
trace_pvscsi_process_req_descr_invalid_dir();
738
scsi_req_cancel(r->sreq);
741
if (r->sreq->cmd.mode == SCSI_XFER_TO_DEV &&
742
(descr->flags & PVSCSI_FLAG_CMD_DIR_TOHOST)) {
743
r->cmp.hostStatus = BTSTAT_BADMSG;
744
trace_pvscsi_process_req_descr_invalid_dir();
745
scsi_req_cancel(r->sreq);
749
pvscsi_build_sglist(s, r);
750
n = scsi_req_enqueue(r->sreq);
753
scsi_req_continue(r->sreq);
758
pvscsi_process_io(PVSCSIState *s)
760
PVSCSIRingReqDesc descr;
761
hwaddr next_descr_pa;
763
if (!s->rings_info_valid) {
767
while ((next_descr_pa = pvscsi_ring_pop_req_descr(&s->rings)) != 0) {
772
trace_pvscsi_process_io(next_descr_pa);
773
cpu_physical_memory_read(next_descr_pa, &descr, sizeof(descr));
774
pvscsi_process_request_descriptor(s, &descr);
777
pvscsi_ring_flush_req(&s->rings);
781
pvscsi_dbg_dump_tx_rings_config(PVSCSICmdDescSetupRings *rc)
784
trace_pvscsi_tx_rings_ppn("Rings State", rc->ringsStatePPN);
786
trace_pvscsi_tx_rings_num_pages("Request Ring", rc->reqRingNumPages);
787
for (i = 0; i < rc->reqRingNumPages; i++) {
788
trace_pvscsi_tx_rings_ppn("Request Ring", rc->reqRingPPNs[i]);
791
trace_pvscsi_tx_rings_num_pages("Confirm Ring", rc->cmpRingNumPages);
792
for (i = 0; i < rc->cmpRingNumPages; i++) {
793
trace_pvscsi_tx_rings_ppn("Confirm Ring", rc->cmpRingPPNs[i]);
798
pvscsi_on_cmd_config(PVSCSIState *s)
800
trace_pvscsi_on_cmd_noimpl("PVSCSI_CMD_CONFIG");
801
return PVSCSI_COMMAND_PROCESSING_FAILED;
805
pvscsi_on_cmd_unplug(PVSCSIState *s)
807
trace_pvscsi_on_cmd_noimpl("PVSCSI_CMD_DEVICE_UNPLUG");
808
return PVSCSI_COMMAND_PROCESSING_FAILED;
812
pvscsi_on_issue_scsi(PVSCSIState *s)
814
trace_pvscsi_on_cmd_noimpl("PVSCSI_CMD_ISSUE_SCSI");
815
return PVSCSI_COMMAND_PROCESSING_FAILED;
819
pvscsi_on_cmd_setup_rings(PVSCSIState *s)
821
PVSCSICmdDescSetupRings *rc =
822
(PVSCSICmdDescSetupRings *) s->curr_cmd_data;
824
trace_pvscsi_on_cmd_arrived("PVSCSI_CMD_SETUP_RINGS");
826
if (!rc->reqRingNumPages
827
|| rc->reqRingNumPages > PVSCSI_SETUP_RINGS_MAX_NUM_PAGES
828
|| !rc->cmpRingNumPages
829
|| rc->cmpRingNumPages > PVSCSI_SETUP_RINGS_MAX_NUM_PAGES) {
830
return PVSCSI_COMMAND_PROCESSING_FAILED;
833
pvscsi_dbg_dump_tx_rings_config(rc);
834
pvscsi_ring_init_data(&s->rings, rc);
836
s->rings_info_valid = TRUE;
837
return PVSCSI_COMMAND_PROCESSING_SUCCEEDED;
841
pvscsi_on_cmd_abort(PVSCSIState *s)
843
PVSCSICmdDescAbortCmd *cmd = (PVSCSICmdDescAbortCmd *) s->curr_cmd_data;
844
PVSCSIRequest *r, *next;
846
trace_pvscsi_on_cmd_abort(cmd->context, cmd->target);
848
QTAILQ_FOREACH_SAFE(r, &s->pending_queue, next, next) {
849
if (r->req.context == cmd->context) {
854
assert(!r->completed);
855
r->cmp.hostStatus = BTSTAT_ABORTQUEUE;
856
scsi_req_cancel(r->sreq);
859
return PVSCSI_COMMAND_PROCESSING_SUCCEEDED;
863
pvscsi_on_cmd_unknown(PVSCSIState *s)
865
trace_pvscsi_on_cmd_unknown_data(s->curr_cmd_data[0]);
866
return PVSCSI_COMMAND_PROCESSING_FAILED;
870
pvscsi_on_cmd_reset_device(PVSCSIState *s)
872
uint8_t target_lun = 0;
873
struct PVSCSICmdDescResetDevice *cmd =
874
(struct PVSCSICmdDescResetDevice *) s->curr_cmd_data;
877
sdev = pvscsi_device_find(s, 0, cmd->target, cmd->lun, &target_lun);
879
trace_pvscsi_on_cmd_reset_dev(cmd->target, (int) target_lun, sdev);
883
device_cold_reset(&sdev->qdev);
885
return PVSCSI_COMMAND_PROCESSING_SUCCEEDED;
888
return PVSCSI_COMMAND_PROCESSING_FAILED;
892
pvscsi_on_cmd_reset_bus(PVSCSIState *s)
894
trace_pvscsi_on_cmd_arrived("PVSCSI_CMD_RESET_BUS");
897
bus_cold_reset(BUS(&s->bus));
899
return PVSCSI_COMMAND_PROCESSING_SUCCEEDED;
903
pvscsi_on_cmd_setup_msg_ring(PVSCSIState *s)
905
PVSCSICmdDescSetupMsgRing *rc =
906
(PVSCSICmdDescSetupMsgRing *) s->curr_cmd_data;
908
trace_pvscsi_on_cmd_arrived("PVSCSI_CMD_SETUP_MSG_RING");
911
return PVSCSI_COMMAND_PROCESSING_FAILED;
914
if (s->rings_info_valid) {
915
if (pvscsi_ring_init_msg(&s->rings, rc) < 0) {
916
return PVSCSI_COMMAND_PROCESSING_FAILED;
918
s->msg_ring_info_valid = TRUE;
920
return sizeof(PVSCSICmdDescSetupMsgRing) / sizeof(uint32_t);
924
pvscsi_on_cmd_adapter_reset(PVSCSIState *s)
926
trace_pvscsi_on_cmd_arrived("PVSCSI_CMD_ADAPTER_RESET");
928
pvscsi_reset_adapter(s);
929
return PVSCSI_COMMAND_PROCESSING_SUCCEEDED;
934
uint64_t (*handler_fn)(PVSCSIState *s);
935
} pvscsi_commands[] = {
936
[PVSCSI_CMD_FIRST] = {
938
.handler_fn = pvscsi_on_cmd_unknown,
942
[PVSCSI_CMD_CONFIG] = {
943
.data_size = 6 * sizeof(uint32_t),
944
.handler_fn = pvscsi_on_cmd_config,
948
[PVSCSI_CMD_ISSUE_SCSI] = {
950
.handler_fn = pvscsi_on_issue_scsi,
954
[PVSCSI_CMD_DEVICE_UNPLUG] = {
956
.handler_fn = pvscsi_on_cmd_unplug,
959
[PVSCSI_CMD_SETUP_RINGS] = {
960
.data_size = sizeof(PVSCSICmdDescSetupRings),
961
.handler_fn = pvscsi_on_cmd_setup_rings,
964
[PVSCSI_CMD_RESET_DEVICE] = {
965
.data_size = sizeof(struct PVSCSICmdDescResetDevice),
966
.handler_fn = pvscsi_on_cmd_reset_device,
969
[PVSCSI_CMD_RESET_BUS] = {
971
.handler_fn = pvscsi_on_cmd_reset_bus,
974
[PVSCSI_CMD_SETUP_MSG_RING] = {
975
.data_size = sizeof(PVSCSICmdDescSetupMsgRing),
976
.handler_fn = pvscsi_on_cmd_setup_msg_ring,
979
[PVSCSI_CMD_ADAPTER_RESET] = {
981
.handler_fn = pvscsi_on_cmd_adapter_reset,
984
[PVSCSI_CMD_ABORT_CMD] = {
985
.data_size = sizeof(struct PVSCSICmdDescAbortCmd),
986
.handler_fn = pvscsi_on_cmd_abort,
991
pvscsi_do_command_processing(PVSCSIState *s)
993
size_t bytes_arrived = s->curr_cmd_data_cntr * sizeof(uint32_t);
995
assert(s->curr_cmd < PVSCSI_CMD_LAST);
996
if (bytes_arrived >= pvscsi_commands[s->curr_cmd].data_size) {
997
s->reg_command_status = pvscsi_commands[s->curr_cmd].handler_fn(s);
998
s->curr_cmd = PVSCSI_CMD_FIRST;
999
s->curr_cmd_data_cntr = 0;
1004
pvscsi_on_command_data(PVSCSIState *s, uint32_t value)
1006
size_t bytes_arrived = s->curr_cmd_data_cntr * sizeof(uint32_t);
1008
assert(bytes_arrived < sizeof(s->curr_cmd_data));
1009
s->curr_cmd_data[s->curr_cmd_data_cntr++] = value;
1011
pvscsi_do_command_processing(s);
1015
pvscsi_on_command(PVSCSIState *s, uint64_t cmd_id)
1017
if ((cmd_id > PVSCSI_CMD_FIRST) && (cmd_id < PVSCSI_CMD_LAST)) {
1018
s->curr_cmd = cmd_id;
1020
s->curr_cmd = PVSCSI_CMD_FIRST;
1021
trace_pvscsi_on_cmd_unknown(cmd_id);
1024
s->curr_cmd_data_cntr = 0;
1025
s->reg_command_status = PVSCSI_COMMAND_NOT_ENOUGH_DATA;
1027
pvscsi_do_command_processing(s);
1031
pvscsi_io_write(void *opaque, hwaddr addr,
1032
uint64_t val, unsigned size)
1034
PVSCSIState *s = opaque;
1037
case PVSCSI_REG_OFFSET_COMMAND:
1038
pvscsi_on_command(s, val);
1041
case PVSCSI_REG_OFFSET_COMMAND_DATA:
1042
pvscsi_on_command_data(s, (uint32_t) val);
1045
case PVSCSI_REG_OFFSET_INTR_STATUS:
1046
trace_pvscsi_io_write("PVSCSI_REG_OFFSET_INTR_STATUS", val);
1047
s->reg_interrupt_status &= ~val;
1048
pvscsi_update_irq_status(s);
1049
pvscsi_schedule_completion_processing(s);
1052
case PVSCSI_REG_OFFSET_INTR_MASK:
1053
trace_pvscsi_io_write("PVSCSI_REG_OFFSET_INTR_MASK", val);
1054
s->reg_interrupt_enabled = val;
1055
pvscsi_update_irq_status(s);
1058
case PVSCSI_REG_OFFSET_KICK_NON_RW_IO:
1059
trace_pvscsi_io_write("PVSCSI_REG_OFFSET_KICK_NON_RW_IO", val);
1060
pvscsi_process_io(s);
1063
case PVSCSI_REG_OFFSET_KICK_RW_IO:
1064
trace_pvscsi_io_write("PVSCSI_REG_OFFSET_KICK_RW_IO", val);
1065
pvscsi_process_io(s);
1068
case PVSCSI_REG_OFFSET_DEBUG:
1069
trace_pvscsi_io_write("PVSCSI_REG_OFFSET_DEBUG", val);
1073
trace_pvscsi_io_write_unknown(addr, size, val);
1080
pvscsi_io_read(void *opaque, hwaddr addr, unsigned size)
1082
PVSCSIState *s = opaque;
1085
case PVSCSI_REG_OFFSET_INTR_STATUS:
1086
trace_pvscsi_io_read("PVSCSI_REG_OFFSET_INTR_STATUS",
1087
s->reg_interrupt_status);
1088
return s->reg_interrupt_status;
1090
case PVSCSI_REG_OFFSET_INTR_MASK:
1091
trace_pvscsi_io_read("PVSCSI_REG_OFFSET_INTR_MASK",
1092
s->reg_interrupt_status);
1093
return s->reg_interrupt_enabled;
1095
case PVSCSI_REG_OFFSET_COMMAND_STATUS:
1096
trace_pvscsi_io_read("PVSCSI_REG_OFFSET_COMMAND_STATUS",
1097
s->reg_interrupt_status);
1098
return s->reg_command_status;
1101
trace_pvscsi_io_read_unknown(addr, size);
1108
pvscsi_init_msi(PVSCSIState *s)
1111
PCIDevice *d = PCI_DEVICE(s);
1113
res = msi_init(d, PVSCSI_MSI_OFFSET(s), PVSCSI_MSIX_NUM_VECTORS,
1114
PVSCSI_USE_64BIT, PVSCSI_PER_VECTOR_MASK, NULL);
1116
trace_pvscsi_init_msi_fail(res);
1117
s->msi_used = false;
1124
pvscsi_cleanup_msi(PVSCSIState *s)
1126
PCIDevice *d = PCI_DEVICE(s);
1131
static const MemoryRegionOps pvscsi_ops = {
1132
.read = pvscsi_io_read,
1133
.write = pvscsi_io_write,
1134
.endianness = DEVICE_LITTLE_ENDIAN,
1136
.min_access_size = 4,
1137
.max_access_size = 4,
1141
static const struct SCSIBusInfo pvscsi_scsi_info = {
1143
.max_target = PVSCSI_MAX_DEVS,
1147
.get_sg_list = pvscsi_get_sg_list,
1148
.complete = pvscsi_command_complete,
1149
.cancel = pvscsi_request_cancelled,
1150
.fail = pvscsi_command_failed,
1154
pvscsi_realizefn(PCIDevice *pci_dev, Error **errp)
1156
PVSCSIState *s = PVSCSI(pci_dev);
1158
trace_pvscsi_state("init");
1161
if (PVSCSI_USE_OLD_PCI_CONFIGURATION(s)) {
1162
pci_set_word(pci_dev->config + PCI_SUBSYSTEM_ID, 0x1000);
1164
pci_set_word(pci_dev->config + PCI_SUBSYSTEM_VENDOR_ID,
1165
PCI_VENDOR_ID_VMWARE);
1166
pci_set_word(pci_dev->config + PCI_SUBSYSTEM_ID,
1167
PCI_DEVICE_ID_VMWARE_PVSCSI);
1168
pci_config_set_revision(pci_dev->config, 0x2);
1172
pci_dev->config[PCI_LATENCY_TIMER] = 0xff;
1175
pci_config_set_interrupt_pin(pci_dev->config, 1);
1177
memory_region_init_io(&s->io_space, OBJECT(s), &pvscsi_ops, s,
1178
"pvscsi-io", PVSCSI_MEM_SPACE_SIZE);
1179
pci_register_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->io_space);
1183
if (pci_is_express(pci_dev) && pci_bus_is_express(pci_get_bus(pci_dev))) {
1184
pcie_endpoint_cap_init(pci_dev, PVSCSI_EXP_EP_OFFSET);
1187
s->completion_worker = qemu_bh_new_guarded(pvscsi_process_completion_queue, s,
1188
&DEVICE(pci_dev)->mem_reentrancy_guard);
1190
scsi_bus_init(&s->bus, sizeof(s->bus), DEVICE(pci_dev), &pvscsi_scsi_info);
1192
qbus_set_hotplug_handler(BUS(&s->bus), OBJECT(s));
1193
pvscsi_reset_state(s);
1197
pvscsi_uninit(PCIDevice *pci_dev)
1199
PVSCSIState *s = PVSCSI(pci_dev);
1201
trace_pvscsi_state("uninit");
1202
qemu_bh_delete(s->completion_worker);
1204
pvscsi_cleanup_msi(s);
1208
pvscsi_reset(DeviceState *dev)
1210
PCIDevice *d = PCI_DEVICE(dev);
1211
PVSCSIState *s = PVSCSI(d);
1213
trace_pvscsi_state("reset");
1214
pvscsi_reset_adapter(s);
1218
pvscsi_pre_save(void *opaque)
1220
PVSCSIState *s = (PVSCSIState *) opaque;
1222
trace_pvscsi_state("presave");
1224
assert(QTAILQ_EMPTY(&s->pending_queue));
1225
assert(QTAILQ_EMPTY(&s->completion_queue));
1231
pvscsi_post_load(void *opaque, int version_id)
1233
trace_pvscsi_state("postload");
1237
static bool pvscsi_vmstate_need_pcie_device(void *opaque)
1239
PVSCSIState *s = PVSCSI(opaque);
1241
return !(s->compat_flags & PVSCSI_COMPAT_DISABLE_PCIE);
1244
static bool pvscsi_vmstate_test_pci_device(void *opaque, int version_id)
1246
return !pvscsi_vmstate_need_pcie_device(opaque);
1249
static const VMStateDescription vmstate_pvscsi_pcie_device = {
1250
.name = "pvscsi/pcie",
1251
.needed = pvscsi_vmstate_need_pcie_device,
1252
.fields = (const VMStateField[]) {
1253
VMSTATE_PCI_DEVICE(parent_obj, PVSCSIState),
1254
VMSTATE_END_OF_LIST()
1258
static const VMStateDescription vmstate_pvscsi = {
1261
.minimum_version_id = 0,
1262
.pre_save = pvscsi_pre_save,
1263
.post_load = pvscsi_post_load,
1264
.fields = (const VMStateField[]) {
1265
VMSTATE_STRUCT_TEST(parent_obj, PVSCSIState,
1266
pvscsi_vmstate_test_pci_device, 0,
1267
vmstate_pci_device, PCIDevice),
1268
VMSTATE_UINT8(msi_used, PVSCSIState),
1269
VMSTATE_UINT32(resetting, PVSCSIState),
1270
VMSTATE_UINT64(reg_interrupt_status, PVSCSIState),
1271
VMSTATE_UINT64(reg_interrupt_enabled, PVSCSIState),
1272
VMSTATE_UINT64(reg_command_status, PVSCSIState),
1273
VMSTATE_UINT64(curr_cmd, PVSCSIState),
1274
VMSTATE_UINT32(curr_cmd_data_cntr, PVSCSIState),
1275
VMSTATE_UINT32_ARRAY(curr_cmd_data, PVSCSIState,
1276
ARRAY_SIZE(((PVSCSIState *)NULL)->curr_cmd_data)),
1277
VMSTATE_UINT8(rings_info_valid, PVSCSIState),
1278
VMSTATE_UINT8(msg_ring_info_valid, PVSCSIState),
1279
VMSTATE_UINT8(use_msg, PVSCSIState),
1281
VMSTATE_UINT64(rings.rs_pa, PVSCSIState),
1282
VMSTATE_UINT32(rings.txr_len_mask, PVSCSIState),
1283
VMSTATE_UINT32(rings.rxr_len_mask, PVSCSIState),
1284
VMSTATE_UINT64_ARRAY(rings.req_ring_pages_pa, PVSCSIState,
1285
PVSCSI_SETUP_RINGS_MAX_NUM_PAGES),
1286
VMSTATE_UINT64_ARRAY(rings.cmp_ring_pages_pa, PVSCSIState,
1287
PVSCSI_SETUP_RINGS_MAX_NUM_PAGES),
1288
VMSTATE_UINT64(rings.consumed_ptr, PVSCSIState),
1289
VMSTATE_UINT64(rings.filled_cmp_ptr, PVSCSIState),
1291
VMSTATE_END_OF_LIST()
1293
.subsections = (const VMStateDescription * const []) {
1294
&vmstate_pvscsi_pcie_device,
1299
static Property pvscsi_properties[] = {
1300
DEFINE_PROP_UINT8("use_msg", PVSCSIState, use_msg, 1),
1301
DEFINE_PROP_BIT("x-old-pci-configuration", PVSCSIState, compat_flags,
1302
PVSCSI_COMPAT_OLD_PCI_CONFIGURATION_BIT, false),
1303
DEFINE_PROP_BIT("x-disable-pcie", PVSCSIState, compat_flags,
1304
PVSCSI_COMPAT_DISABLE_PCIE_BIT, false),
1305
DEFINE_PROP_END_OF_LIST(),
1308
static void pvscsi_realize(DeviceState *qdev, Error **errp)
1310
PVSCSIClass *pvs_c = PVSCSI_GET_CLASS(qdev);
1311
PCIDevice *pci_dev = PCI_DEVICE(qdev);
1312
PVSCSIState *s = PVSCSI(qdev);
1314
if (!(s->compat_flags & PVSCSI_COMPAT_DISABLE_PCIE)) {
1315
pci_dev->cap_present |= QEMU_PCI_CAP_EXPRESS;
1318
pvs_c->parent_dc_realize(qdev, errp);
1321
static void pvscsi_class_init(ObjectClass *klass, void *data)
1323
DeviceClass *dc = DEVICE_CLASS(klass);
1324
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1325
PVSCSIClass *pvs_k = PVSCSI_CLASS(klass);
1326
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
1328
k->realize = pvscsi_realizefn;
1329
k->exit = pvscsi_uninit;
1330
k->vendor_id = PCI_VENDOR_ID_VMWARE;
1331
k->device_id = PCI_DEVICE_ID_VMWARE_PVSCSI;
1332
k->class_id = PCI_CLASS_STORAGE_SCSI;
1333
k->subsystem_id = 0x1000;
1334
device_class_set_parent_realize(dc, pvscsi_realize,
1335
&pvs_k->parent_dc_realize);
1336
dc->reset = pvscsi_reset;
1337
dc->vmsd = &vmstate_pvscsi;
1338
device_class_set_props(dc, pvscsi_properties);
1339
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
1340
hc->unplug = pvscsi_hot_unplug;
1341
hc->plug = pvscsi_hotplug;
1344
static const TypeInfo pvscsi_info = {
1345
.name = TYPE_PVSCSI,
1346
.parent = TYPE_PCI_DEVICE,
1347
.class_size = sizeof(PVSCSIClass),
1348
.instance_size = sizeof(PVSCSIState),
1349
.class_init = pvscsi_class_init,
1350
.interfaces = (InterfaceInfo[]) {
1351
{ TYPE_HOTPLUG_HANDLER },
1352
{ INTERFACE_PCIE_DEVICE },
1353
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
1359
pvscsi_register_types(void)
1361
type_register_static(&pvscsi_info);
1364
type_init(pvscsi_register_types);