2005-04-16 15:20:36 -07:00
/* mga_drv.c -- Matrox G200/G400 driver -*- linux-c -*-
* Created : Mon Dec 13 01 : 56 : 22 1999 by jhartmann @ precisioninsight . com
*
* 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 :
*
* The above copyright notice and this permission notice ( including the next
* paragraph ) shall be included in all copies or substantial portions of the
* Software .
*
* 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
* VA LINUX SYSTEMS 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 .
*
* Authors :
* Rickard E . ( Rik ) Faith < faith @ valinux . com >
* Gareth Hughes < gareth @ valinux . com >
*/
# include "drmP.h"
# include "drm.h"
# include "mga_drm.h"
# include "mga_drv.h"
# include "drm_pciids.h"
2007-07-11 16:09:54 +10:00
static int mga_driver_device_is_agp ( struct drm_device * dev ) ;
2005-04-16 15:20:36 -07:00
static struct pci_device_id pciidlist [ ] = {
mga_PCI_IDS
} ;
static struct drm_driver driver = {
2005-09-25 14:28:13 +10:00
. driver_features =
2005-11-11 23:11:34 +11:00
DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA |
2005-09-25 14:28:13 +10:00
DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED |
DRIVER_IRQ_VBL ,
2006-10-24 21:52:23 +10:00
. dev_priv_size = sizeof ( drm_mga_buf_priv_t ) ,
2005-11-10 22:16:34 +11:00
. load = mga_driver_load ,
. unload = mga_driver_unload ,
. lastclose = mga_driver_lastclose ,
2005-04-16 15:20:36 -07:00
. dma_quiescent = mga_driver_dma_quiescent ,
2005-07-10 17:31:26 +10:00
. device_is_agp = mga_driver_device_is_agp ,
2005-04-16 15:20:36 -07:00
. vblank_wait = mga_driver_vblank_wait ,
. irq_preinstall = mga_driver_irq_preinstall ,
. irq_postinstall = mga_driver_irq_postinstall ,
. irq_uninstall = mga_driver_irq_uninstall ,
. irq_handler = mga_driver_irq_handler ,
. reclaim_buffers = drm_core_reclaim_buffers ,
. get_map_ofs = drm_core_get_map_ofs ,
. get_reg_ofs = drm_core_get_reg_ofs ,
. ioctls = mga_ioctls ,
. dma_ioctl = mga_dma_buffers ,
. fops = {
2005-09-25 14:28:13 +10:00
. owner = THIS_MODULE ,
. open = drm_open ,
. release = drm_release ,
. ioctl = drm_ioctl ,
. mmap = drm_mmap ,
. poll = drm_poll ,
. fasync = drm_fasync ,
2005-07-07 21:51:26 +10:00
# ifdef CONFIG_COMPAT
2005-09-25 14:28:13 +10:00
. compat_ioctl = mga_compat_ioctl ,
2005-07-07 21:51:26 +10:00
# endif
2005-09-25 14:28:13 +10:00
} ,
2005-04-16 15:20:36 -07:00
. pci_driver = {
2005-11-10 22:16:34 +11:00
. name = DRIVER_NAME ,
. id_table = pciidlist ,
} ,
. 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
} ;
static int __init mga_init ( void )
{
driver . num_ioctls = mga_max_ioctl ;
return drm_init ( & driver ) ;
}
static void __exit mga_exit ( void )
{
drm_exit ( & driver ) ;
}
module_init ( mga_init ) ;
module_exit ( mga_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 " ) ;
2005-07-10 17:31:26 +10:00
/**
* Determine if the device really is AGP or not .
*
* In addition to the usual tests performed by \ c drm_device_is_agp , this
* function detects PCI G450 cards that appear to the system exactly like
* AGP G450 cards .
*
* \ param dev The device to be tested .
*
* \ returns
* If the device is a PCI G450 , zero is returned . Otherwise 2 is returned .
*/
2007-07-11 16:09:54 +10:00
static int mga_driver_device_is_agp ( struct drm_device * dev )
2005-07-10 17:31:26 +10:00
{
2005-09-25 14:28:13 +10:00
const struct pci_dev * const pdev = dev - > pdev ;
2005-07-10 17:31:26 +10:00
/* There are PCI versions of the G450. These cards have the
* same PCI ID as the AGP G450 , but have an additional PCI - to - PCI
* bridge chip . We detect these cards , which are not currently
* supported by this driver , by looking at the device ID of the
* bus the " card " is on . If vendor is 0x3388 ( Hint Corp ) and the
* device is 0x0021 ( HB6 Universal PCI - PCI bridge ) , we reject the
* device .
*/
2005-09-25 14:28:13 +10:00
2005-11-23 21:45:43 +11:00
if ( ( pdev - > device = = 0x0525 ) & & pdev - > bus - > self
2005-09-25 14:28:13 +10:00
& & ( pdev - > bus - > self - > vendor = = 0x3388 )
& & ( pdev - > bus - > self - > device = = 0x0021 ) ) {
2005-07-10 17:31:26 +10:00
return 0 ;
}
return 2 ;
}