Module Name:    src
Committed By:   riastradh
Date:           Fri Apr  3 01:09:42 UTC 2015

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/nouveau: nouveau_agp.c nouveau_ttm.c
        src/sys/external/bsd/drm2/dist/drm/radeon: radeon_agp.c radeon_object.c
        src/sys/external/bsd/drm2/dist/drm/ttm: ttm_bo.c

Log Message:
Use pmap_pv(9) to remove mappings of device pages in TTM.

Adapt nouveau and radeon to do pmap_pv_track for their device pages.

Proposed on tech-kern with no objections:

https://mail-index.netbsd.org/tech-kern/2015/03/26/msg018561.html

Further background at:

https://mail-index.netbsd.org/tech-kern/2014/07/23/msg017392.html


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_agp.c
cvs rdiff -u -r1.3 -r1.4 \
    src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_ttm.c
cvs rdiff -u -r1.2 -r1.3 \
    src/sys/external/bsd/drm2/dist/drm/radeon/radeon_agp.c \
    src/sys/external/bsd/drm2/dist/drm/radeon/radeon_object.c
cvs rdiff -u -r1.6 -r1.7 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.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/nouveau/nouveau_agp.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_agp.c:1.2 src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_agp.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_agp.c:1.2	Wed Aug  6 13:35:13 2014
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_agp.c	Fri Apr  3 01:09:42 2015
@@ -1,7 +1,7 @@
-/*	$NetBSD: nouveau_agp.c,v 1.2 2014/08/06 13:35:13 riastradh Exp $	*/
+/*	$NetBSD: nouveau_agp.c,v 1.3 2015/04/03 01:09:42 riastradh Exp $	*/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_agp.c,v 1.2 2014/08/06 13:35:13 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_agp.c,v 1.3 2015/04/03 01:09:42 riastradh Exp $");
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
@@ -190,6 +190,9 @@ nouveau_agp_init(struct nouveau_drm *drm
 	drm->agp.stat = ENABLED;
 	drm->agp.base = info.aperture_base;
 	drm->agp.size = info.aperture_size;
+#ifdef __NetBSD__
+	pmap_pv_track(drm->agp.base, drm->agp.size);
+#endif
 #endif
 }
 
@@ -198,7 +201,11 @@ nouveau_agp_fini(struct nouveau_drm *drm
 {
 #if __OS_HAS_AGP
 	struct drm_device *dev = drm->dev;
-	if (dev->agp && dev->agp->acquired)
+	if (dev->agp && dev->agp->acquired) {
+#ifdef __NetBSD__
+		pmap_pv_untrack(drm->agp.base, drm->agp.size);
+#endif
 		drm_agp_release(dev);
+	}
 #endif
 }

Index: src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_ttm.c
diff -u src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_ttm.c:1.3 src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_ttm.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_ttm.c:1.3	Wed Feb 25 22:12:00 2015
+++ src/sys/external/bsd/drm2/dist/drm/nouveau/nouveau_ttm.c	Fri Apr  3 01:09:42 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: nouveau_ttm.c,v 1.3 2015/02/25 22:12:00 riastradh Exp $	*/
+/*	$NetBSD: nouveau_ttm.c,v 1.4 2015/04/03 01:09:42 riastradh Exp $	*/
 
 /*
  * Copyright (c) 2007-2008 Tungsten Graphics, Inc., Cedar Park, TX., USA,
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nouveau_ttm.c,v 1.3 2015/02/25 22:12:00 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nouveau_ttm.c,v 1.4 2015/04/03 01:09:42 riastradh Exp $");
 
 #include <subdev/fb.h>
 #include <subdev/vm.h>
@@ -443,6 +443,11 @@ nouveau_ttm_init(struct nouveau_drm *drm
 	drm->ttm.mtrr = arch_phys_wc_add(nv_device_resource_start(device, 1),
 					 nv_device_resource_len(device, 1));
 
+#ifdef __NetBSD__
+	pmap_pv_track(nv_device_resource_start(device, 1),
+	    nv_device_resource_len(device, 1));
+#endif
+
 	/* GART init */
 	if (drm->agp.stat != ENABLED) {
 		drm->gem.gart_available = nouveau_vmmgr(drm->device)->limit;
@@ -476,4 +481,9 @@ nouveau_ttm_fini(struct nouveau_drm *drm
 
 	arch_phys_wc_del(drm->ttm.mtrr);
 	drm->ttm.mtrr = 0;
+
+#ifdef __NetBSD__
+	pmap_pv_untrack(nv_device_resource_start(nv_device(drm->device), 1),
+	    nv_device_resource_len(nv_device(drm->device), 1));
+#endif
 }

Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_agp.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_agp.c:1.2 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_agp.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_agp.c:1.2	Wed Jul 16 20:59:57 2014
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_agp.c	Fri Apr  3 01:09:42 2015
@@ -248,6 +248,10 @@ int radeon_agp_init(struct radeon_device
 	dev_info(rdev->dev, "GTT: %"PRIu64"M 0x%08"PRIX64" - 0x%08"PRIX64"\n",
 		rdev->mc.gtt_size >> 20, rdev->mc.gtt_start, rdev->mc.gtt_end);
 
+#ifdef __NetBSD__
+	pmap_pv_track(rdev->mc.agp_base, rdev->mc.gtt_size);
+#endif
+
 	/* workaround some hw issues */
 	if (rdev->family < CHIP_R200) {
 		WREG32(RADEON_AGP_CNTL, RREG32(RADEON_AGP_CNTL) | 0x000e0000);
@@ -274,6 +278,9 @@ void radeon_agp_fini(struct radeon_devic
 {
 #if __OS_HAS_AGP
 	if (rdev->ddev->agp && rdev->ddev->agp->acquired) {
+#ifdef __NetBSD__
+		pmap_pv_untrack(rdev->mc.agp_base, rdev->mc.gtt_size);
+#endif
 		drm_agp_release(rdev->ddev);
 	}
 #endif
Index: src/sys/external/bsd/drm2/dist/drm/radeon/radeon_object.c
diff -u src/sys/external/bsd/drm2/dist/drm/radeon/radeon_object.c:1.2 src/sys/external/bsd/drm2/dist/drm/radeon/radeon_object.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/radeon/radeon_object.c:1.2	Wed Jul 16 20:59:57 2014
+++ src/sys/external/bsd/drm2/dist/drm/radeon/radeon_object.c	Fri Apr  3 01:09:42 2015
@@ -366,6 +366,10 @@ int radeon_bo_init(struct radeon_device 
 		rdev->mc.vram_mtrr = arch_phys_wc_add(rdev->mc.aper_base,
 						      rdev->mc.aper_size);
 	}
+#ifdef __NetBSD__
+	if (rdev->mc.aper_base)
+		pmap_pv_track(rdev->mc.aper_base, rdev->mc.aper_size);
+#endif
 	DRM_INFO("Detected VRAM RAM=%"PRIx64"M, BAR=%lluM\n",
 		rdev->mc.mc_vram_size >> 20,
 		(unsigned long long)rdev->mc.aper_size >> 20);
@@ -377,6 +381,10 @@ int radeon_bo_init(struct radeon_device 
 void radeon_bo_fini(struct radeon_device *rdev)
 {
 	radeon_ttm_fini(rdev);
+#ifdef __NetBSD__
+	if (rdev->mc.aper_base)
+		pmap_pv_untrack(rdev->mc.aper_base, rdev->mc.aper_size);
+#endif
 	arch_phys_wc_del(rdev->mc.vram_mtrr);
 }
 

Index: src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c
diff -u src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:1.6 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:1.7
--- src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:1.6	Mon Aug 18 02:43:27 2014
+++ src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c	Fri Apr  3 01:09:42 2015
@@ -1611,11 +1611,16 @@ void ttm_bo_unmap_virtual_locked(struct 
 
 #ifdef __NetBSD__
 	if (bo->mem.bus.is_iomem) {
-		/*
-		 * XXX OOPS!  NetBSD doesn't have a way to enumerate
-		 * and remove the virtual mappings for device addresses
-		 * or of a uvm object.
-		 */
+		paddr_t start, end, pa;
+
+		KASSERT((bo->mem.bus.base & (PAGE_SIZE - 1)) == 0);
+		KASSERT((bo->mem.bus.offset & (PAGE_SIZE - 1)) == 0);
+		start = bo->mem.bus.base + bo->mem.bus.offset;
+		KASSERT((bo->mem.bus.size & (PAGE_SIZE - 1)) == 0);
+		end = start + bo->mem.bus.size;
+
+		for (pa = start; pa < end; pa += PAGE_SIZE)
+			pmap_pv_protect(pa, VM_PROT_NONE);
 	} else if (bo->ttm != NULL) {
 		unsigned i;
 

Reply via email to