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( | ||||
|     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); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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; | ||||
| } | ||||
|  | ||||
| @ -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", | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -199,14 +199,14 @@ typedef BlockAIOCB *DMAIOFunc(BlockBackend *blk, int64_t offset, | ||||
|                               BlockCompletionFunc *cb, void *opaque); | ||||
| 
 | ||||
| BlockAIOCB *dma_blk_io(BlockBackend *blk, | ||||
|                        QEMUSGList *sg, uint64_t sector_num, | ||||
|                        QEMUSGList *sg, uint64_t offset, | ||||
|                        DMAIOFunc *io_func, BlockCompletionFunc *cb, | ||||
|                        void *opaque, DMADirection dir); | ||||
| BlockAIOCB *dma_blk_read(BlockBackend *blk, | ||||
|                          QEMUSGList *sg, uint64_t sector, | ||||
|                          QEMUSGList *sg, uint64_t offset, | ||||
|                          BlockCompletionFunc *cb, void *opaque); | ||||
| BlockAIOCB *dma_blk_write(BlockBackend *blk, | ||||
|                           QEMUSGList *sg, uint64_t sector, | ||||
|                           QEMUSGList *sg, uint64_t offset, | ||||
|                           BlockCompletionFunc *cb, void *opaque); | ||||
| 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); | ||||
|  | ||||
| @ -1143,7 +1143,7 @@ win_helper_done(uint32_t tl) "tl=%d" | ||||
| win_helper_retry(uint32_t tl) "tl=%d" | ||||
| 
 | ||||
| # 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_complete(void *dbs, int ret, void *cb) "dbs=%p ret=%d cb=%p" | ||||
| dma_blk_cb(void *dbs, int ret) "dbs=%p ret=%d" | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Paolo Bonzini
						Paolo Bonzini