i915_drv.c revision 194741
1182080Srnoland/* i915_drv.c -- Intel i915 driver -*- linux-c -*- 2145132Sanholt * Created: Wed Feb 14 17:10:04 2001 by gareth@valinux.com 3145132Sanholt */ 4145132Sanholt/*- 5145132Sanholt * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 6145132Sanholt * All Rights Reserved. 7145132Sanholt * 8145132Sanholt * Permission is hereby granted, free of charge, to any person obtaining a 9145132Sanholt * copy of this software and associated documentation files (the "Software"), 10145132Sanholt * to deal in the Software without restriction, including without limitation 11145132Sanholt * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12145132Sanholt * and/or sell copies of the Software, and to permit persons to whom the 13145132Sanholt * Software is furnished to do so, subject to the following conditions: 14145132Sanholt * 15145132Sanholt * The above copyright notice and this permission notice (including the next 16145132Sanholt * paragraph) shall be included in all copies or substantial portions of the 17145132Sanholt * Software. 18145132Sanholt * 19145132Sanholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20145132Sanholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21145132Sanholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22145132Sanholt * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 23145132Sanholt * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 24145132Sanholt * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 25145132Sanholt * OTHER DEALINGS IN THE SOFTWARE. 26145132Sanholt * 27145132Sanholt * Authors: 28145132Sanholt * Gareth Hughes <gareth@valinux.com> 29145132Sanholt * 30145132Sanholt */ 31145132Sanholt 32152909Sanholt#include <sys/cdefs.h> 33152909Sanholt__FBSDID("$FreeBSD: head/sys/dev/drm/i915_drv.c 194741 2009-06-23 17:38:28Z rnoland $"); 34145132Sanholt 35152909Sanholt#include "dev/drm/drmP.h" 36152909Sanholt#include "dev/drm/drm.h" 37152909Sanholt#include "dev/drm/i915_drm.h" 38152909Sanholt#include "dev/drm/i915_drv.h" 39152909Sanholt#include "dev/drm/drm_pciids.h" 40152909Sanholt 41145132Sanholt/* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */ 42145132Sanholtstatic drm_pci_id_list_t i915_pciidlist[] = { 43145132Sanholt i915_PCI_IDS 44145132Sanholt}; 45145132Sanholt 46189563Srnolandstatic int i915_suspend(device_t kdev) 47145132Sanholt{ 48189563Srnoland struct drm_device *dev = device_get_softc(kdev); 49182080Srnoland 50190163Srnoland if (!dev || !dev->dev_private) { 51182080Srnoland DRM_ERROR("DRM not initialized, aborting suspend.\n"); 52182080Srnoland return -ENODEV; 53182080Srnoland } 54182080Srnoland 55194741Srnoland DRM_LOCK(); 56194741Srnoland DRM_DEBUG("starting suspend\n"); 57182080Srnoland i915_save_state(dev); 58194741Srnoland DRM_UNLOCK(); 59182080Srnoland 60189563Srnoland return (bus_generic_suspend(kdev)); 61182080Srnoland} 62182080Srnoland 63189563Srnolandstatic int i915_resume(device_t kdev) 64182080Srnoland{ 65189563Srnoland struct drm_device *dev = device_get_softc(kdev); 66182080Srnoland 67194741Srnoland DRM_LOCK(); 68182080Srnoland i915_restore_state(dev); 69194741Srnoland DRM_DEBUG("finished resume\n"); 70194741Srnoland DRM_UNLOCK(); 71182080Srnoland 72189563Srnoland return (bus_generic_resume(kdev)); 73182080Srnoland} 74182080Srnoland 75182080Srnolandstatic void i915_configure(struct drm_device *dev) 76182080Srnoland{ 77183573Srnoland dev->driver->driver_features = 78183573Srnoland DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | DRIVER_USE_MTRR | 79183573Srnoland DRIVER_HAVE_IRQ; 80145132Sanholt 81183573Srnoland dev->driver->buf_priv_size = sizeof(drm_i915_private_t); 82183573Srnoland dev->driver->load = i915_driver_load; 83183573Srnoland dev->driver->unload = i915_driver_unload; 84183573Srnoland dev->driver->preclose = i915_driver_preclose; 85183573Srnoland dev->driver->lastclose = i915_driver_lastclose; 86183573Srnoland dev->driver->device_is_agp = i915_driver_device_is_agp; 87183573Srnoland dev->driver->enable_vblank = i915_enable_vblank; 88183573Srnoland dev->driver->disable_vblank = i915_disable_vblank; 89183573Srnoland dev->driver->irq_preinstall = i915_driver_irq_preinstall; 90183573Srnoland dev->driver->irq_postinstall = i915_driver_irq_postinstall; 91183573Srnoland dev->driver->irq_uninstall = i915_driver_irq_uninstall; 92183573Srnoland dev->driver->irq_handler = i915_driver_irq_handler; 93145132Sanholt 94183573Srnoland dev->driver->ioctls = i915_ioctls; 95183573Srnoland dev->driver->max_ioctl = i915_max_ioctl; 96145132Sanholt 97183573Srnoland dev->driver->name = DRIVER_NAME; 98183573Srnoland dev->driver->desc = DRIVER_DESC; 99183573Srnoland dev->driver->date = DRIVER_DATE; 100183573Srnoland dev->driver->major = DRIVER_MAJOR; 101183573Srnoland dev->driver->minor = DRIVER_MINOR; 102183573Srnoland dev->driver->patchlevel = DRIVER_PATCHLEVEL; 103145132Sanholt} 104145132Sanholt 105145132Sanholtstatic int 106189563Srnolandi915_probe(device_t kdev) 107145132Sanholt{ 108189563Srnoland return drm_probe(kdev, i915_pciidlist); 109145132Sanholt} 110145132Sanholt 111145132Sanholtstatic int 112189563Srnolandi915_attach(device_t kdev) 113145132Sanholt{ 114189563Srnoland struct drm_device *dev = device_get_softc(kdev); 115145132Sanholt 116183833Srnoland dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER, 117183604Srnoland M_WAITOK | M_ZERO); 118183604Srnoland 119145132Sanholt i915_configure(dev); 120183573Srnoland 121189563Srnoland return drm_attach(kdev, i915_pciidlist); 122145132Sanholt} 123145132Sanholt 124183573Srnolandstatic int 125189563Srnolandi915_detach(device_t kdev) 126183573Srnoland{ 127189563Srnoland struct drm_device *dev = device_get_softc(kdev); 128183573Srnoland int ret; 129183573Srnoland 130189563Srnoland ret = drm_detach(kdev); 131183573Srnoland 132183833Srnoland free(dev->driver, DRM_MEM_DRIVER); 133183573Srnoland 134183573Srnoland return ret; 135183573Srnoland} 136183573Srnoland 137145132Sanholtstatic device_method_t i915_methods[] = { 138145132Sanholt /* Device interface */ 139145132Sanholt DEVMETHOD(device_probe, i915_probe), 140145132Sanholt DEVMETHOD(device_attach, i915_attach), 141182080Srnoland DEVMETHOD(device_suspend, i915_suspend), 142182080Srnoland DEVMETHOD(device_resume, i915_resume), 143183573Srnoland DEVMETHOD(device_detach, i915_detach), 144145132Sanholt 145145132Sanholt { 0, 0 } 146145132Sanholt}; 147145132Sanholt 148145132Sanholtstatic driver_t i915_driver = { 149153579Sjhb#if __FreeBSD_version >= 700010 150153579Sjhb "drm", 151153579Sjhb#else 152145132Sanholt "drmsub", 153153579Sjhb#endif 154145132Sanholt i915_methods, 155182080Srnoland sizeof(struct drm_device) 156145132Sanholt}; 157145132Sanholt 158145132Sanholtextern devclass_t drm_devclass; 159153579Sjhb#if __FreeBSD_version >= 700010 160153579SjhbDRIVER_MODULE(i915, vgapci, i915_driver, drm_devclass, 0, 0); 161153579Sjhb#else 162153033SanholtDRIVER_MODULE(i915, agp, i915_driver, drm_devclass, 0, 0); 163153579Sjhb#endif 164145132SanholtMODULE_DEPEND(i915, drm, 1, 1, 1); 165