aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.h2
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c27
2 files changed, 8 insertions, 21 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 96983c47fb40..366dcfc1f9bb 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -296,7 +296,7 @@ struct vmw_sg_table {
296struct vmw_piter { 296struct vmw_piter {
297 struct page **pages; 297 struct page **pages;
298 const dma_addr_t *addrs; 298 const dma_addr_t *addrs;
299 struct sg_page_iter iter; 299 struct sg_dma_page_iter iter;
300 unsigned long i; 300 unsigned long i;
301 unsigned long num_pages; 301 unsigned long num_pages;
302 bool (*next)(struct vmw_piter *); 302 bool (*next)(struct vmw_piter *);
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: