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;