1 /** 2 * \file radeon_drv.c 3 * ATI Radeon driver 4 * 5 * \author Gareth Hughes <gareth@valinux.com> 6 */ 7 8 /* 9 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 10 * All Rights Reserved. 11 * 12 * Permission is hereby granted, free of charge, to any person obtaining a 13 * copy of this software and associated documentation files (the "Software"), 14 * to deal in the Software without restriction, including without limitation 15 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 16 * and/or sell copies of the Software, and to permit persons to whom the 17 * Software is furnished to do so, subject to the following conditions: 18 * 19 * The above copyright notice and this permission notice (including the next 20 * paragraph) shall be included in all copies or substantial portions of the 21 * Software. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 26 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 27 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 28 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 29 * OTHER DEALINGS IN THE SOFTWARE. 30 */ 31 32 #include "drmP.h" 33 #include "drm.h" 34 #include "radeon_drm.h" 35 #include "radeon_drv.h" 36 37 #include "drm_pciids.h" 38 39 int radeon_no_wb; 40 41 MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers"); 42 module_param_named(no_wb, radeon_no_wb, int, 0444); 43 44 static int radeon_suspend(struct drm_device *dev, pm_message_t state) 45 { 46 drm_radeon_private_t *dev_priv = dev->dev_private; 47 48 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) 49 return 0; 50 51 /* Disable *all* interrupts */ 52 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) 53 RADEON_WRITE(R500_DxMODE_INT_MASK, 0); 54 RADEON_WRITE(RADEON_GEN_INT_CNTL, 0); 55 return 0; 56 } 57 58 static int radeon_resume(struct drm_device *dev) 59 { 60 drm_radeon_private_t *dev_priv = dev->dev_private; 61 62 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) 63 return 0; 64 65 /* Restore interrupt registers */ 66 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) 67 RADEON_WRITE(R500_DxMODE_INT_MASK, dev_priv->r500_disp_irq_reg); 68 RADEON_WRITE(RADEON_GEN_INT_CNTL, dev_priv->irq_enable_reg); 69 return 0; 70 } 71 72 static struct pci_device_id pciidlist[] = { 73 radeon_PCI_IDS 74 }; 75 76 static struct drm_driver driver = { 77 .driver_features = 78 DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG | 79 DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED, 80 .dev_priv_size = sizeof(drm_radeon_buf_priv_t), 81 .load = radeon_driver_load, 82 .firstopen = radeon_driver_firstopen, 83 .open = radeon_driver_open, 84 .preclose = radeon_driver_preclose, 85 .postclose = radeon_driver_postclose, 86 .lastclose = radeon_driver_lastclose, 87 .unload = radeon_driver_unload, 88 .suspend = radeon_suspend, 89 .resume = radeon_resume, 90 .get_vblank_counter = radeon_get_vblank_counter, 91 .enable_vblank = radeon_enable_vblank, 92 .disable_vblank = radeon_disable_vblank, 93 .master_create = radeon_master_create, 94 .master_destroy = radeon_master_destroy, 95 .irq_preinstall = radeon_driver_irq_preinstall, 96 .irq_postinstall = radeon_driver_irq_postinstall, 97 .irq_uninstall = radeon_driver_irq_uninstall, 98 .irq_handler = radeon_driver_irq_handler, 99 .reclaim_buffers = drm_core_reclaim_buffers, 100 .get_map_ofs = drm_core_get_map_ofs, 101 .get_reg_ofs = drm_core_get_reg_ofs, 102 .ioctls = radeon_ioctls, 103 .dma_ioctl = radeon_cp_buffers, 104 .fops = { 105 .owner = THIS_MODULE, 106 .open = drm_open, 107 .release = drm_release, 108 .ioctl = drm_ioctl, 109 .mmap = drm_mmap, 110 .poll = drm_poll, 111 .fasync = drm_fasync, 112 #ifdef CONFIG_COMPAT 113 .compat_ioctl = radeon_compat_ioctl, 114 #endif 115 }, 116 117 .pci_driver = { 118 .name = DRIVER_NAME, 119 .id_table = pciidlist, 120 }, 121 122 .name = DRIVER_NAME, 123 .desc = DRIVER_DESC, 124 .date = DRIVER_DATE, 125 .major = DRIVER_MAJOR, 126 .minor = DRIVER_MINOR, 127 .patchlevel = DRIVER_PATCHLEVEL, 128 }; 129 130 static int __init radeon_init(void) 131 { 132 driver.num_ioctls = radeon_max_ioctl; 133 return drm_init(&driver); 134 } 135 136 static void __exit radeon_exit(void) 137 { 138 drm_exit(&driver); 139 } 140 141 module_init(radeon_init); 142 module_exit(radeon_exit); 143 144 MODULE_AUTHOR(DRIVER_AUTHOR); 145 MODULE_DESCRIPTION(DRIVER_DESC); 146 MODULE_LICENSE("GPL and additional rights"); 147