diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c')
| -rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c | 27 |
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 | ||
| 267 | static bool __vmw_piter_sg_next(struct vmw_piter *viter) | 267 | static 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 | ||
| 287 | static 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 | ||
| 312 | static dma_addr_t __vmw_piter_sg_addr(struct vmw_piter *viter) | 308 | static 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: |
