summaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
authorEric Anholt <anholt@freebsd.org>2003-10-17 03:14:39 +0000
committerEric Anholt <anholt@freebsd.org>2003-10-17 03:14:39 +0000
commitff58476011ba8fe72d65e884380d3d86710bfdd4 (patch)
treec2855a267ab001340e588ae6b32a55982312cfa0 /linux
parent355b204de0dbc01308bebc77c4c1c0a9a402cded (diff)
- Converted Linux drivers to initialize DRM instances based on PCI IDs, not
just a single instance. Moved the PCI ID lists from <card>_drv.c in BSD to <card>.h. The PCI ID lists include a driver private field, which may be used by drivers for chip family or other information. Based on work by jonsmirl. - Make tdfx_drv.c and tdfx.h match other drivers. - Fixed up linking of sis shared files. Tested with Radeon and SiS on Linux and FreeBSD, including a Linux setup with 2 SiS cards in a machine, but only one head being used (with DRI)
Diffstat (limited to 'linux')
-rw-r--r--linux/Makefile.linux5
-rw-r--r--linux/drmP.h12
-rw-r--r--linux/drm_drv.h217
-rw-r--r--linux/gamma.h4
-rw-r--r--linux/i810.h9
-rw-r--r--linux/i830.h5
-rw-r--r--linux/tdfx.h42
-rw-r--r--linux/tdfx_drv.c41
8 files changed, 127 insertions, 208 deletions
diff --git a/linux/Makefile.linux b/linux/Makefile.linux
index 12e0e8c8..e873242e 100644
--- a/linux/Makefile.linux
+++ b/linux/Makefile.linux
@@ -68,6 +68,7 @@ DRMHEADERS = drm.h drmP.h $(DRMSHARED)
GAMMAHEADERS = gamma.h gamma_context.h gamma_drm.h gamma_drv.h gamma_lists.h \
gamma_old_dma.h gamma_lock.h $(DRMHEADERS) $(DRMTEMPLATES)
TDFXHEADERS = tdfx.h $(DRMHEADERS) $(DRMTEMPLATES)
+TDFXSHARED = tdfx.h
R128HEADERS = r128.h r128_drv.h r128_drm.h $(DRMHEADERS) $(DRMTEMPLATES)
R128SHARED = r128.h r128_drv.h r128_drm.h r128_cce.c r128_state.c r128_irq.c
RADEONHEADERS = radeon.h radeon_drv.h radeon_drm.h $(DRMHEADERS) \
@@ -81,8 +82,10 @@ MGASHARED = mga.h mga_dma.c mga_drm.h mga_drv.h mga_irq.c mga_state.c \
I810HEADERS = i810.h i810_drv.h i810_drm.h $(DRMHEADERS) $(DRMTEMPLATES)
I830HEADERS = i830.h i830_drv.h i830_drm.h $(DRMHEADERS) $(DRMTEMPLATES)
SISHEADERS= sis_drv.h sis_drm.h $(DRMHEADERS)
+SISSHARED= sis_drv.h sis_drm.h sis_ds.c sis_ds.h sis_mm.c
-SHAREDSRC = $(DRMSHARED) $(MGASHARED) $(R128SHARED) $(RADEONSHARED)
+SHAREDSRC = $(DRMSHARED) $(MGASHARED) $(R128SHARED) $(RADEONSHARED) \
+ $(SISSHARED) $(TDFXSHARED)
PROGS = dristat drmstat
diff --git a/linux/drmP.h b/linux/drmP.h
index 8a995dbe..f7137b25 100644
--- a/linux/drmP.h
+++ b/linux/drmP.h
@@ -391,10 +391,13 @@ do { \
typedef int drm_ioctl_t( struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg );
-typedef struct drm_pci_list {
- u16 vendor;
- u16 device;
-} drm_pci_list_t;
+typedef struct drm_pci_id_list
+{
+ int vendor;
+ int device;
+ long driver_private;
+ char *name;
+} drm_pci_id_list_t;
typedef struct drm_ioctl_desc {
drm_ioctl_t *func;
@@ -651,6 +654,7 @@ typedef struct drm_device {
int unique_len; /**< Length of unique field */
dev_t device; /**< Device number for mknod */
char *devname; /**< For /proc/interrupts */
+ int minor; /**< Minor device number */
int blocked; /**< Blocked due to VC switch? */
struct proc_dir_entry *root; /**< Root for this device's entries */
diff --git a/linux/drm_drv.h b/linux/drm_drv.h
index d62156b3..801118e3 100644
--- a/linux/drm_drv.h
+++ b/linux/drm_drv.h
@@ -159,15 +159,8 @@ __setup( DRIVER_NAME "=", DRM_OPTIONS_FUNC );
#undef DRM_OPTIONS_FUNC
#endif
-/**
- * The default number of instances (minor numbers) to initialize.
- */
-#ifndef DRIVER_NUM_CARDS
-#define DRIVER_NUM_CARDS 1
-#endif
-
-static drm_device_t *DRM(device);
-static int *DRM(minor);
+#define MAX_DEVICES 4
+static drm_device_t DRM(device)[MAX_DEVICES];
static int DRM(numdevs) = 0;
DRIVER_FOPS;
@@ -534,52 +527,112 @@ static int DRM(takedown)( drm_device_t *dev )
return 0;
}
-/**
- * Figure out how many instances to initialize.
- *
- * \return number of cards found.
- *
- * Searches for every PCI card in \c DRIVER_CARD_LIST with matching vendor and device ids.
- */
-static int drm_count_cards(void)
+static drm_pci_id_list_t DRM(pciidlist)[] = {
+ DRIVER_PCI_IDS
+};
+
+static int probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
- int num = 0;
-#if defined(DRIVER_CARD_LIST)
- int i;
- drm_pci_list_t *l;
- u16 device, vendor;
- struct pci_dev *pdev = NULL;
+ drm_device_t *dev;
+#if __HAVE_CTX_BITMAP
+ int retcode;
#endif
+ int i;
+ char *desc = NULL;
DRM_DEBUG( "\n" );
-#if defined(DRIVER_COUNT_CARDS)
- num = DRIVER_COUNT_CARDS();
-#elif defined(DRIVER_CARD_LIST)
- for (i = 0, l = DRIVER_CARD_LIST; l[i].vendor != 0; i++) {
- pdev = NULL;
- vendor = l[i].vendor;
- device = l[i].device;
- if(device == 0xffff) device = PCI_ANY_ID;
- if(vendor == 0xffff) vendor = PCI_ANY_ID;
- while ((pdev = pci_find_device(vendor, device, pdev))) {
- num++;
+ for (i = 0; DRM(pciidlist)[i].vendor != 0; i++) {
+ if ((DRM(pciidlist)[i].vendor == pdev->vendor) &&
+ (DRM(pciidlist)[i].device == pdev->device)) {
+ desc = DRM(pciidlist)[i].name;
}
}
-#else
- num = DRIVER_NUM_CARDS;
+ if (desc == NULL)
+ return -ENODEV;
+
+ if (DRM(numdevs) >= MAX_DEVICES)
+ return -ENODEV;
+
+ dev = &(DRM(device)[DRM(numdevs)]);
+
+ memset( (void *)dev, 0, sizeof(*dev) );
+ dev->count_lock = SPIN_LOCK_UNLOCKED;
+ init_timer( &dev->timer );
+ sema_init( &dev->struct_sem, 1 );
+
+ if ((dev->minor = DRM(stub_register)(DRIVER_NAME, &DRM(fops),dev)) < 0)
+ return -EPERM;
+ dev->device = MKDEV(DRM_MAJOR, dev->minor );
+ dev->name = DRIVER_NAME;
+ dev->pdev = pdev;
+#ifdef __alpha__
+ dev->hose = pdev->sysdata;
#endif
- DRM_DEBUG("numdevs = %d\n", num);
- return num;
+
+ DRIVER_PREINIT();
+
+#if __REALLY_HAVE_AGP
+ dev->agp = DRM(agp_init)();
+#if __MUST_HAVE_AGP
+ if ( dev->agp == NULL ) {
+ DRM_ERROR( "Cannot initialize the agpgart module.\n" );
+ DRM(stub_unregister)(dev->minor);
+ DRM(takedown)( dev );
+ return -ENOMEM;
+ }
+#endif
+#if __REALLY_HAVE_MTRR
+ if (dev->agp)
+ dev->agp->agp_mtrr = mtrr_add( dev->agp->agp_info.aper_base,
+ dev->agp->agp_info.aper_size*1024*1024,
+ MTRR_TYPE_WRCOMB,
+ 1 );
+#endif
+#endif
+
+#if __HAVE_CTX_BITMAP
+ retcode = DRM(ctxbitmap_init)( dev );
+ if( retcode ) {
+ DRM_ERROR( "Cannot allocate memory for context bitmap.\n" );
+ DRM(stub_unregister)(dev->minor);
+ DRM(takedown)( dev );
+ return retcode;
+ }
+#endif
+ DRM(numdevs)++; /* no errors, mark it reserved */
+
+ DRM_INFO( "Initialized %s %d.%d.%d %s on minor %d\n",
+ DRIVER_NAME,
+ DRIVER_MAJOR,
+ DRIVER_MINOR,
+ DRIVER_PATCHLEVEL,
+ DRIVER_DATE,
+ dev->minor );
+
+ DRIVER_POSTINIT();
+
+ return 0;
+}
+
+static void __exit remove(struct pci_dev *dev)
+{
}
+static struct pci_driver driver = {
+ .name = DRIVER_NAME,
+ .id_table = NULL,
+ .probe = probe,
+ .remove = remove,
+};
+
/**
* Module initialization. Called via init_module at module load time, or via
* linux/init/main.c (this is not currently supported).
*
* \return zero on success or a negative number on failure.
*
- * Allocates and initialize an array of drm_device structures, and attempts to
+ * Initializes an array of drm_device structures, and attempts to
* initialize all available devices, using consecutive minors, registering the
* stubs and initializing the AGP device.
*
@@ -588,89 +641,15 @@ static int drm_count_cards(void)
*/
static int __init drm_init( void )
{
-
- drm_device_t *dev;
- int i;
-#if __HAVE_CTX_BITMAP
- int retcode;
-#endif
DRM_DEBUG( "\n" );
#ifdef MODULE
DRM(parse_options)( drm_opts );
#endif
- DRM(numdevs) = drm_count_cards();
- /* Force at least one instance. */
- if (DRM(numdevs) <= 0)
- DRM(numdevs) = 1;
-
- DRM(device) = kmalloc(sizeof(*DRM(device)) * DRM(numdevs), GFP_KERNEL);
- if (!DRM(device)) {
- return -ENOMEM;
- }
- DRM(minor) = kmalloc(sizeof(*DRM(minor)) * DRM(numdevs), GFP_KERNEL);
- if (!DRM(minor)) {
- kfree(DRM(device));
- return -ENOMEM;
- }
-
- DRIVER_PREINIT();
-
DRM(mem_init)();
- for (i = 0; i < DRM(numdevs); i++) {
- dev = &(DRM(device)[i]);
- memset( (void *)dev, 0, sizeof(*dev) );
- dev->count_lock = SPIN_LOCK_UNLOCKED;
- init_timer( &dev->timer );
- sema_init( &dev->struct_sem, 1 );
-
- if ((DRM(minor)[i] = DRM(stub_register)(DRIVER_NAME, &DRM(fops),dev)) < 0)
- return -EPERM;
- dev->device = MKDEV(DRM_MAJOR, DRM(minor)[i] );
- dev->name = DRIVER_NAME;
-
-#if __REALLY_HAVE_AGP
- dev->agp = DRM(agp_init)();
-#if __MUST_HAVE_AGP
- if ( dev->agp == NULL ) {
- DRM_ERROR( "Cannot initialize the agpgart module.\n" );
- DRM(stub_unregister)(DRM(minor)[i]);
- DRM(takedown)( dev );
- return -ENOMEM;
- }
-#endif
-#if __REALLY_HAVE_MTRR
- if (dev->agp)
- dev->agp->agp_mtrr = mtrr_add( dev->agp->agp_info.aper_base,
- dev->agp->agp_info.aper_size*1024*1024,
- MTRR_TYPE_WRCOMB,
- 1 );
-#endif
-#endif
-
-#if __HAVE_CTX_BITMAP
- retcode = DRM(ctxbitmap_init)( dev );
- if( retcode ) {
- DRM_ERROR( "Cannot allocate memory for context bitmap.\n" );
- DRM(stub_unregister)(DRM(minor)[i]);
- DRM(takedown)( dev );
- return retcode;
- }
-#endif
- DRM_INFO( "Initialized %s %d.%d.%d %s on minor %d\n",
- DRIVER_NAME,
- DRIVER_MAJOR,
- DRIVER_MINOR,
- DRIVER_PATCHLEVEL,
- DRIVER_DATE,
- DRM(minor)[i] );
- }
-
- DRIVER_POSTINIT();
-
- return 0;
+ return pci_module_init (&driver);;
}
/**
@@ -687,12 +666,14 @@ static void __exit drm_cleanup( void )
DRM_DEBUG( "\n" );
+ pci_unregister_driver (&driver);
+
for (i = DRM(numdevs) - 1; i >= 0; i--) {
dev = &(DRM(device)[i]);
- if ( DRM(stub_unregister)(DRM(minor)[i]) ) {
+ if ( DRM(stub_unregister)(dev->minor) ) {
DRM_ERROR( "Cannot unload module\n" );
} else {
- DRM_DEBUG("minor %d unregistered\n", DRM(minor)[i]);
+ DRM_DEBUG("minor %d unregistered\n", dev->minor);
if (i == 0) {
DRM_INFO( "Module unloaded\n" );
}
@@ -722,8 +703,6 @@ static void __exit drm_cleanup( void )
#endif
}
DRIVER_POSTCLEANUP();
- kfree(DRM(minor));
- kfree(DRM(device));
DRM(numdevs) = 0;
}
@@ -795,7 +774,7 @@ int DRM(open)( struct inode *inode, struct file *filp )
int i;
for (i = 0; i < DRM(numdevs); i++) {
- if (minor(inode->i_rdev) == DRM(minor)[i]) {
+ if (minor(inode->i_rdev) == DRM(device)[i].minor) {
dev = &(DRM(device)[i]);
break;
}
diff --git a/linux/gamma.h b/linux/gamma.h
index 54dafcfc..407eb369 100644
--- a/linux/gamma.h
+++ b/linux/gamma.h
@@ -53,6 +53,10 @@
[DRM_IOCTL_NR(DRM_IOCTL_GAMMA_INIT)] = { gamma_dma_init, 1, 1 }, \
[DRM_IOCTL_NR(DRM_IOCTL_GAMMA_COPY)] = { gamma_dma_copy, 1, 1 }
+#define DRIVER_PCI_IDS \
+ {0x3d3d, 0x0008, 0, "3DLabs GLINT Gamma G1"}, \
+ {0, 0, 0, NULL}
+
#define IOCTL_TABLE_NAME DRM(ioctls)
#define IOCTL_FUNC_NAME DRM(ioctl)
diff --git a/linux/i810.h b/linux/i810.h
index a5d300a2..d4098e4d 100644
--- a/linux/i810.h
+++ b/linux/i810.h
@@ -77,7 +77,14 @@
[DRM_IOCTL_NR(DRM_IOCTL_I810_MC)] = { i810_dma_mc, 1, 1 }, \
[DRM_IOCTL_NR(DRM_IOCTL_I810_RSTATUS)] = { i810_rstatus, 1, 0 }, \
[DRM_IOCTL_NR(DRM_IOCTL_I810_FLIP)] = { i810_flip_bufs, 1, 0 }
-
+
+#define DRIVER_PCI_IDS \
+ {0x8086, 0x7121, 0, "Intel i810 GMCH"}, \
+ {0x8086, 0x7123, 0, "Intel i810-DC100 GMCH"}, \
+ {0x8086, 0x7125, 0, "Intel i810E GMCH"}, \
+ {0x8086, 0x1132, 0, "Intel i815 GMCH"}, \
+ {0, 0, 0, NULL}
+
#define __HAVE_COUNTERS 4
#define __HAVE_COUNTER6 _DRM_STAT_IRQ
diff --git a/linux/i830.h b/linux/i830.h
index 5775162a..cd770bb5 100644
--- a/linux/i830.h
+++ b/linux/i830.h
@@ -77,6 +77,11 @@
[DRM_IOCTL_NR(DRM_IOCTL_I830_GETPARAM)] = { i830_getparam, 1, 0 }, \
[DRM_IOCTL_NR(DRM_IOCTL_I830_SETPARAM)] = { i830_setparam, 1, 0 }
+#define DRIVER_PCI_IDS \
+ {0x8086, 0x3577, 0, "Intel i830M GMCH"}, \
+ {0x8086, 0x2562, 0, "Intel i845G GMCH"}, \
+ {0, 0, 0, NULL}
+
#define __HAVE_COUNTERS 4
#define __HAVE_COUNTER6 _DRM_STAT_IRQ
#define __HAVE_COUNTER7 _DRM_STAT_PRIMARY
diff --git a/linux/tdfx.h b/linux/tdfx.h
deleted file mode 100644
index 40aba8fb..00000000
--- a/linux/tdfx.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* tdfx.h -- 3dfx DRM template customization -*- linux-c -*-
- * Created: Wed Feb 14 12:32:32 2001 by gareth@valinux.com
- *
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * 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
- * VA LINUX SYSTEMS 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.
- *
- * Authors:
- * Gareth Hughes <gareth@valinux.com>
- */
-
-#ifndef __TDFX_H__
-#define __TDFX_H__
-
-/* This remains constant for all DRM template files.
- */
-#define DRM(x) tdfx_##x
-
-/* General customization:
- */
-#define __HAVE_MTRR 1
-#define __HAVE_CTX_BITMAP 1
-
-#endif
diff --git a/linux/tdfx_drv.c b/linux/tdfx_drv.c
index 8b790188..fafa1f92 100644
--- a/linux/tdfx_drv.c
+++ b/linux/tdfx_drv.c
@@ -34,47 +34,6 @@
#include "tdfx.h"
#include "drmP.h"
-#define DRIVER_AUTHOR "VA Linux Systems Inc."
-
-#define DRIVER_NAME "tdfx"
-#define DRIVER_DESC "3dfx Banshee/Voodoo3+"
-#define DRIVER_DATE "20010216"
-
-#define DRIVER_MAJOR 1
-#define DRIVER_MINOR 0
-#define DRIVER_PATCHLEVEL 0
-
-#ifndef PCI_VENDOR_ID_3DFX
-#define PCI_VENDOR_ID_3DFX 0x121A
-#endif
-#ifndef PCI_DEVICE_ID_3DFX_VOODOO5
-#define PCI_DEVICE_ID_3DFX_VOODOO5 0x0009
-#endif
-#ifndef PCI_DEVICE_ID_3DFX_VOODOO4
-#define PCI_DEVICE_ID_3DFX_VOODOO4 0x0007
-#endif
-#ifndef PCI_DEVICE_ID_3DFX_VOODOO3_3000 /* Voodoo3 3000 */
-#define PCI_DEVICE_ID_3DFX_VOODOO3_3000 0x0005
-#endif
-#ifndef PCI_DEVICE_ID_3DFX_VOODOO3_2000 /* Voodoo3 3000 */
-#define PCI_DEVICE_ID_3DFX_VOODOO3_2000 0x0004
-#endif
-#ifndef PCI_DEVICE_ID_3DFX_BANSHEE
-#define PCI_DEVICE_ID_3DFX_BANSHEE 0x0003
-#endif
-
-static drm_pci_list_t DRM(idlist)[] = {
- { PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_BANSHEE },
- { PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO3_2000 },
- { PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO3_3000 },
- { PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO4 },
- { PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_VOODOO5 },
- { 0, 0 }
-};
-
-#define DRIVER_CARD_LIST DRM(idlist)
-
-
#include "drm_auth.h"
#include "drm_bufs.h"
#include "drm_context.h"