|
@@ -38,6 +38,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;
|
|
@@ -81,6 +82,7 @@ static struct drm_driver driver = {
|
|
|
.driver_features = DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | DRIVER_USE_MTRR | DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | 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,
|
|
@@ -128,3 +130,38 @@ module_exit(mga_exit);
|
|
|
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 2 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) ) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 2;
|
|
|
+}
|