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;