diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_userptr.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_userptr.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c index 1f4e5a32a16e..8fd431bcdfd3 100644 --- a/drivers/gpu/drm/i915/i915_gem_userptr.c +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c | |||
@@ -545,6 +545,26 @@ err: | |||
545 | return ret; | 545 | return ret; |
546 | } | 546 | } |
547 | 547 | ||
548 | static int | ||
549 | __i915_gem_userptr_set_pages(struct drm_i915_gem_object *obj, | ||
550 | struct page **pvec, int num_pages) | ||
551 | { | ||
552 | int ret; | ||
553 | |||
554 | ret = st_set_pages(&obj->pages, pvec, num_pages); | ||
555 | if (ret) | ||
556 | return ret; | ||
557 | |||
558 | ret = i915_gem_gtt_prepare_object(obj); | ||
559 | if (ret) { | ||
560 | sg_free_table(obj->pages); | ||
561 | kfree(obj->pages); | ||
562 | obj->pages = NULL; | ||
563 | } | ||
564 | |||
565 | return ret; | ||
566 | } | ||
567 | |||
548 | static void | 568 | static void |
549 | __i915_gem_userptr_get_pages_worker(struct work_struct *_work) | 569 | __i915_gem_userptr_get_pages_worker(struct work_struct *_work) |
550 | { | 570 | { |
@@ -584,9 +604,12 @@ __i915_gem_userptr_get_pages_worker(struct work_struct *_work) | |||
584 | if (obj->userptr.work != &work->work) { | 604 | if (obj->userptr.work != &work->work) { |
585 | ret = 0; | 605 | ret = 0; |
586 | } else if (pinned == num_pages) { | 606 | } else if (pinned == num_pages) { |
587 | ret = st_set_pages(&obj->pages, pvec, num_pages); | 607 | ret = __i915_gem_userptr_set_pages(obj, pvec, num_pages); |
588 | if (ret == 0) { | 608 | if (ret == 0) { |
589 | list_add_tail(&obj->global_list, &to_i915(dev)->mm.unbound_list); | 609 | list_add_tail(&obj->global_list, &to_i915(dev)->mm.unbound_list); |
610 | obj->get_page.sg = obj->pages->sgl; | ||
611 | obj->get_page.last = 0; | ||
612 | |||
590 | pinned = 0; | 613 | pinned = 0; |
591 | } | 614 | } |
592 | } | 615 | } |
@@ -693,7 +716,7 @@ i915_gem_userptr_get_pages(struct drm_i915_gem_object *obj) | |||
693 | } | 716 | } |
694 | } | 717 | } |
695 | } else { | 718 | } else { |
696 | ret = st_set_pages(&obj->pages, pvec, num_pages); | 719 | ret = __i915_gem_userptr_set_pages(obj, pvec, num_pages); |
697 | if (ret == 0) { | 720 | if (ret == 0) { |
698 | obj->userptr.work = NULL; | 721 | obj->userptr.work = NULL; |
699 | pinned = 0; | 722 | pinned = 0; |
@@ -715,6 +738,8 @@ i915_gem_userptr_put_pages(struct drm_i915_gem_object *obj) | |||
715 | if (obj->madv != I915_MADV_WILLNEED) | 738 | if (obj->madv != I915_MADV_WILLNEED) |
716 | obj->dirty = 0; | 739 | obj->dirty = 0; |
717 | 740 | ||
741 | i915_gem_gtt_finish_object(obj); | ||
742 | |||
718 | for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { | 743 | for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents, 0) { |
719 | struct page *page = sg_page_iter_page(&sg_iter); | 744 | struct page *page = sg_page_iter_page(&sg_iter); |
720 | 745 | ||