Lukas Hejtmanek wrote:
drm_stub.c version 1.52 contains check whether device is AGP. I have i915 card
that is PCIE and it fails to initialize i915 module. If I comment out check for
AGP then everything is OK.
Please try the attached patch. Since I don't have any i9X5 hardware, I
haven't run-tested it, but it does compile. This implements a fix
similar to the one described by Alan in one of his posts. Note that the
i810 and i830 drivers do *not* need to be modified because those devices
always show up with the AGP capability correctly set.
Index: bsd-core/drmP.h
===================================================================
RCS file: /cvs/dri/drm/bsd-core/drmP.h,v
retrieving revision 1.57
diff -u -d -r1.57 drmP.h
--- bsd-core/drmP.h 16 May 2005 17:37:10 -0000 1.57
+++ bsd-core/drmP.h 27 May 2005 20:57:05 -0000
@@ -644,8 +644,10 @@
*
* \param dev DRM device handle
*
- * \returns true if the card really is attached to AGP, false
- * otherwise.
+ * \returns
+ * One of three values is returned depending on whether or not the
+ * card is absolutely \b not AGP (return of 0), absolutely \b is AGP
+ * (return of 1), or may or may not be AGP (return of 2).
*/
int (*device_is_agp) (struct drm_device * dev);
Index: bsd-core/drm_agpsupport.c
===================================================================
RCS file: /cvs/dri/drm/bsd-core/drm_agpsupport.c,v
retrieving revision 1.14
diff -u -d -r1.14 drm_agpsupport.c
--- bsd-core/drm_agpsupport.c 16 May 2005 17:37:10 -0000 1.14
+++ bsd-core/drm_agpsupport.c 27 May 2005 20:57:06 -0000
@@ -47,9 +47,12 @@
u_int8_t ptr, next;
- if ( (dev->driver->device_is_agp != NULL)
- && ! (*dev->driver->device_is_agp)( dev ) ) {
- return 0;
+ if ( dev->driver->device_is_agp != NULL ) {
+ int err = (*dev->driver->device_is_agp)( dev );
+
+ if (err != 2) {
+ return err;
+ }
}
/*
Index: linux-core/drmP.h
===================================================================
RCS file: /cvs/dri/drm/linux-core/drmP.h,v
retrieving revision 1.143
diff -u -d -r1.143 drmP.h
--- linux-core/drmP.h 16 May 2005 17:37:09 -0000 1.143
+++ linux-core/drmP.h 27 May 2005 20:57:06 -0000
@@ -548,8 +548,10 @@
*
* \param dev DRM device handle
*
- * \returns true if the card really is attached to AGP, false
- * otherwise.
+ * \returns
+ * One of three values is returned depending on whether or not the
+ * card is absolutely \b not AGP (return of 0), absolutely \b is AGP
+ * (return of 1), or may or may not be AGP (return of 2).
*/
int (*device_is_agp) (struct drm_device * dev);
@@ -1028,9 +1030,12 @@
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;
+ if ( dev->driver->device_is_agp != NULL ) {
+ int err = (*dev->driver->device_is_agp)( dev );
+
+ if (err != 2) {
+ return err;
+ }
}
return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
Index: linux-core/i915_drv.c
===================================================================
RCS file: /cvs/dri/drm/linux-core/i915_drv.c,v
retrieving revision 1.13
diff -u -d -r1.13 i915_drv.c
--- linux-core/i915_drv.c 1 Feb 2005 10:43:42 -0000 1.13
+++ linux-core/i915_drv.c 27 May 2005 20:57:06 -0000
@@ -15,6 +15,8 @@
#include "drm_pciids.h"
+static int i915_driver_device_is_agp(drm_device_t * dev);
+
static int postinit(struct drm_device *dev, unsigned long flags)
{
dev->counters += 4;
@@ -60,6 +62,7 @@
DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
.pretakedown = i915_driver_pretakedown,
.prerelease = i915_driver_prerelease,
+ .device_is_agp = i915_driver_device_is_agp,
.irq_preinstall = i915_driver_irq_preinstall,
.irq_postinstall = i915_driver_irq_postinstall,
.irq_uninstall = i915_driver_irq_uninstall,
@@ -109,3 +112,19 @@
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL and additional rights");
+
+/**
+ * Determine if the device really is AGP or not.
+ *
+ * All Intel graphics chipsets are treated as AGP, even if they are really
+ * PCI-e.
+ *
+ * \param dev The device to be tested.
+ *
+ * \returns
+ * A value of 1 is always returned to indicate every i9X5 is AGP.
+ */
+int i915_driver_device_is_agp(drm_device_t * dev)
+{
+ return 1;
+}
Index: linux-core/mga_drv.c
===================================================================
RCS file: /cvs/dri/drm/linux-core/mga_drv.c,v
retrieving revision 1.51
diff -u -d -r1.51 mga_drv.c
--- linux-core/mga_drv.c 21 May 2005 02:27:51 -0000 1.51
+++ linux-core/mga_drv.c 27 May 2005 20:57:06 -0000
@@ -148,8 +148,7 @@
* \param dev The device to be tested.
*
* \returns
- * If the device is a PCI G450, zero is returned. Otherwise non-zero is
- * returned.
+ * If the device is a PCI G450, zero is returned. Otherwise 2 is returned.
*/
int mga_driver_device_is_agp(drm_device_t * dev)
{
@@ -176,5 +175,5 @@
return 0;
}
- return 1;
+ return 2;
}