Home | History | Annotate | Download | only in via

Lines Matching defs:vsg

73     drm_via_sg_info_t *vsg)
76 bus_dmamap_unload(dev->dmat, vsg->dmamap);
78 int num_desc = vsg->num_desc;
79 unsigned cur_descriptor_page = num_desc / vsg->descriptors_per_page;
80 unsigned descriptor_this_page = num_desc % vsg->descriptors_per_page;
81 drm_via_descriptor_t *desc_ptr = vsg->desc_pages[cur_descriptor_page] +
83 dma_addr_t next = vsg->chain_start;
88 descriptor_this_page = vsg->descriptors_per_page - 1;
89 desc_ptr = vsg->desc_pages[cur_descriptor_page] +
93 dma_unmap_page(&pdev->dev, desc_ptr->mem_addr, desc_ptr->size, vsg->direction);
110 drm_via_sg_info_t *vsg,
130 desc_ptr = vsg->desc_pages[cur_descriptor_page];
147 &vsg->dmamap->dm_segs[atop(cur_va)];
153 vsg->pages[VIA_PFN(cur_mem) -
156 vsg->direction);
163 next = vsg->desc_dmamap
171 if (++num_descriptors_this_page >= vsg->descriptors_per_page) {
173 desc_ptr = vsg->desc_pages[++cur_descriptor_page];
187 vsg->chain_start = next;
188 vsg->state = dr_via_device_mapped;
190 vsg->num_desc = num_desc;
202 drm_via_sg_info_t *vsg)
206 switch (vsg->state) {
208 via_unmap_blit_from_device(dev, pdev, vsg);
213 bus_dmamap_unload(dev->dmat, vsg->desc_dmamap);
214 bus_dmamap_destroy(dev->dmat, vsg->desc_dmamap);
215 bus_dmamem_unmap(dev->dmat, vsg->desc_kva,
216 (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT);
217 bus_dmamem_free(dev->dmat, vsg->desc_segs, vsg->num_desc_segs);
218 kfree(vsg->desc_segs);
220 for (i = 0; i < vsg->num_desc_pages; ++i) {
221 if (vsg->desc_pages[i] != NULL)
222 free_page((unsigned long)vsg->desc_pages[i]);
225 kfree(vsg->desc_pages);
230 bus_dmamap_unload(dev->dmat, vsg->dmamap);
232 unpin_user_pages_dirty_lock(vsg->pages, vsg->num_pages,
233 (vsg->direction == DMA_FROM_DEVICE));
238 bus_dmamap_destroy(dev->dmat, vsg->dmamap);
240 vfree(vsg->pages);
244 vsg->state = dr_via_sg_init;
246 vsg->free_on_sequence = 0;
254 via_fire_dmablit(struct drm_device *dev, drm_via_sg_info_t *vsg, int engine)
264 via_write(dev_priv, VIA_PCI_DMA_DPR0 + engine*0x10, vsg->chain_start);
276 via_lock_all_dma_pages(struct drm_device *dev, drm_via_sg_info_t *vsg,
303 BUS_DMA_WAITOK, &vsg->dmamap);
309 ret = -bus_dmamap_load_uio(dev->dmat, vsg->dmamap, &uio,
313 bus_dmamap_destroy(dev->dmat, vsg->dmamap);
316 vsg->num_pages = npages;
319 vsg->num_pages = VIA_PFN(xfer->mem_addr + (xfer->num_lines * xfer->mem_stride - 1)) -
322 vsg->pages = vzalloc(array_size(sizeof(struct page *), vsg->num_pages));
323 if (NULL == vsg->pages)
326 vsg->num_pages,
327 vsg->direction == DMA_FROM_DEVICE ? FOLL_WRITE : 0,
328 vsg->pages);
329 if (ret != vsg->num_pages) {
332 vsg->state = dr_via_pages_locked;
336 vsg->state = dr_via_pages_locked;
348 via_alloc_desc_pages(struct drm_device *dev, drm_via_sg_info_t *vsg)
355 vsg->descriptors_per_page = PAGE_SIZE / sizeof(drm_via_descriptor_t);
356 vsg->num_desc_pages = (vsg->num_desc + vsg->descriptors_per_page - 1) /
357 vsg->descriptors_per_page;
359 if (NULL == (vsg->desc_pages = kcalloc(vsg->num_desc_pages, sizeof(void *), GFP_KERNEL)))
363 vsg->desc_segs = kcalloc(vsg->num_desc_pages, sizeof(*vsg->desc_segs),
365 if (vsg->desc_segs == NULL) {
366 kfree(vsg->desc_pages);
371 (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT,
372 PAGE_SIZE, 0, vsg->desc_segs, vsg->num_pages, &vsg->num_desc_segs,
375 kfree(vsg->desc_segs);
376 kfree(vsg->desc_pages);
381 ret = -bus_dmamem_map(dev->dmat, vsg->desc_segs, vsg->num_desc_segs,
382 (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT, &vsg->desc_kva,
385 bus_dmamem_free(dev->dmat, vsg->desc_segs, vsg->num_desc_segs);
386 kfree(vsg->desc_segs);
387 kfree(vsg->desc_pages);
392 (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT,
393 vsg->num_desc_pages, PAGE_SIZE, 0, BUS_DMA_WAITOK,
394 &vsg->desc_dmamap);
396 bus_dmamem_unmap(dev->dmat, vsg->desc_kva,
397 (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT);
398 bus_dmamem_free(dev->dmat, vsg->desc_segs, vsg->num_desc_segs);
399 kfree(vsg->desc_segs);
400 kfree(vsg->desc_pages);
403 ret = -bus_dmamap_load(dev->dmat, vsg->desc_dmamap, vsg->desc_kva,
404 (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT, NULL,
407 bus_dmamap_destroy(dev->dmat, vsg->desc_dmamap);
408 bus_dmamem_unmap(dev->dmat, vsg->desc_kva,
409 (bus_size_t)vsg->num_desc_pages << PAGE_SHIFT);
410 bus_dmamem_free(dev->dmat, vsg->desc_segs, vsg->num_desc_segs);
411 kfree(vsg->desc_segs);
412 kfree(vsg->desc_pages);
415 for (i = 0; i < vsg->num_desc_pages; i++)
416 vsg->desc_pages[i] = (void *)
417 ((char *)vsg->desc_kva + (i * PAGE_SIZE));
418 vsg->state = dr_via_desc_pages_alloc;
420 vsg->state = dr_via_desc_pages_alloc;
421 for (i = 0; i < vsg->num_desc_pages; ++i) {
422 if (NULL == (vsg->desc_pages[i] =
427 DRM_DEBUG("Allocated %d pages for %d descriptors.\n", vsg->num_desc_pages,
428 vsg->num_desc);
768 via_build_sg_info(struct drm_device *dev, drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer)
773 vsg->direction = (draw) ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
775 vsg->state = dr_via_sg_init;
846 if (0 != (ret = via_lock_all_dma_pages(dev, vsg, xfer))) {
848 via_free_sg_info(dev, dev->pdev, vsg);
852 via_map_blit_for_device(dev->pdev, xfer, vsg, 0);
853 if (0 != (ret = via_alloc_desc_pages(dev, vsg))) {
855 via_free_sg_info(dev, dev->pdev, vsg);
858 via_map_blit_for_device(dev->pdev, xfer, vsg, 1);
936 drm_via_sg_info_t *vsg;
951 if (NULL == (vsg = kmalloc(sizeof(*vsg), GFP_KERNEL))) {
955 if (0 != (ret = via_build_sg_info(dev, vsg, xfer))) {
957 kfree(vsg);
962 bus_dmamap_sync(dev->dmat, vsg->dmamap, 0,
963 vsg->num_pages << PAGE_SHIFT,
964 (vsg->direction == DMA_FROM_DEVICE
970 blitq->blits[blitq->head++] = vsg;