diff --git a/bsd-core/drm_sysctl.c b/bsd-core/drm_sysctl.c index a5b7bbe3..bb3cbb18 100644 --- a/bsd-core/drm_sysctl.c +++ b/bsd-core/drm_sysctl.c @@ -1,20 +1,20 @@ SYSCTL_NODE(_hw, OID_AUTO, dri, CTLFLAG_RW, 0, "DRI Graphics"); -static int DRM(name_info)(SYSCTL_HANDLER_ARGS); -static int DRM(vm_info)(SYSCTL_HANDLER_ARGS); -static int DRM(clients_info)(SYSCTL_HANDLER_ARGS); -static int DRM(queues_info)(SYSCTL_HANDLER_ARGS); -static int DRM(bufs_info)(SYSCTL_HANDLER_ARGS); +static int DRM(name_info)SYSCTL_HANDLER_ARGS; +static int DRM(vm_info)SYSCTL_HANDLER_ARGS; +static int DRM(clients_info)SYSCTL_HANDLER_ARGS; +static int DRM(queues_info)SYSCTL_HANDLER_ARGS; +static int DRM(bufs_info)SYSCTL_HANDLER_ARGS; #if DRM_DEBUG_CODExx -static int DRM(vma_info)(SYSCTL_HANDLER_ARGS); +static int DRM(vma_info)SYSCTL_HANDLER_ARGS; #endif #if DRM_DMA_HISTOGRAM -static int DRM(histo_info)(SYSCTL_HANDLER_ARGS); +static int DRM(histo_info)SYSCTL_HANDLER_ARGS; #endif struct DRM(sysctl_list) { const char *name; - int (*f) (SYSCTL_HANDLER_ARGS); + int (*f) SYSCTL_HANDLER_ARGS; } DRM(sysctl_list)[] = { { "name", DRM(name_info) }, { "mem", DRM(mem_info) }, @@ -102,7 +102,7 @@ int DRM(sysctl_cleanup)(drm_device_t *dev) return 0; } -static int DRM(name_info)(SYSCTL_HANDLER_ARGS) +static int DRM(name_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; char buf[128]; @@ -120,7 +120,7 @@ static int DRM(name_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(_vm_info)(SYSCTL_HANDLER_ARGS) +static int DRM(_vm_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_map_t *map; @@ -159,7 +159,7 @@ static int DRM(_vm_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(vm_info)(SYSCTL_HANDLER_ARGS) +static int DRM(vm_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -172,7 +172,7 @@ static int DRM(vm_info)(SYSCTL_HANDLER_ARGS) } -static int DRM(_queues_info)(SYSCTL_HANDLER_ARGS) +static int DRM(_queues_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int i; @@ -210,7 +210,7 @@ static int DRM(_queues_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(queues_info) (SYSCTL_HANDLER_ARGS) +static int DRM(queues_info) SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -224,7 +224,7 @@ static int DRM(queues_info) (SYSCTL_HANDLER_ARGS) /* drm_bufs_info is called whenever a process reads hw.dri.0.bufs. */ -static int DRM(_bufs_info) (SYSCTL_HANDLER_ARGS) +static int DRM(_bufs_info) SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_device_dma_t *dma = dev->dma; @@ -260,7 +260,7 @@ static int DRM(_bufs_info) (SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(bufs_info) (SYSCTL_HANDLER_ARGS) +static int DRM(bufs_info) SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -272,7 +272,7 @@ static int DRM(bufs_info) (SYSCTL_HANDLER_ARGS) } -static int DRM(_clients_info) (SYSCTL_HANDLER_ARGS) +static int DRM(_clients_info) SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_file_t *priv; @@ -294,7 +294,7 @@ static int DRM(_clients_info) (SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(clients_info)(SYSCTL_HANDLER_ARGS) +static int DRM(clients_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -307,7 +307,7 @@ static int DRM(clients_info)(SYSCTL_HANDLER_ARGS) #if DRM_DEBUG_CODExx -static int DRM(_vma_info)(SYSCTL_HANDLER_ARGS) +static int DRM(_vma_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_vma_entry_t *pt; @@ -379,7 +379,7 @@ static int DRM(_vma_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(vma_info)(SYSCTL_HANDLER_ARGS) +static int DRM(vma_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -393,7 +393,7 @@ static int DRM(vma_info)(SYSCTL_HANDLER_ARGS) #if DRM_DMA_HISTOGRAM -static int DRM(_histo_info)(SYSCTL_HANDLER_ARGS) +static int DRM(_histo_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_device_dma_t *dma = dev->dma; @@ -508,7 +508,7 @@ static int DRM(_histo_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(histo_info)(SYSCTL_HANDLER_ARGS) +static int DRM(histo_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -519,5 +519,3 @@ static int DRM(histo_info)(SYSCTL_HANDLER_ARGS) return ret; } #endif - - diff --git a/bsd-core/drm_vm.c b/bsd-core/drm_vm.c new file mode 100644 index 00000000..814cc8bf --- /dev/null +++ b/bsd-core/drm_vm.c @@ -0,0 +1,75 @@ +#include +#include + +static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) +{ + drm_device_t *dev = kdev->si_drv1; + drm_device_dma_t *dma = dev->dma; + unsigned long physical; + unsigned long page; + + if (!dma) return -1; /* Error */ + if (!dma->pagelist) return -1; /* Nothing allocated */ + + page = offset >> PAGE_SHIFT; + physical = dma->pagelist[page]; + + DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical); + return atop(physical); +} + +int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot) +{ + drm_device_t *dev = kdev->si_drv1; + drm_map_t *map = NULL; + drm_map_list_entry_t *listentry=NULL; + +/* DRM_DEBUG("offset = 0x%x\n", offset);*/ + + if (dev->dma + && offset >= 0 + && offset < ptoa(dev->dma->page_count)) + return DRM(dma_mmap)(kdev, offset, prot); + + /* A sequential search of a linked list is + fine here because: 1) there will only be + about 5-10 entries in the list and, 2) a + DRI client only has to do this mapping + once, so it doesn't have to be optimized + for performance, even if the list was a + bit longer. */ + TAILQ_FOREACH(listentry, dev->maplist, link) { + map = listentry->map; +/* DRM_DEBUG("considering 0x%x..0x%x\n", map->offset, map->offset + map->size - 1);*/ + if (offset >= map->offset + && offset < map->offset + map->size) break; + } + + if (!listentry) { + DRM_DEBUG("can't find map\n"); + return -1; + } + if (((map->flags&_DRM_RESTRICTED) && suser(curproc))) { + DRM_DEBUG("restricted map\n"); + return -1; + } + + switch (map->type) { + case _DRM_FRAME_BUFFER: + case _DRM_REGISTERS: + case _DRM_AGP: + return atop(offset); + case _DRM_SHM: + DRM_DEBUG("In DRM_SHM\n"); + return atop(vtophys(offset)); + default: + return -1; /* This should never happen. */ + } + DRM_DEBUG("bailing out\n"); + + return -1; +} + + + + diff --git a/bsd-core/tdfx/Makefile b/bsd-core/tdfx/Makefile index 4362a5ba..3680fc8a 100644 --- a/bsd-core/tdfx/Makefile +++ b/bsd-core/tdfx/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ KMOD = tdfx -SRCS = tdfx_drv.c tdfx_context.c +SRCS = tdfx_drv.c SRCS += device_if.h bus_if.h pci_if.h CFLAGS += ${DEBUG_FLAGS} -I. -I.. KMODDEPS = drm diff --git a/bsd/Imakefile b/bsd/Imakefile index fab8015b..7f232a5c 100644 --- a/bsd/Imakefile +++ b/bsd/Imakefile @@ -41,10 +41,10 @@ LinkSourceFile(drm_ioctl.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(drm_lists.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(drm_lock.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(drm_memory.h,$(XF86OSSRC)/linux/drm/kernel) -LinkSourceFile(drm_proc.h,$(XF86OSSRC)/linux/drm/kernel) +XCOMM LinkSourceFile(drm_proc.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(drm_scatter.h,$(XF86OSSRC)/linux/drm/kernel) XCOMM LinkSourceFile(drm_stub.h,$(XF86OSSRC)/linux/drm/kernel) -LinkSourceFile(drm_vm.h,$(XF86OSSRC)/linux/drm/kernel) +XCOMM LinkSourceFile(drm_vm.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(drm.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(drmP.h,$(XF86OSSRC)/linux/drm/kernel) LinkSourceFile(i810_drm.h,$(XF86OSSRC)/linux/drm/kernel) diff --git a/bsd/drm_sysctl.h b/bsd/drm_sysctl.h index a5b7bbe3..bb3cbb18 100644 --- a/bsd/drm_sysctl.h +++ b/bsd/drm_sysctl.h @@ -1,20 +1,20 @@ SYSCTL_NODE(_hw, OID_AUTO, dri, CTLFLAG_RW, 0, "DRI Graphics"); -static int DRM(name_info)(SYSCTL_HANDLER_ARGS); -static int DRM(vm_info)(SYSCTL_HANDLER_ARGS); -static int DRM(clients_info)(SYSCTL_HANDLER_ARGS); -static int DRM(queues_info)(SYSCTL_HANDLER_ARGS); -static int DRM(bufs_info)(SYSCTL_HANDLER_ARGS); +static int DRM(name_info)SYSCTL_HANDLER_ARGS; +static int DRM(vm_info)SYSCTL_HANDLER_ARGS; +static int DRM(clients_info)SYSCTL_HANDLER_ARGS; +static int DRM(queues_info)SYSCTL_HANDLER_ARGS; +static int DRM(bufs_info)SYSCTL_HANDLER_ARGS; #if DRM_DEBUG_CODExx -static int DRM(vma_info)(SYSCTL_HANDLER_ARGS); +static int DRM(vma_info)SYSCTL_HANDLER_ARGS; #endif #if DRM_DMA_HISTOGRAM -static int DRM(histo_info)(SYSCTL_HANDLER_ARGS); +static int DRM(histo_info)SYSCTL_HANDLER_ARGS; #endif struct DRM(sysctl_list) { const char *name; - int (*f) (SYSCTL_HANDLER_ARGS); + int (*f) SYSCTL_HANDLER_ARGS; } DRM(sysctl_list)[] = { { "name", DRM(name_info) }, { "mem", DRM(mem_info) }, @@ -102,7 +102,7 @@ int DRM(sysctl_cleanup)(drm_device_t *dev) return 0; } -static int DRM(name_info)(SYSCTL_HANDLER_ARGS) +static int DRM(name_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; char buf[128]; @@ -120,7 +120,7 @@ static int DRM(name_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(_vm_info)(SYSCTL_HANDLER_ARGS) +static int DRM(_vm_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_map_t *map; @@ -159,7 +159,7 @@ static int DRM(_vm_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(vm_info)(SYSCTL_HANDLER_ARGS) +static int DRM(vm_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -172,7 +172,7 @@ static int DRM(vm_info)(SYSCTL_HANDLER_ARGS) } -static int DRM(_queues_info)(SYSCTL_HANDLER_ARGS) +static int DRM(_queues_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int i; @@ -210,7 +210,7 @@ static int DRM(_queues_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(queues_info) (SYSCTL_HANDLER_ARGS) +static int DRM(queues_info) SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -224,7 +224,7 @@ static int DRM(queues_info) (SYSCTL_HANDLER_ARGS) /* drm_bufs_info is called whenever a process reads hw.dri.0.bufs. */ -static int DRM(_bufs_info) (SYSCTL_HANDLER_ARGS) +static int DRM(_bufs_info) SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_device_dma_t *dma = dev->dma; @@ -260,7 +260,7 @@ static int DRM(_bufs_info) (SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(bufs_info) (SYSCTL_HANDLER_ARGS) +static int DRM(bufs_info) SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -272,7 +272,7 @@ static int DRM(bufs_info) (SYSCTL_HANDLER_ARGS) } -static int DRM(_clients_info) (SYSCTL_HANDLER_ARGS) +static int DRM(_clients_info) SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_file_t *priv; @@ -294,7 +294,7 @@ static int DRM(_clients_info) (SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(clients_info)(SYSCTL_HANDLER_ARGS) +static int DRM(clients_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -307,7 +307,7 @@ static int DRM(clients_info)(SYSCTL_HANDLER_ARGS) #if DRM_DEBUG_CODExx -static int DRM(_vma_info)(SYSCTL_HANDLER_ARGS) +static int DRM(_vma_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_vma_entry_t *pt; @@ -379,7 +379,7 @@ static int DRM(_vma_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(vma_info)(SYSCTL_HANDLER_ARGS) +static int DRM(vma_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -393,7 +393,7 @@ static int DRM(vma_info)(SYSCTL_HANDLER_ARGS) #if DRM_DMA_HISTOGRAM -static int DRM(_histo_info)(SYSCTL_HANDLER_ARGS) +static int DRM(_histo_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; drm_device_dma_t *dma = dev->dma; @@ -508,7 +508,7 @@ static int DRM(_histo_info)(SYSCTL_HANDLER_ARGS) return 0; } -static int DRM(histo_info)(SYSCTL_HANDLER_ARGS) +static int DRM(histo_info)SYSCTL_HANDLER_ARGS { drm_device_t *dev = arg1; int ret; @@ -519,5 +519,3 @@ static int DRM(histo_info)(SYSCTL_HANDLER_ARGS) return ret; } #endif - - diff --git a/bsd/drm_vm.h b/bsd/drm_vm.h new file mode 100644 index 00000000..814cc8bf --- /dev/null +++ b/bsd/drm_vm.h @@ -0,0 +1,75 @@ +#include +#include + +static int DRM(dma_mmap)(dev_t kdev, vm_offset_t offset, int prot) +{ + drm_device_t *dev = kdev->si_drv1; + drm_device_dma_t *dma = dev->dma; + unsigned long physical; + unsigned long page; + + if (!dma) return -1; /* Error */ + if (!dma->pagelist) return -1; /* Nothing allocated */ + + page = offset >> PAGE_SHIFT; + physical = dma->pagelist[page]; + + DRM_DEBUG("0x%08x (page %lu) => 0x%08lx\n", offset, page, physical); + return atop(physical); +} + +int DRM(mmap)(dev_t kdev, vm_offset_t offset, int prot) +{ + drm_device_t *dev = kdev->si_drv1; + drm_map_t *map = NULL; + drm_map_list_entry_t *listentry=NULL; + +/* DRM_DEBUG("offset = 0x%x\n", offset);*/ + + if (dev->dma + && offset >= 0 + && offset < ptoa(dev->dma->page_count)) + return DRM(dma_mmap)(kdev, offset, prot); + + /* A sequential search of a linked list is + fine here because: 1) there will only be + about 5-10 entries in the list and, 2) a + DRI client only has to do this mapping + once, so it doesn't have to be optimized + for performance, even if the list was a + bit longer. */ + TAILQ_FOREACH(listentry, dev->maplist, link) { + map = listentry->map; +/* DRM_DEBUG("considering 0x%x..0x%x\n", map->offset, map->offset + map->size - 1);*/ + if (offset >= map->offset + && offset < map->offset + map->size) break; + } + + if (!listentry) { + DRM_DEBUG("can't find map\n"); + return -1; + } + if (((map->flags&_DRM_RESTRICTED) && suser(curproc))) { + DRM_DEBUG("restricted map\n"); + return -1; + } + + switch (map->type) { + case _DRM_FRAME_BUFFER: + case _DRM_REGISTERS: + case _DRM_AGP: + return atop(offset); + case _DRM_SHM: + DRM_DEBUG("In DRM_SHM\n"); + return atop(vtophys(offset)); + default: + return -1; /* This should never happen. */ + } + DRM_DEBUG("bailing out\n"); + + return -1; +} + + + + diff --git a/bsd/tdfx/Makefile b/bsd/tdfx/Makefile index 4362a5ba..3680fc8a 100644 --- a/bsd/tdfx/Makefile +++ b/bsd/tdfx/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ KMOD = tdfx -SRCS = tdfx_drv.c tdfx_context.c +SRCS = tdfx_drv.c SRCS += device_if.h bus_if.h pci_if.h CFLAGS += ${DEBUG_FLAGS} -I. -I.. KMODDEPS = drm diff --git a/linux-core/drmP.h b/linux-core/drmP.h index dbc86b05..62897789 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -537,6 +537,11 @@ typedef struct drm_device { wait_queue_head_t buf_readers; /* Processes waiting to read */ wait_queue_head_t buf_writers; /* Processes waiting to ctx switch */ +#ifdef __FreeBSD__ + /* Sysctl support */ + struct drm_sysctl_info *sysctl; +#endif + #if __REALLY_HAVE_AGP drm_agp_head_t *agp; #endif diff --git a/linux-core/drm_memory.h b/linux-core/drm_memory.h index 8ed67fcb..2dc4fd17 100644 --- a/linux-core/drm_memory.h +++ b/linux-core/drm_memory.h @@ -364,13 +364,13 @@ void DRM(free_pages)(unsigned long address, int order, int area) unsigned long bytes = PAGE_SIZE << order; int alloc_count; int free_count; - unsigned long addr; - unsigned int sz; if (!address) { DRM_MEM_ERROR(area, "Attempt to free address 0\n"); } else { #ifdef __linux__ + unsigned long addr; + unsigned int sz; /* Unreserve */ for (addr = address, sz = bytes; sz > 0; diff --git a/linux-core/tdfx_drv.c b/linux-core/tdfx_drv.c index 7edd71a3..b578d962 100644 --- a/linux-core/tdfx_drv.c +++ b/linux-core/tdfx_drv.c @@ -38,7 +38,7 @@ #include #include #include -#include +/* #include */ #endif #include "tdfx.h" @@ -94,7 +94,9 @@ static int tdfx_probe(device_t dev) #include "drm_ioctl.h" #include "drm_lock.h" #include "drm_memory.h" +#ifdef __linux__ #include "drm_proc.h" +#endif #include "drm_vm.h" #ifdef __linux__ #include "drm_stub.h" diff --git a/linux/drmP.h b/linux/drmP.h index dbc86b05..62897789 100644 --- a/linux/drmP.h +++ b/linux/drmP.h @@ -537,6 +537,11 @@ typedef struct drm_device { wait_queue_head_t buf_readers; /* Processes waiting to read */ wait_queue_head_t buf_writers; /* Processes waiting to ctx switch */ +#ifdef __FreeBSD__ + /* Sysctl support */ + struct drm_sysctl_info *sysctl; +#endif + #if __REALLY_HAVE_AGP drm_agp_head_t *agp; #endif diff --git a/linux/drm_memory.h b/linux/drm_memory.h index 8ed67fcb..2dc4fd17 100644 --- a/linux/drm_memory.h +++ b/linux/drm_memory.h @@ -364,13 +364,13 @@ void DRM(free_pages)(unsigned long address, int order, int area) unsigned long bytes = PAGE_SIZE << order; int alloc_count; int free_count; - unsigned long addr; - unsigned int sz; if (!address) { DRM_MEM_ERROR(area, "Attempt to free address 0\n"); } else { #ifdef __linux__ + unsigned long addr; + unsigned int sz; /* Unreserve */ for (addr = address, sz = bytes; sz > 0; diff --git a/linux/tdfx_drv.c b/linux/tdfx_drv.c index 7edd71a3..b578d962 100644 --- a/linux/tdfx_drv.c +++ b/linux/tdfx_drv.c @@ -38,7 +38,7 @@ #include #include #include -#include +/* #include */ #endif #include "tdfx.h" @@ -94,7 +94,9 @@ static int tdfx_probe(device_t dev) #include "drm_ioctl.h" #include "drm_lock.h" #include "drm_memory.h" +#ifdef __linux__ #include "drm_proc.h" +#endif #include "drm_vm.h" #ifdef __linux__ #include "drm_stub.h"