Home | History | Annotate | Line # | Download | only in bsd-core
      1 /* mach64_drv.c -- ATI Rage 128 driver -*- linux-c -*-
      2  * Created: Mon Dec 13 09:47:27 1999 by faith (at) precisioninsight.com
      3  */
      4 /*-
      5  * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
      6  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
      7  * All Rights Reserved.
      8  *
      9  * Permission is hereby granted, free of charge, to any person obtaining a
     10  * copy of this software and associated documentation files (the "Software"),
     11  * to deal in the Software without restriction, including without limitation
     12  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     13  * and/or sell copies of the Software, and to permit persons to whom the
     14  * Software is furnished to do so, subject to the following conditions:
     15  *
     16  * The above copyright notice and this permission notice (including the next
     17  * paragraph) shall be included in all copies or substantial portions of the
     18  * Software.
     19  *
     20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     23  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
     24  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     25  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     26  * OTHER DEALINGS IN THE SOFTWARE.
     27  *
     28  * Authors:
     29  *    Rickard E. (Rik) Faith <faith (at) valinux.com>
     30  *    Gareth Hughes <gareth (at) valinux.com>
     31  */
     32 
     33 
     34 #include <sys/types.h>
     35 
     36 #include "drmP.h"
     37 #include "drm.h"
     38 #include "mach64_drm.h"
     39 #include "mach64_drv.h"
     40 #include "drm_pciids.h"
     41 
     42 /* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */
     43 static drm_pci_id_list_t mach64_pciidlist[] = {
     44 	mach64_PCI_IDS
     45 };
     46 
     47 int
     48 mach64_driver_load(struct drm_device * dev, unsigned long flags)
     49 {
     50         return drm_vblank_init(dev, 1);
     51 }
     52 
     53 static void mach64_configure(struct drm_device *dev)
     54 {
     55 	dev->driver->driver_features =
     56 	    DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA |
     57 	    DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ;
     58 
     59 	dev->driver->buf_priv_size	= 1; /* No dev_priv */
     60 	dev->driver->load		= mach64_driver_load;
     61 	dev->driver->lastclose		= mach64_driver_lastclose;
     62 	dev->driver->get_vblank_counter	= mach64_get_vblank_counter;
     63 	dev->driver->enable_vblank	= mach64_enable_vblank;
     64 	dev->driver->disable_vblank	= mach64_disable_vblank;
     65 	dev->driver->irq_preinstall	= mach64_driver_irq_preinstall;
     66 	dev->driver->irq_postinstall	= mach64_driver_irq_postinstall;
     67 	dev->driver->irq_uninstall	= mach64_driver_irq_uninstall;
     68 	dev->driver->irq_handler	= mach64_driver_irq_handler;
     69 	dev->driver->dma_ioctl		= mach64_dma_buffers;
     70 
     71 	dev->driver->ioctls		= mach64_ioctls;
     72 	dev->driver->max_ioctl		= mach64_max_ioctl;
     73 
     74 	dev->driver->name		= DRIVER_NAME;
     75 	dev->driver->desc		= DRIVER_DESC;
     76 	dev->driver->date		= DRIVER_DATE;
     77 	dev->driver->major		= DRIVER_MAJOR;
     78 	dev->driver->minor		= DRIVER_MINOR;
     79 	dev->driver->patchlevel		= DRIVER_PATCHLEVEL;
     80 }
     81 
     82 #if defined(__FreeBSD__)
     83 
     84 static int
     85 mach64_probe(device_t kdev)
     86 {
     87 	return drm_probe(kdev, mach64_pciidlist);
     88 }
     89 
     90 static int
     91 mach64_attach(device_t kdev)
     92 {
     93 	struct drm_device *dev = device_get_softc(kdev);
     94 
     95 	dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER,
     96 	    M_WAITOK | M_ZERO);
     97 
     98 	mach64_configure(dev);
     99 
    100 	return drm_attach(kdev, mach64_pciidlist);
    101 }
    102 
    103 static int
    104 mach64_detach(device_t kdev)
    105 {
    106 	struct drm_device *dev = device_get_softc(kdev);
    107 	int ret;
    108 
    109 	ret = drm_detach(kdev);
    110 
    111 	free(dev->driver, DRM_MEM_DRIVER);
    112 
    113 	return ret;
    114 }
    115 
    116 static device_method_t mach64_methods[] = {
    117 	/* Device interface */
    118 	DEVMETHOD(device_probe,		mach64_probe),
    119 	DEVMETHOD(device_attach,	mach64_attach),
    120 	DEVMETHOD(device_detach,	mach64_detach),
    121 
    122 	{ 0, 0 }
    123 };
    124 
    125 static driver_t mach64_driver = {
    126 	"drm",
    127 	mach64_methods,
    128 	sizeof(struct drm_device)
    129 };
    130 
    131 extern devclass_t drm_devclass;
    132 #if __FreeBSD_version >= 700010
    133 DRIVER_MODULE(mach64, vgapci, mach64_driver, drm_devclass, 0, 0);
    134 #else
    135 DRIVER_MODULE(mach64, pci, mach64_driver, drm_devclass, 0, 0);
    136 #endif
    137 MODULE_DEPEND(mach64, drm, 1, 1, 1);
    138 
    139 #elif   defined(__NetBSD__)
    140 
    141 static int
    142 mach64drm_probe(device_t parent, cfdata_t match, void *aux)
    143 {
    144 	struct pci_attach_args *pa = aux;
    145 
    146 	return drm_probe(pa, mach64_pciidlist);
    147 }
    148 
    149 static void
    150 mach64drm_attach(device_t parent, device_t self, void *aux)
    151 {
    152 	struct pci_attach_args *pa = aux;
    153 	struct drm_device *dev = device_private(self);
    154 
    155 	dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER,
    156 	    M_WAITOK | M_ZERO);
    157 
    158 	mach64_configure(dev);
    159 
    160 	drm_attach(self, pa, mach64_pciidlist);
    161 }
    162 
    163 CFATTACH_DECL_NEW(mach64drm, sizeof(struct drm_device),
    164     mach64drm_probe, mach64drm_attach, drm_detach, NULL);
    165 
    166 MODULE(MODULE_CLASS_DRIVER, mach64drm, "drm");
    167 
    168 #ifdef _MODULE
    169 #include "ioconf.c"
    170 #endif
    171 
    172 static int
    173 mach64drm_modcmd(modcmd_t cmd, void *arg)
    174 {
    175 	int error = 0;
    176 
    177 	switch (cmd) {
    178 	case MODULE_CMD_INIT:
    179 #ifdef _MODULE
    180 		error = config_init_component(cfdriver_ioconf_mach64drm,
    181 		    cfattach_ioconf_mach64drm, cfdata_ioconf_mach64drm);
    182 #endif
    183 		break;
    184 	case MODULE_CMD_FINI:
    185 #ifdef _MODULE
    186 		error = config_fini_component(cfdriver_ioconf_mach64drm,
    187 		    cfattach_ioconf_mach64drm, cfdata_ioconf_mach64drm);
    188 #endif
    189 		break;
    190 	default:
    191 		return ENOTTY;
    192 	}
    193 
    194 	return error;
    195 }
    196 
    197 #endif
    198