Module Name: src
Committed By: mrg
Date: Sun Mar 29 19:50:17 UTC 2009
Modified Files:
src/sys/dev/drm: drm_bufs.c drm_vm.c
Log Message:
drm_addmap():
- for _DRM_CONSISTENT mappings, keep the handle.
- use DRM_HANDLE_NEEDS_MASK()
drm_mapbufs():
- use DRM_HANDLE_NEEDS_MASK()
drm_mmap():
- use DRM_HANDLE_NEEDS_MASK()
- for _DRM_SCATTER_GATHER and _DRM_SHM, use vtophys() on the
adjusted offset. XXX
this is gets radeon working on amd64 with an older PCI 9250 card.
XXX: need to excise vtophys() usage.
XXX: need to finish porting these fixes to external.
To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/drm/drm_bufs.c
cvs rdiff -u -r1.16 -r1.17 src/sys/dev/drm/drm_vm.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/dev/drm/drm_bufs.c
diff -u src/sys/dev/drm/drm_bufs.c:1.10 src/sys/dev/drm/drm_bufs.c:1.11
--- src/sys/dev/drm/drm_bufs.c:1.10 Sun Jun 29 12:49:08 2008
+++ src/sys/dev/drm/drm_bufs.c Sun Mar 29 19:50:17 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_bufs.c,v 1.10 2008/06/29 12:49:08 jmcneill Exp $ */
+/* $NetBSD: drm_bufs.c,v 1.11 2009/03/29 19:50:17 mrg Exp $ */
/* drm_bufs.h -- Generic buffer template -*- linux-c -*-
* Created: Thu Nov 23 03:10:50 2000 by [email protected]
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_bufs.c,v 1.10 2008/06/29 12:49:08 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_bufs.c,v 1.11 2009/03/29 19:50:17 mrg Exp $");
/*
__FBSDID("$FreeBSD: src/sys/dev/drm/drm_bufs.c,v 1.3 2005/11/28 23:13:52 anholt Exp $");
*/
@@ -206,6 +206,7 @@
return DRM_ERR(EINVAL);
}
map->offset = map->offset + dev->sg->handle;
+ map->handle = (void *)(uintptr_t)map->offset;
break;
case _DRM_CONSISTENT:
/* Unfortunately, we don't get any alignment specification from
@@ -274,10 +275,10 @@
request.mtrr = map->mtrr;
request.handle = map->handle;
- if (request.type != _DRM_SHM) {
- request.handle = (void *)request.offset;
- } else {
+ if (DRM_HANDLE_NEEDS_MASK(request.type)) {
request.handle = (void *)DRM_NETBSD_ADDR2HANDLE((uintptr_t)map->handle);
+ } else {
+ request.handle = (void *)request.offset;
}
DRM_COPY_TO_USER_IOCTL((drm_map_t *)data, request, sizeof(drm_map_t));
@@ -1054,6 +1055,8 @@
}
size = round_page(map->size);
foff = map->offset;
+ if (DRM_HANDLE_NEEDS_MASK(map->type))
+ foff = DRM_NETBSD_ADDR2HANDLE(foff);
} else {
size = round_page(dma->byte_count),
foff = 0;
@@ -1062,7 +1065,7 @@
vaddr = p->l_proc->p_emul->e_vm_default_addr(p->l_proc,
(vaddr_t)vms->vm_daddr, size);
rsize = round_page(size);
- DRM_DEBUG("mmap %lx/%ld\n", vaddr, rsize);
+ DRM_DEBUG("mmap %#lx/%#lx foff %#llx\n", vaddr, rsize, (long long)foff);
retcode = uvm_mmap(&vms->vm_map, &vaddr, rsize,
UVM_PROT_READ | UVM_PROT_WRITE, UVM_PROT_ALL, MAP_SHARED,
&vn->v_uobj, foff, p->l_proc->p_rlimit[RLIMIT_MEMLOCK].rlim_cur);
Index: src/sys/dev/drm/drm_vm.c
diff -u src/sys/dev/drm/drm_vm.c:1.16 src/sys/dev/drm/drm_vm.c:1.17
--- src/sys/dev/drm/drm_vm.c:1.16 Sat Mar 7 05:46:09 2009
+++ src/sys/dev/drm/drm_vm.c Sun Mar 29 19:50:17 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: drm_vm.c,v 1.16 2009/03/07 05:46:09 mrg Exp $ */
+/* $NetBSD: drm_vm.c,v 1.17 2009/03/29 19:50:17 mrg Exp $ */
/*-
* Copyright 2003 Eric Anholt
@@ -24,7 +24,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: drm_vm.c,v 1.16 2009/03/07 05:46:09 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: drm_vm.c,v 1.17 2009/03/29 19:50:17 mrg Exp $");
/*
__FBSDID("$FreeBSD: src/sys/dev/drm/drm_vm.c,v 1.2 2005/11/28 23:13:53 anholt Exp $");
*/
@@ -41,8 +41,9 @@
drm_file_t *priv;
drm_map_type_t type;
paddr_t phys;
- uintptr_t roffset;
+ off_t roffset;
+ DRM_DEBUG("dev %llx offset %llx prot %d\n", (long long)kdev, (long long)offset, prot);
DRM_LOCK();
priv = drm_find_file_by_proc(dev, DRM_CURPROC);
DRM_UNLOCK();
@@ -85,7 +86,7 @@
DRM_LOCK();
roffset = DRM_NETBSD_HANDLE2ADDR(offset);
TAILQ_FOREACH(map, &dev->maplist, link) {
- if (map->type == _DRM_SHM) {
+ if (DRM_HANDLE_NEEDS_MASK(map->type)) {
if (roffset >= (uintptr_t)map->handle && roffset < (uintptr_t)map->handle + map->size)
break;
} else {
@@ -117,16 +118,15 @@
phys = vtophys((paddr_t)map->handle + (offset - map->offset));
break;
case _DRM_SCATTER_GATHER:
- phys = vtophys(offset);
- break;
case _DRM_SHM:
- phys = vtophys(DRM_NETBSD_HANDLE2ADDR(offset));
+ phys = vtophys(roffset);
break;
default:
DRM_ERROR("bad map type %d\n", type);
return -1; /* This should never happen. */
}
+ DRM_DEBUG("going to return phys %lx\n", phys);
#ifdef macppc
return phys;
#else