Rev 4392 | Rev 5060 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4392 | Rev 4539 | ||
---|---|---|---|
Line 631... | Line 631... | ||
631 | drm_i915_private_t *dev_priv = dev->dev_private; |
631 | drm_i915_private_t *dev_priv = dev->dev_private; |
632 | ssize_t remain; |
632 | ssize_t remain; |
633 | loff_t offset, page_base; |
633 | loff_t offset, page_base; |
634 | char __user *user_data; |
634 | char __user *user_data; |
635 | int page_offset, page_length, ret; |
635 | int page_offset, page_length, ret; |
636 | char *vaddr; |
- | |
Line 637... | Line 636... | ||
637 | 636 | ||
638 | ret = i915_gem_obj_ggtt_pin(obj, 0, true, true); |
637 | ret = i915_gem_obj_ggtt_pin(obj, 0, true, true); |
639 | if (ret) |
638 | if (ret) |
Line 645... | Line 644... | ||
645 | 644 | ||
646 | ret = i915_gem_object_put_fence(obj); |
645 | ret = i915_gem_object_put_fence(obj); |
647 | if (ret) |
646 | if (ret) |
Line 648... | Line -... | ||
648 | goto out_unpin; |
- | |
649 | - | ||
650 | vaddr = AllocKernelSpace(4096); |
- | |
651 | if(vaddr == NULL) |
- | |
652 | { |
- | |
653 | ret = -ENOSPC; |
- | |
654 | goto out_unpin; |
- | |
655 | }; |
647 | goto out_unpin; |
656 | 648 | ||
Line 657... | Line 649... | ||
657 | user_data = (char __user *) (uintptr_t) args->data_ptr; |
649 | user_data = to_user_ptr(args->data_ptr); |
Line 658... | Line 650... | ||
658 | remain = args->size; |
650 | remain = args->size; |
Line 670... | Line 662... | ||
670 | page_offset = offset_in_page(offset); |
662 | page_offset = offset_in_page(offset); |
671 | page_length = remain; |
663 | page_length = remain; |
672 | if ((page_offset + remain) > PAGE_SIZE) |
664 | if ((page_offset + remain) > PAGE_SIZE) |
673 | page_length = PAGE_SIZE - page_offset; |
665 | page_length = PAGE_SIZE - page_offset; |
Line 674... | Line 666... | ||
674 | 666 | ||
Line 675... | Line 667... | ||
675 | MapPage(vaddr, dev_priv->gtt.mappable_base+page_base, PG_SW|PG_NOCACHE); |
667 | MapPage(dev_priv->gtt.mappable, dev_priv->gtt.mappable_base+page_base, PG_SW); |
Line 676... | Line 668... | ||
676 | 668 | ||
677 | memcpy(vaddr+page_offset, user_data, page_length); |
669 | memcpy(dev_priv->gtt.mappable+page_offset, user_data, page_length); |
678 | 670 | ||
679 | remain -= page_length; |
671 | remain -= page_length; |
Line 680... | Line -... | ||
680 | user_data += page_length; |
- | |
681 | offset += page_length; |
- | |
682 | } |
672 | user_data += page_length; |
683 | 673 | offset += page_length; |
|
684 | FreeKernelSpace(vaddr); |
674 | } |
685 | 675 | ||
686 | out_unpin: |
676 | out_unpin: |
Line 704... | Line 694... | ||
704 | int ret = 0; |
694 | int ret = 0; |
Line 705... | Line 695... | ||
705 | 695 | ||
706 | if (unlikely(page_do_bit17_swizzling)) |
696 | if (unlikely(page_do_bit17_swizzling)) |
Line 707... | Line 697... | ||
707 | return -EINVAL; |
697 | return -EINVAL; |
708 | 698 | ||
709 | vaddr = (char *)MapIoMem((addr_t)page, 4096, PG_SW|PG_NOCACHE); |
699 | vaddr = (char *)MapIoMem((addr_t)page, 4096, PG_SW); |
710 | if (needs_clflush_before) |
700 | if (needs_clflush_before) |
711 | drm_clflush_virt_range(vaddr + shmem_page_offset, |
701 | drm_clflush_virt_range(vaddr + shmem_page_offset, |
712 | page_length); |
702 | page_length); |
Line 2080... | Line 2070... | ||
2080 | i915_gem_context_unreference(request->ctx); |
2070 | i915_gem_context_unreference(request->ctx); |
Line 2081... | Line 2071... | ||
2081 | 2071 | ||
2082 | kfree(request); |
2072 | kfree(request); |
Line 2083... | Line 2073... | ||
2083 | } |
2073 | } |
2084 | 2074 | ||
2085 | static void i915_gem_reset_ring_lists(struct drm_i915_private *dev_priv, |
2075 | static void i915_gem_reset_ring_status(struct drm_i915_private *dev_priv, |
2086 | struct intel_ring_buffer *ring) |
2076 | struct intel_ring_buffer *ring) |
2087 | { |
2077 | { |
- | 2078 | u32 completed_seqno = ring->get_seqno(ring, false); |
|
Line 2088... | Line 2079... | ||
2088 | u32 completed_seqno; |
2079 | u32 acthd = intel_ring_get_active_head(ring); |
2089 | u32 acthd; |
2080 | struct drm_i915_gem_request *request; |
- | 2081 | ||
- | 2082 | list_for_each_entry(request, &ring->request_list, list) { |
|
- | 2083 | if (i915_seqno_passed(completed_seqno, request->seqno)) |
|
- | 2084 | continue; |
|
- | 2085 | ||
Line -... | Line 2086... | ||
- | 2086 | i915_set_reset_status(ring, request, acthd); |
|
- | 2087 | } |
|
- | 2088 | } |
|
2090 | 2089 | ||
2091 | acthd = intel_ring_get_active_head(ring); |
2090 | static void i915_gem_reset_ring_cleanup(struct drm_i915_private *dev_priv, |
Line 2092... | Line 2091... | ||
2092 | completed_seqno = ring->get_seqno(ring, false); |
2091 | struct intel_ring_buffer *ring) |
2093 | 2092 | { |
|
2094 | while (!list_empty(&ring->request_list)) { |
2093 | while (!list_empty(&ring->request_list)) { |
Line 2095... | Line -... | ||
2095 | struct drm_i915_gem_request *request; |
- | |
2096 | - | ||
2097 | request = list_first_entry(&ring->request_list, |
- | |
2098 | struct drm_i915_gem_request, |
2094 | struct drm_i915_gem_request *request; |
2099 | list); |
2095 | |
Line 2100... | Line 2096... | ||
2100 | 2096 | request = list_first_entry(&ring->request_list, |
|
2101 | if (request->seqno > completed_seqno) |
2097 | struct drm_i915_gem_request, |
Line 2140... | Line 2136... | ||
2140 | { |
2136 | { |
2141 | struct drm_i915_private *dev_priv = dev->dev_private; |
2137 | struct drm_i915_private *dev_priv = dev->dev_private; |
2142 | struct intel_ring_buffer *ring; |
2138 | struct intel_ring_buffer *ring; |
2143 | int i; |
2139 | int i; |
Line -... | Line 2140... | ||
- | 2140 | ||
- | 2141 | /* |
|
- | 2142 | * Before we free the objects from the requests, we need to inspect |
|
- | 2143 | * them for finding the guilty party. As the requests only borrow |
|
- | 2144 | * their reference to the objects, the inspection must be done first. |
|
- | 2145 | */ |
|
- | 2146 | for_each_ring(ring, dev_priv, i) |
|
- | 2147 | i915_gem_reset_ring_status(dev_priv, ring); |
|
2144 | 2148 | ||
2145 | for_each_ring(ring, dev_priv, i) |
2149 | for_each_ring(ring, dev_priv, i) |
Line 2146... | Line 2150... | ||
2146 | i915_gem_reset_ring_lists(dev_priv, ring); |
2150 | i915_gem_reset_ring_cleanup(dev_priv, ring); |
2147 | 2151 | ||
Line 2148... | Line 2152... | ||
2148 | i915_gem_restore_fences(dev); |
2152 | i915_gem_restore_fences(dev); |