diff --git a/bsd-core/drm_bufs.c b/bsd-core/drm_bufs.c index 44355dca..5f813bd8 100644 --- a/bsd-core/drm_bufs.c +++ b/bsd-core/drm_bufs.c @@ -71,12 +71,6 @@ int DRM(addmap)( DRM_OS_IOCTL ) DRM_OS_DEVICE; drm_map_t *map; drm_map_list_entry_t *list; -#if __REALLY_HAVE_MTRR -#ifdef __NetBSD__ - struct mtrr mtrrmap; - int one = 1; -#endif /* __NetBSD__ */ -#endif /* __REALLY_HAVE_MTRR */ if (!(dev->flags & (FREAD|FWRITE))) DRM_OS_RETURN(EACCES); /* Require read/write */ @@ -120,7 +114,19 @@ int DRM(addmap)( DRM_OS_IOCTL ) #if __REALLY_HAVE_MTRR if ( map->type == _DRM_FRAME_BUFFER || (map->flags & _DRM_WRITE_COMBINING) ) { -#ifdef __NetBSD__ +#ifdef __FreeBSD__ + int retcode = 0, act; + struct mem_range_desc mrdesc; + mrdesc.mr_base = map->offset; + mrdesc.mr_len = map->size; + mrdesc.mr_flags = MDF_WRITECOMBINE; + act = MEMRANGE_SET_UPDATE; + bcopy(DRIVER_NAME, &mrdesc.mr_owner, strlen(DRIVER_NAME)); + retcode = mem_range_attr_set(&mrdesc, &act); + map->mtrr=1; +#elif defined __NetBSD__ + struct mtrr mtrrmap; + int one = 1; mtrrmap.base = map->offset; mtrrmap.len = map->size; mtrrmap.type = MTRR_TYPE_WC; @@ -203,12 +209,6 @@ int DRM(rmmap)( DRM_OS_IOCTL ) drm_map_t *map; drm_map_t request; int found_maps = 0; -#if __REALLY_HAVE_MTRR -#ifdef __NetBSD__ - struct mtrr mtrrmap; - int one = 1; -#endif -#endif DRM_OS_KRNFROMUSR( request, (drm_map_t *)data, sizeof(request) ); @@ -237,7 +237,18 @@ int DRM(rmmap)( DRM_OS_IOCTL ) #if __REALLY_HAVE_MTRR if (map->mtrr >= 0) { int retcode; -#ifdef __NetBSD__ +#ifdef __FreeBSD__ + int act; + struct mem_range_desc mrdesc; + mrdesc.mr_base = map->offset; + mrdesc.mr_len = map->size; + mrdesc.mr_flags = MDF_WRITECOMBINE; + act = MEMRANGE_SET_REMOVE; + bcopy(DRIVER_NAME, &mrdesc.mr_owner, strlen(DRIVER_NAME)); + retcode = mem_range_attr_set(&mrdesc, &act); +#elif defined __NetBSD__ + struct mtrr mtrrmap; + int one = 1; mtrrmap.base = map->offset; mtrrmap.len = map->size; mtrrmap.type = 0; diff --git a/bsd-core/drm_drv.c b/bsd-core/drm_drv.c index c393e7da..06f1578a 100644 --- a/bsd-core/drm_drv.c +++ b/bsd-core/drm_drv.c @@ -487,12 +487,6 @@ static int DRM(takedown)( drm_device_t *dev ) drm_map_list_entry_t *list; drm_vma_entry_t *vma, *vma_next; int i; -#if __REALLY_HAVE_MTRR -#ifdef __NetBSD__ - struct mtrr mtrrmap; - int one = 1; -#endif /* __NetBSD__ */ -#endif /* __REALLY_HAVE_MTRR */ DRM_DEBUG( "\n" ); @@ -566,7 +560,19 @@ static int DRM(takedown)( drm_device_t *dev ) #if __REALLY_HAVE_MTRR if ( map->mtrr >= 0 ) { int retcode; -#ifdef __NetBSD__ +#ifdef __FreeBSD__ + int act; + struct mem_range_desc mrdesc; + mrdesc.mr_base = map->offset; + mrdesc.mr_len = map->size; + mrdesc.mr_flags = MDF_WRITECOMBINE; + act = MEMRANGE_SET_UPDATE; + bcopy(DRIVER_NAME, &mrdesc.mr_owner, strlen(DRIVER_NAME)); + retcode = mem_range_attr_set(&mrdesc, &act); + map->mtrr=1; +#elif defined __NetBSD__ + struct mtrr mtrrmap; + int one = 1; mtrrmap.base = map->offset; mtrrmap.len = map->size; mtrrmap.type = MTRR_TYPE_WC; @@ -658,12 +664,6 @@ static int DRM(init)( drm_device_t *dev ) #ifdef __FreeBSD__ drm_device_t *dev; #endif -#if __REALLY_HAVE_MTRR -#ifdef __NetBSD__ - struct mtrr mtrrmap; - int one = 1; -#endif /* __NetBSD__ */ -#endif /* __REALLY_HAVE_MTRR */ #if __HAVE_CTX_BITMAP int retcode; #endif @@ -703,10 +703,22 @@ static int DRM(init)( drm_device_t *dev ) DRM(takedown)( dev ); DRM_OS_RETURN(ENOMEM); } -#endif +#endif /* __MUST_HAVE_AGP */ #if __REALLY_HAVE_MTRR - if (dev->agp) -#ifdef __NetBSD__ + if (dev->agp) { +#ifdef __FreeBSD__ + int retcode = 0, act; + struct mem_range_desc mrdesc; + mrdesc.mr_base = dev->agp->info.ai_aperture_base; + mrdesc.mr_len = dev->agp->info.ai_aperture_size; + mrdesc.mr_flags = MDF_WRITECOMBINE; + act = MEMRANGE_SET_UPDATE; + bcopy(DRIVER_NAME, &mrdesc.mr_owner, strlen(DRIVER_NAME)); + retcode = mem_range_attr_set(&mrdesc, &act); + dev->agp->agp_mtrr=1; +#elif defined __NetBSD__ + struct mtrr mtrrmap; + int one = 1; mtrrmap.base = dev->agp->info.ai_aperture_base; /* Might need a multiplier here XXX */ mtrrmap.len = dev->agp->info.ai_aperture_size; @@ -714,8 +726,9 @@ static int DRM(init)( drm_device_t *dev ) mtrrmap.flags = MTRR_VALID; dev->agp->agp_mtrr = mtrr_set( &mtrrmap, &one, NULL, MTRR_GETSET_KERNEL); #endif /* __NetBSD__ */ -#endif -#endif + } +#endif /* __REALLY_HAVE_MTRR */ +#endif /* __REALLY_HAVE_AGP */ #if __HAVE_CTX_BITMAP retcode = DRM(ctxbitmap_init)( dev ); diff --git a/bsd-core/drm_os_freebsd.h b/bsd-core/drm_os_freebsd.h index b867bd18..f4279347 100644 --- a/bsd-core/drm_os_freebsd.h +++ b/bsd-core/drm_os_freebsd.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #if __FreeBSD_version >= 500000 #include @@ -42,7 +43,7 @@ #define __REALLY_HAVE_AGP __HAVE_AGP #endif -#define __REALLY_HAVE_MTRR 0 +#define __REALLY_HAVE_MTRR 1 #define __REALLY_HAVE_SG 0 #if __REALLY_HAVE_AGP diff --git a/bsd/drm_bufs.h b/bsd/drm_bufs.h index 44355dca..5f813bd8 100644 --- a/bsd/drm_bufs.h +++ b/bsd/drm_bufs.h @@ -71,12 +71,6 @@ int DRM(addmap)( DRM_OS_IOCTL ) DRM_OS_DEVICE; drm_map_t *map; drm_map_list_entry_t *list; -#if __REALLY_HAVE_MTRR -#ifdef __NetBSD__ - struct mtrr mtrrmap; - int one = 1; -#endif /* __NetBSD__ */ -#endif /* __REALLY_HAVE_MTRR */ if (!(dev->flags & (FREAD|FWRITE))) DRM_OS_RETURN(EACCES); /* Require read/write */ @@ -120,7 +114,19 @@ int DRM(addmap)( DRM_OS_IOCTL ) #if __REALLY_HAVE_MTRR if ( map->type == _DRM_FRAME_BUFFER || (map->flags & _DRM_WRITE_COMBINING) ) { -#ifdef __NetBSD__ +#ifdef __FreeBSD__ + int retcode = 0, act; + struct mem_range_desc mrdesc; + mrdesc.mr_base = map->offset; + mrdesc.mr_len = map->size; + mrdesc.mr_flags = MDF_WRITECOMBINE; + act = MEMRANGE_SET_UPDATE; + bcopy(DRIVER_NAME, &mrdesc.mr_owner, strlen(DRIVER_NAME)); + retcode = mem_range_attr_set(&mrdesc, &act); + map->mtrr=1; +#elif defined __NetBSD__ + struct mtrr mtrrmap; + int one = 1; mtrrmap.base = map->offset; mtrrmap.len = map->size; mtrrmap.type = MTRR_TYPE_WC; @@ -203,12 +209,6 @@ int DRM(rmmap)( DRM_OS_IOCTL ) drm_map_t *map; drm_map_t request; int found_maps = 0; -#if __REALLY_HAVE_MTRR -#ifdef __NetBSD__ - struct mtrr mtrrmap; - int one = 1; -#endif -#endif DRM_OS_KRNFROMUSR( request, (drm_map_t *)data, sizeof(request) ); @@ -237,7 +237,18 @@ int DRM(rmmap)( DRM_OS_IOCTL ) #if __REALLY_HAVE_MTRR if (map->mtrr >= 0) { int retcode; -#ifdef __NetBSD__ +#ifdef __FreeBSD__ + int act; + struct mem_range_desc mrdesc; + mrdesc.mr_base = map->offset; + mrdesc.mr_len = map->size; + mrdesc.mr_flags = MDF_WRITECOMBINE; + act = MEMRANGE_SET_REMOVE; + bcopy(DRIVER_NAME, &mrdesc.mr_owner, strlen(DRIVER_NAME)); + retcode = mem_range_attr_set(&mrdesc, &act); +#elif defined __NetBSD__ + struct mtrr mtrrmap; + int one = 1; mtrrmap.base = map->offset; mtrrmap.len = map->size; mtrrmap.type = 0; diff --git a/bsd/drm_drv.h b/bsd/drm_drv.h index c393e7da..06f1578a 100644 --- a/bsd/drm_drv.h +++ b/bsd/drm_drv.h @@ -487,12 +487,6 @@ static int DRM(takedown)( drm_device_t *dev ) drm_map_list_entry_t *list; drm_vma_entry_t *vma, *vma_next; int i; -#if __REALLY_HAVE_MTRR -#ifdef __NetBSD__ - struct mtrr mtrrmap; - int one = 1; -#endif /* __NetBSD__ */ -#endif /* __REALLY_HAVE_MTRR */ DRM_DEBUG( "\n" ); @@ -566,7 +560,19 @@ static int DRM(takedown)( drm_device_t *dev ) #if __REALLY_HAVE_MTRR if ( map->mtrr >= 0 ) { int retcode; -#ifdef __NetBSD__ +#ifdef __FreeBSD__ + int act; + struct mem_range_desc mrdesc; + mrdesc.mr_base = map->offset; + mrdesc.mr_len = map->size; + mrdesc.mr_flags = MDF_WRITECOMBINE; + act = MEMRANGE_SET_UPDATE; + bcopy(DRIVER_NAME, &mrdesc.mr_owner, strlen(DRIVER_NAME)); + retcode = mem_range_attr_set(&mrdesc, &act); + map->mtrr=1; +#elif defined __NetBSD__ + struct mtrr mtrrmap; + int one = 1; mtrrmap.base = map->offset; mtrrmap.len = map->size; mtrrmap.type = MTRR_TYPE_WC; @@ -658,12 +664,6 @@ static int DRM(init)( drm_device_t *dev ) #ifdef __FreeBSD__ drm_device_t *dev; #endif -#if __REALLY_HAVE_MTRR -#ifdef __NetBSD__ - struct mtrr mtrrmap; - int one = 1; -#endif /* __NetBSD__ */ -#endif /* __REALLY_HAVE_MTRR */ #if __HAVE_CTX_BITMAP int retcode; #endif @@ -703,10 +703,22 @@ static int DRM(init)( drm_device_t *dev ) DRM(takedown)( dev ); DRM_OS_RETURN(ENOMEM); } -#endif +#endif /* __MUST_HAVE_AGP */ #if __REALLY_HAVE_MTRR - if (dev->agp) -#ifdef __NetBSD__ + if (dev->agp) { +#ifdef __FreeBSD__ + int retcode = 0, act; + struct mem_range_desc mrdesc; + mrdesc.mr_base = dev->agp->info.ai_aperture_base; + mrdesc.mr_len = dev->agp->info.ai_aperture_size; + mrdesc.mr_flags = MDF_WRITECOMBINE; + act = MEMRANGE_SET_UPDATE; + bcopy(DRIVER_NAME, &mrdesc.mr_owner, strlen(DRIVER_NAME)); + retcode = mem_range_attr_set(&mrdesc, &act); + dev->agp->agp_mtrr=1; +#elif defined __NetBSD__ + struct mtrr mtrrmap; + int one = 1; mtrrmap.base = dev->agp->info.ai_aperture_base; /* Might need a multiplier here XXX */ mtrrmap.len = dev->agp->info.ai_aperture_size; @@ -714,8 +726,9 @@ static int DRM(init)( drm_device_t *dev ) mtrrmap.flags = MTRR_VALID; dev->agp->agp_mtrr = mtrr_set( &mtrrmap, &one, NULL, MTRR_GETSET_KERNEL); #endif /* __NetBSD__ */ -#endif -#endif + } +#endif /* __REALLY_HAVE_MTRR */ +#endif /* __REALLY_HAVE_AGP */ #if __HAVE_CTX_BITMAP retcode = DRM(ctxbitmap_init)( dev ); diff --git a/bsd/drm_os_freebsd.h b/bsd/drm_os_freebsd.h index b867bd18..f4279347 100644 --- a/bsd/drm_os_freebsd.h +++ b/bsd/drm_os_freebsd.h @@ -26,6 +26,7 @@ #include #include #include +#include #include #if __FreeBSD_version >= 500000 #include @@ -42,7 +43,7 @@ #define __REALLY_HAVE_AGP __HAVE_AGP #endif -#define __REALLY_HAVE_MTRR 0 +#define __REALLY_HAVE_MTRR 1 #define __REALLY_HAVE_SG 0 #if __REALLY_HAVE_AGP