diff options
author | Ian Romanick <idr@us.ibm.com> | 2005-05-16 17:37:10 +0000 |
---|---|---|
committer | Ian Romanick <idr@us.ibm.com> | 2005-05-16 17:37:10 +0000 |
commit | e051cd19c00ed28997ff6fece0d1d4308b171229 (patch) | |
tree | ac705c230e9f7a5c1c6dcc5144cc2fc3d6fdbeb3 /bsd-core | |
parent | bd72c6990f22381af61f62bffe70619f726d5923 (diff) |
Added device_is_agp callback to drm_driver. This function is called by the
platform-specific drm_device_is_agp function. Added implementation of
this function the the Linux-specific portion of the MGA driver to
detect PCI G450 cards. Added code to the Linux-specific portion of the
generic DRM layer to not initialize AGP infrastructure if the card is
not AGP (this matches what already existed in BSD).
Bumped the driver date and the driver patch-level for MGA.
This mostly fixes bugzilla #3248. The BSD side still needs an
implementation of mga_driver_device_is_agp.
Diffstat (limited to 'bsd-core')
-rw-r--r-- | bsd-core/drmP.h | 12 | ||||
-rw-r--r-- | bsd-core/drm_agpsupport.c | 11 | ||||
-rw-r--r-- | bsd-core/mga_drv.c | 27 |
3 files changed, 50 insertions, 0 deletions
diff --git a/bsd-core/drmP.h b/bsd-core/drmP.h index 6af29718..9943a4f6 100644 --- a/bsd-core/drmP.h +++ b/bsd-core/drmP.h @@ -638,6 +638,18 @@ struct drm_device { void (*irq_handler)(DRM_IRQ_ARGS); int (*vblank_wait)(drm_device_t *dev, unsigned int *sequence); + /** + * Called by \c drm_device_is_agp. Typically used to determine if a + * card is really attached to AGP or not. + * + * \param dev DRM device handle + * + * \returns true if the card really is attached to AGP, false + * otherwise. + */ + int (*device_is_agp) (struct drm_device * dev); + + drm_ioctl_desc_t *driver_ioctls; int max_driver_ioctl; diff --git a/bsd-core/drm_agpsupport.c b/bsd-core/drm_agpsupport.c index 6d58134a..33fb3f0c 100644 --- a/bsd-core/drm_agpsupport.c +++ b/bsd-core/drm_agpsupport.c @@ -46,6 +46,12 @@ drm_device_is_agp(drm_device_t *dev) u_int32_t status; u_int8_t ptr, next; + + if ( (dev->driver->device_is_agp != NULL) + && ! (*dev->driver->device_is_agp)( dev ) ) { + return 0; + } + /* * Check the CAP_LIST bit of the PCI status register first. */ @@ -71,6 +77,11 @@ drm_device_is_agp(drm_device_t *dev) return 0; #else + if ( (dev->driver->device_is_agp != NULL) + && ! (*dev->driver->device_is_agp)( dev ) ) { + return 0; + } + /* XXX: fill me in for non-FreeBSD */ return 1; #endif diff --git a/bsd-core/mga_drv.c b/bsd-core/mga_drv.c index bff8c42f..1dd4c81b 100644 --- a/bsd-core/mga_drv.c +++ b/bsd-core/mga_drv.c @@ -37,11 +37,14 @@ #include "mga_drv.h" #include "drm_pciids.h" +int mga_driver_device_is_agp(drm_device_t * dev) /* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */ static drm_pci_id_list_t mga_pciidlist[] = { mga_PCI_IDS }; +static int mga_driver_device_is_agp(drm_device_t * dev); + extern drm_ioctl_desc_t mga_ioctls[]; extern int mga_max_ioctl; @@ -58,6 +61,8 @@ static void mga_configure(drm_device_t *dev) dev->dma_ioctl = mga_dma_buffers; dev->dma_quiescent = mga_driver_dma_quiescent; + dev->device_is_agp = mga_driver_device_is_agp; + dev->driver_ioctls = mga_ioctls; dev->max_driver_ioctl = mga_max_ioctl; @@ -76,6 +81,28 @@ static void mga_configure(drm_device_t *dev) dev->use_vbl_irq = 1; } +/** + * 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 non-zero is + * returned. + * + * \bug + * This function needs to be filled in! The implementation in + * linux-core/mga_drv.c shows what needs to be done. + */ +int mga_driver_device_is_agp(drm_device_t * dev) +{ + return 1; +} + #ifdef __FreeBSD__ static int mga_probe(device_t dev) |