Module Name:    src
Committed By:   christos
Date:           Fri Mar  6 22:24:05 UTC 2015

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/i915: i915_gem.c

Log Message:
Dedup the NetBSD portion of the code (ok Riastradh), no functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.27 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.28
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c:1.27	Wed Mar  4 20:04:51 2015
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem.c	Fri Mar  6 17:24:05 2015
@@ -705,51 +705,21 @@ i915_gem_shmem_pread(struct drm_device *
 	offset = args->offset;
 
 #ifdef __NetBSD__
-	/*
-	 * XXX This is a big #ifdef with a lot of duplicated code, but
-	 * factoring out the loop head -- which is all that
-	 * substantially differs -- is probably more trouble than it's
-	 * worth at the moment.
-	 */
-	while (0 < remain) {
-		/* Get the next page.  */
-		shmem_page_offset = offset_in_page(offset);
-		KASSERT(shmem_page_offset < PAGE_SIZE);
-		page_length = MIN(remain, (PAGE_SIZE - shmem_page_offset));
+	while (0 < remain)
+#else
+	for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents,
+			 offset >> PAGE_SHIFT)
+#endif
+	{
+#ifdef __NetBSD__
 		struct page *const page = i915_gem_object_get_page(obj,
 		    atop(offset));
-
-		/* Decide whether to swizzle bit 17.  */
-		page_do_bit17_swizzling = obj_do_bit17_swizzling &&
-		    (page_to_phys(page) & (1 << 17)) != 0;
-
-		/* Try the fast path.  */
-		ret = shmem_pread_fast(page, shmem_page_offset, page_length,
-		    user_data, page_do_bit17_swizzling, needs_clflush);
-		if (ret == 0)
-			goto next_page;
-
-		/* Fast path failed.  Try the slow path.  */
-		mutex_unlock(&dev->struct_mutex);
-		/* XXX prefault */
-		ret = shmem_pread_slow(page, shmem_page_offset, page_length,
-		    user_data, page_do_bit17_swizzling, needs_clflush);
-		mutex_lock(&dev->struct_mutex);
-		if (ret)
-			goto out;
-
-next_page:	KASSERT(page_length <= remain);
-		remain -= page_length;
-		user_data += page_length;
-		offset += page_length;
-	}
 #else
-	for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents,
-			 offset >> PAGE_SHIFT) {
 		struct page *page = sg_page_iter_page(&sg_iter);
 
 		if (remain <= 0)
 			break;
+#endif
 
 		/* Operation in this page
 		 *
@@ -771,7 +741,7 @@ next_page:	KASSERT(page_length <= remain
 			goto next_page;
 
 		mutex_unlock(&dev->struct_mutex);
-
+#ifndef __NetBSD__
 		if (likely(!i915.prefault_disable) && !prefaulted) {
 			ret = fault_in_multipages_writeable(user_data, remain);
 			/* Userspace is tricking us, but we've already clobbered
@@ -781,7 +751,7 @@ next_page:	KASSERT(page_length <= remain
 			(void)ret;
 			prefaulted = 1;
 		}
-
+#endif
 		ret = shmem_pread_slow(page, shmem_page_offset, page_length,
 				       user_data, page_do_bit17_swizzling,
 				       needs_clflush);
@@ -796,7 +766,6 @@ next_page:
 		user_data += page_length;
 		offset += page_length;
 	}
-#endif
 
 out:
 	i915_gem_object_unpin_pages(obj);
@@ -1050,6 +1019,9 @@ i915_gem_shmem_pwrite(struct drm_device 
 	int needs_clflush_before = 0;
 #ifndef __NetBSD__
 	struct sg_page_iter sg_iter;
+	int flush_mask = boot_cpu_data.x86_clflush_size - 1;
+#else
+	int flush_mask = cpu_info_primary.ci_cflush_lsize - 1;
 #endif
 
 	user_data = to_user_ptr(args->data_ptr);
@@ -1083,48 +1055,18 @@ i915_gem_shmem_pwrite(struct drm_device 
 	obj->dirty = 1;
 
 #ifdef __NetBSD__
-	while (0 < remain) {
-		/* Get the next page.  */
-		shmem_page_offset = offset_in_page(offset);
-		KASSERT(shmem_page_offset < PAGE_SIZE);
-		page_length = MIN(remain, (PAGE_SIZE - shmem_page_offset));
+	while (0 < remain)
+#else
+	for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents,
+			 offset >> PAGE_SHIFT)
+#endif
+	{
+#ifdef __NetBSD__
 		struct page *const page = i915_gem_object_get_page(obj,
 		    atop(offset));
-
-		/* Decide whether to flush the cache or swizzle bit 17.  */
-		const bool partial_cacheline_write = needs_clflush_before &&
-		    ((shmem_page_offset | page_length)
-			& (cpu_info_primary.ci_cflush_lsize - 1));
-		page_do_bit17_swizzling = obj_do_bit17_swizzling &&
-		    (page_to_phys(page) & (1 << 17)) != 0;
-
-		/* Try the fast path.  */
-		ret = shmem_pwrite_fast(page, shmem_page_offset, page_length,
-		    user_data, page_do_bit17_swizzling,
-		    partial_cacheline_write, needs_clflush_after);
-		if (ret == 0)
-			goto next_page;
-
-		/* Fast path failed.  Try the slow path.  */
-		hit_slowpath = 1;
-		mutex_unlock(&dev->struct_mutex);
-		ret = shmem_pwrite_slow(page, shmem_page_offset, page_length,
-		    user_data, page_do_bit17_swizzling,
-		    partial_cacheline_write, needs_clflush_after);
-		mutex_lock(&dev->struct_mutex);
-		if (ret)
-			goto out;
-
-next_page:	KASSERT(page_length <= remain);
-		remain -= page_length;
-		user_data += page_length;
-		offset += page_length;
-	}
 #else
-	for_each_sg_page(obj->pages->sgl, &sg_iter, obj->pages->nents,
-			 offset >> PAGE_SHIFT) {
 		struct page *page = sg_page_iter_page(&sg_iter);
-		int partial_cacheline_write;
+#endif
 
 		if (remain <= 0)
 			break;
@@ -1143,9 +1085,8 @@ next_page:	KASSERT(page_length <= remain
 		/* If we don't overwrite a cacheline completely we need to be
 		 * careful to have up-to-date data by first clflushing. Don't
 		 * overcomplicate things and flush the entire patch. */
-		partial_cacheline_write = needs_clflush_before &&
-			((shmem_page_offset | page_length)
-				& (boot_cpu_data.x86_clflush_size - 1));
+		const int partial_cacheline_write = needs_clflush_before &&
+			((shmem_page_offset | page_length) & flush_mask);
 
 		page_do_bit17_swizzling = obj_do_bit17_swizzling &&
 			(page_to_phys(page) & (1 << 17)) != 0;
@@ -1174,7 +1115,6 @@ next_page:
 		user_data += page_length;
 		offset += page_length;
 	}
-#endif
 
 out:
 	i915_gem_object_unpin_pages(obj);

Reply via email to