Module Name:    src
Committed By:   riastradh
Date:           Mon Aug 27 14:48:35 UTC 2018

Modified Files:
        src/sys/external/bsd/drm2/i915drm: intel_gtt.c

Log Message:
Cope with multi-page segments.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/external/bsd/drm2/i915drm/intel_gtt.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/i915drm/intel_gtt.c
diff -u src/sys/external/bsd/drm2/i915drm/intel_gtt.c:1.8 src/sys/external/bsd/drm2/i915drm/intel_gtt.c:1.9
--- src/sys/external/bsd/drm2/i915drm/intel_gtt.c:1.8	Mon Aug 27 07:17:01 2018
+++ src/sys/external/bsd/drm2/i915drm/intel_gtt.c	Mon Aug 27 14:48:35 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_gtt.c,v 1.8 2018/08/27 07:17:01 riastradh Exp $	*/
+/*	$NetBSD: intel_gtt.c,v 1.9 2018/08/27 14:48:35 riastradh Exp $	*/
 
 /*-
  * Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
 /* Intel GTT stubs */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.8 2018/08/27 07:17:01 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_gtt.c,v 1.9 2018/08/27 14:48:35 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/bus.h>
@@ -170,17 +170,24 @@ intel_gtt_insert_sg_entries(bus_dmamap_t
 
 	for (seg = 0; seg < dmamap->dm_nsegs; seg++) {
 		const bus_addr_t addr = dmamap->dm_segs[seg].ds_addr;
+		bus_size_t len;
 
-		KASSERT(dmamap->dm_segs[seg].ds_len == PAGE_SIZE);
-
-		/* XXX Respect flags.  */
-		error = agp_i810_write_gtt_entry(isc, va, addr, gtt_flags);
-		if (error)
-			device_printf(agp_i810_sc->as_dev,
-			    "write gtt entry"
-			    " %"PRIxMAX" -> %"PRIxMAX" failed: %d\n",
-			    (uintmax_t)va, (uintmax_t)(addr | 1), error);
-		va += PAGE_SIZE;
+		for (len = dmamap->dm_segs[seg].ds_len;
+		     len >= PAGE_SIZE;
+		     len -= PAGE_SIZE, va += PAGE_SIZE) {
+			/* XXX Respect flags.  */
+			error = agp_i810_write_gtt_entry(isc, va, addr,
+			    gtt_flags);
+			if (error)
+				device_printf(agp_i810_sc->as_dev,
+				    "write gtt entry"
+				    " %"PRIxMAX" -> %"PRIxMAX" failed: %d\n",
+				    (uintmax_t)va, (uintmax_t)(addr | 1),
+				    error);
+		}
+		KASSERTMSG(len == 0,
+		    "segment length not divisible by PAGE_SIZE: %jx",
+		    dmamap->dm_segs[seg].ds_len);
 	}
 	agp_i810_post_gtt_entry(isc, (va - PAGE_SIZE));
 	intel_gtt_chipset_flush();

Reply via email to