Subject: Re: DRI/DRM Intel 945GM problem
To: Ahmad M. Afuni <pseudo.statistic@gmail.com>
From: Chavdar Ivanov <ci4ic4@gmail.com>
List: tech-x11
Date: 05/20/2007 14:27:59
On 20/05/07, Ahmad M. Afuni <pseudo.statistic@gmail.com> wrote:
> Hey,
> I compiled my kernel (GENERIC.MP) with:
> i915drm*        at vga?         # Intel i915, i945 DRM driver
> And so dmesg tells me:
> i915drm0 at vga1
> info: [drm] Intel i945GM (unit 0)
> info: [drm] AGP at 0xc0000000 256MB
> info: [drm] Initialized i915 1.5.0 20060119
> Which seems OK.
> Now, to install xorg, I installed (from pkgsrc) x11/xf86-video-i810,
> modular-xorg-server, and the usual mouse/keyboard input drivers.
> I had:
> X11_TYPE=modular
> PKG_OPTIONS.xorg-server=dri
> in my mk.conf.
> Now, after installing the above, I tried X out, only to have this in
> my Xorg.0.log:
> drmOpenDevice: node name is /dev/dri/card0
> drmOpenDevice: open result is 8, (OK)
> drmOpenDevice: node name is /dev/dri/card0
> drmOpenDevice: open result is 8, (OK)
> [drm] failed to load kernel module "i915"

I am sure I have been there at some point, but I can hardly remember
exactly how I fixed it. I've kinda lost the number of
modular-xorg-server* and mesa-dri* compilations; it's good fun,
anyway.

 You got your /dev/dri/card0 as expected with the right mode?

You followed generally what is in:
http://mail-index.netbsd.org/tech-x11/2007/03/19/0000.html ?

Maybe the following will help you (it did it for me), taken against
-current from a few days ago:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
--- sys/dev/pci/agp_i810.c.orig	2007-05-14 20:13:55.000000000 +0100
+++ sys/dev/pci/agp_i810.c	2007-05-14 14:43:51.000000000 +0100
@@ -71,28 +71,6 @@
 		}							\
 	} while (0)

-#define CHIP_I810 0	/* i810/i815 */
-#define CHIP_I830 1	/* 830M/845G */
-#define CHIP_I855 2	/* 852GM/855GM/865G */
-#define CHIP_I915 3	/* 915G/915GM/945G/945GM */
-
-struct agp_i810_softc {
-	u_int32_t initial_aperture;	/* aperture size at startup */
-	struct agp_gatt *gatt;
-	int chiptype;			/* i810-like or i830 */
-	u_int32_t dcache_size;		/* i810 only */
-	u_int32_t stolen;		/* number of i830/845 gtt entries
-					   for stolen memory */
-	bus_space_tag_t bst;		/* register bus_space tag */
-	bus_space_handle_t bsh;		/* register bus_space handle */
-	bus_space_tag_t gtt_bst;	/* GTT bus_space tag */
-	bus_space_handle_t gtt_bsh;	/* GTT bus_space handle */
-	struct pci_attach_args vga_pa;
-
-	void *sc_powerhook;
-	struct pci_conf_state sc_pciconf;
-};
-
 static u_int32_t agp_i810_get_aperture(struct agp_softc *);
 static int agp_i810_set_aperture(struct agp_softc *, u_int32_t);
 static int agp_i810_bind_page(struct agp_softc *, off_t, bus_addr_t);
@@ -725,7 +703,7 @@
 	 * Until the issue is solved, simply restore it.
 	 */

-#if 0
+#if 1
 	regval = bus_space_read_4(isc->bst, isc->bsh, AGP_I810_PGTBL_CTL);
 	if (regval != (isc->gatt->ag_physical | 1)) {
 		printf("agp_i810_bind_memory: PGTBL_CTL is 0x%x - fixing\n",
--- sys/dev/pci/agpvar.h.orig	2007-05-14 20:13:55.000000000 +0100
+++ sys/dev/pci/agpvar.h	2007-05-14 14:45:43.000000000 +0100
@@ -161,6 +161,28 @@
 	size_t		  ag_size;
 };

+#define CHIP_I810 0    /* i810/i815 */
+#define CHIP_I830 1    /* 830M/845G */
+#define CHIP_I855 2    /* 852GM/855GM/865G */
+#define CHIP_I915 3    /* 915G/915GM/945G/945GM */
+
+struct agp_i810_softc {
+       u_int32_t initial_aperture;     /* aperture size at startup */
+       struct agp_gatt *gatt;
+       int chiptype;                   /* i810-like or i830 */
+       u_int32_t dcache_size;          /* i810 only */
+       u_int32_t stolen;               /* number of i830/845 gtt entries
+                                          for stolen memory */
+       bus_space_tag_t bst;            /* register bus_space tag */
+       bus_space_handle_t bsh;         /* register bus_space handle */
+       bus_space_tag_t gtt_bst;        /* GTT bus_space tag */
+       bus_space_handle_t gtt_bsh;     /* GTT bus_space handle */
+       struct pci_attach_args vga_pa;
+
+       void *sc_powerhook;
+       struct pci_conf_state sc_pciconf;
+};
+
 int agpbusprint(void *, const char *);

 /*
--- sys/dev/drm/drm_drv.c.orig	2007-05-14 20:14:08.000000000 +0100
+++ sys/dev/drm/drm_drv.c	2007-05-14 14:49:54.000000000 +0100
@@ -526,7 +526,7 @@
 	}

 	for(i = 0; i<DRM_MAX_PCI_RESOURCE; i++) {
-		if (dev->pci_map_data[i].mapped > 1) {
+		if (dev->pci_map_data[i].mapped > 0) {
 			bus_space_unmap(dev->pci_map_data[i].maptype,
 					dev->pci_map_data[i].bsh,
 					dev->pci_map_data[i].size);
@@ -691,7 +691,7 @@
 	i = 0;

 	for (i = 0; i < DRM_MAX_PCI_RESOURCE; i++)
-		if (dev->pci_map_data[i].mapped != 0)
+		if (dev->pci_map_data[i].mapped > 0)
 		{
 			bus_space_unmap(dev->pa.pa_memt,
 					dev->pci_map_data[i].bsh,
--- sys/dev/drm/drm_memory.c.orig	2007-05-14 20:14:08.000000000 +0100
+++ sys/dev/drm/drm_memory.c	2007-05-14 14:51:39.000000000 +0100
@@ -97,8 +97,9 @@
 			map->bst = dev->pa.pa_memt;
 			map->cnt = &(dev->pci_map_data[i].mapped);
 			map->mapsize = dev->pci_map_data[i].size;
-			dev->pci_map_data[i].mapped++;
-			if (dev->pci_map_data[i].mapped > 1)
+                        if (dev->pci_map_data[i].mapped >= 0)
+                                dev->pci_map_data[i].mapped++;
+                        if (dev->pci_map_data[i].mapped != 1)
 			{
 				map->bsh = dev->pci_map_data[i].bsh;
 				return dev->pci_map_data[i].vaddr;
--- sys/dev/pci/drm/i915_drv.c.orig	2007-05-14 20:13:55.000000000 +0100
+++ sys/dev/pci/drm/i915_drv.c	2007-05-14 14:54:36.000000000 +0100
@@ -39,6 +39,8 @@
 #include "i915_drm.h"
 #include "i915_drv.h"
 #include "drm_pciids.h"
+#include "agp_i810.h"
+

 /* drv_PCI_IDs comes from drm_pciids.h, generated from drm_pciids.txt. */
 static drm_pci_id_list_t i915_pciidlist[] = {
@@ -134,9 +136,34 @@
 	struct pci_attach_args *pa = aux;
 	drm_device_t *dev = (drm_device_t *)self;

+#if NAGP_I810 > 0
+       struct agp_softc *agpsc;
+       struct agp_i810_softc *agpi810sc;
+       int reg;
+#endif
+
+
 	i915_configure(dev);

 	drm_attach(self, pa, i915_pciidlist);
+
+#if NAGP_I810 > 0
+       agpsc = (struct agp_softc *)agp_find_device(0);
+       if(agpsc == NULL || agpsc->as_chipc == NULL)
+               return;
+
+       agpi810sc = agpsc->as_chipc;
+        if(agpi810sc->chiptype == CHIP_I915)
+               reg = 0;
+       else
+               reg = 1;
+
+       dev->pci_map_data[reg].bsh = agpi810sc->bsh;
+       dev->pci_map_data[reg].mapped = -1; /* never unmap */
+       dev->pci_map_data[reg].vaddr =
+               bus_space_vaddr(agpi810sc->bst, agpi810sc->bsh);
+#endif
+
 }

 CFATTACH_DECL(i915drm, sizeof(drm_device_t), i915drm_probe, i915drm_attach,
--------------------------------------------------------

> (II) I810(0): [drm] drmOpen failed
> (EE) I810(0): [dri] DRIScreenInit failed. Disabling DRI.
> Afterwards, realizing that I needed mesa-dri, I installed wip/mesa-dri
> and copied over the MesaLib.buildlink3.mk file over to
> graphics/MesaLib/buildlink3.mk.

I am presently running Xorg7.2+Mesa652+dri on my laptop; the only
problem is I could not get AIGLX to work. Of the more interesting
OpenGL applications available, I got Blender to run accelerated, and
of course BZFlag!

I got even Xorg7.3 + Mesa653+dri working, but for some reason the
server did not recognize the 'vt05' option, which lead to some weird
effects when used with gdm - like sometimes the keyboard attached to
one of the wscons terminals behind... also on occasions some keys got
repeated many times with no reason; this was even running with AIGLX
and Composite and   I was able to try starting Compiz and Beryl; the
latter kinda ran, but gave mostly white background with occasional
window brought in with ALT-Tab; the former did tjhe '--replace' bit
but then refused to continue due to the lack of a particular call.
I've since reverted back to the initial accelerated setup - mainly
because of the problem with the VTs (and also because otherwise I had
to recompile every OpenGL application - that's another story).

> Furthermore, I pkg_deleted i810's driver and rebuilt it.

I also did that just in case, although I don't believe it made any difference.

> Still, exact same error. I must've missed something.
> Anyone know what that might be?
>
> Thanks,
> Ahmad
>

Chavdar Ivanov