linux/drivers/gpu/drm/radeon/radeon_drv.c
<<
>>
Prefs
   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#include <linux/console.h>
  39
  40
  41/*
  42 * KMS wrapper.
  43 */
  44#define KMS_DRIVER_MAJOR        2
  45#define KMS_DRIVER_MINOR        0
  46#define KMS_DRIVER_PATCHLEVEL   0
  47int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
  48int radeon_driver_unload_kms(struct drm_device *dev);
  49int radeon_driver_firstopen_kms(struct drm_device *dev);
  50void radeon_driver_lastclose_kms(struct drm_device *dev);
  51int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv);
  52void radeon_driver_postclose_kms(struct drm_device *dev,
  53                                 struct drm_file *file_priv);
  54void radeon_driver_preclose_kms(struct drm_device *dev,
  55                                struct drm_file *file_priv);
  56int radeon_suspend_kms(struct drm_device *dev, pm_message_t state);
  57int radeon_resume_kms(struct drm_device *dev);
  58u32 radeon_get_vblank_counter_kms(struct drm_device *dev, int crtc);
  59int radeon_enable_vblank_kms(struct drm_device *dev, int crtc);
  60void radeon_disable_vblank_kms(struct drm_device *dev, int crtc);
  61void radeon_driver_irq_preinstall_kms(struct drm_device *dev);
  62int radeon_driver_irq_postinstall_kms(struct drm_device *dev);
  63void radeon_driver_irq_uninstall_kms(struct drm_device *dev);
  64irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS);
  65int radeon_dma_ioctl_kms(struct drm_device *dev, void *data,
  66                         struct drm_file *file_priv);
  67int radeon_gem_object_init(struct drm_gem_object *obj);
  68void radeon_gem_object_free(struct drm_gem_object *obj);
  69extern struct drm_ioctl_desc radeon_ioctls_kms[];
  70extern int radeon_max_kms_ioctl;
  71int radeon_mmap(struct file *filp, struct vm_area_struct *vma);
  72#if defined(CONFIG_DEBUG_FS)
  73int radeon_debugfs_init(struct drm_minor *minor);
  74void radeon_debugfs_cleanup(struct drm_minor *minor);
  75#endif
  76
  77
  78int radeon_no_wb;
  79int radeon_modeset = -1;
  80int radeon_dynclks = -1;
  81int radeon_r4xx_atom = 0;
  82int radeon_agpmode = 0;
  83int radeon_vram_limit = 0;
  84int radeon_gart_size = 512; /* default gart size */
  85int radeon_benchmarking = 0;
  86int radeon_testing = 0;
  87int radeon_connector_table = 0;
  88int radeon_tv = 1;
  89
  90MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
  91module_param_named(no_wb, radeon_no_wb, int, 0444);
  92
  93MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");
  94module_param_named(modeset, radeon_modeset, int, 0400);
  95
  96MODULE_PARM_DESC(dynclks, "Disable/Enable dynamic clocks");
  97module_param_named(dynclks, radeon_dynclks, int, 0444);
  98
  99MODULE_PARM_DESC(r4xx_atom, "Enable ATOMBIOS modesetting for R4xx");
 100module_param_named(r4xx_atom, radeon_r4xx_atom, int, 0444);
 101
 102MODULE_PARM_DESC(vramlimit, "Restrict VRAM for testing");
 103module_param_named(vramlimit, radeon_vram_limit, int, 0600);
 104
 105MODULE_PARM_DESC(agpmode, "AGP Mode (-1 == PCI)");
 106module_param_named(agpmode, radeon_agpmode, int, 0444);
 107
 108MODULE_PARM_DESC(gartsize, "Size of PCIE/IGP gart to setup in megabytes (32,64, etc)\n");
 109module_param_named(gartsize, radeon_gart_size, int, 0600);
 110
 111MODULE_PARM_DESC(benchmark, "Run benchmark");
 112module_param_named(benchmark, radeon_benchmarking, int, 0444);
 113
 114MODULE_PARM_DESC(test, "Run tests");
 115module_param_named(test, radeon_testing, int, 0444);
 116
 117MODULE_PARM_DESC(connector_table, "Force connector table");
 118module_param_named(connector_table, radeon_connector_table, int, 0444);
 119
 120MODULE_PARM_DESC(tv, "TV enable (0 = disable)");
 121module_param_named(tv, radeon_tv, int, 0444);
 122
 123static int radeon_suspend(struct drm_device *dev, pm_message_t state)
 124{
 125        drm_radeon_private_t *dev_priv = dev->dev_private;
 126
 127        if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
 128                return 0;
 129
 130        /* Disable *all* interrupts */
 131        if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600)
 132                RADEON_WRITE(R500_DxMODE_INT_MASK, 0);
 133        RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
 134        return 0;
 135}
 136
 137static int radeon_resume(struct drm_device *dev)
 138{
 139        drm_radeon_private_t *dev_priv = dev->dev_private;
 140
 141        if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
 142                return 0;
 143
 144        /* Restore interrupt registers */
 145        if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600)
 146                RADEON_WRITE(R500_DxMODE_INT_MASK, dev_priv->r500_disp_irq_reg);
 147        RADEON_WRITE(RADEON_GEN_INT_CNTL, dev_priv->irq_enable_reg);
 148        return 0;
 149}
 150
 151static struct pci_device_id pciidlist[] = {
 152        radeon_PCI_IDS
 153};
 154
 155#if defined(CONFIG_DRM_RADEON_KMS)
 156MODULE_DEVICE_TABLE(pci, pciidlist);
 157#endif
 158
 159static struct drm_driver driver_old = {
 160        .driver_features =
 161            DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG |
 162            DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED,
 163        .dev_priv_size = sizeof(drm_radeon_buf_priv_t),
 164        .load = radeon_driver_load,
 165        .firstopen = radeon_driver_firstopen,
 166        .open = radeon_driver_open,
 167        .preclose = radeon_driver_preclose,
 168        .postclose = radeon_driver_postclose,
 169        .lastclose = radeon_driver_lastclose,
 170        .unload = radeon_driver_unload,
 171        .suspend = radeon_suspend,
 172        .resume = radeon_resume,
 173        .get_vblank_counter = radeon_get_vblank_counter,
 174        .enable_vblank = radeon_enable_vblank,
 175        .disable_vblank = radeon_disable_vblank,
 176        .master_create = radeon_master_create,
 177        .master_destroy = radeon_master_destroy,
 178        .irq_preinstall = radeon_driver_irq_preinstall,
 179        .irq_postinstall = radeon_driver_irq_postinstall,
 180        .irq_uninstall = radeon_driver_irq_uninstall,
 181        .irq_handler = radeon_driver_irq_handler,
 182        .reclaim_buffers = drm_core_reclaim_buffers,
 183        .get_map_ofs = drm_core_get_map_ofs,
 184        .get_reg_ofs = drm_core_get_reg_ofs,
 185        .ioctls = radeon_ioctls,
 186        .dma_ioctl = radeon_cp_buffers,
 187        .fops = {
 188                 .owner = THIS_MODULE,
 189                 .open = drm_open,
 190                 .release = drm_release,
 191                 .ioctl = drm_ioctl,
 192                 .mmap = drm_mmap,
 193                 .poll = drm_poll,
 194                 .fasync = drm_fasync,
 195#ifdef CONFIG_COMPAT
 196                 .compat_ioctl = radeon_compat_ioctl,
 197#endif
 198        },
 199
 200        .pci_driver = {
 201                 .name = DRIVER_NAME,
 202                 .id_table = pciidlist,
 203        },
 204
 205        .name = DRIVER_NAME,
 206        .desc = DRIVER_DESC,
 207        .date = DRIVER_DATE,
 208        .major = DRIVER_MAJOR,
 209        .minor = DRIVER_MINOR,
 210        .patchlevel = DRIVER_PATCHLEVEL,
 211};
 212
 213static struct drm_driver kms_driver;
 214
 215static int __devinit
 216radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 217{
 218        return drm_get_dev(pdev, ent, &kms_driver);
 219}
 220
 221static void
 222radeon_pci_remove(struct pci_dev *pdev)
 223{
 224        struct drm_device *dev = pci_get_drvdata(pdev);
 225
 226        drm_put_dev(dev);
 227}
 228
 229static int
 230radeon_pci_suspend(struct pci_dev *pdev, pm_message_t state)
 231{
 232        struct drm_device *dev = pci_get_drvdata(pdev);
 233        return radeon_suspend_kms(dev, state);
 234}
 235
 236static int
 237radeon_pci_resume(struct pci_dev *pdev)
 238{
 239        struct drm_device *dev = pci_get_drvdata(pdev);
 240        return radeon_resume_kms(dev);
 241}
 242
 243static struct drm_driver kms_driver = {
 244        .driver_features =
 245            DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_SG |
 246            DRIVER_HAVE_IRQ | DRIVER_HAVE_DMA | DRIVER_IRQ_SHARED | DRIVER_GEM,
 247        .dev_priv_size = 0,
 248        .load = radeon_driver_load_kms,
 249        .firstopen = radeon_driver_firstopen_kms,
 250        .open = radeon_driver_open_kms,
 251        .preclose = radeon_driver_preclose_kms,
 252        .postclose = radeon_driver_postclose_kms,
 253        .lastclose = radeon_driver_lastclose_kms,
 254        .unload = radeon_driver_unload_kms,
 255        .suspend = radeon_suspend_kms,
 256        .resume = radeon_resume_kms,
 257        .get_vblank_counter = radeon_get_vblank_counter_kms,
 258        .enable_vblank = radeon_enable_vblank_kms,
 259        .disable_vblank = radeon_disable_vblank_kms,
 260#if defined(CONFIG_DEBUG_FS)
 261        .debugfs_init = radeon_debugfs_init,
 262        .debugfs_cleanup = radeon_debugfs_cleanup,
 263#endif
 264        .irq_preinstall = radeon_driver_irq_preinstall_kms,
 265        .irq_postinstall = radeon_driver_irq_postinstall_kms,
 266        .irq_uninstall = radeon_driver_irq_uninstall_kms,
 267        .irq_handler = radeon_driver_irq_handler_kms,
 268        .reclaim_buffers = drm_core_reclaim_buffers,
 269        .get_map_ofs = drm_core_get_map_ofs,
 270        .get_reg_ofs = drm_core_get_reg_ofs,
 271        .ioctls = radeon_ioctls_kms,
 272        .gem_init_object = radeon_gem_object_init,
 273        .gem_free_object = radeon_gem_object_free,
 274        .dma_ioctl = radeon_dma_ioctl_kms,
 275        .fops = {
 276                 .owner = THIS_MODULE,
 277                 .open = drm_open,
 278                 .release = drm_release,
 279                 .ioctl = drm_ioctl,
 280                 .mmap = radeon_mmap,
 281                 .poll = drm_poll,
 282                 .fasync = drm_fasync,
 283#ifdef CONFIG_COMPAT
 284                 .compat_ioctl = radeon_kms_compat_ioctl,
 285#endif
 286        },
 287
 288        .pci_driver = {
 289                 .name = DRIVER_NAME,
 290                 .id_table = pciidlist,
 291                 .probe = radeon_pci_probe,
 292                 .remove = radeon_pci_remove,
 293                 .suspend = radeon_pci_suspend,
 294                 .resume = radeon_pci_resume,
 295        },
 296
 297        .name = DRIVER_NAME,
 298        .desc = DRIVER_DESC,
 299        .date = DRIVER_DATE,
 300        .major = KMS_DRIVER_MAJOR,
 301        .minor = KMS_DRIVER_MINOR,
 302        .patchlevel = KMS_DRIVER_PATCHLEVEL,
 303};
 304
 305static struct drm_driver *driver;
 306
 307static int __init radeon_init(void)
 308{
 309        driver = &driver_old;
 310        driver->num_ioctls = radeon_max_ioctl;
 311#ifdef CONFIG_VGA_CONSOLE
 312        if (vgacon_text_force() && radeon_modeset == -1) {
 313                DRM_INFO("VGACON disable radeon kernel modesetting.\n");
 314                driver = &driver_old;
 315                driver->driver_features &= ~DRIVER_MODESET;
 316                radeon_modeset = 0;
 317        }
 318#endif
 319        /* if enabled by default */
 320        if (radeon_modeset == -1) {
 321#ifdef CONFIG_DRM_RADEON_KMS
 322                DRM_INFO("radeon defaulting to kernel modesetting.\n");
 323                radeon_modeset = 1;
 324#else
 325                DRM_INFO("radeon defaulting to userspace modesetting.\n");
 326                radeon_modeset = 0;
 327#endif
 328        }
 329        if (radeon_modeset == 1) {
 330                DRM_INFO("radeon kernel modesetting enabled.\n");
 331                driver = &kms_driver;
 332                driver->driver_features |= DRIVER_MODESET;
 333                driver->num_ioctls = radeon_max_kms_ioctl;
 334        }
 335        /* if the vga console setting is enabled still
 336         * let modprobe override it */
 337        return drm_init(driver);
 338}
 339
 340static void __exit radeon_exit(void)
 341{
 342        drm_exit(driver);
 343}
 344
 345module_init(radeon_init);
 346module_exit(radeon_exit);
 347
 348MODULE_AUTHOR(DRIVER_AUTHOR);
 349MODULE_DESCRIPTION(DRIVER_DESC);
 350MODULE_LICENSE("GPL and additional rights");
 351