mirror of https://gitee.com/openkylin/qemu.git
dma-helpers: change interface to byte-based
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
20018e12cf
commit
cbe0ed6247
|
@ -192,18 +192,18 @@ static const AIOCBInfo dma_aiocb_info = {
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockAIOCB *dma_blk_io(
|
BlockAIOCB *dma_blk_io(
|
||||||
BlockBackend *blk, QEMUSGList *sg, uint64_t sector_num,
|
BlockBackend *blk, QEMUSGList *sg, uint64_t offset,
|
||||||
DMAIOFunc *io_func, BlockCompletionFunc *cb,
|
DMAIOFunc *io_func, BlockCompletionFunc *cb,
|
||||||
void *opaque, DMADirection dir)
|
void *opaque, DMADirection dir)
|
||||||
{
|
{
|
||||||
DMAAIOCB *dbs = blk_aio_get(&dma_aiocb_info, blk, cb, opaque);
|
DMAAIOCB *dbs = blk_aio_get(&dma_aiocb_info, blk, cb, opaque);
|
||||||
|
|
||||||
trace_dma_blk_io(dbs, blk, sector_num, (dir == DMA_DIRECTION_TO_DEVICE));
|
trace_dma_blk_io(dbs, blk, offset, (dir == DMA_DIRECTION_TO_DEVICE));
|
||||||
|
|
||||||
dbs->acb = NULL;
|
dbs->acb = NULL;
|
||||||
dbs->blk = blk;
|
dbs->blk = blk;
|
||||||
dbs->sg = sg;
|
dbs->sg = sg;
|
||||||
dbs->offset = sector_num << BDRV_SECTOR_BITS;
|
dbs->offset = offset;
|
||||||
dbs->sg_cur_index = 0;
|
dbs->sg_cur_index = 0;
|
||||||
dbs->sg_cur_byte = 0;
|
dbs->sg_cur_byte = 0;
|
||||||
dbs->dir = dir;
|
dbs->dir = dir;
|
||||||
|
@ -216,18 +216,18 @@ BlockAIOCB *dma_blk_io(
|
||||||
|
|
||||||
|
|
||||||
BlockAIOCB *dma_blk_read(BlockBackend *blk,
|
BlockAIOCB *dma_blk_read(BlockBackend *blk,
|
||||||
QEMUSGList *sg, uint64_t sector,
|
QEMUSGList *sg, uint64_t offset,
|
||||||
void (*cb)(void *opaque, int ret), void *opaque)
|
void (*cb)(void *opaque, int ret), void *opaque)
|
||||||
{
|
{
|
||||||
return dma_blk_io(blk, sg, sector, blk_aio_preadv, cb, opaque,
|
return dma_blk_io(blk, sg, offset, blk_aio_preadv, cb, opaque,
|
||||||
DMA_DIRECTION_FROM_DEVICE);
|
DMA_DIRECTION_FROM_DEVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockAIOCB *dma_blk_write(BlockBackend *blk,
|
BlockAIOCB *dma_blk_write(BlockBackend *blk,
|
||||||
QEMUSGList *sg, uint64_t sector,
|
QEMUSGList *sg, uint64_t offset,
|
||||||
void (*cb)(void *opaque, int ret), void *opaque)
|
void (*cb)(void *opaque, int ret), void *opaque)
|
||||||
{
|
{
|
||||||
return dma_blk_io(blk, sg, sector, blk_aio_pwritev, cb, opaque,
|
return dma_blk_io(blk, sg, offset, blk_aio_pwritev, cb, opaque,
|
||||||
DMA_DIRECTION_TO_DEVICE);
|
DMA_DIRECTION_TO_DEVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -239,7 +239,7 @@ static uint16_t nvme_rw(NvmeCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd,
|
||||||
uint8_t lba_index = NVME_ID_NS_FLBAS_INDEX(ns->id_ns.flbas);
|
uint8_t lba_index = NVME_ID_NS_FLBAS_INDEX(ns->id_ns.flbas);
|
||||||
uint8_t data_shift = ns->id_ns.lbaf[lba_index].ds;
|
uint8_t data_shift = ns->id_ns.lbaf[lba_index].ds;
|
||||||
uint64_t data_size = (uint64_t)nlb << data_shift;
|
uint64_t data_size = (uint64_t)nlb << data_shift;
|
||||||
uint64_t aio_slba = slba << (data_shift - BDRV_SECTOR_BITS);
|
uint64_t data_offset = slba << data_shift;
|
||||||
int is_write = rw->opcode == NVME_CMD_WRITE ? 1 : 0;
|
int is_write = rw->opcode == NVME_CMD_WRITE ? 1 : 0;
|
||||||
enum BlockAcctType acct = is_write ? BLOCK_ACCT_WRITE : BLOCK_ACCT_READ;
|
enum BlockAcctType acct = is_write ? BLOCK_ACCT_WRITE : BLOCK_ACCT_READ;
|
||||||
|
|
||||||
|
@ -258,8 +258,8 @@ static uint16_t nvme_rw(NvmeCtrl *n, NvmeNamespace *ns, NvmeCmd *cmd,
|
||||||
req->has_sg = true;
|
req->has_sg = true;
|
||||||
dma_acct_start(n->conf.blk, &req->acct, &req->qsg, acct);
|
dma_acct_start(n->conf.blk, &req->acct, &req->qsg, acct);
|
||||||
req->aiocb = is_write ?
|
req->aiocb = is_write ?
|
||||||
dma_blk_write(n->conf.blk, &req->qsg, aio_slba, nvme_rw_cb, req) :
|
dma_blk_write(n->conf.blk, &req->qsg, data_offset, nvme_rw_cb, req) :
|
||||||
dma_blk_read(n->conf.blk, &req->qsg, aio_slba, nvme_rw_cb, req);
|
dma_blk_read(n->conf.blk, &req->qsg, data_offset, nvme_rw_cb, req);
|
||||||
|
|
||||||
return NVME_NO_COMPLETE;
|
return NVME_NO_COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1006,7 +1006,8 @@ static void execute_ncq_command(NCQTransferState *ncq_tfs)
|
||||||
dma_acct_start(ide_state->blk, &ncq_tfs->acct,
|
dma_acct_start(ide_state->blk, &ncq_tfs->acct,
|
||||||
&ncq_tfs->sglist, BLOCK_ACCT_READ);
|
&ncq_tfs->sglist, BLOCK_ACCT_READ);
|
||||||
ncq_tfs->aiocb = dma_blk_read(ide_state->blk, &ncq_tfs->sglist,
|
ncq_tfs->aiocb = dma_blk_read(ide_state->blk, &ncq_tfs->sglist,
|
||||||
ncq_tfs->lba, ncq_cb, ncq_tfs);
|
ncq_tfs->lba << BDRV_SECTOR_BITS,
|
||||||
|
ncq_cb, ncq_tfs);
|
||||||
break;
|
break;
|
||||||
case WRITE_FPDMA_QUEUED:
|
case WRITE_FPDMA_QUEUED:
|
||||||
DPRINTF(port, "NCQ writing %d sectors to LBA %"PRId64", tag %d\n",
|
DPRINTF(port, "NCQ writing %d sectors to LBA %"PRId64", tag %d\n",
|
||||||
|
@ -1018,7 +1019,8 @@ static void execute_ncq_command(NCQTransferState *ncq_tfs)
|
||||||
dma_acct_start(ide_state->blk, &ncq_tfs->acct,
|
dma_acct_start(ide_state->blk, &ncq_tfs->acct,
|
||||||
&ncq_tfs->sglist, BLOCK_ACCT_WRITE);
|
&ncq_tfs->sglist, BLOCK_ACCT_WRITE);
|
||||||
ncq_tfs->aiocb = dma_blk_write(ide_state->blk, &ncq_tfs->sglist,
|
ncq_tfs->aiocb = dma_blk_write(ide_state->blk, &ncq_tfs->sglist,
|
||||||
ncq_tfs->lba, ncq_cb, ncq_tfs);
|
ncq_tfs->lba << BDRV_SECTOR_BITS,
|
||||||
|
ncq_cb, ncq_tfs);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DPRINTF(port, "error: unsupported NCQ command (0x%02x) received\n",
|
DPRINTF(port, "error: unsupported NCQ command (0x%02x) received\n",
|
||||||
|
|
|
@ -799,6 +799,7 @@ static void ide_dma_cb(void *opaque, int ret)
|
||||||
IDEState *s = opaque;
|
IDEState *s = opaque;
|
||||||
int n;
|
int n;
|
||||||
int64_t sector_num;
|
int64_t sector_num;
|
||||||
|
uint64_t offset;
|
||||||
bool stay_active = false;
|
bool stay_active = false;
|
||||||
|
|
||||||
if (ret == -ECANCELED) {
|
if (ret == -ECANCELED) {
|
||||||
|
@ -859,17 +860,18 @@ static void ide_dma_cb(void *opaque, int ret)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
offset = sector_num << BDRV_SECTOR_BITS;
|
||||||
switch (s->dma_cmd) {
|
switch (s->dma_cmd) {
|
||||||
case IDE_DMA_READ:
|
case IDE_DMA_READ:
|
||||||
s->bus->dma->aiocb = dma_blk_read(s->blk, &s->sg, sector_num,
|
s->bus->dma->aiocb = dma_blk_read(s->blk, &s->sg, offset,
|
||||||
ide_dma_cb, s);
|
ide_dma_cb, s);
|
||||||
break;
|
break;
|
||||||
case IDE_DMA_WRITE:
|
case IDE_DMA_WRITE:
|
||||||
s->bus->dma->aiocb = dma_blk_write(s->blk, &s->sg, sector_num,
|
s->bus->dma->aiocb = dma_blk_write(s->blk, &s->sg, offset,
|
||||||
ide_dma_cb, s);
|
ide_dma_cb, s);
|
||||||
break;
|
break;
|
||||||
case IDE_DMA_TRIM:
|
case IDE_DMA_TRIM:
|
||||||
s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, sector_num,
|
s->bus->dma->aiocb = dma_blk_io(s->blk, &s->sg, offset,
|
||||||
ide_issue_trim, ide_dma_cb, s,
|
ide_issue_trim, ide_dma_cb, s,
|
||||||
DMA_DIRECTION_TO_DEVICE);
|
DMA_DIRECTION_TO_DEVICE);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -335,7 +335,8 @@ static void scsi_do_read(SCSIDiskReq *r, int ret)
|
||||||
if (r->req.sg) {
|
if (r->req.sg) {
|
||||||
dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ);
|
dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ);
|
||||||
r->req.resid -= r->req.sg->size;
|
r->req.resid -= r->req.sg->size;
|
||||||
r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg, r->sector,
|
r->req.aiocb = dma_blk_read(s->qdev.conf.blk, r->req.sg,
|
||||||
|
r->sector << BDRV_SECTOR_BITS,
|
||||||
scsi_dma_complete, r);
|
scsi_dma_complete, r);
|
||||||
} else {
|
} else {
|
||||||
scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
|
scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
|
||||||
|
@ -539,7 +540,8 @@ static void scsi_write_data(SCSIRequest *req)
|
||||||
if (r->req.sg) {
|
if (r->req.sg) {
|
||||||
dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE);
|
dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE);
|
||||||
r->req.resid -= r->req.sg->size;
|
r->req.resid -= r->req.sg->size;
|
||||||
r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg, r->sector,
|
r->req.aiocb = dma_blk_write(s->qdev.conf.blk, r->req.sg,
|
||||||
|
r->sector << BDRV_SECTOR_BITS,
|
||||||
scsi_dma_complete, r);
|
scsi_dma_complete, r);
|
||||||
} else {
|
} else {
|
||||||
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
|
||||||
|
|
|
@ -199,14 +199,14 @@ typedef BlockAIOCB *DMAIOFunc(BlockBackend *blk, int64_t offset,
|
||||||
BlockCompletionFunc *cb, void *opaque);
|
BlockCompletionFunc *cb, void *opaque);
|
||||||
|
|
||||||
BlockAIOCB *dma_blk_io(BlockBackend *blk,
|
BlockAIOCB *dma_blk_io(BlockBackend *blk,
|
||||||
QEMUSGList *sg, uint64_t sector_num,
|
QEMUSGList *sg, uint64_t offset,
|
||||||
DMAIOFunc *io_func, BlockCompletionFunc *cb,
|
DMAIOFunc *io_func, BlockCompletionFunc *cb,
|
||||||
void *opaque, DMADirection dir);
|
void *opaque, DMADirection dir);
|
||||||
BlockAIOCB *dma_blk_read(BlockBackend *blk,
|
BlockAIOCB *dma_blk_read(BlockBackend *blk,
|
||||||
QEMUSGList *sg, uint64_t sector,
|
QEMUSGList *sg, uint64_t offset,
|
||||||
BlockCompletionFunc *cb, void *opaque);
|
BlockCompletionFunc *cb, void *opaque);
|
||||||
BlockAIOCB *dma_blk_write(BlockBackend *blk,
|
BlockAIOCB *dma_blk_write(BlockBackend *blk,
|
||||||
QEMUSGList *sg, uint64_t sector,
|
QEMUSGList *sg, uint64_t offset,
|
||||||
BlockCompletionFunc *cb, void *opaque);
|
BlockCompletionFunc *cb, void *opaque);
|
||||||
uint64_t dma_buf_read(uint8_t *ptr, int32_t len, QEMUSGList *sg);
|
uint64_t dma_buf_read(uint8_t *ptr, int32_t len, QEMUSGList *sg);
|
||||||
uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg);
|
uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg);
|
||||||
|
|
|
@ -1143,7 +1143,7 @@ win_helper_done(uint32_t tl) "tl=%d"
|
||||||
win_helper_retry(uint32_t tl) "tl=%d"
|
win_helper_retry(uint32_t tl) "tl=%d"
|
||||||
|
|
||||||
# dma-helpers.c
|
# dma-helpers.c
|
||||||
dma_blk_io(void *dbs, void *bs, int64_t sector_num, bool to_dev) "dbs=%p bs=%p sector_num=%" PRId64 " to_dev=%d"
|
dma_blk_io(void *dbs, void *bs, int64_t offset, bool to_dev) "dbs=%p bs=%p offset=%" PRId64 " to_dev=%d"
|
||||||
dma_aio_cancel(void *dbs) "dbs=%p"
|
dma_aio_cancel(void *dbs) "dbs=%p"
|
||||||
dma_complete(void *dbs, int ret, void *cb) "dbs=%p ret=%d cb=%p"
|
dma_complete(void *dbs, int ret, void *cb) "dbs=%p ret=%d cb=%p"
|
||||||
dma_blk_cb(void *dbs, int ret) "dbs=%p ret=%d"
|
dma_blk_cb(void *dbs, int ret) "dbs=%p ret=%d"
|
||||||
|
|
Loading…
Reference in New Issue