Lines Matching refs:vsg

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