Revision 43cf8ae6
b/dma-helpers.c | ||
---|---|---|
41 | 41 |
BlockDriverAIOCB *acb; |
42 | 42 |
QEMUSGList *sg; |
43 | 43 |
uint64_t sector_num; |
44 |
bool to_dev;
|
|
44 |
DMADirection dir;
|
|
45 | 45 |
bool in_cancel; |
46 | 46 |
int sg_cur_index; |
47 | 47 |
dma_addr_t sg_cur_byte; |
... | ... | |
75 | 75 |
|
76 | 76 |
for (i = 0; i < dbs->iov.niov; ++i) { |
77 | 77 |
cpu_physical_memory_unmap(dbs->iov.iov[i].iov_base, |
78 |
dbs->iov.iov[i].iov_len, !dbs->to_dev, |
|
78 |
dbs->iov.iov[i].iov_len, |
|
79 |
dbs->dir != DMA_DIRECTION_TO_DEVICE, |
|
79 | 80 |
dbs->iov.iov[i].iov_len); |
80 | 81 |
} |
81 | 82 |
qemu_iovec_reset(&dbs->iov); |
... | ... | |
122 | 123 |
while (dbs->sg_cur_index < dbs->sg->nsg) { |
123 | 124 |
cur_addr = dbs->sg->sg[dbs->sg_cur_index].base + dbs->sg_cur_byte; |
124 | 125 |
cur_len = dbs->sg->sg[dbs->sg_cur_index].len - dbs->sg_cur_byte; |
125 |
mem = cpu_physical_memory_map(cur_addr, &cur_len, !dbs->to_dev); |
|
126 |
mem = cpu_physical_memory_map(cur_addr, &cur_len, |
|
127 |
dbs->dir != DMA_DIRECTION_TO_DEVICE); |
|
126 | 128 |
if (!mem) |
127 | 129 |
break; |
128 | 130 |
qemu_iovec_add(&dbs->iov, mem, cur_len); |
... | ... | |
169 | 171 |
BlockDriverAIOCB *dma_bdrv_io( |
170 | 172 |
BlockDriverState *bs, QEMUSGList *sg, uint64_t sector_num, |
171 | 173 |
DMAIOFunc *io_func, BlockDriverCompletionFunc *cb, |
172 |
void *opaque, bool to_dev)
|
|
174 |
void *opaque, DMADirection dir)
|
|
173 | 175 |
{ |
174 | 176 |
DMAAIOCB *dbs = qemu_aio_get(&dma_aio_pool, bs, cb, opaque); |
175 | 177 |
|
176 |
trace_dma_bdrv_io(dbs, bs, sector_num, to_dev);
|
|
178 |
trace_dma_bdrv_io(dbs, bs, sector_num, (dir == DMA_DIRECTION_TO_DEVICE));
|
|
177 | 179 |
|
178 | 180 |
dbs->acb = NULL; |
179 | 181 |
dbs->bs = bs; |
... | ... | |
181 | 183 |
dbs->sector_num = sector_num; |
182 | 184 |
dbs->sg_cur_index = 0; |
183 | 185 |
dbs->sg_cur_byte = 0; |
184 |
dbs->to_dev = to_dev;
|
|
186 |
dbs->dir = dir;
|
|
185 | 187 |
dbs->io_func = io_func; |
186 | 188 |
dbs->bh = NULL; |
187 | 189 |
qemu_iovec_init(&dbs->iov, sg->nsg); |
... | ... | |
194 | 196 |
QEMUSGList *sg, uint64_t sector, |
195 | 197 |
void (*cb)(void *opaque, int ret), void *opaque) |
196 | 198 |
{ |
197 |
return dma_bdrv_io(bs, sg, sector, bdrv_aio_readv, cb, opaque, false); |
|
199 |
return dma_bdrv_io(bs, sg, sector, bdrv_aio_readv, cb, opaque, |
|
200 |
DMA_DIRECTION_FROM_DEVICE); |
|
198 | 201 |
} |
199 | 202 |
|
200 | 203 |
BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs, |
201 | 204 |
QEMUSGList *sg, uint64_t sector, |
202 | 205 |
void (*cb)(void *opaque, int ret), void *opaque) |
203 | 206 |
{ |
204 |
return dma_bdrv_io(bs, sg, sector, bdrv_aio_writev, cb, opaque, true); |
|
207 |
return dma_bdrv_io(bs, sg, sector, bdrv_aio_writev, cb, opaque, |
|
208 |
DMA_DIRECTION_TO_DEVICE); |
|
205 | 209 |
} |
206 | 210 |
|
207 | 211 |
|
b/dma.h | ||
---|---|---|
17 | 17 |
|
18 | 18 |
typedef struct ScatterGatherEntry ScatterGatherEntry; |
19 | 19 |
|
20 |
typedef enum { |
|
21 |
DMA_DIRECTION_TO_DEVICE = 0, |
|
22 |
DMA_DIRECTION_FROM_DEVICE = 1, |
|
23 |
} DMADirection; |
|
24 |
|
|
20 | 25 |
struct QEMUSGList { |
21 | 26 |
ScatterGatherEntry *sg; |
22 | 27 |
int nsg; |
... | ... | |
29 | 34 |
|
30 | 35 |
#define DMA_ADDR_FMT TARGET_FMT_plx |
31 | 36 |
|
32 |
typedef enum { |
|
33 |
DMA_DIRECTION_TO_DEVICE = 0, |
|
34 |
DMA_DIRECTION_FROM_DEVICE = 1, |
|
35 |
} DMADirection; |
|
36 |
|
|
37 | 37 |
struct ScatterGatherEntry { |
38 | 38 |
dma_addr_t base; |
39 | 39 |
dma_addr_t len; |
... | ... | |
51 | 51 |
BlockDriverAIOCB *dma_bdrv_io(BlockDriverState *bs, |
52 | 52 |
QEMUSGList *sg, uint64_t sector_num, |
53 | 53 |
DMAIOFunc *io_func, BlockDriverCompletionFunc *cb, |
54 |
void *opaque, bool to_dev);
|
|
54 |
void *opaque, DMADirection dir);
|
|
55 | 55 |
BlockDriverAIOCB *dma_bdrv_read(BlockDriverState *bs, |
56 | 56 |
QEMUSGList *sg, uint64_t sector, |
57 | 57 |
BlockDriverCompletionFunc *cb, void *opaque); |
b/hw/ide/core.c | ||
---|---|---|
618 | 618 |
break; |
619 | 619 |
case IDE_DMA_TRIM: |
620 | 620 |
s->bus->dma->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num, |
621 |
ide_issue_trim, ide_dma_cb, s, true); |
|
621 |
ide_issue_trim, ide_dma_cb, s, |
|
622 |
DMA_DIRECTION_TO_DEVICE); |
|
622 | 623 |
break; |
623 | 624 |
} |
624 | 625 |
return; |
b/hw/ide/macio.c | ||
---|---|---|
149 | 149 |
break; |
150 | 150 |
case IDE_DMA_TRIM: |
151 | 151 |
m->aiocb = dma_bdrv_io(s->bs, &s->sg, sector_num, |
152 |
ide_issue_trim, pmac_ide_transfer_cb, s, true); |
|
152 |
ide_issue_trim, pmac_ide_transfer_cb, s, |
|
153 |
DMA_DIRECTION_TO_DEVICE); |
|
153 | 154 |
break; |
154 | 155 |
} |
155 | 156 |
return; |
Also available in: Unified diff