mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-06 11:48:04 +02:00
Sync with Rik's tree to bring over agp support.
This commit is contained in:
parent
ff1e7b3957
commit
0c9c9a805d
32 changed files with 944 additions and 91 deletions
137
libdrm/xf86drm.c
137
libdrm/xf86drm.c
|
|
@ -1,6 +1,5 @@
|
|||
/* xf86drm.c -- User-level interface to DRM device
|
||||
* Created: Tue Jan 5 08:16:21 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 11:34:13 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.43 1999/08/04 18:14:43 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drm.c,v 1.5 1999/10/13 22:33:07 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
@ -745,6 +745,139 @@ int drmDestroyDrawable(int fd, drmDrawable handle)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int drmAgpAcquire(int fd)
|
||||
{
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE)) return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmAgpRelease(int fd)
|
||||
{
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_RELEASE)) return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmAgpEnable(int fd, unsigned long mode)
|
||||
{
|
||||
drm_agp_mode_t m;
|
||||
|
||||
m.mode = mode;
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long drmAgpAlloc(int fd, unsigned long size)
|
||||
{
|
||||
drm_agp_buffer_t b;
|
||||
|
||||
b.size = size;
|
||||
b.handle = 0;
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) return 0;
|
||||
return b.handle;
|
||||
}
|
||||
|
||||
int drmAgpFree(int fd, unsigned long handle)
|
||||
{
|
||||
drm_agp_buffer_t b;
|
||||
|
||||
b.size = 0;
|
||||
b.handle = handle;
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b)) return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned long drmAgpBind(int fd, unsigned long handle, unsigned long offset)
|
||||
{
|
||||
drm_agp_binding_t b;
|
||||
|
||||
b.handle = handle;
|
||||
b.offset = offset;
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b)) return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmAgpUnbind(int fd, unsigned long handle)
|
||||
{
|
||||
drm_agp_binding_t b;
|
||||
|
||||
b.handle = handle;
|
||||
b.offset = 0;
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) return -errno;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drmAgpVersionMajor(int fd)
|
||||
{
|
||||
drm_agp_info_t i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
|
||||
return i.agp_version_major;
|
||||
}
|
||||
|
||||
int drmAgpVersionMinor(int fd)
|
||||
{
|
||||
drm_agp_info_t i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
|
||||
return i.agp_version_minor;
|
||||
}
|
||||
|
||||
unsigned long drmAgpGetMode(int fd)
|
||||
{
|
||||
drm_agp_info_t i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
|
||||
return i.mode;
|
||||
}
|
||||
|
||||
unsigned long drmAgpBase(int fd)
|
||||
{
|
||||
drm_agp_info_t i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
|
||||
return i.aperture_base;
|
||||
}
|
||||
|
||||
unsigned long drmAgpSize(int fd)
|
||||
{
|
||||
drm_agp_info_t i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
|
||||
return i.aperture_size;
|
||||
}
|
||||
|
||||
unsigned long drmAgpMemoryUsed(int fd)
|
||||
{
|
||||
drm_agp_info_t i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
|
||||
return i.memory_used;
|
||||
}
|
||||
|
||||
unsigned long drmAgpMemoryAvail(int fd)
|
||||
{
|
||||
drm_agp_info_t i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
|
||||
return i.memory_allowed;
|
||||
}
|
||||
|
||||
unsigned int drmAgpVendorId(int fd)
|
||||
{
|
||||
drm_agp_info_t i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
|
||||
return i.id_vendor;
|
||||
}
|
||||
|
||||
unsigned int drmAgpDeviceId(int fd)
|
||||
{
|
||||
drm_agp_info_t i;
|
||||
|
||||
if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
|
||||
return i.id_device;
|
||||
}
|
||||
|
||||
int drmError(int err, const char *label)
|
||||
{
|
||||
switch (err) {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* xf86drmHash.c -- Small hash table support for integer -> integer mapping
|
||||
* Created: Sun Apr 18 09:35:45 1999 by faith@precisioninsight.com
|
||||
* Revised: Thu Jun 3 16:11:06 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmHash.c,v 1.3 1999/06/07 13:01:42 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmHash.c,v 1.1 1999/06/14 07:32:02 dawes Exp $
|
||||
*
|
||||
* DESCRIPTION
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* xf86drmRandom.c -- "Minimal Standard" PRNG Implementation
|
||||
* Created: Mon Apr 19 08:28:13 1999 by faith@precisioninsight.com
|
||||
* Revised: Thu Jun 24 14:53:45 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRandom.c,v 1.4 1999/06/24 18:54:55 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRandom.c,v 1.2 1999/06/27 14:08:20 dawes Exp $
|
||||
*
|
||||
* DESCRIPTION
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* xf86drmSL.c -- Skip list support
|
||||
* Created: Mon May 10 09:28:13 1999 by faith@precisioninsight.com
|
||||
* Revised: Thu Jun 3 16:13:01 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSL.c,v 1.2 1999/06/07 13:01:42 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSL.c,v 1.1 1999/06/14 07:32:02 dawes Exp $
|
||||
*
|
||||
* DESCRIPTION
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* drmP.h -- Private header for Direct Rendering Manager -*- linux-c -*-
|
||||
* Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 16:06:49 1999 by faith@precisioninsight.com
|
||||
* Created: Mon Jan 4 10:05:05 1999 by faith@dict.org
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All rights reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h,v 1.58 1999/08/30 13:05:00 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h,v 1.1 1999/09/25 14:37:59 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
@ -49,6 +49,10 @@
|
|||
#ifdef CONFIG_MTRR
|
||||
#include <asm/mtrr.h>
|
||||
#endif
|
||||
#ifdef DRM_AGP
|
||||
#include <linux/types.h>
|
||||
#include <linux/agp_backend.h>
|
||||
#endif
|
||||
#include "drm.h"
|
||||
|
||||
#define DRM_DEBUG_CODE 2 /* Include debugging code (if > 1, then
|
||||
|
|
@ -81,6 +85,9 @@
|
|||
#define DRM_MEM_CMDS 12
|
||||
#define DRM_MEM_MAPPINGS 13
|
||||
#define DRM_MEM_BUFLISTS 14
|
||||
#define DRM_MEM_AGPLISTS 15
|
||||
#define DRM_MEM_TOTALAGP 16
|
||||
#define DRM_MEM_BOUNDAGP 17
|
||||
|
||||
/* Backward compatibility section */
|
||||
/* _PAGE_WT changed to _PAGE_PWT in 2.2.6 */
|
||||
|
|
@ -381,6 +388,40 @@ typedef struct drm_device_dma {
|
|||
wait_queue_head_t waiting; /* Processes waiting on free bufs */
|
||||
} drm_device_dma_t;
|
||||
|
||||
#ifdef DRM_AGP
|
||||
typedef struct drm_agp_mem {
|
||||
unsigned long handle;
|
||||
agp_memory *memory;
|
||||
unsigned long bound; /* address */
|
||||
int pages;
|
||||
struct drm_agp_mem *prev;
|
||||
struct drm_agp_mem *next;
|
||||
} drm_agp_mem_t;
|
||||
|
||||
typedef struct drm_agp_head {
|
||||
agp_kern_info agp_info;
|
||||
const char *chipset;
|
||||
drm_agp_mem_t *memory;
|
||||
unsigned long mode;
|
||||
int enabled;
|
||||
int acquired;
|
||||
unsigned long base;
|
||||
} drm_agp_head_t;
|
||||
|
||||
typedef struct {
|
||||
void (*free_memory)(agp_memory *);
|
||||
agp_memory *(*allocate_memory)(size_t, u32);
|
||||
int (*bind_memory)(agp_memory *, off_t);
|
||||
int (*unbind_memory)(agp_memory *);
|
||||
void (*enable)(u32);
|
||||
int (*acquire)(void);
|
||||
void (*release)(void);
|
||||
void (*copy_info)(agp_kern_info *);
|
||||
} drm_agp_func_t;
|
||||
|
||||
extern drm_agp_func_t drm_agp;
|
||||
#endif
|
||||
|
||||
typedef struct drm_device {
|
||||
const char *name; /* Simple driver name */
|
||||
char *unique; /* Unique identifier: e.g., busid */
|
||||
|
|
@ -459,6 +500,10 @@ typedef struct drm_device {
|
|||
struct fasync_struct *buf_async;/* Processes waiting for SIGIO */
|
||||
wait_queue_head_t buf_readers; /* Processes waiting to read */
|
||||
wait_queue_head_t buf_writers; /* Processes waiting to ctx switch */
|
||||
|
||||
#ifdef DRM_AGP
|
||||
drm_agp_head_t *agp;
|
||||
#endif
|
||||
} drm_device_t;
|
||||
|
||||
|
||||
|
|
@ -529,6 +574,14 @@ extern void drm_free_pages(unsigned long address, int order,
|
|||
extern void *drm_ioremap(unsigned long offset, unsigned long size);
|
||||
extern void drm_ioremapfree(void *pt, unsigned long size);
|
||||
|
||||
#ifdef DRM_AGP
|
||||
extern agp_memory *drm_alloc_agp(int pages);
|
||||
extern int drm_free_agp(agp_memory *handle, int pages);
|
||||
extern int drm_bind_agp(agp_memory *handle, unsigned int start);
|
||||
extern int drm_unbind_agp(agp_memory *handle);
|
||||
#endif
|
||||
|
||||
|
||||
/* Buffer management support (bufs.c) */
|
||||
extern int drm_order(unsigned long size);
|
||||
extern int drm_addmap(struct inode *inode, struct file *filp,
|
||||
|
|
@ -638,5 +691,26 @@ extern int drm_flush_unblock(drm_device_t *dev, int context,
|
|||
drm_lock_flags_t flags);
|
||||
extern int drm_flush_block_and_flush(drm_device_t *dev, int context,
|
||||
drm_lock_flags_t flags);
|
||||
|
||||
#ifdef DRM_AGP
|
||||
/* AGP/GART support (agpsupport.c) */
|
||||
extern drm_agp_head_t *drm_agp_init(void);
|
||||
extern int drm_agp_acquire(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_release(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_enable(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_info(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_alloc(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_free(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_unbind(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_bind(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* tdfx.c -- tdfx driver -*- linux-c -*-
|
||||
/* tdfx_drv.c -- tdfx driver -*- linux-c -*-
|
||||
* Created: Thu Oct 7 10:38:32 1999 by faith@precisioninsight.com
|
||||
* Revised: Tue Oct 12 08:51:35 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,9 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI$
|
||||
* Authors: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
* Daryll Strauss <daryll@precisioninsight.com>
|
||||
*
|
||||
* $XFree86$
|
||||
*
|
||||
*/
|
||||
|
|
@ -262,6 +263,10 @@ static int tdfx_takedown(drm_device_t *dev)
|
|||
- PAGE_SHIFT,
|
||||
DRM_MEM_SAREA);
|
||||
break;
|
||||
case _DRM_AGP:
|
||||
/* Do nothing here, because this is all
|
||||
handled in the AGP/GART driver. */
|
||||
break;
|
||||
}
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
# Makefile -- For the Direct Rendering Manager module (drm)
|
||||
# Created: Mon Jan 4 09:26:53 1999 by faith@precisioninsight.com
|
||||
# Revised: Thu Oct 7 10:56:13 1999 by faith@precisioninsight.com
|
||||
#
|
||||
# Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
# All rights reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
# DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/generic/Makefile.linux,v 1.23 1999/07/02 17:46:30 faith Exp $
|
||||
# Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
#
|
||||
# $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/generic/Makefile.linux,v 1.3 1999/06/27 14:08:21 dawes Exp $
|
||||
#
|
||||
|
||||
|
|
@ -56,7 +56,7 @@ MODVERSIONS := $(shell \
|
|||
|
||||
# **** End of SMP/MODVERSIONS detection
|
||||
|
||||
MODS= gamma.o tdfx.o
|
||||
MODS= gamma.o tdfx.o r128.o
|
||||
LIBS= libdrm.a
|
||||
PROGS= drmstat
|
||||
|
||||
|
|
@ -70,6 +70,9 @@ GAMMAHEADERS= gamma_drv.h $(DRMHEADERS)
|
|||
TDFXOBJS= tdfx_drv.o tdfx_context.o
|
||||
TDFXHEADERS= tdfx_drv.h $(DRMHEADERS)
|
||||
|
||||
R128OBJS= r128_drv.o r128_context.o
|
||||
R128HEADERS= r128_drv.h $(DRMHEADERS)
|
||||
|
||||
PROGOBJS= drmstat.po xf86drm.po xf86drmHash.po xf86drmRandom.po sigio.po
|
||||
PROGHEADERS= xf86drm.h $(DRMHEADERS)
|
||||
|
||||
|
|
@ -79,7 +82,7 @@ CFLAGS= -O2 $(WARNINGS)
|
|||
WARNINGS= -Wall -Wwrite-strings -Wpointer-arith -Wcast-align \
|
||||
-Wstrict-prototypes -Wshadow -Wnested-externs \
|
||||
-Winline -Wpointer-arith
|
||||
MODCFLAGS= $(CFLAGS) -D__KERNEL__ -DMODULE -fomit-frame-pointer
|
||||
MODCFLAGS= $(CFLAGS) -DDRM_AGP -D__KERNEL__ -DMODULE -fomit-frame-pointer
|
||||
PRGCFLAGS= $(CFLAGS) -g -ansi -pedantic -DPOSIX_C_SOURCE=199309L \
|
||||
-D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE \
|
||||
-I../../../../../../include -I../../../../../../../../include \
|
||||
|
|
@ -108,6 +111,9 @@ gamma.o: $(GAMMAOBJS) $(LIBS)
|
|||
tdfx.o: $(TDFXOBJS) $(LIBS)
|
||||
$(LD) -r $^ -o $@
|
||||
|
||||
r128.o: $(R128OBJS) $(LIBS)
|
||||
$(LD) -r $^ -o $@
|
||||
|
||||
drmstat: $(PROGOBJS)
|
||||
$(CC) $(PRGCFLAGS) $^ $(PRGLIBS) -o $@
|
||||
|
||||
|
|
@ -129,6 +135,7 @@ ChangeLog:
|
|||
$(DRMOBJS): $(DRMHEADERS)
|
||||
$(GAMMAOBJS): $(GAMMAHEADERS)
|
||||
$(TDFXOBJS): $(TDFXHEADERS)
|
||||
$(R128OBJS): $(R128HEADERS)
|
||||
$(PROGOBJS): $(PROGHEADERS)
|
||||
|
||||
clean:
|
||||
|
|
|
|||
302
linux/agpsupport.c
Normal file
302
linux/agpsupport.c
Normal file
|
|
@ -0,0 +1,302 @@
|
|||
/* agpsupport.c -- DRM support for AGP/GART backend -*- linux-c -*-
|
||||
* Created: Mon Dec 13 09:56:45 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86$
|
||||
*
|
||||
*/
|
||||
|
||||
#define __NO_VERSION__
|
||||
#include "drmP.h"
|
||||
|
||||
drm_agp_func_t drm_agp = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
|
||||
|
||||
/* The C standard says that 'void *' is not guaranteed to hold a function
|
||||
pointer, so we use this union to define a generic pointer that is
|
||||
guaranteed to hold any of the function pointers we care about. */
|
||||
typedef union {
|
||||
void (*free_memory)(agp_memory *);
|
||||
agp_memory *(*allocate_memory)(size_t, u32);
|
||||
int (*bind_memory)(agp_memory *, off_t);
|
||||
int (*unbind_memory)(agp_memory *);
|
||||
void (*enable)(u32);
|
||||
int (*acquire)(void);
|
||||
void (*release)(void);
|
||||
void (*copy_info)(agp_kern_info *);
|
||||
unsigned long address;
|
||||
} drm_agp_func_u;
|
||||
|
||||
typedef struct drm_agp_fill {
|
||||
const char *name;
|
||||
drm_agp_func_u *f;
|
||||
} drm_agp_fill_t;
|
||||
|
||||
static drm_agp_fill_t drm_agp_fill[] = {
|
||||
{ "agp_free_memory", (drm_agp_func_u *)&drm_agp.free_memory },
|
||||
{ "agp_allocate_memory", (drm_agp_func_u *)&drm_agp.allocate_memory },
|
||||
{ "agp_bind_memory", (drm_agp_func_u *)&drm_agp.bind_memory },
|
||||
{ "agp_unbind_memory", (drm_agp_func_u *)&drm_agp.unbind_memory },
|
||||
{ "agp_enable", (drm_agp_func_u *)&drm_agp.enable },
|
||||
{ "agp_backend_acquire", (drm_agp_func_u *)&drm_agp.acquire },
|
||||
{ "agp_backend_release", (drm_agp_func_u *)&drm_agp.release },
|
||||
{ "agp_copy_info", (drm_agp_func_u *)&drm_agp.copy_info },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
int drm_agp_info(struct inode *inode, struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
agp_kern_info *kern;
|
||||
drm_agp_info_t info;
|
||||
|
||||
if (!dev->agp->acquired || !drm_agp.copy_info) return -EINVAL;
|
||||
|
||||
kern = &dev->agp->agp_info;
|
||||
info.agp_version_major = kern->version.major;
|
||||
info.agp_version_minor = kern->version.minor;
|
||||
info.mode = kern->mode;
|
||||
info.aperture_base = kern->aper_base;
|
||||
info.aperture_size = kern->aper_size * 1024 * 1024;
|
||||
info.memory_allowed = kern->max_memory << PAGE_SHIFT;
|
||||
info.memory_used = kern->current_memory << PAGE_SHIFT;
|
||||
info.id_vendor = kern->device->vendor;
|
||||
info.id_device = kern->device->device;
|
||||
|
||||
copy_to_user_ret((drm_agp_info_t *)arg, &info, sizeof(info), -EFAULT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drm_agp_acquire(struct inode *inode, struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
int retcode;
|
||||
|
||||
if (dev->agp->acquired || !drm_agp.acquire) return -EINVAL;
|
||||
if ((retcode = (*drm_agp.acquire)())) return retcode;
|
||||
dev->agp->acquired = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drm_agp_release(struct inode *inode, struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
|
||||
if (!dev->agp->acquired || !drm_agp.release) return -EINVAL;
|
||||
(*drm_agp.release)();
|
||||
dev->agp->acquired = 0;
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
int drm_agp_enable(struct inode *inode, struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
drm_agp_mode_t mode;
|
||||
|
||||
if (!dev->agp->acquired || !drm_agp.enable) return -EINVAL;
|
||||
|
||||
copy_from_user_ret(&mode, (drm_agp_mode_t *)arg, sizeof(mode),
|
||||
-EFAULT);
|
||||
|
||||
dev->agp->mode = mode.mode;
|
||||
(*drm_agp.enable)(mode.mode);
|
||||
dev->agp->base = dev->agp->agp_info.aper_base;
|
||||
dev->agp->enabled = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drm_agp_alloc(struct inode *inode, struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
drm_agp_buffer_t request;
|
||||
drm_agp_mem_t *entry;
|
||||
agp_memory *memory;
|
||||
unsigned long pages;
|
||||
|
||||
if (!dev->agp->acquired) return -EINVAL;
|
||||
copy_from_user_ret(&request, (drm_agp_buffer_t *)arg, sizeof(request),
|
||||
-EFAULT);
|
||||
if (!(entry = drm_alloc(sizeof(*entry), DRM_MEM_AGPLISTS)))
|
||||
return -ENOMEM;
|
||||
|
||||
pages = (request.size + PAGE_SIZE - 1) / PAGE_SIZE;
|
||||
if (!(memory = drm_alloc_agp(request.size))) {
|
||||
drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
entry->handle = (unsigned long)memory->memory;
|
||||
entry->memory = memory;
|
||||
entry->bound = 0;
|
||||
entry->pages = pages;
|
||||
entry->prev = NULL;
|
||||
entry->next = dev->agp->memory;
|
||||
if (dev->agp->memory) dev->agp->memory->prev = entry;
|
||||
dev->agp->memory = entry;
|
||||
|
||||
request.handle = entry->handle;
|
||||
if (copy_to_user((drm_agp_buffer_t *)arg, &request, sizeof(request))) {
|
||||
dev->agp->memory = entry->next;
|
||||
dev->agp->memory->prev = NULL;
|
||||
drm_free_agp(memory, request.size);
|
||||
drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static drm_agp_mem_t *drm_agp_lookup_entry(drm_device_t *dev,
|
||||
unsigned long handle)
|
||||
{
|
||||
drm_agp_mem_t *entry;
|
||||
|
||||
for (entry = dev->agp->memory; entry; entry = entry->next) {
|
||||
if (entry->handle == handle) return entry;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int drm_agp_unbind_entry(drm_device_t *dev, drm_agp_mem_t *entry)
|
||||
{
|
||||
if (!dev->agp->acquired || !drm_agp.unbind_memory) return -EINVAL;
|
||||
return (*drm_agp.unbind_memory)(entry->memory);
|
||||
}
|
||||
|
||||
int drm_agp_unbind(struct inode *inode, struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
drm_agp_binding_t request;
|
||||
drm_agp_mem_t *entry;
|
||||
|
||||
if (!dev->agp->acquired) return -EINVAL;
|
||||
copy_from_user_ret(&request, (drm_agp_binding_t *)arg, sizeof(request),
|
||||
-EFAULT);
|
||||
if (!(entry = drm_agp_lookup_entry(dev, request.handle)))
|
||||
return -EINVAL;
|
||||
if (!entry->bound) return -EINVAL;
|
||||
return drm_agp_unbind_entry(dev, entry);
|
||||
}
|
||||
|
||||
int drm_agp_bind(struct inode *inode, struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
drm_agp_binding_t request;
|
||||
drm_agp_mem_t *entry;
|
||||
int retcode;
|
||||
int page;
|
||||
|
||||
if (!dev->agp->acquired || !drm_agp.bind_memory) return -EINVAL;
|
||||
copy_from_user_ret(&request, (drm_agp_binding_t *)arg, sizeof(request),
|
||||
-EFAULT);
|
||||
if (!(entry = drm_agp_lookup_entry(dev, request.handle)))
|
||||
return -EINVAL;
|
||||
if (entry->bound) return -EINVAL;
|
||||
page = (request.offset + PAGE_SIZE - 1) / PAGE_SIZE;
|
||||
if ((retcode = (*drm_agp.bind_memory)(entry->memory, page)))
|
||||
return retcode;
|
||||
entry->bound = dev->agp->base + (page << PAGE_SHIFT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int drm_agp_free(struct inode *inode, struct file *filp, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
drm_file_t *priv = filp->private_data;
|
||||
drm_device_t *dev = priv->dev;
|
||||
drm_agp_buffer_t request;
|
||||
drm_agp_mem_t *entry;
|
||||
|
||||
if (!dev->agp->acquired) return -EINVAL;
|
||||
copy_from_user_ret(&request, (drm_agp_buffer_t *)arg, sizeof(request),
|
||||
-EFAULT);
|
||||
if (!(entry = drm_agp_lookup_entry(dev, request.handle)))
|
||||
return -EINVAL;
|
||||
drm_agp_unbind_entry(dev, entry);
|
||||
entry->prev->next = entry->next;
|
||||
entry->next->prev = entry->prev;
|
||||
drm_free_agp(entry->memory, entry->pages);
|
||||
drm_free(entry, sizeof(*entry), DRM_MEM_AGPLISTS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
drm_agp_head_t *drm_agp_init(void)
|
||||
{
|
||||
drm_agp_fill_t *fill;
|
||||
drm_agp_head_t *head = NULL;
|
||||
int agp_available = 1;
|
||||
|
||||
for (fill = &drm_agp_fill[0]; fill->name; fill++) {
|
||||
char *n = (char *)fill->name;
|
||||
*fill->f = (drm_agp_func_u)get_module_symbol(NULL, n);
|
||||
DRM_DEBUG("%s resolves to 0x%08lx\n", n, (*fill->f).address);
|
||||
if (!(*fill->f).address) agp_available = 0;
|
||||
}
|
||||
|
||||
if (agp_available) {
|
||||
if (!(head = drm_alloc(sizeof(*head), DRM_MEM_AGPLISTS)))
|
||||
return NULL;
|
||||
(*drm_agp.copy_info)(&head->agp_info);
|
||||
head->memory = NULL;
|
||||
switch (head->agp_info.chipset) {
|
||||
case INTEL_GENERIC: head->chipset = "Intel"; break;
|
||||
case INTEL_LX: head->chipset = "Intel 440LX"; break;
|
||||
case INTEL_BX: head->chipset = "Intel 440BX"; break;
|
||||
case INTEL_GX: head->chipset = "Intel 440GX"; break;
|
||||
case INTEL_I810: head->chipset = "Intel i810"; break;
|
||||
case VIA_GENERIC: head->chipset = "VIA"; break;
|
||||
case VIA_VP3: head->chipset = "VIA VP3"; break;
|
||||
case VIA_MVP3: head->chipset = "VIA MVP3"; break;
|
||||
case VIA_APOLLO_PRO: head->chipset = "VIA Apollo Pro"; break;
|
||||
case SIS_GENERIC: head->chipset = "SiS"; break;
|
||||
case AMD_GENERIC: head->chipset = "AMD"; break;
|
||||
case AMD_IRONGATE: head->chipset = "AMD Irongate"; break;
|
||||
case ALI_GENERIC: head->chipset = "ALi"; break;
|
||||
case ALI_M1541: head->chipset = "ALi M1541"; break;
|
||||
default:
|
||||
}
|
||||
DRM_INFO("AGP %d.%d on %s @ 0x%08lx %dMB\n",
|
||||
head->agp_info.version.major,
|
||||
head->agp_info.version.minor,
|
||||
head->chipset,
|
||||
head->agp_info.aper_base,
|
||||
head->agp_info.aper_size);
|
||||
}
|
||||
return head;
|
||||
}
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
/* auth.c -- IOCTLs for authentication -*- linux-c -*-
|
||||
* Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com
|
||||
* Revised: Fri Aug 20 11:31:48 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -23,8 +22,9 @@
|
|||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/auth.c,v 1.4 1999/08/30 13:05:00 faith Exp $
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/auth.c,v 1.1 1999/09/25 14:37:57 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* bufs.c -- IOCTLs to manage buffers -*- linux-c -*-
|
||||
* Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com
|
||||
* Revised: Fri Dec 3 12:11:11 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/bufs.c,v 1.8 1999/08/30 13:05:00 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/bufs.c,v 1.1 1999/09/25 14:37:57 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
@ -103,6 +103,9 @@ int drm_addmap(struct inode *inode, struct file *filp, unsigned int cmd,
|
|||
dev->lock.hw_lock = map->handle; /* Pointer to lock */
|
||||
}
|
||||
break;
|
||||
case _DRM_AGP:
|
||||
map->handle = (void *)(map->offset + dev->agp->base);
|
||||
break;
|
||||
default:
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* context.c -- IOCTLs for contexts and DMA queues -*- linux-c -*-
|
||||
* Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com
|
||||
* Revised: Fri Aug 20 11:32:09 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/context.c,v 1.5 1999/08/30 13:05:00 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/context.c,v 1.1 1999/09/25 14:37:58 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* dma.c -- DMA IOCTL and function support -*- linux-c -*-
|
||||
* Created: Fri Mar 19 14:30:16 1999 by faith@precisioninsight.com
|
||||
* Revised: Thu Sep 16 12:55:39 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/dma.c,v 1.7 1999/09/16 16:56:18 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/dma.c,v 1.1 1999/09/25 14:37:58 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* drawable.c -- IOCTLs for drawables -*- linux-c -*-
|
||||
* Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com
|
||||
* Revised: Fri Aug 20 09:27:03 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drawable.c,v 1.3 1999/08/30 13:05:00 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drawable.c,v 1.1 1999/09/25 14:37:58 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
49
linux/drm.h
49
linux/drm.h
|
|
@ -1,6 +1,5 @@
|
|||
/* drm.h -- Header for Direct Rendering Manager -*- linux-c -*-
|
||||
* Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 17:11:19 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All rights reserved.
|
||||
|
|
@ -24,12 +23,14 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h,v 1.46 1999/08/20 20:00:53 faith Exp $
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h,v 1.1 1999/09/25 14:37:58 dawes Exp $
|
||||
*
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* Acknowledgements:
|
||||
* Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic cmpxchg.
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h,v 1.1 1999/09/25 14:37:58 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _DRM_H_
|
||||
|
|
@ -102,7 +103,8 @@ typedef struct drm_control {
|
|||
typedef enum drm_map_type {
|
||||
_DRM_FRAME_BUFFER = 0, /* WC (no caching), no core dump */
|
||||
_DRM_REGISTERS = 1, /* no caching, no core dump */
|
||||
_DRM_SHM = 2 /* shared, cached */
|
||||
_DRM_SHM = 2, /* shared, cached */
|
||||
_DRM_AGP = 3 /* AGP/GART */
|
||||
} drm_map_type_t;
|
||||
|
||||
typedef enum drm_map_flags {
|
||||
|
|
@ -238,6 +240,36 @@ typedef struct drm_irq_busid {
|
|||
int funcnum;
|
||||
} drm_irq_busid_t;
|
||||
|
||||
typedef struct drm_agp_mode {
|
||||
unsigned long mode;
|
||||
} drm_agp_mode_t;
|
||||
|
||||
/* For drm_agp_alloc -- allocated a buffer */
|
||||
typedef struct drm_agp_buffer {
|
||||
unsigned long size; /* In bytes -- will round to page boundary */
|
||||
unsigned long handle; /* Used for BIND/UNBIND ioctls */
|
||||
} drm_agp_buffer_t;
|
||||
|
||||
/* For drm_agp_bind */
|
||||
typedef struct drm_agp_binding {
|
||||
unsigned long handle; /* From drm_agp_buffer */
|
||||
unsigned long offset; /* In bytes -- will round to page boundary */
|
||||
} drm_agp_binding_t;
|
||||
|
||||
typedef struct drm_agp_info {
|
||||
int agp_version_major;
|
||||
int agp_version_minor;
|
||||
unsigned long mode;
|
||||
unsigned long aperture_base; /* physical address */
|
||||
unsigned long aperture_size; /* bytes */
|
||||
unsigned long memory_allowed; /* bytes */
|
||||
unsigned long memory_used;
|
||||
|
||||
/* PCI information */
|
||||
unsigned short id_vendor;
|
||||
unsigned short id_device;
|
||||
} drm_agp_info_t;
|
||||
|
||||
#define DRM_IOCTL_BASE 'd'
|
||||
#define DRM_IOCTL_NR(n) _IOC_NR(n)
|
||||
#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
|
||||
|
|
@ -277,4 +309,13 @@ typedef struct drm_irq_busid {
|
|||
#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, drm_lock_t)
|
||||
#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, drm_lock_t)
|
||||
|
||||
#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
|
||||
#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
|
||||
#define DRM_IOCTL_AGP_ENABLE DRM_IOR( 0x32, drm_agp_mode_t)
|
||||
#define DRM_IOCTL_AGP_INFO DRM_IOW( 0x33, drm_agp_info_t)
|
||||
#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, drm_agp_buffer_t)
|
||||
#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, drm_agp_buffer_t)
|
||||
#define DRM_IOCTL_AGP_BIND DRM_IOWR(0x36, drm_agp_binding_t)
|
||||
#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, drm_agp_binding_t)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
80
linux/drmP.h
80
linux/drmP.h
|
|
@ -1,6 +1,5 @@
|
|||
/* drmP.h -- Private header for Direct Rendering Manager -*- linux-c -*-
|
||||
* Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 16:06:49 1999 by faith@precisioninsight.com
|
||||
* Created: Mon Jan 4 10:05:05 1999 by faith@dict.org
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All rights reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h,v 1.58 1999/08/30 13:05:00 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmP.h,v 1.1 1999/09/25 14:37:59 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
@ -49,6 +49,10 @@
|
|||
#ifdef CONFIG_MTRR
|
||||
#include <asm/mtrr.h>
|
||||
#endif
|
||||
#ifdef DRM_AGP
|
||||
#include <linux/types.h>
|
||||
#include <linux/agp_backend.h>
|
||||
#endif
|
||||
#include "drm.h"
|
||||
|
||||
#define DRM_DEBUG_CODE 2 /* Include debugging code (if > 1, then
|
||||
|
|
@ -81,6 +85,9 @@
|
|||
#define DRM_MEM_CMDS 12
|
||||
#define DRM_MEM_MAPPINGS 13
|
||||
#define DRM_MEM_BUFLISTS 14
|
||||
#define DRM_MEM_AGPLISTS 15
|
||||
#define DRM_MEM_TOTALAGP 16
|
||||
#define DRM_MEM_BOUNDAGP 17
|
||||
|
||||
/* Backward compatibility section */
|
||||
/* _PAGE_WT changed to _PAGE_PWT in 2.2.6 */
|
||||
|
|
@ -381,6 +388,40 @@ typedef struct drm_device_dma {
|
|||
wait_queue_head_t waiting; /* Processes waiting on free bufs */
|
||||
} drm_device_dma_t;
|
||||
|
||||
#ifdef DRM_AGP
|
||||
typedef struct drm_agp_mem {
|
||||
unsigned long handle;
|
||||
agp_memory *memory;
|
||||
unsigned long bound; /* address */
|
||||
int pages;
|
||||
struct drm_agp_mem *prev;
|
||||
struct drm_agp_mem *next;
|
||||
} drm_agp_mem_t;
|
||||
|
||||
typedef struct drm_agp_head {
|
||||
agp_kern_info agp_info;
|
||||
const char *chipset;
|
||||
drm_agp_mem_t *memory;
|
||||
unsigned long mode;
|
||||
int enabled;
|
||||
int acquired;
|
||||
unsigned long base;
|
||||
} drm_agp_head_t;
|
||||
|
||||
typedef struct {
|
||||
void (*free_memory)(agp_memory *);
|
||||
agp_memory *(*allocate_memory)(size_t, u32);
|
||||
int (*bind_memory)(agp_memory *, off_t);
|
||||
int (*unbind_memory)(agp_memory *);
|
||||
void (*enable)(u32);
|
||||
int (*acquire)(void);
|
||||
void (*release)(void);
|
||||
void (*copy_info)(agp_kern_info *);
|
||||
} drm_agp_func_t;
|
||||
|
||||
extern drm_agp_func_t drm_agp;
|
||||
#endif
|
||||
|
||||
typedef struct drm_device {
|
||||
const char *name; /* Simple driver name */
|
||||
char *unique; /* Unique identifier: e.g., busid */
|
||||
|
|
@ -459,6 +500,10 @@ typedef struct drm_device {
|
|||
struct fasync_struct *buf_async;/* Processes waiting for SIGIO */
|
||||
wait_queue_head_t buf_readers; /* Processes waiting to read */
|
||||
wait_queue_head_t buf_writers; /* Processes waiting to ctx switch */
|
||||
|
||||
#ifdef DRM_AGP
|
||||
drm_agp_head_t *agp;
|
||||
#endif
|
||||
} drm_device_t;
|
||||
|
||||
|
||||
|
|
@ -529,6 +574,14 @@ extern void drm_free_pages(unsigned long address, int order,
|
|||
extern void *drm_ioremap(unsigned long offset, unsigned long size);
|
||||
extern void drm_ioremapfree(void *pt, unsigned long size);
|
||||
|
||||
#ifdef DRM_AGP
|
||||
extern agp_memory *drm_alloc_agp(int pages);
|
||||
extern int drm_free_agp(agp_memory *handle, int pages);
|
||||
extern int drm_bind_agp(agp_memory *handle, unsigned int start);
|
||||
extern int drm_unbind_agp(agp_memory *handle);
|
||||
#endif
|
||||
|
||||
|
||||
/* Buffer management support (bufs.c) */
|
||||
extern int drm_order(unsigned long size);
|
||||
extern int drm_addmap(struct inode *inode, struct file *filp,
|
||||
|
|
@ -638,5 +691,26 @@ extern int drm_flush_unblock(drm_device_t *dev, int context,
|
|||
drm_lock_flags_t flags);
|
||||
extern int drm_flush_block_and_flush(drm_device_t *dev, int context,
|
||||
drm_lock_flags_t flags);
|
||||
|
||||
#ifdef DRM_AGP
|
||||
/* AGP/GART support (agpsupport.c) */
|
||||
extern drm_agp_head_t *drm_agp_init(void);
|
||||
extern int drm_agp_acquire(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_release(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_enable(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_info(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_alloc(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_free(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_unbind(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
extern int drm_agp_bind(struct inode *inode, struct file *filp,
|
||||
unsigned int cmd, unsigned long arg);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* fops.c -- File operations for DRM -*- linux-c -*-
|
||||
* Created: Mon Jan 4 08:58:31 1999 by faith@precisioninsight.com
|
||||
* Revised: Fri Dec 3 10:26:26 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/fops.c,v 1.3 1999/08/20 15:36:45 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/fops.c,v 1.1 1999/09/25 14:37:59 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* gamma_dma.c -- DMA support for GMX 2000 -*- linux-c -*-
|
||||
* Created: Fri Mar 19 14:30:16 1999 by faith@precisioninsight.com
|
||||
* Revised: Thu Sep 16 12:55:37 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/gamma_dma.c,v 1.9 1999/09/16 16:56:18 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/gamma_dma.c,v 1.1 1999/09/25 14:38:00 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* gamma.c -- 3dlabs GMX 2000 driver -*- linux-c -*-
|
||||
* Created: Mon Jan 4 08:58:31 1999 by faith@precisioninsight.com
|
||||
* Revised: Tue Oct 12 08:51:36 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/gamma_drv.c,v 1.17 1999/08/30 13:05:00 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/gamma_drv.c,v 1.1 1999/09/25 14:38:00 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
@ -271,6 +271,10 @@ static int gamma_takedown(drm_device_t *dev)
|
|||
- PAGE_SHIFT,
|
||||
DRM_MEM_SAREA);
|
||||
break;
|
||||
case _DRM_AGP:
|
||||
/* Do nothing here, because this is all
|
||||
handled in the AGP/GART driver. */
|
||||
break;
|
||||
}
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* gamma_drv.h -- Private header for 3dlabs GMX 2000 driver -*- linux-c -*-
|
||||
* Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com
|
||||
* Revised: Fri Aug 20 09:24:27 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All rights reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/gamma_drv.h,v 1.4 1999/08/30 13:05:00 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/gamma_drv.h,v 1.1 1999/09/25 14:38:00 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* init.c -- Setup/Cleanup for DRM -*- linux-c -*-
|
||||
* Created: Mon Jan 4 08:58:31 1999 by faith@precisioninsight.com
|
||||
* Revised: Fri Aug 20 09:27:02 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/init.c,v 1.3 1999/08/20 15:07:01 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/init.c,v 1.1 1999/09/25 14:38:01 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* ioctl.c -- IOCTL processing for DRM -*- linux-c -*-
|
||||
* Created: Fri Jan 8 09:01:26 1999 by faith@precisioninsight.com
|
||||
* Revised: Fri Aug 20 09:27:02 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/ioctl.c,v 1.3 1999/08/30 13:05:00 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/ioctl.c,v 1.1 1999/09/25 14:38:01 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* lists.c -- Buffer list handling routines -*- linux-c -*-
|
||||
* Created: Mon Apr 19 20:54:22 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 16:04:44 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/lists.c,v 1.3 1999/08/20 15:07:02 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/lists.c,v 1.1 1999/09/25 14:38:01 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* lock.c -- IOCTLs for locking -*- linux-c -*-
|
||||
* Created: Tue Feb 2 08:37:54 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 16:04:44 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/lock.c,v 1.5 1999/08/30 13:05:00 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/lock.c,v 1.1 1999/09/25 14:38:01 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
151
linux/memory.c
151
linux/memory.c
|
|
@ -1,6 +1,5 @@
|
|||
/* memory.c -- Memory management wrappers for DRM -*- linux-c -*-
|
||||
* Created: Thu Feb 4 14:00:34 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 10:28:18 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/memory.c,v 1.4 1999/08/20 20:00:53 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/memory.c,v 1.1 1999/09/25 14:38:02 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
@ -45,21 +45,24 @@ static spinlock_t drm_mem_lock = SPIN_LOCK_UNLOCKED;
|
|||
static unsigned long drm_ram_available = 0; /* In pages */
|
||||
static unsigned long drm_ram_used = 0;
|
||||
static drm_mem_stats_t drm_mem_stats[] = {
|
||||
[DRM_MEM_DMA] = { "dmabufs" },
|
||||
[DRM_MEM_SAREA] = { "sareas" },
|
||||
[DRM_MEM_DRIVER] = { "driver" },
|
||||
[DRM_MEM_MAGIC] = { "magic" },
|
||||
[DRM_MEM_IOCTLS] = { "ioctltab" },
|
||||
[DRM_MEM_MAPS] = { "maplist" },
|
||||
[DRM_MEM_VMAS] = { "vmalist" },
|
||||
[DRM_MEM_BUFS] = { "buflist" },
|
||||
[DRM_MEM_SEGS] = { "seglist" },
|
||||
[DRM_MEM_PAGES] = { "pagelist" },
|
||||
[DRM_MEM_FILES] = { "files" },
|
||||
[DRM_MEM_QUEUES] = { "queues" },
|
||||
[DRM_MEM_CMDS] = { "commands" },
|
||||
[DRM_MEM_MAPPINGS] = { "mappings" },
|
||||
[DRM_MEM_BUFLISTS] = { "buflists" },
|
||||
[DRM_MEM_DMA] = { "dmabufs" },
|
||||
[DRM_MEM_SAREA] = { "sareas" },
|
||||
[DRM_MEM_DRIVER] = { "driver" },
|
||||
[DRM_MEM_MAGIC] = { "magic" },
|
||||
[DRM_MEM_IOCTLS] = { "ioctltab" },
|
||||
[DRM_MEM_MAPS] = { "maplist" },
|
||||
[DRM_MEM_VMAS] = { "vmalist" },
|
||||
[DRM_MEM_BUFS] = { "buflist" },
|
||||
[DRM_MEM_SEGS] = { "seglist" },
|
||||
[DRM_MEM_PAGES] = { "pagelist" },
|
||||
[DRM_MEM_FILES] = { "files" },
|
||||
[DRM_MEM_QUEUES] = { "queues" },
|
||||
[DRM_MEM_CMDS] = { "commands" },
|
||||
[DRM_MEM_MAPPINGS] = { "mappings" },
|
||||
[DRM_MEM_BUFLISTS] = { "buflists" },
|
||||
[DRM_MEM_AGPLISTS] = { "agplist" },
|
||||
[DRM_MEM_TOTALAGP] = { "totalagp" },
|
||||
[DRM_MEM_BOUNDAGP] = { "boundagp" },
|
||||
{ NULL, 0, } /* Last entry must be null */
|
||||
};
|
||||
|
||||
|
|
@ -325,3 +328,117 @@ void drm_ioremapfree(void *pt, unsigned long size)
|
|||
free_count, alloc_count);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef DRM_AGP
|
||||
agp_memory *drm_alloc_agp(int pages)
|
||||
{
|
||||
agp_memory *handle;
|
||||
|
||||
if (!pages) {
|
||||
DRM_MEM_ERROR(DRM_MEM_TOTALAGP, "Allocating 0 pages\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (drm_agp.allocate_memory) {
|
||||
if ((handle = (*drm_agp.allocate_memory)(pages,
|
||||
AGP_NORMAL_MEMORY))) {
|
||||
spin_lock(&drm_mem_lock);
|
||||
++drm_mem_stats[DRM_MEM_TOTALAGP].succeed_count;
|
||||
drm_mem_stats[DRM_MEM_TOTALAGP].bytes_allocated
|
||||
+= pages << PAGE_SHIFT;
|
||||
spin_unlock(&drm_mem_lock);
|
||||
return handle;
|
||||
}
|
||||
}
|
||||
spin_lock(&drm_mem_lock);
|
||||
++drm_mem_stats[DRM_MEM_TOTALAGP].fail_count;
|
||||
spin_unlock(&drm_mem_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int drm_free_agp(agp_memory *handle, int pages)
|
||||
{
|
||||
int alloc_count;
|
||||
int free_count;
|
||||
int retval = -EINVAL;
|
||||
|
||||
if (!handle) {
|
||||
DRM_MEM_ERROR(DRM_MEM_TOTALAGP,
|
||||
"Attempt to free NULL AGP handle\n");
|
||||
return retval;;
|
||||
}
|
||||
|
||||
if (drm_agp.free_memory) {
|
||||
(*drm_agp.free_memory)(handle);
|
||||
spin_lock(&drm_mem_lock);
|
||||
free_count = ++drm_mem_stats[DRM_MEM_TOTALAGP].free_count;
|
||||
alloc_count = drm_mem_stats[DRM_MEM_TOTALAGP].succeed_count;
|
||||
drm_mem_stats[DRM_MEM_TOTALAGP].bytes_freed
|
||||
+= pages << PAGE_SHIFT;
|
||||
spin_unlock(&drm_mem_lock);
|
||||
if (free_count > alloc_count) {
|
||||
DRM_MEM_ERROR(DRM_MEM_TOTALAGP,
|
||||
"Excess frees: %d frees, %d allocs\n",
|
||||
free_count, alloc_count);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
int drm_bind_agp(agp_memory *handle, unsigned int start)
|
||||
{
|
||||
int retcode = -EINVAL;
|
||||
|
||||
if (!handle) {
|
||||
DRM_MEM_ERROR(DRM_MEM_BOUNDAGP,
|
||||
"Attempt to bind NULL AGP handle\n");
|
||||
return retcode;
|
||||
}
|
||||
|
||||
if (drm_agp.bind_memory) {
|
||||
if (!(retcode = (*drm_agp.bind_memory)(handle, start))) {
|
||||
spin_lock(&drm_mem_lock);
|
||||
++drm_mem_stats[DRM_MEM_BOUNDAGP].succeed_count;
|
||||
drm_mem_stats[DRM_MEM_BOUNDAGP].bytes_allocated
|
||||
+= handle->page_count << PAGE_SHIFT;
|
||||
spin_unlock(&drm_mem_lock);
|
||||
return retcode;
|
||||
}
|
||||
}
|
||||
spin_lock(&drm_mem_lock);
|
||||
++drm_mem_stats[DRM_MEM_BOUNDAGP].fail_count;
|
||||
spin_unlock(&drm_mem_lock);
|
||||
return retcode;
|
||||
}
|
||||
|
||||
int drm_unbind_agp(agp_memory *handle)
|
||||
{
|
||||
int alloc_count;
|
||||
int free_count;
|
||||
int retcode = -EINVAL;
|
||||
|
||||
if (!handle) {
|
||||
DRM_MEM_ERROR(DRM_MEM_BOUNDAGP,
|
||||
"Attempt to unbind NULL AGP handle\n");
|
||||
return retcode;
|
||||
}
|
||||
|
||||
if (drm_agp.unbind_memory) {
|
||||
int c = handle->page_count;
|
||||
if ((retcode = (*drm_agp.unbind_memory)(handle)))
|
||||
return retcode;
|
||||
spin_lock(&drm_mem_lock);
|
||||
free_count = ++drm_mem_stats[DRM_MEM_BOUNDAGP].free_count;
|
||||
alloc_count = drm_mem_stats[DRM_MEM_BOUNDAGP].succeed_count;
|
||||
drm_mem_stats[DRM_MEM_BOUNDAGP].bytes_freed += c << PAGE_SHIFT;
|
||||
spin_unlock(&drm_mem_lock);
|
||||
if (free_count > alloc_count) {
|
||||
DRM_MEM_ERROR(DRM_MEM_BOUNDAGP,
|
||||
"Excess frees: %d frees, %d allocs\n",
|
||||
free_count, alloc_count);
|
||||
}
|
||||
}
|
||||
return retcode;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* proc.c -- /proc support for DRM -*- linux-c -*-
|
||||
* Created: Mon Jan 11 09:48:47 1999 by faith@precisioninsight.com
|
||||
* Revised: Fri Dec 3 09:44:16 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/proc.c,v 1.4 1999/08/20 15:36:46 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/proc.c,v 1.1 1999/09/25 14:38:02 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
@ -165,7 +165,10 @@ static int _drm_vm_info(char *buf, char **start, off_t offset, int len,
|
|||
{
|
||||
drm_device_t *dev = (drm_device_t *)data;
|
||||
drm_map_t *map;
|
||||
const char *types[] = { "FB", "REG", "SHM" };
|
||||
/* Hardcoded from _DRM_FRAME_BUFFER,
|
||||
_DRM_REGISTERS, _DRM_SHM, and
|
||||
_DRM_AGP. */
|
||||
const char *types[] = { "FB", "REG", "SHM", "AGP" };
|
||||
const char *type;
|
||||
int i;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* tdfx_context.c -- IOCTLs for tdfx contexts -*- linux-c -*-
|
||||
* Created: Thu Oct 7 10:50:22 1999 by faith@precisioninsight.com
|
||||
* Revised: Sat Oct 9 23:39:56 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,9 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI$
|
||||
* Authors: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
* Daryll Strauss <daryll@precisioninsight.com>
|
||||
*
|
||||
* $XFree86$
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* tdfx.c -- tdfx driver -*- linux-c -*-
|
||||
/* tdfx_drv.c -- tdfx driver -*- linux-c -*-
|
||||
* Created: Thu Oct 7 10:38:32 1999 by faith@precisioninsight.com
|
||||
* Revised: Tue Oct 12 08:51:35 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,9 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI$
|
||||
* Authors: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
* Daryll Strauss <daryll@precisioninsight.com>
|
||||
*
|
||||
* $XFree86$
|
||||
*
|
||||
*/
|
||||
|
|
@ -262,6 +263,10 @@ static int tdfx_takedown(drm_device_t *dev)
|
|||
- PAGE_SHIFT,
|
||||
DRM_MEM_SAREA);
|
||||
break;
|
||||
case _DRM_AGP:
|
||||
/* Do nothing here, because this is all
|
||||
handled in the AGP/GART driver. */
|
||||
break;
|
||||
}
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* tdfx_drv.h -- Private header for tdfx driver -*- linux-c -*-
|
||||
* Created: Thu Oct 7 10:40:04 1999 by faith@precisioninsight.com
|
||||
* Revised: Sat Oct 9 23:38:19 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All rights reserved.
|
||||
|
|
@ -23,8 +22,10 @@
|
|||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
* Daryll Strauss <daryll@precisioninsight.com>
|
||||
*
|
||||
* $PI$
|
||||
* $XFree86$
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* vm.c -- Memory mapping for DRM -*- linux-c -*-
|
||||
* Created: Mon Jan 4 08:58:31 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 16:54:35 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/vm.c,v 1.7 1999/08/21 02:48:34 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/vm.c,v 1.1 1999/09/25 14:38:02 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
@ -251,9 +251,10 @@ int drm_mmap(struct file *filp, struct vm_area_struct *vma)
|
|||
switch (map->type) {
|
||||
case _DRM_FRAME_BUFFER:
|
||||
case _DRM_REGISTERS:
|
||||
case _DRM_AGP:
|
||||
if (VM_OFFSET(vma) >= __pa(high_memory)) {
|
||||
#if defined(__i386__)
|
||||
if (boot_cpu_data.x86 > 3) {
|
||||
if (boot_cpu_data.x86 > 3 && map->type != _DRM_AGP) {
|
||||
pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
|
||||
pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* drm.h -- Header for Direct Rendering Manager -*- linux-c -*-
|
||||
* Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 17:11:19 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All rights reserved.
|
||||
|
|
@ -24,12 +23,14 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h,v 1.46 1999/08/20 20:00:53 faith Exp $
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h,v 1.1 1999/09/25 14:37:58 dawes Exp $
|
||||
*
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* Acknowledgements:
|
||||
* Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic cmpxchg.
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h,v 1.1 1999/09/25 14:37:58 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _DRM_H_
|
||||
|
|
@ -102,7 +103,8 @@ typedef struct drm_control {
|
|||
typedef enum drm_map_type {
|
||||
_DRM_FRAME_BUFFER = 0, /* WC (no caching), no core dump */
|
||||
_DRM_REGISTERS = 1, /* no caching, no core dump */
|
||||
_DRM_SHM = 2 /* shared, cached */
|
||||
_DRM_SHM = 2, /* shared, cached */
|
||||
_DRM_AGP = 3 /* AGP/GART */
|
||||
} drm_map_type_t;
|
||||
|
||||
typedef enum drm_map_flags {
|
||||
|
|
@ -238,6 +240,36 @@ typedef struct drm_irq_busid {
|
|||
int funcnum;
|
||||
} drm_irq_busid_t;
|
||||
|
||||
typedef struct drm_agp_mode {
|
||||
unsigned long mode;
|
||||
} drm_agp_mode_t;
|
||||
|
||||
/* For drm_agp_alloc -- allocated a buffer */
|
||||
typedef struct drm_agp_buffer {
|
||||
unsigned long size; /* In bytes -- will round to page boundary */
|
||||
unsigned long handle; /* Used for BIND/UNBIND ioctls */
|
||||
} drm_agp_buffer_t;
|
||||
|
||||
/* For drm_agp_bind */
|
||||
typedef struct drm_agp_binding {
|
||||
unsigned long handle; /* From drm_agp_buffer */
|
||||
unsigned long offset; /* In bytes -- will round to page boundary */
|
||||
} drm_agp_binding_t;
|
||||
|
||||
typedef struct drm_agp_info {
|
||||
int agp_version_major;
|
||||
int agp_version_minor;
|
||||
unsigned long mode;
|
||||
unsigned long aperture_base; /* physical address */
|
||||
unsigned long aperture_size; /* bytes */
|
||||
unsigned long memory_allowed; /* bytes */
|
||||
unsigned long memory_used;
|
||||
|
||||
/* PCI information */
|
||||
unsigned short id_vendor;
|
||||
unsigned short id_device;
|
||||
} drm_agp_info_t;
|
||||
|
||||
#define DRM_IOCTL_BASE 'd'
|
||||
#define DRM_IOCTL_NR(n) _IOC_NR(n)
|
||||
#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
|
||||
|
|
@ -277,4 +309,13 @@ typedef struct drm_irq_busid {
|
|||
#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, drm_lock_t)
|
||||
#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, drm_lock_t)
|
||||
|
||||
#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
|
||||
#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
|
||||
#define DRM_IOCTL_AGP_ENABLE DRM_IOR( 0x32, drm_agp_mode_t)
|
||||
#define DRM_IOCTL_AGP_INFO DRM_IOW( 0x33, drm_agp_info_t)
|
||||
#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, drm_agp_buffer_t)
|
||||
#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, drm_agp_buffer_t)
|
||||
#define DRM_IOCTL_AGP_BIND DRM_IOWR(0x36, drm_agp_binding_t)
|
||||
#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, drm_agp_binding_t)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
49
shared/drm.h
49
shared/drm.h
|
|
@ -1,6 +1,5 @@
|
|||
/* drm.h -- Header for Direct Rendering Manager -*- linux-c -*-
|
||||
* Created: Mon Jan 4 10:05:05 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 17:11:19 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All rights reserved.
|
||||
|
|
@ -24,12 +23,14 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h,v 1.46 1999/08/20 20:00:53 faith Exp $
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h,v 1.1 1999/09/25 14:37:58 dawes Exp $
|
||||
*
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* Acknowledgements:
|
||||
* Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic cmpxchg.
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drm.h,v 1.1 1999/09/25 14:37:58 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _DRM_H_
|
||||
|
|
@ -102,7 +103,8 @@ typedef struct drm_control {
|
|||
typedef enum drm_map_type {
|
||||
_DRM_FRAME_BUFFER = 0, /* WC (no caching), no core dump */
|
||||
_DRM_REGISTERS = 1, /* no caching, no core dump */
|
||||
_DRM_SHM = 2 /* shared, cached */
|
||||
_DRM_SHM = 2, /* shared, cached */
|
||||
_DRM_AGP = 3 /* AGP/GART */
|
||||
} drm_map_type_t;
|
||||
|
||||
typedef enum drm_map_flags {
|
||||
|
|
@ -238,6 +240,36 @@ typedef struct drm_irq_busid {
|
|||
int funcnum;
|
||||
} drm_irq_busid_t;
|
||||
|
||||
typedef struct drm_agp_mode {
|
||||
unsigned long mode;
|
||||
} drm_agp_mode_t;
|
||||
|
||||
/* For drm_agp_alloc -- allocated a buffer */
|
||||
typedef struct drm_agp_buffer {
|
||||
unsigned long size; /* In bytes -- will round to page boundary */
|
||||
unsigned long handle; /* Used for BIND/UNBIND ioctls */
|
||||
} drm_agp_buffer_t;
|
||||
|
||||
/* For drm_agp_bind */
|
||||
typedef struct drm_agp_binding {
|
||||
unsigned long handle; /* From drm_agp_buffer */
|
||||
unsigned long offset; /* In bytes -- will round to page boundary */
|
||||
} drm_agp_binding_t;
|
||||
|
||||
typedef struct drm_agp_info {
|
||||
int agp_version_major;
|
||||
int agp_version_minor;
|
||||
unsigned long mode;
|
||||
unsigned long aperture_base; /* physical address */
|
||||
unsigned long aperture_size; /* bytes */
|
||||
unsigned long memory_allowed; /* bytes */
|
||||
unsigned long memory_used;
|
||||
|
||||
/* PCI information */
|
||||
unsigned short id_vendor;
|
||||
unsigned short id_device;
|
||||
} drm_agp_info_t;
|
||||
|
||||
#define DRM_IOCTL_BASE 'd'
|
||||
#define DRM_IOCTL_NR(n) _IOC_NR(n)
|
||||
#define DRM_IO(nr) _IO(DRM_IOCTL_BASE,nr)
|
||||
|
|
@ -277,4 +309,13 @@ typedef struct drm_irq_busid {
|
|||
#define DRM_IOCTL_UNLOCK DRM_IOW( 0x2b, drm_lock_t)
|
||||
#define DRM_IOCTL_FINISH DRM_IOW( 0x2c, drm_lock_t)
|
||||
|
||||
#define DRM_IOCTL_AGP_ACQUIRE DRM_IO( 0x30)
|
||||
#define DRM_IOCTL_AGP_RELEASE DRM_IO( 0x31)
|
||||
#define DRM_IOCTL_AGP_ENABLE DRM_IOR( 0x32, drm_agp_mode_t)
|
||||
#define DRM_IOCTL_AGP_INFO DRM_IOW( 0x33, drm_agp_info_t)
|
||||
#define DRM_IOCTL_AGP_ALLOC DRM_IOWR(0x34, drm_agp_buffer_t)
|
||||
#define DRM_IOCTL_AGP_FREE DRM_IOW( 0x35, drm_agp_buffer_t)
|
||||
#define DRM_IOCTL_AGP_BIND DRM_IOWR(0x36, drm_agp_binding_t)
|
||||
#define DRM_IOCTL_AGP_UNBIND DRM_IOW( 0x37, drm_agp_binding_t)
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
/* drmstat.c -- DRM device status and testing program
|
||||
* Created: Tue Jan 5 08:19:24 1999 by faith@precisioninsight.com
|
||||
* Revised: Mon Dec 6 10:33:46 1999 by faith@precisioninsight.com
|
||||
*
|
||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
|
|
@ -24,7 +23,8 @@
|
|||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* $PI: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmstat.c,v 1.28 1999/08/04 18:12:11 faith Exp $
|
||||
* Author: Rickard E. (Rik) Faith <faith@precisioninsight.com>
|
||||
*
|
||||
* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/kernel/drmstat.c,v 1.1 1999/09/25 14:37:59 dawes Exp $
|
||||
*
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue