Commit cbe0ed62 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Kevin Wolf
Browse files

dma-helpers: change interface to byte-based



Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 20018e12
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -192,18 +192,18 @@ static const AIOCBInfo dma_aiocb_info = {
};

BlockAIOCB *dma_blk_io(
    BlockBackend *blk, QEMUSGList *sg, uint64_t sector_num,
    BlockBackend *blk, QEMUSGList *sg, uint64_t offset,
    DMAIOFunc *io_func, BlockCompletionFunc *cb,
    void *opaque, DMADirection dir)
{
    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->blk = blk;
    dbs->sg = sg;
    dbs->offset = sector_num << BDRV_SECTOR_BITS;
    dbs->offset = offset;
    dbs->sg_cur_index = 0;
    dbs->sg_cur_byte = 0;
    dbs->dir = dir;
@@ -216,18 +216,18 @@ BlockAIOCB *dma_blk_io(


BlockAIOCB *dma_blk_read(BlockBackend *blk,
                         QEMUSGList *sg, uint64_t sector,
                         QEMUSGList *sg, uint64_t offset,
                         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);
}

BlockAIOCB *dma_blk_write(BlockBackend *blk,
                          QEMUSGList *sg, uint64_t sector,
                          QEMUSGList *sg, uint64_t offset,
                          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);
}

+3 −3
Original line number Diff line number Diff line
@@ -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 data_shift = ns->id_ns.lbaf[lba_index].ds;
    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;
    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;
    dma_acct_start(n->conf.blk, &req->acct, &req->qsg, acct);
    req->aiocb = is_write ?
        dma_blk_write(n->conf.blk, &req->qsg, aio_slba, nvme_rw_cb, req) :
        dma_blk_read(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, data_offset, nvme_rw_cb, req);

    return NVME_NO_COMPLETE;
}
+4 −2
Original line number Diff line number Diff line
@@ -1006,7 +1006,8 @@ static void execute_ncq_command(NCQTransferState *ncq_tfs)
        dma_acct_start(ide_state->blk, &ncq_tfs->acct,
                       &ncq_tfs->sglist, BLOCK_ACCT_READ);
        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;
    case WRITE_FPDMA_QUEUED:
        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,
                       &ncq_tfs->sglist, BLOCK_ACCT_WRITE);
        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;
    default:
        DPRINTF(port, "error: unsupported NCQ command (0x%02x) received\n",
+5 −3
Original line number Diff line number Diff line
@@ -799,6 +799,7 @@ static void ide_dma_cb(void *opaque, int ret)
    IDEState *s = opaque;
    int n;
    int64_t sector_num;
    uint64_t offset;
    bool stay_active = false;

    if (ret == -ECANCELED) {
@@ -859,17 +860,18 @@ static void ide_dma_cb(void *opaque, int ret)
        return;
    }

    offset = sector_num << BDRV_SECTOR_BITS;
    switch (s->dma_cmd) {
    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);
        break;
    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);
        break;
    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,
                                        DMA_DIRECTION_TO_DEVICE);
        break;
+4 −2
Original line number Diff line number Diff line
@@ -335,7 +335,8 @@ static void scsi_do_read(SCSIDiskReq *r, int ret)
    if (r->req.sg) {
        dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_READ);
        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);
    } else {
        scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
@@ -539,7 +540,8 @@ static void scsi_write_data(SCSIRequest *req)
    if (r->req.sg) {
        dma_acct_start(s->qdev.conf.blk, &r->acct, r->req.sg, BLOCK_ACCT_WRITE);
        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);
    } else {
        block_acct_start(blk_get_stats(s->qdev.conf.blk), &r->acct,
Loading