summaryrefslogtreecommitdiff
path: root/linux-core/mga_drv.c
diff options
context:
space:
mode:
authorIan Romanick <idr@us.ibm.com>2005-05-16 17:37:10 +0000
committerIan Romanick <idr@us.ibm.com>2005-05-16 17:37:10 +0000
commite051cd19c00ed28997ff6fece0d1d4308b171229 (patch)
treeac705c230e9f7a5c1c6dcc5144cc2fc3d6fdbeb3 /linux-core/mga_drv.c
parentbd72c6990f22381af61f62bffe70619f726d5923 (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 'linux-core/mga_drv.c')
-rw-r--r--linux-core/mga_drv.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/linux-core/mga_drv.c b/linux-core/mga_drv.c
index bdb591ee..e0f1ab31 100644
--- a/linux-core/mga_drv.c
+++ b/linux-core/mga_drv.c
@@ -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 @@ static struct drm_driver driver = {
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_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 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;
+}