On Sat, 2009-03-28 at 10:20 -0700, David Johnson wrote: > On Friday 27 March 2009 11:34:17 pm Robert Noland wrote: > > Actually, the commits that I might have expected to cause this, haven't > > been MFC'd yet. You probably did pick up the r6/7xx code in this > > update. I also made an error in the GART mapping code, but that should > > only effect pci(e) based radeons. > > Actually, my card is a PCI-Express. > > > It could also be related to the 6.12.1 ati driver. AGP mode 4x is > > always suspect as well, you might try reducing that to 2 or 1 and see if > > the problems go away. > > > > As for checking out an earlier release, with csup you just have to > > specify a date that you want to checkout. See man csup and reference > > the section titled CHECKOUT MODE. > > If PCI-Express is not allowed (do they even make AGP boards anymore?) then > I'll have to downgrade until the GART gets fixed.
Ok, the GART should be fixed in HEAD as well... r190282 is what you need. You probably need 190123 for it to apply cleanly. I'll attach both. robert. -- Robert Noland <rnol...@freebsd.org> FreeBSD
Index: ati_pcigart.c =================================================================== --- ati_pcigart.c (revision 190122) +++ ati_pcigart.c (revision 190123) @@ -75,18 +75,15 @@ NULL, NULL, /* filtfunc, filtfuncargs */ gart_info->table_size, 1, /* maxsize, nsegs */ gart_info->table_size, /* maxsegsize */ - BUS_DMA_ALLOCNOW, NULL, NULL, /* flags, lockfunc, lockfuncargs */ + 0, NULL, NULL, /* flags, lockfunc, lockfuncargs */ &dmah->tag); if (ret != 0) { free(dmah, DRM_MEM_DMA); return ENOMEM; } - flags = BUS_DMA_NOWAIT | BUS_DMA_ZERO; - if (gart_info->gart_reg_if == DRM_ATI_GART_IGP) - flags |= BUS_DMA_NOCACHE; - - ret = bus_dmamem_alloc(dmah->tag, &dmah->vaddr, flags, &dmah->map); + ret = bus_dmamem_alloc(dmah->tag, &dmah->vaddr, + BUS_DMA_WAITOK | BUS_DMA_ZERO, &dmah->map); if (ret != 0) { bus_dma_tag_destroy(dmah->tag); free(dmah, DRM_MEM_DMA); @@ -94,8 +91,12 @@ } DRM_LOCK(); + flags = BUS_DMA_NOWAIT; + if (gart_info->gart_reg_if == DRM_ATI_GART_IGP) + flags |= BUS_DMA_NOCACHE; + ret = bus_dmamap_load(dmah->tag, dmah->map, dmah->vaddr, - gart_info->table_size, drm_ati_alloc_pcigart_table_cb, dmah, 0); + gart_info->table_size, drm_ati_alloc_pcigart_table_cb, dmah, flags); if (ret != 0) { bus_dmamem_free(dmah->tag, dmah->vaddr, dmah->map); bus_dma_tag_destroy(dmah->tag);
Index: drm_scatter.c =================================================================== --- drm_scatter.c (revision 190281) +++ drm_scatter.c (revision 190282) @@ -92,7 +92,7 @@ } ret = bus_dmamem_alloc(dmah->tag, &dmah->vaddr, - BUS_DMA_WAITOK | BUS_DMA_ZERO, &dmah->map); + BUS_DMA_WAITOK | BUS_DMA_ZERO | BUS_DMA_NOCACHE, &dmah->map); if (ret != 0) { bus_dma_tag_destroy(dmah->tag); free(dmah, DRM_MEM_DMA); @@ -102,8 +102,7 @@ } ret = bus_dmamap_load(dmah->tag, dmah->map, dmah->vaddr, - request->size, drm_sg_alloc_cb, entry, - BUS_DMA_NOWAIT | BUS_DMA_NOCACHE); + request->size, drm_sg_alloc_cb, entry, BUS_DMA_NOWAIT); if (ret != 0) { bus_dmamem_free(dmah->tag, dmah->vaddr, dmah->map); bus_dma_tag_destroy(dmah->tag); Index: ati_pcigart.c =================================================================== --- ati_pcigart.c (revision 190281) +++ ati_pcigart.c (revision 190282) @@ -82,8 +82,11 @@ return ENOMEM; } - ret = bus_dmamem_alloc(dmah->tag, &dmah->vaddr, - BUS_DMA_WAITOK | BUS_DMA_ZERO, &dmah->map); + flags = BUS_DMA_WAITOK | BUS_DMA_ZERO; + if (gart_info->gart_reg_if == DRM_ATI_GART_IGP) + flags |= BUS_DMA_NOCACHE; + + ret = bus_dmamem_alloc(dmah->tag, &dmah->vaddr, flags, &dmah->map); if (ret != 0) { bus_dma_tag_destroy(dmah->tag); free(dmah, DRM_MEM_DMA); @@ -91,12 +94,9 @@ } DRM_LOCK(); - flags = BUS_DMA_NOWAIT; - if (gart_info->gart_reg_if == DRM_ATI_GART_IGP) - flags |= BUS_DMA_NOCACHE; - ret = bus_dmamap_load(dmah->tag, dmah->map, dmah->vaddr, - gart_info->table_size, drm_ati_alloc_pcigart_table_cb, dmah, flags); + gart_info->table_size, drm_ati_alloc_pcigart_table_cb, dmah, + BUS_DMA_NOWAIT); if (ret != 0) { bus_dmamem_free(dmah->tag, dmah->vaddr, dmah->map); bus_dma_tag_destroy(dmah->tag);
signature.asc
Description: This is a digitally signed message part