tdfx module now builds, but warnings and full check up still needed.

This commit is contained in:
Alan Hourihane 2001-04-30 13:24:28 +00:00
parent a54832fca8
commit 3a1e399a64
13 changed files with 216 additions and 56 deletions

View file

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

75
bsd-core/drm_vm.c Normal file
View file

@ -0,0 +1,75 @@
#include <vm/vm.h>
#include <vm/pmap.h>
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;
}

View file

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

View file

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

View file

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

75
bsd/drm_vm.h Normal file
View file

@ -0,0 +1,75 @@
#include <vm/vm.h>
#include <vm/pmap.h>
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;
}

View file

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

View file

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

View file

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

View file

@ -38,7 +38,7 @@
#include <sys/types.h>
#include <sys/bus.h>
#include <pci/pcivar.h>
#include <opt_drm_linux.h>
/* #include <opt_drm_linux.h> */
#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"

View file

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

View file

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

View file

@ -38,7 +38,7 @@
#include <sys/types.h>
#include <sys/bus.h>
#include <pci/pcivar.h>
#include <opt_drm_linux.h>
/* #include <opt_drm_linux.h> */
#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"