Hi list!

I am very happy to announce that I got my Radeon X600 working on both
Linux/i386 and FreeBSD/amd64. I needed to apply Benjamin's latest
patches and also the small attached patch for FreeBSD. The biggest
problem (that caused the crahes on FreeBSD) was that the virtual field
of the struct drm_sg_mem_t was never initialized.

BTW, I think the PCI ID of this card (0x5b62) should be added to the
drm_pciids.txt

Thanks for your great work!

        Markus
Index: drmP.h
===================================================================
RCS file: /cvs/dri/drm/bsd-core/drmP.h,v
retrieving revision 1.73
diff -w -u -d -r1.73 drmP.h
--- drmP.h	8 Nov 2005 20:24:59 -0000	1.73
+++ drmP.h	29 Jan 2006 07:31:28 -0000
@@ -341,7 +341,7 @@
 #define DRM_COPY_FROM_USER_IOCTL(kern, user, size) \
 	if ( IOCPARM_LEN(cmd) != size)			\
 		return EINVAL;				\
-	kern = *user;
+	memcpy(&kern, user, size);
 #define DRM_COPY_TO_USER(user, kern, size) \
 	copyout(kern, user, size)
 #define DRM_COPY_FROM_USER(kern, user, size) \
Index: drm_scatter.c
===================================================================
RCS file: /cvs/dri/drm/bsd-core/drm_scatter.c,v
retrieving revision 1.11
diff -w -u -d -r1.11 drm_scatter.c
--- drm_scatter.c	26 Apr 2005 05:19:11 -0000	1.11
+++ drm_scatter.c	29 Jan 2006 07:31:28 -0000
@@ -35,7 +35,7 @@
 
 void drm_sg_cleanup(drm_sg_mem_t *entry)
 {
-	free((void *)entry->handle, M_DRM);
+	free(entry->virtual, M_DRM);
 	free(entry->busaddr, M_DRM);
 	free(entry, M_DRM);
 }
@@ -72,8 +72,9 @@
 		return ENOMEM;
 	}
 
-	entry->handle = (long)malloc(pages << PAGE_SHIFT, M_DRM,
+	entry->virtual = malloc(pages << PAGE_SHIFT, M_DRM,
 	    M_WAITOK | M_ZERO);
+	entry->handle = (unsigned long)entry->virtual;
 	if (entry->handle == 0) {
 		drm_sg_cleanup(entry);
 		return ENOMEM;

Reply via email to