linux/drivers/gpu/drm/sis/sis_drv.c
<<
>>
Prefs
   1/* sis.c -- sis driver -*- linux-c -*-
   2 *
   3 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
   4 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
   5 * All Rights Reserved.
   6 *
   7 * Permission is hereby granted, free of charge, to any person obtaining a
   8 * copy of this software and associated documentation files (the "Software"),
   9 * to deal in the Software without restriction, including without limitation
  10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11 * and/or sell copies of the Software, and to permit persons to whom the
  12 * Software is furnished to do so, subject to the following conditions:
  13 *
  14 * The above copyright notice and this permission notice (including the next
  15 * paragraph) shall be included in all copies or substantial portions of the
  16 * Software.
  17 *
  18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  21 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  24 * DEALINGS IN THE SOFTWARE.
  25 *
  26 */
  27
  28#include <linux/module.h>
  29#include <linux/pci.h>
  30
  31#include <drm/drm_drv.h>
  32#include <drm/drm_file.h>
  33#include <drm/drm_pciids.h>
  34#include <drm/sis_drm.h>
  35
  36#include "sis_drv.h"
  37
  38static struct pci_device_id pciidlist[] = {
  39        sisdrv_PCI_IDS
  40};
  41
  42static int sis_driver_load(struct drm_device *dev, unsigned long chipset)
  43{
  44        struct pci_dev *pdev = to_pci_dev(dev->dev);
  45        drm_sis_private_t *dev_priv;
  46
  47        pci_set_master(pdev);
  48
  49        dev_priv = kzalloc(sizeof(drm_sis_private_t), GFP_KERNEL);
  50        if (dev_priv == NULL)
  51                return -ENOMEM;
  52
  53        idr_init(&dev_priv->object_idr);
  54        dev->dev_private = (void *)dev_priv;
  55        dev_priv->chipset = chipset;
  56
  57        return 0;
  58}
  59
  60static void sis_driver_unload(struct drm_device *dev)
  61{
  62        drm_sis_private_t *dev_priv = dev->dev_private;
  63
  64        idr_destroy(&dev_priv->object_idr);
  65
  66        kfree(dev_priv);
  67}
  68
  69static const struct file_operations sis_driver_fops = {
  70        .owner = THIS_MODULE,
  71        .open = drm_open,
  72        .release = drm_release,
  73        .unlocked_ioctl = drm_ioctl,
  74        .mmap = drm_legacy_mmap,
  75        .poll = drm_poll,
  76        .compat_ioctl = drm_compat_ioctl,
  77        .llseek = noop_llseek,
  78};
  79
  80static int sis_driver_open(struct drm_device *dev, struct drm_file *file)
  81{
  82        struct sis_file_private *file_priv;
  83
  84        DRM_DEBUG_DRIVER("\n");
  85        file_priv = kmalloc(sizeof(*file_priv), GFP_KERNEL);
  86        if (!file_priv)
  87                return -ENOMEM;
  88
  89        file->driver_priv = file_priv;
  90
  91        INIT_LIST_HEAD(&file_priv->obj_list);
  92
  93        return 0;
  94}
  95
  96static void sis_driver_postclose(struct drm_device *dev, struct drm_file *file)
  97{
  98        struct sis_file_private *file_priv = file->driver_priv;
  99
 100        kfree(file_priv);
 101}
 102
 103static struct drm_driver driver = {
 104        .driver_features = DRIVER_USE_AGP | DRIVER_LEGACY,
 105        .load = sis_driver_load,
 106        .unload = sis_driver_unload,
 107        .open = sis_driver_open,
 108        .preclose = sis_reclaim_buffers_locked,
 109        .postclose = sis_driver_postclose,
 110        .dma_quiescent = sis_idle,
 111        .lastclose = sis_lastclose,
 112        .ioctls = sis_ioctls,
 113        .fops = &sis_driver_fops,
 114        .name = DRIVER_NAME,
 115        .desc = DRIVER_DESC,
 116        .date = DRIVER_DATE,
 117        .major = DRIVER_MAJOR,
 118        .minor = DRIVER_MINOR,
 119        .patchlevel = DRIVER_PATCHLEVEL,
 120};
 121
 122static struct pci_driver sis_pci_driver = {
 123        .name = DRIVER_NAME,
 124        .id_table = pciidlist,
 125};
 126
 127static int __init sis_init(void)
 128{
 129        driver.num_ioctls = sis_max_ioctl;
 130        return drm_legacy_pci_init(&driver, &sis_pci_driver);
 131}
 132
 133static void __exit sis_exit(void)
 134{
 135        drm_legacy_pci_exit(&driver, &sis_pci_driver);
 136}
 137
 138module_init(sis_init);
 139module_exit(sis_exit);
 140
 141MODULE_AUTHOR(DRIVER_AUTHOR);
 142MODULE_DESCRIPTION(DRIVER_DESC);
 143MODULE_LICENSE("GPL and additional rights");
 144