aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c')
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c27
1 files changed, 7 insertions, 20 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
index a3357ff7540d..a6ea75b58a83 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
@@ -266,7 +266,9 @@ static bool __vmw_piter_non_sg_next(struct vmw_piter *viter)
266 266
267static bool __vmw_piter_sg_next(struct vmw_piter *viter) 267static bool __vmw_piter_sg_next(struct vmw_piter *viter)
268{ 268{
269 return __sg_page_iter_next(&viter->iter); 269 bool ret = __vmw_piter_non_sg_next(viter);
270
271 return __sg_page_iter_dma_next(&viter->iter) && ret;
270} 272}
271 273
272 274
@@ -284,12 +286,6 @@ static struct page *__vmw_piter_non_sg_page(struct vmw_piter *viter)
284 return viter->pages[viter->i]; 286 return viter->pages[viter->i];
285} 287}
286 288
287static struct page *__vmw_piter_sg_page(struct vmw_piter *viter)
288{
289 return sg_page_iter_page(&viter->iter);
290}
291
292
293/** 289/**
294 * Helper functions to return the DMA address of the current page. 290 * Helper functions to return the DMA address of the current page.
295 * 291 *
@@ -311,13 +307,7 @@ static dma_addr_t __vmw_piter_dma_addr(struct vmw_piter *viter)
311 307
312static dma_addr_t __vmw_piter_sg_addr(struct vmw_piter *viter) 308static dma_addr_t __vmw_piter_sg_addr(struct vmw_piter *viter)
313{ 309{
314 /* 310 return sg_page_iter_dma_address(&viter->iter);
315 * FIXME: This driver wrongly mixes DMA and CPU SG list iteration and
316 * needs revision. See
317 * https://lore.kernel.org/lkml/20190104223531.GA1705@ziepe.ca/
318 */
319 return sg_page_iter_dma_address(
320 container_of(&viter->iter, struct sg_dma_page_iter, base));
321} 311}
322 312
323 313
@@ -336,26 +326,23 @@ void vmw_piter_start(struct vmw_piter *viter, const struct vmw_sg_table *vsgt,
336{ 326{
337 viter->i = p_offset - 1; 327 viter->i = p_offset - 1;
338 viter->num_pages = vsgt->num_pages; 328 viter->num_pages = vsgt->num_pages;
329 viter->page = &__vmw_piter_non_sg_page;
330 viter->pages = vsgt->pages;
339 switch (vsgt->mode) { 331 switch (vsgt->mode) {
340 case vmw_dma_phys: 332 case vmw_dma_phys:
341 viter->next = &__vmw_piter_non_sg_next; 333 viter->next = &__vmw_piter_non_sg_next;
342 viter->dma_address = &__vmw_piter_phys_addr; 334 viter->dma_address = &__vmw_piter_phys_addr;
343 viter->page = &__vmw_piter_non_sg_page;
344 viter->pages = vsgt->pages;
345 break; 335 break;
346 case vmw_dma_alloc_coherent: 336 case vmw_dma_alloc_coherent:
347 viter->next = &__vmw_piter_non_sg_next; 337 viter->next = &__vmw_piter_non_sg_next;
348 viter->dma_address = &__vmw_piter_dma_addr; 338 viter->dma_address = &__vmw_piter_dma_addr;
349 viter->page = &__vmw_piter_non_sg_page;
350 viter->addrs = vsgt->addrs; 339 viter->addrs = vsgt->addrs;
351 viter->pages = vsgt->pages;
352 break; 340 break;
353 case vmw_dma_map_populate: 341 case vmw_dma_map_populate:
354 case vmw_dma_map_bind: 342 case vmw_dma_map_bind:
355 viter->next = &__vmw_piter_sg_next; 343 viter->next = &__vmw_piter_sg_next;
356 viter->dma_address = &__vmw_piter_sg_addr; 344 viter->dma_address = &__vmw_piter_sg_addr;
357 viter->page = &__vmw_piter_sg_page; 345 __sg_page_iter_start(&viter->iter.base, vsgt->sgt->sgl,
358 __sg_page_iter_start(&viter->iter, vsgt->sgt->sgl,
359 vsgt->sgt->orig_nents, p_offset); 346 vsgt->sgt->orig_nents, p_offset);
360 break; 347 break;
361 default: 348 default: