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
  30#include <drm/drmP.h>
  31#include <drm/sis_drm.h>
  32#include "sis_drv.h"
  33
  34#include <drm/drm_pciids.h>
  35
  36static struct pci_device_id pciidlist[] = {
  37        sisdrv_PCI_IDS
  38};
  39
  40static int sis_driver_load(struct drm_device *dev, unsigned long chipset)
  41{
  42        drm_sis_private_t *dev_priv;
  43
  44        pci_set_master(dev->pdev);
  45
  46        dev_priv = kzalloc(sizeof(drm_sis_private_t), GFP_KERNEL);
  47        if (dev_priv == NULL)
  48                return -ENOMEM;
  49
  50        idr_init(&dev_priv->object_idr);
  51        dev->dev_private = (void *)dev_priv;
  52        dev_priv->chipset = chipset;
  53
  54        return 0;
  55}
  56
  57static int sis_driver_unload(struct drm_device *dev)
  58{
  59        drm_sis_private_t *dev_priv = dev->dev_private;
  60
  61        idr_destroy(&dev_priv->object_idr);
  62
  63        kfree(dev_priv);
  64
  65        return 0;
  66}
  67
  68static const struct file_operations sis_driver_fops = {
  69        .owner = THIS_MODULE,
  70        .open = drm_open,
  71        .release = drm_release,
  72        .unlocked_ioctl = drm_ioctl,
  73        .mmap = drm_legacy_mmap,
  74        .poll = drm_poll,
  75#ifdef CONFIG_COMPAT
  76        .compat_ioctl = drm_compat_ioctl,
  77#endif
  78        .llseek = noop_llseek,
  79};
  80
  81static int sis_driver_open(struct drm_device *dev, struct drm_file *file)
  82{
  83        struct sis_file_private *file_priv;
  84
  85        DRM_DEBUG_DRIVER("\n");
  86        file_priv = kmalloc(sizeof(*file_priv), GFP_KERNEL);
  87        if (!file_priv)
  88                return -ENOMEM;
  89
  90        file->driver_priv = file_priv;
  91
  92        INIT_LIST_HEAD(&file_priv->obj_list);
  93
  94        return 0;
  95}
  96
  97static void sis_driver_postclose(struct drm_device *dev, struct drm_file *file)
  98{
  99        struct sis_file_private *file_priv = file->driver_priv;
 100
 101        kfree(file_priv);
 102}
 103
 104static struct drm_driver driver = {
 105        .driver_features = DRIVER_USE_AGP,
 106        .load = sis_driver_load,
 107        .unload = sis_driver_unload,
 108        .open = sis_driver_open,
 109        .preclose = sis_reclaim_buffers_locked,
 110        .postclose = sis_driver_postclose,
 111        .set_busid = drm_pci_set_busid,
 112        .dma_quiescent = sis_idle,
 113        .lastclose = sis_lastclose,
 114        .ioctls = sis_ioctls,
 115        .fops = &sis_driver_fops,
 116        .name = DRIVER_NAME,
 117        .desc = DRIVER_DESC,
 118        .date = DRIVER_DATE,
 119        .major = DRIVER_MAJOR,
 120        .minor = DRIVER_MINOR,
 121        .patchlevel = DRIVER_PATCHLEVEL,
 122};
 123
 124static struct pci_driver sis_pci_driver = {
 125        .name = DRIVER_NAME,
 126        .id_table = pciidlist,
 127};
 128
 129static int __init sis_init(void)
 130{
 131        driver.num_ioctls = sis_max_ioctl;
 132        return drm_pci_init(&driver, &sis_pci_driver);
 133}
 134
 135static void __exit sis_exit(void)
 136{
 137        drm_pci_exit(&driver, &sis_pci_driver);
 138}
 139
 140module_init(sis_init);
 141module_exit(sis_exit);
 142
 143MODULE_AUTHOR(DRIVER_AUTHOR);
 144MODULE_DESCRIPTION(DRIVER_DESC);
 145MODULE_LICENSE("GPL and additional rights");
 146