2005-04-16 15:20:36 -07:00
/* sis.c -- sis driver -*- linux-c -*-
*
* Copyright 1999 Precision Insight , Inc . , Cedar Park , Texas .
* Copyright 2000 VA Linux Systems , Inc . , Sunnyvale , California .
* All Rights Reserved .
*
* Permission is hereby granted , free of charge , to any person obtaining a
* copy of this software and associated documentation files ( the " Software " ) ,
* to deal in the Software without restriction , including without limitation
* the rights to use , copy , modify , merge , publish , distribute , sublicense ,
* and / or sell copies of the Software , and to permit persons to whom the
* Software is furnished to do so , subject to the following conditions :
2005-09-25 14:28:13 +10:00
*
2005-04-16 15:20:36 -07:00
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
2005-09-25 14:28:13 +10:00
*
2005-04-16 15:20:36 -07:00
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL
* PRECISION INSIGHT AND / OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM , DAMAGES OR
* OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
* ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE .
*
*/
2011-08-30 11:04:30 -04:00
# include <linux/module.h>
2005-04-16 15:20:36 -07:00
# include "drmP.h"
# include "sis_drm.h"
# include "sis_drv.h"
# include "drm_pciids.h"
2005-09-25 14:28:13 +10:00
2005-04-16 15:20:36 -07:00
static struct pci_device_id pciidlist [ ] = {
sisdrv_PCI_IDS
} ;
2007-07-11 15:53:27 +10:00
static int sis_driver_load ( struct drm_device * dev , unsigned long chipset )
2006-08-07 22:03:22 +10:00
{
drm_sis_private_t * dev_priv ;
2011-12-19 11:15:29 +00:00
pci_set_master ( dev - > pdev ) ;
2009-03-24 12:23:04 -07:00
dev_priv = kzalloc ( sizeof ( drm_sis_private_t ) , GFP_KERNEL ) ;
2006-08-07 22:03:22 +10:00
if ( dev_priv = = NULL )
2007-08-25 19:22:43 +10:00
return - ENOMEM ;
2006-08-07 22:03:22 +10:00
dev - > dev_private = ( void * ) dev_priv ;
dev_priv - > chipset = chipset ;
2011-10-25 18:00:41 +02:00
idr_init ( & dev - > object_name_idr ) ;
2006-08-07 22:03:22 +10:00
2012-01-14 21:20:37 +01:00
return 0 ;
2006-08-07 22:03:22 +10:00
}
2007-07-11 15:53:27 +10:00
static int sis_driver_unload ( struct drm_device * dev )
2006-08-07 22:03:22 +10:00
{
drm_sis_private_t * dev_priv = dev - > dev_private ;
2011-10-25 18:00:41 +02:00
idr_remove_all ( & dev_priv - > object_idr ) ;
idr_destroy ( & dev_priv - > object_idr ) ;
2009-03-24 12:23:04 -07:00
kfree ( dev_priv ) ;
2006-08-07 22:03:22 +10:00
return 0 ;
}
2011-10-31 07:28:57 -07:00
static const struct file_operations sis_driver_fops = {
. owner = THIS_MODULE ,
. open = drm_open ,
. release = drm_release ,
. unlocked_ioctl = drm_ioctl ,
. mmap = drm_mmap ,
. poll = drm_poll ,
. fasync = drm_fasync ,
. llseek = noop_llseek ,
} ;
2011-10-25 16:32:34 +02:00
static int sis_driver_open ( struct drm_device * dev , struct drm_file * file )
{
struct sis_file_private * file_priv ;
DRM_DEBUG_DRIVER ( " \n " ) ;
file_priv = kmalloc ( sizeof ( * file_priv ) , GFP_KERNEL ) ;
if ( ! file_priv )
return - ENOMEM ;
file - > driver_priv = file_priv ;
INIT_LIST_HEAD ( & file_priv - > obj_list ) ;
return 0 ;
}
void sis_driver_postclose ( struct drm_device * dev , struct drm_file * file )
{
struct sis_file_private * file_priv = file - > driver_priv ;
kfree ( file_priv ) ;
}
2005-04-16 15:20:36 -07:00
static struct drm_driver driver = {
. driver_features = DRIVER_USE_AGP | DRIVER_USE_MTRR ,
2006-08-07 22:03:22 +10:00
. load = sis_driver_load ,
. unload = sis_driver_unload ,
2011-10-25 16:32:34 +02:00
. open = sis_driver_open ,
. postclose = sis_driver_postclose ,
2006-08-08 21:34:46 +10:00
. dma_quiescent = sis_idle ,
2006-08-07 22:03:22 +10:00
. reclaim_buffers = NULL ,
2007-03-23 13:28:33 +11:00
. reclaim_buffers_idlelocked = sis_reclaim_buffers_locked ,
2006-08-07 22:03:22 +10:00
. lastclose = sis_lastclose ,
2005-04-16 15:20:36 -07:00
. ioctls = sis_ioctls ,
2011-10-31 07:28:57 -07:00
. fops = & sis_driver_fops ,
2005-11-10 22:16:34 +11:00
. name = DRIVER_NAME ,
. desc = DRIVER_DESC ,
. date = DRIVER_DATE ,
. major = DRIVER_MAJOR ,
. minor = DRIVER_MINOR ,
. patchlevel = DRIVER_PATCHLEVEL ,
2005-04-16 15:20:36 -07:00
} ;
2010-12-15 03:16:38 +10:00
static struct pci_driver sis_pci_driver = {
. name = DRIVER_NAME ,
. id_table = pciidlist ,
} ;
2005-04-16 15:20:36 -07:00
static int __init sis_init ( void )
{
driver . num_ioctls = sis_max_ioctl ;
2010-12-15 03:16:38 +10:00
return drm_pci_init ( & driver , & sis_pci_driver ) ;
2005-04-16 15:20:36 -07:00
}
static void __exit sis_exit ( void )
{
2010-12-15 03:16:38 +10:00
drm_pci_exit ( & driver , & sis_pci_driver ) ;
2005-04-16 15:20:36 -07:00
}
module_init ( sis_init ) ;
module_exit ( sis_exit ) ;
2005-09-25 14:28:13 +10:00
MODULE_AUTHOR ( DRIVER_AUTHOR ) ;
MODULE_DESCRIPTION ( DRIVER_DESC ) ;
2005-04-16 15:20:36 -07:00
MODULE_LICENSE ( " GPL and additional rights " ) ;