1/* via_drv.c -- VIA unichrome driver -*- linux-c -*- 2 * Created: Fri Aug 12 2005 by anholt@FreeBSD.org 3 */ 4/*- 5 * Copyright 2005 Eric Anholt 6 * All Rights Reserved. 7 * 8 * Permission is hereby granted, free of charge, to any person obtaining a 9 * copy of this software and associated documentation files (the "Software"), 10 * to deal in the Software without restriction, including without limitation 11 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 * and/or sell copies of the Software, and to permit persons to whom the 13 * Software is furnished to do so, subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the next 16 * paragraph) shall be included in all copies or substantial portions of the 17 * Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22 * ERIC ANHOLT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 23 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 * Authors: 27 * Eric Anholt <anholt@FreeBSD.org> 28 * 29 */ 30 31#include <sys/cdefs.h> 32__FBSDID("$FreeBSD: releng/11.0/sys/dev/drm/via_drv.c 203288 2010-01-31 14:30:39Z rnoland $"); 33 34#include "dev/drm/drmP.h" 35#include "dev/drm/drm.h" 36#include "dev/drm/via_drm.h" 37#include "dev/drm/via_drv.h" 38#include "dev/drm/drm_pciids.h" 39 40/* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */ 41static drm_pci_id_list_t via_pciidlist[] = { 42 viadrv_PCI_IDS 43}; 44 45static void via_configure(struct drm_device *dev) 46{ 47 dev->driver->driver_features = 48 DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_HAVE_IRQ; 49 50 dev->driver->buf_priv_size = sizeof(drm_via_private_t); 51 dev->driver->load = via_driver_load; 52 dev->driver->unload = via_driver_unload; 53 dev->driver->lastclose = via_lastclose; 54 dev->driver->get_vblank_counter = via_get_vblank_counter; 55 dev->driver->enable_vblank = via_enable_vblank; 56 dev->driver->disable_vblank = via_disable_vblank; 57 dev->driver->irq_preinstall = via_driver_irq_preinstall; 58 dev->driver->irq_postinstall = via_driver_irq_postinstall; 59 dev->driver->irq_uninstall = via_driver_irq_uninstall; 60 dev->driver->irq_handler = via_driver_irq_handler; 61 dev->driver->dma_quiescent = via_driver_dma_quiescent; 62 63 dev->driver->ioctls = via_ioctls; 64 dev->driver->max_ioctl = via_max_ioctl; 65 66 dev->driver->name = DRIVER_NAME; 67 dev->driver->desc = DRIVER_DESC; 68 dev->driver->date = DRIVER_DATE; 69 dev->driver->major = DRIVER_MAJOR; 70 dev->driver->minor = DRIVER_MINOR; 71 dev->driver->patchlevel = DRIVER_PATCHLEVEL; 72} 73 74static int 75via_probe(device_t kdev) 76{ 77 return drm_probe(kdev, via_pciidlist); 78} 79 80static int 81via_attach(device_t kdev) 82{ 83 struct drm_device *dev = device_get_softc(kdev); 84 85 dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER, 86 M_WAITOK | M_ZERO); 87 88 via_configure(dev); 89 90 return drm_attach(kdev, via_pciidlist); 91} 92 93static int 94via_detach(device_t kdev) 95{ 96 struct drm_device *dev = device_get_softc(kdev); 97 int ret; 98 99 ret = drm_detach(kdev); 100 101 free(dev->driver, DRM_MEM_DRIVER); 102 103 return ret; 104} 105 106static device_method_t via_methods[] = { 107 /* Device interface */ 108 DEVMETHOD(device_probe, via_probe), 109 DEVMETHOD(device_attach, via_attach), 110 DEVMETHOD(device_detach, via_detach), 111 112 { 0, 0 } 113}; 114 115static driver_t via_driver = { 116 "drm", 117 via_methods, 118 sizeof(struct drm_device) 119}; 120 121extern devclass_t drm_devclass; 122DRIVER_MODULE(via, vgapci, via_driver, drm_devclass, 0, 0); 123MODULE_DEPEND(via, drm, 1, 1, 1); 124