Index: bsd-core/drmP.h =================================================================== RCS file: /cvs/dri/drm/bsd-core/drmP.h,v retrieving revision 1.56 diff -u -d -r1.56 drmP.h --- bsd-core/drmP.h 26 Apr 2005 05:19:11 -0000 1.56 +++ bsd-core/drmP.h 13 May 2005 18:53:18 -0000 @@ -638,6 +638,18 @@ 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; Index: bsd-core/drm_agpsupport.c =================================================================== RCS file: /cvs/dri/drm/bsd-core/drm_agpsupport.c,v retrieving revision 1.13 diff -u -d -r1.13 drm_agpsupport.c --- bsd-core/drm_agpsupport.c 16 Apr 2005 03:02:52 -0000 1.13 +++ bsd-core/drm_agpsupport.c 13 May 2005 18:53:18 -0000 @@ -46,6 +46,12 @@ 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 @@ 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 Index: bsd-core/mga_drv.c =================================================================== RCS file: /cvs/dri/drm/bsd-core/mga_drv.c,v retrieving revision 1.11 diff -u -d -r1.11 mga_drv.c --- bsd-core/mga_drv.c 16 Apr 2005 03:02:52 -0000 1.11 +++ bsd-core/mga_drv.c 13 May 2005 18:53:18 -0000 @@ -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 @@ 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,24 @@ 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. + */ +int mga_driver_device_is_agp(drm_device_t * dev) +{ + return 1; +} + #ifdef __FreeBSD__ static int mga_probe(device_t dev) Index: linux-core/drmP.h =================================================================== RCS file: /cvs/dri/drm/linux-core/drmP.h,v retrieving revision 1.142 diff -u -d -r1.142 drmP.h --- linux-core/drmP.h 26 Apr 2005 05:19:11 -0000 1.142 +++ linux-core/drmP.h 13 May 2005 18:53:18 -0000 @@ -541,6 +541,18 @@ int new); int (*kernel_context_switch_unlock) (struct drm_device * dev); int (*vblank_wait) (struct drm_device * 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); + /* these have to be filled in */ int (*postinit) (struct drm_device *, unsigned long flags); irqreturn_t(*irq_handler) (DRM_IRQ_ARGS); @@ -1016,6 +1028,11 @@ static __inline__ int drm_device_is_agp(drm_device_t *dev) { + if ( (dev->driver->device_is_agp != NULL) + && ! (*dev->driver->device_is_agp)( dev ) ) { + return 0; + } + return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP); } Index: linux-core/drm_stub.c =================================================================== RCS file: /cvs/dri/drm/linux-core/drm_stub.c,v retrieving revision 1.51 diff -u -d -r1.51 drm_stub.c --- linux-core/drm_stub.c 25 Mar 2005 09:48:34 -0000 1.51 +++ linux-core/drm_stub.c 13 May 2005 18:53:18 -0000 @@ -99,7 +99,8 @@ goto error_out_unreg; if (drm_core_has_AGP(dev)) { - dev->agp = drm_agp_init(dev); + if (drm_device_is_agp(dev)) + dev->agp = drm_agp_init(dev); if (drm_core_check_feature(dev, DRIVER_REQUIRE_AGP) && (dev->agp == NULL)) { DRM_ERROR("Cannot initialize the agpgart module.\n"); Index: linux-core/mga_drv.c =================================================================== RCS file: /cvs/dri/drm/linux-core/mga_drv.c,v retrieving revision 1.49 diff -u -d -r1.49 mga_drv.c --- linux-core/mga_drv.c 9 Nov 2004 16:58:02 -0000 1.49 +++ linux-core/mga_drv.c 13 May 2005 18:53:18 -0000 @@ -37,6 +37,7 @@ #include "drm_pciids.h" +static int mga_driver_device_is_agp(drm_device_t * dev); static int postinit(struct drm_device *dev, unsigned long flags) { dev->counters += 3; @@ -82,6 +83,7 @@ DRIVER_IRQ_VBL, .pretakedown = mga_driver_pretakedown, .dma_quiescent = mga_driver_dma_quiescent, + .device_is_agp = mga_driver_device_is_agp, .vblank_wait = mga_driver_vblank_wait, .irq_preinstall = mga_driver_irq_preinstall, .irq_postinstall = mga_driver_irq_postinstall, @@ -134,3 +136,44 @@ MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE("GPL and additional rights"); + +/** + * 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. + */ +int mga_driver_device_is_agp(drm_device_t * dev) +{ + const struct pci_dev * const pdev = dev->pdev; + + + /* 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. + */ + + if ( (pdev->device == 0x0525) + && (pdev->bus->self->vendor == 0x3388) + && (pdev->bus->self->device == 0x0021) ) { +#if defined( __powerpc__ ) + DRM_ERROR("GXT135p is not yet supported\n"); +#else + DRM_ERROR("PCI G450 is not yet supported\n"); +#endif + return 0; + } + + return 1; +} Index: shared-core/mga_drv.h =================================================================== RCS file: /cvs/dri/drm/shared-core/mga_drv.h,v retrieving revision 1.14 diff -u -d -r1.14 mga_drv.h --- shared-core/mga_drv.h 1 Feb 2005 11:08:31 -0000 1.14 +++ shared-core/mga_drv.h 13 May 2005 18:53:18 -0000 @@ -38,11 +38,11 @@ #define DRIVER_NAME "mga" #define DRIVER_DESC "Matrox G200/G400" -#define DRIVER_DATE "20021029" +#define DRIVER_DATE "20051013" #define DRIVER_MAJOR 3 #define DRIVER_MINOR 1 -#define DRIVER_PATCHLEVEL 0 +#define DRIVER_PATCHLEVEL 1 typedef struct drm_mga_primary_buffer { u8 *start;