Subversion Repositories Kolibri OS

Rev

Rev 4392 | Rev 4560 | 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);