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$"); 34145132Sanholt 35152909Sanholt#include "dev/drm/drmP.h" 36152909Sanholt#include "dev/drm/drm.h" 37203287Srnoland#include "dev/drm/drm_mm.h" 38152909Sanholt#include "dev/drm/i915_drm.h" 39152909Sanholt#include "dev/drm/i915_drv.h" 40152909Sanholt#include "dev/drm/drm_pciids.h" 41152909Sanholt 42145132Sanholt/* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */ 43145132Sanholtstatic drm_pci_id_list_t i915_pciidlist[] = { 44145132Sanholt i915_PCI_IDS 45145132Sanholt}; 46145132Sanholt 47189563Srnolandstatic int i915_suspend(device_t kdev) 48145132Sanholt{ 49189563Srnoland struct drm_device *dev = device_get_softc(kdev); 50182080Srnoland 51190163Srnoland if (!dev || !dev->dev_private) { 52182080Srnoland DRM_ERROR("DRM not initialized, aborting suspend.\n"); 53182080Srnoland return -ENODEV; 54182080Srnoland } 55182080Srnoland 56194741Srnoland DRM_LOCK(); 57194741Srnoland DRM_DEBUG("starting suspend\n"); 58182080Srnoland i915_save_state(dev); 59194741Srnoland DRM_UNLOCK(); 60182080Srnoland 61189563Srnoland return (bus_generic_suspend(kdev)); 62182080Srnoland} 63182080Srnoland 64189563Srnolandstatic int i915_resume(device_t kdev) 65182080Srnoland{ 66189563Srnoland struct drm_device *dev = device_get_softc(kdev); 67182080Srnoland 68194741Srnoland DRM_LOCK(); 69182080Srnoland i915_restore_state(dev); 70194741Srnoland DRM_DEBUG("finished resume\n"); 71194741Srnoland DRM_UNLOCK(); 72182080Srnoland 73189563Srnoland return (bus_generic_resume(kdev)); 74182080Srnoland} 75182080Srnoland 76182080Srnolandstatic void i915_configure(struct drm_device *dev) 77182080Srnoland{ 78183573Srnoland dev->driver->driver_features = 79183573Srnoland DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | DRIVER_USE_MTRR | 80183573Srnoland DRIVER_HAVE_IRQ; 81145132Sanholt 82183573Srnoland dev->driver->buf_priv_size = sizeof(drm_i915_private_t); 83183573Srnoland dev->driver->load = i915_driver_load; 84183573Srnoland dev->driver->unload = i915_driver_unload; 85183573Srnoland dev->driver->preclose = i915_driver_preclose; 86183573Srnoland dev->driver->lastclose = i915_driver_lastclose; 87183573Srnoland dev->driver->device_is_agp = i915_driver_device_is_agp; 88183573Srnoland dev->driver->enable_vblank = i915_enable_vblank; 89183573Srnoland dev->driver->disable_vblank = i915_disable_vblank; 90183573Srnoland dev->driver->irq_preinstall = i915_driver_irq_preinstall; 91183573Srnoland dev->driver->irq_postinstall = i915_driver_irq_postinstall; 92183573Srnoland dev->driver->irq_uninstall = i915_driver_irq_uninstall; 93183573Srnoland dev->driver->irq_handler = i915_driver_irq_handler; 94145132Sanholt 95183573Srnoland dev->driver->ioctls = i915_ioctls; 96183573Srnoland dev->driver->max_ioctl = i915_max_ioctl; 97145132Sanholt 98183573Srnoland dev->driver->name = DRIVER_NAME; 99183573Srnoland dev->driver->desc = DRIVER_DESC; 100183573Srnoland dev->driver->date = DRIVER_DATE; 101183573Srnoland dev->driver->major = DRIVER_MAJOR; 102183573Srnoland dev->driver->minor = DRIVER_MINOR; 103183573Srnoland dev->driver->patchlevel = DRIVER_PATCHLEVEL; 104145132Sanholt} 105145132Sanholt 106145132Sanholtstatic int 107189563Srnolandi915_probe(device_t kdev) 108145132Sanholt{ 109189563Srnoland return drm_probe(kdev, i915_pciidlist); 110145132Sanholt} 111145132Sanholt 112145132Sanholtstatic int 113189563Srnolandi915_attach(device_t kdev) 114145132Sanholt{ 115189563Srnoland struct drm_device *dev = device_get_softc(kdev); 116145132Sanholt 117183833Srnoland dev->driver = malloc(sizeof(struct drm_driver_info), DRM_MEM_DRIVER, 118183604Srnoland M_WAITOK | M_ZERO); 119183604Srnoland 120145132Sanholt i915_configure(dev); 121183573Srnoland 122189563Srnoland return drm_attach(kdev, i915_pciidlist); 123145132Sanholt} 124145132Sanholt 125183573Srnolandstatic int 126189563Srnolandi915_detach(device_t kdev) 127183573Srnoland{ 128189563Srnoland struct drm_device *dev = device_get_softc(kdev); 129183573Srnoland int ret; 130183573Srnoland 131189563Srnoland ret = drm_detach(kdev); 132183573Srnoland 133183833Srnoland free(dev->driver, DRM_MEM_DRIVER); 134183573Srnoland 135183573Srnoland return ret; 136183573Srnoland} 137183573Srnoland 138145132Sanholtstatic device_method_t i915_methods[] = { 139145132Sanholt /* Device interface */ 140145132Sanholt DEVMETHOD(device_probe, i915_probe), 141145132Sanholt DEVMETHOD(device_attach, i915_attach), 142182080Srnoland DEVMETHOD(device_suspend, i915_suspend), 143182080Srnoland DEVMETHOD(device_resume, i915_resume), 144183573Srnoland DEVMETHOD(device_detach, i915_detach), 145145132Sanholt 146145132Sanholt { 0, 0 } 147145132Sanholt}; 148145132Sanholt 149145132Sanholtstatic driver_t i915_driver = { 150153579Sjhb "drm", 151145132Sanholt i915_methods, 152182080Srnoland sizeof(struct drm_device) 153145132Sanholt}; 154145132Sanholt 155145132Sanholtextern devclass_t drm_devclass; 156153579SjhbDRIVER_MODULE(i915, vgapci, i915_driver, drm_devclass, 0, 0); 157145132SanholtMODULE_DEPEND(i915, drm, 1, 1, 1); 158