mach64_drv.c revision 256281
1167802Sjkim/* mach64_drv.c -- ATI Rage 128 driver -*- linux-c -*- 2167802Sjkim * Created: Mon Dec 13 09:47:27 1999 by faith@precisioninsight.com 3167802Sjkim */ 4167802Sjkim/*- 5167802Sjkim * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 6167802Sjkim * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 7217365Sjkim * All Rights Reserved. 8298714Sjkim * 9167802Sjkim * Permission is hereby granted, free of charge, to any person obtaining a 10167802Sjkim * copy of this software and associated documentation files (the "Software"), 11217365Sjkim * to deal in the Software without restriction, including without limitation 12217365Sjkim * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13217365Sjkim * and/or sell copies of the Software, and to permit persons to whom the 14217365Sjkim * Software is furnished to do so, subject to the following conditions: 15217365Sjkim * 16217365Sjkim * The above copyright notice and this permission notice (including the next 17217365Sjkim * paragraph) shall be included in all copies or substantial portions of the 18217365Sjkim * Software. 19217365Sjkim * 20217365Sjkim * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21217365Sjkim * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22217365Sjkim * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23217365Sjkim * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 24217365Sjkim * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 25167802Sjkim * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26217365Sjkim * OTHER DEALINGS IN THE SOFTWARE. 27217365Sjkim * 28217365Sjkim * Authors: 29167802Sjkim * Rickard E. (Rik) Faith <faith@valinux.com> 30217365Sjkim * Gareth Hughes <gareth@valinux.com> 31217365Sjkim */ 32217365Sjkim 33217365Sjkim#include <sys/cdefs.h> 34217365Sjkim__FBSDID("$FreeBSD: stable/10/sys/dev/drm/mach64_drv.c 189563 2009-03-09 07:55:18Z rnoland $"); 35217365Sjkim 36217365Sjkim 37217365Sjkim#include <sys/types.h> 38217365Sjkim 39217365Sjkim#include "dev/drm/drmP.h" 40217365Sjkim#include "dev/drm/drm.h" 41217365Sjkim#include "dev/drm/mach64_drm.h" 42217365Sjkim#include "dev/drm/mach64_drv.h" 43167802Sjkim#include "dev/drm/drm_pciids.h" 44193529Sjkim 45193529Sjkim/* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */ 46193529Sjkimstatic drm_pci_id_list_t mach64_pciidlist[] = { 47193529Sjkim mach64_PCI_IDS 48167802Sjkim}; 49167802Sjkim 50167802Sjkimstatic void mach64_configure(struct drm_device *dev) 51167802Sjkim{ 52167802Sjkim dev->driver->driver_features = 53167802Sjkim DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | 54167802Sjkim DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ; 55239340Sjkim 56239340Sjkim dev->driver->buf_priv_size = 1; /* No dev_priv */ 57218590Sjkim dev->driver->load = mach64_driver_load; 58218590Sjkim dev->driver->lastclose = mach64_driver_lastclose; 59218590Sjkim dev->driver->get_vblank_counter = mach64_get_vblank_counter; 60218590Sjkim dev->driver->enable_vblank = mach64_enable_vblank; 61218590Sjkim dev->driver->disable_vblank = mach64_disable_vblank; 62218590Sjkim dev->driver->irq_preinstall = mach64_driver_irq_preinstall; 63167802Sjkim dev->driver->irq_postinstall = mach64_driver_irq_postinstall; 64167802Sjkim dev->driver->irq_uninstall = mach64_driver_irq_uninstall; 65239340Sjkim dev->driver->irq_handler = mach64_driver_irq_handler; 66239340Sjkim dev->driver->dma_ioctl = mach64_dma_buffers; 67239340Sjkim 68239340Sjkim dev->driver->ioctls = mach64_ioctls; 69239340Sjkim dev->driver->max_ioctl = mach64_max_ioctl; 70239340Sjkim 71239340Sjkim dev->driver->name = DRIVER_NAME; 72239340Sjkim dev->driver->desc = DRIVER_DESC; 73239340Sjkim dev->driver->date = DRIVER_DATE; 74239340Sjkim dev->driver->major = DRIVER_MAJOR; 75239340Sjkim dev->driver->minor = DRIVER_MINOR; 76239340Sjkim dev->driver->patchlevel = DRIVER_PATCHLEVEL; 77239340Sjkim} 78239340Sjkim 79239340Sjkimstatic int 80239340Sjkimmach64_probe(device_t kdev) 81281396Sjkim{ 82239340Sjkim return drm_probe(kdev, mach64_pciidlist); 83239340Sjkim} 84239340Sjkim 85239340Sjkimstatic int 86239340Sjkimmach64_attach(device_t kdev) 87283092Sjkim{ 88239340Sjkim struct drm_device *dev = device_get_softc(kdev); 89239340Sjkim 90239340Sjkim dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER, 91239340Sjkim M_WAITOK | M_ZERO); 92239340Sjkim 93239340Sjkim mach64_configure(dev); 94239340Sjkim 95239340Sjkim return drm_attach(kdev, mach64_pciidlist); 96239340Sjkim} 97239340Sjkim 98239340Sjkimint 99239340Sjkimmach64_driver_load(struct drm_device * dev, unsigned long flags) 100239340Sjkim{ 101239340Sjkim return drm_vblank_init(dev, 1); 102239340Sjkim} 103239340Sjkim 104239340Sjkimstatic int 105283092Sjkimmach64_detach(device_t kdev) 106283092Sjkim{ 107283092Sjkim struct drm_device *dev = device_get_softc(kdev); 108281396Sjkim int ret; 109281396Sjkim 110281396Sjkim ret = drm_detach(kdev); 111239340Sjkim 112239340Sjkim free(dev->driver, DRM_MEM_DRIVER); 113239340Sjkim 114239340Sjkim return ret; 115239340Sjkim} 116239340Sjkim 117239340Sjkimstatic device_method_t mach64_methods[] = { 118239340Sjkim /* Device interface */ 119239340Sjkim DEVMETHOD(device_probe, mach64_probe), 120239340Sjkim DEVMETHOD(device_attach, mach64_attach), 121239340Sjkim DEVMETHOD(device_detach, mach64_detach), 122239340Sjkim 123239340Sjkim { 0, 0 } 124239340Sjkim}; 125283092Sjkim 126283092Sjkimstatic driver_t mach64_driver = { 127283092Sjkim "drm", 128283092Sjkim mach64_methods, 129283092Sjkim sizeof(struct drm_device) 130283092Sjkim}; 131283092Sjkim 132283092Sjkimextern devclass_t drm_devclass; 133283092Sjkim#if __FreeBSD_version >= 700010 134283092SjkimDRIVER_MODULE(mach64, vgapci, mach64_driver, drm_devclass, 0, 0); 135283092Sjkim#else 136283092SjkimDRIVER_MODULE(mach64, pci, mach64_driver, drm_devclass, 0, 0); 137283092Sjkim#endif 138283092SjkimMODULE_DEPEND(mach64, drm, 1, 1, 1); 139283092Sjkim