MTRR support for FreeBSD.

This commit is contained in:
Eric Anholt 2002-06-27 20:58:55 +00:00
parent ed692e57b4
commit 86bef24923
6 changed files with 116 additions and 66 deletions

View file

@ -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;

View file

@ -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 );

View file

@ -26,6 +26,7 @@
#include <machine/resource.h>
#include <sys/mman.h>
#include <sys/rman.h>
#include <sys/memrange.h>
#include <pci/pcivar.h>
#if __FreeBSD_version >= 500000
#include <sys/selinfo.h>
@ -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

View file

@ -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;

View file

@ -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 );

View file

@ -26,6 +26,7 @@
#include <machine/resource.h>
#include <sys/mman.h>
#include <sys/rman.h>
#include <sys/memrange.h>
#include <pci/pcivar.h>
#if __FreeBSD_version >= 500000
#include <sys/selinfo.h>
@ -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