15
15
/* #define DEBUG_IOMMU */
17
static void do_dma_memory_set(AddressSpace *as,
18
dma_addr_t addr, uint8_t c, dma_addr_t len)
17
int dma_memory_set(AddressSpace *as, dma_addr_t addr, uint8_t c, dma_addr_t len)
19
dma_barrier(as, DMA_DIRECTION_FROM_DEVICE);
20
21
#define FILLBUF_SIZE 512
21
22
uint8_t fillbuf[FILLBUF_SIZE];
24
26
memset(fillbuf, c, FILLBUF_SIZE);
26
28
l = len < FILLBUF_SIZE ? len : FILLBUF_SIZE;
27
address_space_rw(as, addr, fillbuf, l, true);
29
error |= address_space_rw(as, addr, fillbuf, l, true);
33
int dma_memory_set(DMAContext *dma, dma_addr_t addr, uint8_t c, dma_addr_t len)
35
dma_barrier(dma, DMA_DIRECTION_FROM_DEVICE);
37
if (dma_has_iommu(dma)) {
38
return iommu_dma_memory_set(dma, addr, c, len);
40
do_dma_memory_set(dma->as, addr, c, len);
45
void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint, DMAContext *dma)
37
void qemu_sglist_init(QEMUSGList *qsg, DeviceState *dev, int alloc_hint,
47
40
qsg->sg = g_malloc(alloc_hint * sizeof(ScatterGatherEntry));
49
42
qsg->nalloc = alloc_hint;
46
object_ref(OBJECT(dev));
54
49
void qemu_sglist_add(QEMUSGList *qsg, dma_addr_t base, dma_addr_t len)
278
274
bdrv_acct_start(bs, cookie, sg->size, type);
281
bool iommu_dma_memory_valid(DMAContext *dma, dma_addr_t addr, dma_addr_t len,
287
fprintf(stderr, "dma_memory_check context=%p addr=0x" DMA_ADDR_FMT
288
" len=0x" DMA_ADDR_FMT " dir=%d\n", dma, addr, len, dir);
292
if (dma->translate(dma, addr, &paddr, &plen, dir) != 0) {
296
/* The translation might be valid for larger regions. */
308
int iommu_dma_memory_rw(DMAContext *dma, dma_addr_t addr,
309
void *buf, dma_addr_t len, DMADirection dir)
315
fprintf(stderr, "dma_memory_rw context=%p addr=0x" DMA_ADDR_FMT " len=0x"
316
DMA_ADDR_FMT " dir=%d\n", dma, addr, len, dir);
320
err = dma->translate(dma, addr, &paddr, &plen, dir);
323
* In case of failure on reads from the guest, we clean the
324
* destination buffer so that a device that doesn't test
325
* for errors will not expose qemu internal memory.
331
/* The translation might be valid for larger regions. */
336
address_space_rw(dma->as, paddr, buf, plen, dir == DMA_DIRECTION_FROM_DEVICE);
346
int iommu_dma_memory_set(DMAContext *dma, dma_addr_t addr, uint8_t c,
353
fprintf(stderr, "dma_memory_set context=%p addr=0x" DMA_ADDR_FMT
354
" len=0x" DMA_ADDR_FMT "\n", dma, addr, len);
358
err = dma->translate(dma, addr, &paddr, &plen,
359
DMA_DIRECTION_FROM_DEVICE);
364
/* The translation might be valid for larger regions. */
369
do_dma_memory_set(dma->as, paddr, c, plen);
378
void dma_context_init(DMAContext *dma, AddressSpace *as, DMATranslateFunc translate,
379
DMAMapFunc map, DMAUnmapFunc unmap)
382
fprintf(stderr, "dma_context_init(%p, %p, %p, %p)\n",
383
dma, translate, map, unmap);
386
dma->translate = translate;
391
void *iommu_dma_memory_map(DMAContext *dma, dma_addr_t addr, dma_addr_t *len,
399
return dma->map(dma, addr, len, dir);
403
err = dma->translate(dma, addr, &paddr, &plen, dir);
409
* If this is true, the virtual region is contiguous,
410
* but the translated physical region isn't. We just
411
* clamp *len, much like address_space_map() does.
417
buf = address_space_map(dma->as, paddr, &plen, dir == DMA_DIRECTION_FROM_DEVICE);
423
void iommu_dma_memory_unmap(DMAContext *dma, void *buffer, dma_addr_t len,
424
DMADirection dir, dma_addr_t access_len)
427
dma->unmap(dma, buffer, len, dir, access_len);
431
address_space_unmap(dma->as, buffer, len, dir == DMA_DIRECTION_FROM_DEVICE,