In article <20140321180950.24a7...@cvs.netbsd.org>, Taylor R Campbell <source-changes-d@NetBSD.org> wrote: >-=-=-=-=-=- > >Module Name: xsrc >Committed By: riastradh >Date: Fri Mar 21 18:09:50 UTC 2014 > >Modified Files: > xsrc/external/mit/libdrm/dist: xf86drm.c > xsrc/external/mit/libdrm/dist/include/drm: drm.h > >Log Message: >Use the NetBSD-specific mmapping ioctl for drmMap. > > >To generate a diff of this commit: >cvs rdiff -u -r1.5 -r1.6 xsrc/external/mit/libdrm/dist/xf86drm.c >cvs rdiff -u -r1.1.1.4 -r1.2 xsrc/external/mit/libdrm/dist/include/drm/drm.h > >Please note that diffs are not public domain; they are subject to the >copyright notices on the relevant files. > > >-=-=-=-=-=- > >Modified files: > >Index: xsrc/external/mit/libdrm/dist/xf86drm.c >diff -u xsrc/external/mit/libdrm/dist/xf86drm.c:1.5 >xsrc/external/mit/libdrm/dist/xf86drm.c:1.6 >--- xsrc/external/mit/libdrm/dist/xf86drm.c:1.5 Mon Mar 17 07:52:19 2014 >+++ xsrc/external/mit/libdrm/dist/xf86drm.c Fri Mar 21 18:09:50 2014 >@@ -1138,6 +1138,10 @@ int drmClose(int fd) > int drmMap(int fd, drm_handle_t handle, drmSize size, drmAddressPtr address) > { > static unsigned long pagesize_mask = 0;
That ifdef could just be DRM_IOCTL_MMAP >+#ifdef __NetBSD__ /* XXX */ >+ static const struct drm_mmap zero_mmap_req; >+ struct drm_mmap mmap_req = zero_mmap_req; struct drm_mmap map_req = { 0 }; works just fine? >+#endif > > if (fd < 0) > return -EINVAL; >@@ -1147,9 +1151,20 @@ int drmMap(int fd, drm_handle_t handle, > > size = (size + pagesize_mask) & ~pagesize_mask; > That ifdef could just be DRM_IOCTL_MMAP >+#ifdef __NetBSD__ >+ mmap_req.dnm_addr = NULL; >+ mmap_req.dnm_size = size; >+ mmap_req.dnm_prot = (PROT_READ | PROT_WRITE); >+ mmap_req.dnm_flags = MAP_SHARED; >+ mmap_req.dnm_offset = handle; >+ if (drmIoctl(fd, DRM_IOCTL_MMAP, &mmap_req) == -1) >+ return -errno; >+ *address = mmap_req.dnm_addr; >+#else > *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle); > if (*address == MAP_FAILED) > return -errno; >+#endif > return 0; > } > > >Index: xsrc/external/mit/libdrm/dist/include/drm/drm.h >diff -u xsrc/external/mit/libdrm/dist/include/drm/drm.h:1.1.1.4 >xsrc/external/mit/libdrm/dist/include/drm/drm.h:1.2 >--- xsrc/external/mit/libdrm/dist/include/drm/drm.h:1.1.1.4 Mon Mar 17 >07:51:43 2014 >+++ xsrc/external/mit/libdrm/dist/include/drm/drm.h Fri Mar 21 18:09:49 2014 >@@ -751,6 +751,20 @@ struct drm_prime_handle { > #define DRM_IOCTL_MODE_OBJ_SETPROPERTY DRM_IOWR(0xBA, struct >drm_mode_obj_set_property) > #define DRM_IOCTL_MODE_CURSOR2 DRM_IOWR(0xBB, struct > drm_mode_cursor2) > >+#ifdef __NetBSD__ >+/* >+ * Instrumenting mmap is trickier than just making an ioctl to do it. >+ */ >+struct drm_mmap { >+ void *dnm_addr; /* in/out */ >+ size_t dnm_size; /* in */ >+ int dnm_prot; /* in */ >+ int dnm_flags; /* in */ >+ off_t dnm_offset; /* in */ >+}; >+#define DRM_IOCTL_MMAP DRM_IOWR(0xff, struct drm_mmap) >+#endif >+ > /** > * Device specific ioctls should only be in their respective headers > * The device specific ioctl range is from 0x40 to 0x99. > > >-=-=-=-=-=-