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