1193323Sed/* $NetBSD: sis_drv.c,v 1.4 2021/12/18 23:45:44 riastradh Exp $ */ 2193323Sed 3193323Sed/* sis.c -- sis driver -*- linux-c -*- 4193323Sed * 5193323Sed * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 6193323Sed * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 7193323Sed * All Rights Reserved. 8193323Sed * 9193323Sed * Permission is hereby granted, free of charge, to any person obtaining a 10193323Sed * copy of this software and associated documentation files (the "Software"), 11193323Sed * to deal in the Software without restriction, including without limitation 12193323Sed * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13193323Sed * and/or sell copies of the Software, and to permit persons to whom the 14193323Sed * Software is furnished to do so, subject to the following conditions: 15193323Sed * 16193323Sed * The above copyright notice and this permission notice (including the next 17218893Sdim * paragraph) shall be included in all copies or substantial portions of the 18193323Sed * Software. 19193323Sed * 20193323Sed * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21193323Sed * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22193323Sed * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23193323Sed * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 24193323Sed * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 25193323Sed * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26195340Sed * DEALINGS IN THE SOFTWARE. 27193323Sed * 28193323Sed */ 29193323Sed 30193323Sed#include <sys/cdefs.h> 31193323Sed__KERNEL_RCSID(0, "$NetBSD: sis_drv.c,v 1.4 2021/12/18 23:45:44 riastradh Exp $"); 32193323Sed 33193323Sed#include <linux/module.h> 34208599Srdivacky#include <linux/pci.h> 35208599Srdivacky 36193323Sed#include <drm/drm_drv.h> 37193323Sed#include <drm/drm_file.h> 38193323Sed#include <drm/drm_pciids.h> 39193323Sed#include <drm/sis_drm.h> 40193323Sed 41193323Sed#include "sis_drv.h" 42193323Sed 43193323Sedstatic struct pci_device_id pciidlist[] = { 44193323Sed sisdrv_PCI_IDS 45193323Sed}; 46193323Sed 47193323Sedstatic int sis_driver_load(struct drm_device *dev, unsigned long chipset) 48193323Sed{ 49193323Sed drm_sis_private_t *dev_priv; 50193323Sed 51193323Sed pci_set_master(dev->pdev); 52193323Sed 53193323Sed dev_priv = kzalloc(sizeof(drm_sis_private_t), GFP_KERNEL); 54193323Sed if (dev_priv == NULL) 55193323Sed return -ENOMEM; 56193323Sed 57193323Sed idr_init(&dev_priv->object_idr); 58193323Sed dev->dev_private = (void *)dev_priv; 59193323Sed dev_priv->chipset = chipset; 60193323Sed 61193323Sed return 0; 62193323Sed} 63193323Sed 64193323Sedstatic void sis_driver_unload(struct drm_device *dev) 65208599Srdivacky{ 66208599Srdivacky drm_sis_private_t *dev_priv = dev->dev_private; 67193323Sed 68193323Sed idr_destroy(&dev_priv->object_idr); 69208599Srdivacky 70208599Srdivacky kfree(dev_priv); 71218893Sdim} 72218893Sdim 73218893Sdimstatic const struct file_operations sis_driver_fops = { 74218893Sdim .owner = THIS_MODULE, 75218893Sdim .open = drm_open, 76208599Srdivacky .release = drm_release, 77208599Srdivacky .unlocked_ioctl = drm_ioctl, 78208599Srdivacky .mmap = drm_legacy_mmap, 79208599Srdivacky .poll = drm_poll, 80218893Sdim .compat_ioctl = drm_compat_ioctl, 81208599Srdivacky .llseek = noop_llseek, 82218893Sdim}; 83218893Sdim 84208599Srdivackystatic int sis_driver_open(struct drm_device *dev, struct drm_file *file) 85208599Srdivacky{ 86208599Srdivacky struct sis_file_private *file_priv; 87193323Sed 88195340Sed DRM_DEBUG_DRIVER("\n"); 89193323Sed file_priv = kmalloc(sizeof(*file_priv), GFP_KERNEL); 90193323Sed if (!file_priv) 91193323Sed return -ENOMEM; 92193323Sed 93193323Sed file->driver_priv = file_priv; 94193323Sed 95193323Sed INIT_LIST_HEAD(&file_priv->obj_list); 96193323Sed 97193323Sed return 0; 98193323Sed} 99193323Sed 100193323Sedstatic void sis_driver_postclose(struct drm_device *dev, struct drm_file *file) 101193323Sed{ 102195340Sed struct sis_file_private *file_priv = file->driver_priv; 103218893Sdim 104218893Sdim kfree(file_priv); 105193323Sed} 106218893Sdim 107218893Sdimstatic struct drm_driver driver = { 108193323Sed .driver_features = DRIVER_USE_AGP | DRIVER_LEGACY, 109193323Sed .load = sis_driver_load, 110218893Sdim .unload = sis_driver_unload, 111218893Sdim .open = sis_driver_open, 112218893Sdim .preclose = sis_reclaim_buffers_locked, 113218893Sdim .postclose = sis_driver_postclose, 114218893Sdim .dma_quiescent = sis_idle, 115193323Sed .lastclose = sis_lastclose, 116218893Sdim .ioctls = sis_ioctls, 117218893Sdim .fops = &sis_driver_fops, 118218893Sdim .name = DRIVER_NAME, 119218893Sdim .desc = DRIVER_DESC, 120218893Sdim .date = DRIVER_DATE, 121218893Sdim .major = DRIVER_MAJOR, 122218893Sdim .minor = DRIVER_MINOR, 123218893Sdim .patchlevel = DRIVER_PATCHLEVEL, 124218893Sdim}; 125218893Sdim 126218893Sdimstatic struct pci_driver sis_pci_driver = { 127218893Sdim .name = DRIVER_NAME, 128218893Sdim .id_table = pciidlist, 129218893Sdim}; 130218893Sdim 131218893Sdimstatic int __init sis_init(void) 132218893Sdim{ 133218893Sdim driver.num_ioctls = sis_max_ioctl; 134218893Sdim return drm_legacy_pci_init(&driver, &sis_pci_driver); 135218893Sdim} 136218893Sdim 137218893Sdimstatic void __exit sis_exit(void) 138193323Sed{ 139193323Sed drm_legacy_pci_exit(&driver, &sis_pci_driver); 140218893Sdim} 141218893Sdim 142218893Sdimmodule_init(sis_init); 143193323Sedmodule_exit(sis_exit); 144218893Sdim 145193323SedMODULE_AUTHOR(DRIVER_AUTHOR); 146193323SedMODULE_DESCRIPTION(DRIVER_DESC); 147193323SedMODULE_LICENSE("GPL and additional rights"); 148193323Sed