Revision f487b677
b/dma-helpers.c | ||
---|---|---|
34 | 34 |
return error; |
35 | 35 |
} |
36 | 36 |
|
37 |
void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint, AddressSpace *as) |
|
37 |
void qemu_sglist_init(QEMUSGList *qsg, DeviceState *dev, int alloc_hint, |
|
38 |
AddressSpace *as) |
|
38 | 39 |
{ |
39 | 40 |
qsg->sg = g_malloc(alloc_hint * sizeof(ScatterGatherEntry)); |
40 | 41 |
qsg->nsg = 0; |
41 | 42 |
qsg->nalloc = alloc_hint; |
42 | 43 |
qsg->size = 0; |
43 | 44 |
qsg->as = as; |
45 |
qsg->dev = dev; |
|
46 |
object_ref(OBJECT(dev)); |
|
44 | 47 |
} |
45 | 48 |
|
46 | 49 |
void qemu_sglist_add(QEMUSGList *qsg, dma_addr_t base, dma_addr_t len) |
... | ... | |
57 | 60 |
|
58 | 61 |
void qemu_sglist_destroy(QEMUSGList *qsg) |
59 | 62 |
{ |
63 |
object_unref(OBJECT(qsg->dev)); |
|
60 | 64 |
g_free(qsg->sg); |
61 | 65 |
memset(qsg, 0, sizeof(*qsg)); |
62 | 66 |
} |
b/hw/ide/ahci.c | ||
---|---|---|
650 | 650 |
int off_idx = -1; |
651 | 651 |
int off_pos = -1; |
652 | 652 |
int tbl_entry_size; |
653 |
IDEBus *bus = &ad->port; |
|
654 |
BusState *qbus = BUS(bus); |
|
653 | 655 |
|
654 | 656 |
if (!sglist_alloc_hint) { |
655 | 657 |
DPRINTF(ad->port_no, "no sg list given by guest: 0x%08x\n", opts); |
... | ... | |
691 | 693 |
goto out; |
692 | 694 |
} |
693 | 695 |
|
694 |
qemu_sglist_init(sglist, (sglist_alloc_hint - off_idx), ad->hba->as); |
|
696 |
qemu_sglist_init(sglist, qbus->parent, (sglist_alloc_hint - off_idx), |
|
697 |
ad->hba->as); |
|
695 | 698 |
qemu_sglist_add(sglist, le64_to_cpu(tbl[off_idx].addr + off_pos), |
696 | 699 |
le32_to_cpu(tbl[off_idx].flags_size) + 1 - off_pos); |
697 | 700 |
|
b/hw/ide/macio.c | ||
---|---|---|
70 | 70 |
|
71 | 71 |
s->io_buffer_size = io->len; |
72 | 72 |
|
73 |
qemu_sglist_init(&s->sg, io->len / MACIO_PAGE_SIZE + 1, |
|
73 |
qemu_sglist_init(&s->sg, DEVICE(m), io->len / MACIO_PAGE_SIZE + 1,
|
|
74 | 74 |
&address_space_memory); |
75 | 75 |
qemu_sglist_add(&s->sg, io->addr, io->len); |
76 | 76 |
io->addr += io->len; |
... | ... | |
127 | 127 |
s->io_buffer_index = 0; |
128 | 128 |
s->io_buffer_size = io->len; |
129 | 129 |
|
130 |
qemu_sglist_init(&s->sg, io->len / MACIO_PAGE_SIZE + 1, |
|
130 |
qemu_sglist_init(&s->sg, DEVICE(m), io->len / MACIO_PAGE_SIZE + 1,
|
|
131 | 131 |
&address_space_memory); |
132 | 132 |
qemu_sglist_add(&s->sg, io->addr, io->len); |
133 | 133 |
io->addr += io->len; |
b/hw/scsi/virtio-scsi.c | ||
---|---|---|
77 | 77 |
exit(1); |
78 | 78 |
} |
79 | 79 |
|
80 |
static void qemu_sgl_init_external(QEMUSGList *qsgl, struct iovec *sg,
|
|
80 |
static void qemu_sgl_init_external(VirtIOSCSIReq *req, struct iovec *sg,
|
|
81 | 81 |
hwaddr *addr, int num) |
82 | 82 |
{ |
83 |
qemu_sglist_init(qsgl, num, &address_space_memory); |
|
83 |
QEMUSGList *qsgl = &req->qsgl; |
|
84 |
|
|
85 |
qemu_sglist_init(qsgl, DEVICE(req->dev), num, &address_space_memory); |
|
84 | 86 |
while (num--) { |
85 | 87 |
qemu_sglist_add(qsgl, *(addr++), (sg++)->iov_len); |
86 | 88 |
} |
... | ... | |
99 | 101 |
req->resp.buf = req->elem.in_sg[0].iov_base; |
100 | 102 |
|
101 | 103 |
if (req->elem.out_num > 1) { |
102 |
qemu_sgl_init_external(&req->qsgl, &req->elem.out_sg[1],
|
|
104 |
qemu_sgl_init_external(req, &req->elem.out_sg[1],
|
|
103 | 105 |
&req->elem.out_addr[1], |
104 | 106 |
req->elem.out_num - 1); |
105 | 107 |
} else { |
106 |
qemu_sgl_init_external(&req->qsgl, &req->elem.in_sg[1],
|
|
108 |
qemu_sgl_init_external(req, &req->elem.in_sg[1],
|
|
107 | 109 |
&req->elem.in_addr[1], |
108 | 110 |
req->elem.in_num - 1); |
109 | 111 |
} |
b/hw/usb/hcd-ehci.c | ||
---|---|---|
1241 | 1241 |
{ |
1242 | 1242 |
uint32_t cpage, offset, bytes, plen; |
1243 | 1243 |
dma_addr_t page; |
1244 |
USBBus *bus = &p->queue->ehci->bus; |
|
1245 |
BusState *qbus = BUS(bus); |
|
1244 | 1246 |
|
1245 | 1247 |
cpage = get_field(p->qtd.token, QTD_TOKEN_CPAGE); |
1246 | 1248 |
bytes = get_field(p->qtd.token, QTD_TOKEN_TBYTES); |
1247 | 1249 |
offset = p->qtd.bufptr[0] & ~QTD_BUFPTR_MASK; |
1248 |
qemu_sglist_init(&p->sgl, 5, p->queue->ehci->as); |
|
1250 |
qemu_sglist_init(&p->sgl, qbus->parent, 5, p->queue->ehci->as);
|
|
1249 | 1251 |
|
1250 | 1252 |
while (bytes > 0) { |
1251 | 1253 |
if (cpage > 4) { |
... | ... | |
1484 | 1486 |
return -1; |
1485 | 1487 |
} |
1486 | 1488 |
|
1487 |
qemu_sglist_init(&ehci->isgl, 2, ehci->as); |
|
1489 |
qemu_sglist_init(&ehci->isgl, DEVICE(ehci), 2, ehci->as);
|
|
1488 | 1490 |
if (off + len > 4096) { |
1489 | 1491 |
/* transfer crosses page border */ |
1490 | 1492 |
uint32_t len2 = off + len - 4096; |
b/include/hw/pci/pci.h | ||
---|---|---|
702 | 702 |
static inline void pci_dma_sglist_init(QEMUSGList *qsg, PCIDevice *dev, |
703 | 703 |
int alloc_hint) |
704 | 704 |
{ |
705 |
qemu_sglist_init(qsg, alloc_hint, pci_get_address_space(dev)); |
|
705 |
qemu_sglist_init(qsg, DEVICE(dev), alloc_hint, pci_get_address_space(dev));
|
|
706 | 706 |
} |
707 | 707 |
|
708 | 708 |
extern const VMStateDescription vmstate_pci_device; |
b/include/sysemu/dma.h | ||
---|---|---|
29 | 29 |
int nsg; |
30 | 30 |
int nalloc; |
31 | 31 |
size_t size; |
32 |
DeviceState *dev; |
|
32 | 33 |
AddressSpace *as; |
33 | 34 |
}; |
34 | 35 |
|
... | ... | |
189 | 190 |
dma_addr_t len; |
190 | 191 |
}; |
191 | 192 |
|
192 |
void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint, AddressSpace *as); |
|
193 |
void qemu_sglist_init(QEMUSGList *qsg, DeviceState *dev, int alloc_hint, |
|
194 |
AddressSpace *as); |
|
193 | 195 |
void qemu_sglist_add(QEMUSGList *qsg, dma_addr_t base, dma_addr_t len); |
194 | 196 |
void qemu_sglist_destroy(QEMUSGList *qsg); |
195 | 197 |
#endif |
Also available in: Unified diff