|
@@ -109,8 +109,8 @@ struct MegasasState {
|
|
|
uint64_t reply_queue_pa;
|
|
|
void *reply_queue;
|
|
|
uint16_t reply_queue_len;
|
|
|
- uint16_t reply_queue_head;
|
|
|
- uint16_t reply_queue_tail;
|
|
|
+ uint32_t reply_queue_head;
|
|
|
+ uint32_t reply_queue_tail;
|
|
|
uint64_t consumer_pa;
|
|
|
uint64_t producer_pa;
|
|
|
|
|
@@ -168,14 +168,16 @@ static void megasas_frame_set_cmd_status(MegasasState *s,
|
|
|
unsigned long frame, uint8_t v)
|
|
|
{
|
|
|
PCIDevice *pci = &s->parent_obj;
|
|
|
- stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, cmd_status), v);
|
|
|
+ stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, cmd_status),
|
|
|
+ v, MEMTXATTRS_UNSPECIFIED);
|
|
|
}
|
|
|
|
|
|
static void megasas_frame_set_scsi_status(MegasasState *s,
|
|
|
unsigned long frame, uint8_t v)
|
|
|
{
|
|
|
PCIDevice *pci = &s->parent_obj;
|
|
|
- stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, scsi_status), v);
|
|
|
+ stb_pci_dma(pci, frame + offsetof(struct mfi_frame_header, scsi_status),
|
|
|
+ v, MEMTXATTRS_UNSPECIFIED);
|
|
|
}
|
|
|
|
|
|
static inline const char *mfi_frame_desc(unsigned int cmd)
|
|
@@ -200,7 +202,12 @@ static uint64_t megasas_frame_get_context(MegasasState *s,
|
|
|
unsigned long frame)
|
|
|
{
|
|
|
PCIDevice *pci = &s->parent_obj;
|
|
|
- return ldq_le_pci_dma(pci, frame + offsetof(struct mfi_frame_header, context));
|
|
|
+ uint64_t val;
|
|
|
+
|
|
|
+ ldq_le_pci_dma(pci, frame + offsetof(struct mfi_frame_header, context),
|
|
|
+ &val, MEMTXATTRS_UNSPECIFIED);
|
|
|
+
|
|
|
+ return val;
|
|
|
}
|
|
|
|
|
|
static bool megasas_frame_is_ieee_sgl(MegasasCmd *cmd)
|
|
@@ -532,7 +539,8 @@ static MegasasCmd *megasas_enqueue_frame(MegasasState *s,
|
|
|
s->busy++;
|
|
|
|
|
|
if (s->consumer_pa) {
|
|
|
- s->reply_queue_tail = ldl_le_pci_dma(pcid, s->consumer_pa);
|
|
|
+ ldl_le_pci_dma(pcid, s->consumer_pa, &s->reply_queue_tail,
|
|
|
+ MEMTXATTRS_UNSPECIFIED);
|
|
|
}
|
|
|
trace_megasas_qf_enqueue(cmd->index, cmd->count, cmd->context,
|
|
|
s->reply_queue_head, s->reply_queue_tail, s->busy);
|
|
@@ -542,6 +550,7 @@ static MegasasCmd *megasas_enqueue_frame(MegasasState *s,
|
|
|
|
|
|
static void megasas_complete_frame(MegasasState *s, uint64_t context)
|
|
|
{
|
|
|
+ const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
|
|
|
PCIDevice *pci_dev = PCI_DEVICE(s);
|
|
|
int tail, queue_offset;
|
|
|
|
|
@@ -555,24 +564,26 @@ static void megasas_complete_frame(MegasasState *s, uint64_t context)
|
|
|
*/
|
|
|
if (megasas_use_queue64(s)) {
|
|
|
queue_offset = s->reply_queue_head * sizeof(uint64_t);
|
|
|
- stq_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset, context);
|
|
|
+ stq_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset,
|
|
|
+ context, attrs);
|
|
|
} else {
|
|
|
queue_offset = s->reply_queue_head * sizeof(uint32_t);
|
|
|
- stl_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset, context);
|
|
|
+ stl_le_pci_dma(pci_dev, s->reply_queue_pa + queue_offset,
|
|
|
+ context, attrs);
|
|
|
}
|
|
|
- s->reply_queue_tail = ldl_le_pci_dma(pci_dev, s->consumer_pa);
|
|
|
+ ldl_le_pci_dma(pci_dev, s->consumer_pa, &s->reply_queue_tail, attrs);
|
|
|
trace_megasas_qf_complete(context, s->reply_queue_head,
|
|
|
s->reply_queue_tail, s->busy);
|
|
|
}
|
|
|
|
|
|
if (megasas_intr_enabled(s)) {
|
|
|
/* Update reply queue pointer */
|
|
|
- s->reply_queue_tail = ldl_le_pci_dma(pci_dev, s->consumer_pa);
|
|
|
+ ldl_le_pci_dma(pci_dev, s->consumer_pa, &s->reply_queue_tail, attrs);
|
|
|
tail = s->reply_queue_head;
|
|
|
s->reply_queue_head = megasas_next_index(s, tail, s->fw_cmds);
|
|
|
trace_megasas_qf_update(s->reply_queue_head, s->reply_queue_tail,
|
|
|
s->busy);
|
|
|
- stl_le_pci_dma(pci_dev, s->producer_pa, s->reply_queue_head);
|
|
|
+ stl_le_pci_dma(pci_dev, s->producer_pa, s->reply_queue_head, attrs);
|
|
|
/* Notify HBA */
|
|
|
if (msix_enabled(pci_dev)) {
|
|
|
trace_megasas_msix_raise(0);
|
|
@@ -632,6 +643,7 @@ static void megasas_abort_command(MegasasCmd *cmd)
|
|
|
|
|
|
static int megasas_init_firmware(MegasasState *s, MegasasCmd *cmd)
|
|
|
{
|
|
|
+ const MemTxAttrs attrs = MEMTXATTRS_UNSPECIFIED;
|
|
|
PCIDevice *pcid = PCI_DEVICE(s);
|
|
|
uint32_t pa_hi, pa_lo;
|
|
|
hwaddr iq_pa, initq_size = sizeof(struct mfi_init_qinfo);
|
|
@@ -670,9 +682,9 @@ static int megasas_init_firmware(MegasasState *s, MegasasCmd *cmd)
|
|
|
pa_lo = le32_to_cpu(initq->pi_addr_lo);
|
|
|
pa_hi = le32_to_cpu(initq->pi_addr_hi);
|
|
|
s->producer_pa = ((uint64_t) pa_hi << 32) | pa_lo;
|
|
|
- s->reply_queue_head = ldl_le_pci_dma(pcid, s->producer_pa);
|
|
|
+ ldl_le_pci_dma(pcid, s->producer_pa, &s->reply_queue_head, attrs);
|
|
|
s->reply_queue_head %= MEGASAS_MAX_FRAMES;
|
|
|
- s->reply_queue_tail = ldl_le_pci_dma(pcid, s->consumer_pa);
|
|
|
+ ldl_le_pci_dma(pcid, s->consumer_pa, &s->reply_queue_tail, attrs);
|
|
|
s->reply_queue_tail %= MEGASAS_MAX_FRAMES;
|
|
|
flags = le32_to_cpu(initq->flags);
|
|
|
if (flags & MFI_QUEUE_FLAG_CONTEXT64) {
|
|
@@ -848,7 +860,7 @@ static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
|
|
|
MFI_INFO_PDMIX_SATA |
|
|
|
MFI_INFO_PDMIX_LD);
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
|
|
|
+ cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -878,7 +890,7 @@ static int megasas_mfc_get_defaults(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.disable_preboot_cli = 1;
|
|
|
info.cluster_disable = 1;
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
|
|
|
+ cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -899,7 +911,7 @@ static int megasas_dcmd_get_bios_info(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.expose_all_drives = 1;
|
|
|
}
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
|
|
|
+ cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -910,7 +922,7 @@ static int megasas_dcmd_get_fw_time(MegasasState *s, MegasasCmd *cmd)
|
|
|
|
|
|
fw_time = cpu_to_le64(megasas_fw_time());
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read((uint8_t *)&fw_time, dcmd_size, &cmd->qsg);
|
|
|
+ cmd->iov_size -= dma_buf_read(&fw_time, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -937,7 +949,7 @@ static int megasas_event_info(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.shutdown_seq_num = cpu_to_le32(s->shutdown_event);
|
|
|
info.boot_seq_num = cpu_to_le32(s->boot_event);
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
|
|
|
+ cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -1006,7 +1018,7 @@ static int megasas_dcmd_pd_get_list(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.size = cpu_to_le32(offset);
|
|
|
info.count = cpu_to_le32(num_pd_disks);
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read((uint8_t *)&info, offset, &cmd->qsg);
|
|
|
+ cmd->iov_size -= dma_buf_read(&info, offset, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -1100,7 +1112,7 @@ static int megasas_pd_get_info_submit(SCSIDevice *sdev, int lun,
|
|
|
info->connected_port_bitmap = 0x1;
|
|
|
info->device_speed = 1;
|
|
|
info->link_speed = 1;
|
|
|
- resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg);
|
|
|
+ resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
g_free(cmd->iov_buf);
|
|
|
cmd->iov_size = dcmd_size - resid;
|
|
|
cmd->iov_buf = NULL;
|
|
@@ -1172,7 +1184,7 @@ static int megasas_dcmd_ld_get_list(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.ld_count = cpu_to_le32(num_ld_disks);
|
|
|
trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
|
|
|
|
|
|
- resid = dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
|
|
|
+ resid = dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
cmd->iov_size = dcmd_size - resid;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
@@ -1221,7 +1233,7 @@ static int megasas_dcmd_ld_list_query(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.size = dcmd_size;
|
|
|
trace_megasas_dcmd_ld_get_list(cmd->index, num_ld_disks, max_ld_disks);
|
|
|
|
|
|
- resid = dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
|
|
|
+ resid = dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
cmd->iov_size = dcmd_size - resid;
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
@@ -1271,7 +1283,7 @@ static int megasas_ld_get_info_submit(SCSIDevice *sdev, int lun,
|
|
|
info->ld_config.span[0].num_blocks = info->size;
|
|
|
info->ld_config.span[0].array_ref = cpu_to_le16(sdev_id);
|
|
|
|
|
|
- resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg);
|
|
|
+ resid = dma_buf_read(cmd->iov_buf, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
g_free(cmd->iov_buf);
|
|
|
cmd->iov_size = dcmd_size - resid;
|
|
|
cmd->iov_buf = NULL;
|
|
@@ -1390,7 +1402,7 @@ static int megasas_dcmd_cfg_read(MegasasState *s, MegasasCmd *cmd)
|
|
|
ld_offset += sizeof(struct mfi_ld_config);
|
|
|
}
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read((uint8_t *)data, info->size, &cmd->qsg);
|
|
|
+ cmd->iov_size -= dma_buf_read(data, info->size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -1420,7 +1432,7 @@ static int megasas_dcmd_get_properties(MegasasState *s, MegasasCmd *cmd)
|
|
|
info.ecc_bucket_leak_rate = cpu_to_le16(1440);
|
|
|
info.expose_encl_devices = 1;
|
|
|
|
|
|
- cmd->iov_size -= dma_buf_read((uint8_t *)&info, dcmd_size, &cmd->qsg);
|
|
|
+ cmd->iov_size -= dma_buf_read(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|
|
|
|
|
@@ -1465,7 +1477,7 @@ static int megasas_dcmd_set_properties(MegasasState *s, MegasasCmd *cmd)
|
|
|
dcmd_size);
|
|
|
return MFI_STAT_INVALID_PARAMETER;
|
|
|
}
|
|
|
- dma_buf_write((uint8_t *)&info, dcmd_size, &cmd->qsg);
|
|
|
+ dma_buf_write(&info, dcmd_size, &cmd->qsg, MEMTXATTRS_UNSPECIFIED);
|
|
|
trace_megasas_dcmd_unsupported(cmd->index, cmd->iov_size);
|
|
|
return MFI_STAT_OK;
|
|
|
}
|