On Mon, 2 Oct 2006 14:59:59 -0400 John Baldwin <jhb_at_freebsd.org> wrote: > On Monday 02 October 2006 08:50, Ariff Abdullah wrote: > > On Mon, 02 Oct 2006 12:22:33 +0000 > > Poul-Henning Kamp <phk_at_phk.freebsd.dk> wrote: > > > > > > During a "make universe" ia64 fails with the following errors. > > > > > > I wouldn't expect a sound driver to call any of those functions > > > at all, what's going on ? > > > > > > [....] > > > > > > > I wish BUS_DMA_NOCACHE has real meaning (like what NetBSD did) > > since uncached DMA is pretty much guarantee to make the driver > > works on broken i386/amd86 hardwares. > > > > Should we just narrow this down to i386/amd64 , or give > > BUS_DMA_NOCACHE a real meaning as part of bus_dmamem_alloc() ? > > > > I'm open for suggestion. > > I can probably fix NOCACHE for i386/amd64 for the bus_dmamem_alloc() > case. Try this patch: > > --- //depot/vendor/freebsd/src/sys/amd64/amd64/busdma_machdep.c 2006/06/01 > 04:50:42 > +++ //depot/user/jhb/acpipci/amd64/amd64/busdma_machdep.c 2006/10/02 18:58:21 > _at__at_ -48,6 +48,7 _at__at_ > #include <machine/atomic.h> > #include <machine/bus.h> > #include <machine/md_var.h> > +#include <machine/specialreg.h> > > #define MAX_BPAGES 8192 > > _at__at_ -522,6 +523,9 _at__at_ > } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { > printf("bus_dmamem_alloc failed to align memory properly."); > } > + if (flags & BUS_DMA_NOCACHE) > + pmap_change_attr((vm_offset_t)*vaddr, dmat->maxsize, > + PAT_UNCACHEABLE); > CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", > __func__, dmat, dmat->flags, ENOMEM); > return (0); > --- //depot/vendor/freebsd/src/sys/i386/i386/busdma_machdep.c 2006/09/26 > 23:16:33 > +++ //depot/user/jhb/acpipci/i386/i386/busdma_machdep.c 2006/10/02 18:58:21 > _at__at_ -51,6 +51,7 _at__at_ > #include <machine/atomic.h> > #include <machine/bus.h> > #include <machine/md_var.h> > +#include <machine/specialreg.h> > > #define MAX_BPAGES 512 > #define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 > _at__at_ -530,6 +531,9 _at__at_ > } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { > printf("bus_dmamem_alloc failed to align memory > properly.\n"); > } > + if (flags & BUS_DMA_NOCACHE) > + pmap_change_attr((vm_offset_t)*vaddr, dmat->maxsize, > + PAT_UNCACHEABLE); > CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", > __func__, dmat, dmat->flags, ENOMEM); > return (0); > > I guess these are what we're looking for. I can't tell whether it really works or not (finding such buggy hardware is quite difficult), but this will make lot of things easier for drivers. Any objections? I guess you should go ahead, John. -- Ariff Abdullah FreeBSD ... Recording in stereo is obviously too advanced and confusing for us idiot ***** users :P ........
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:01 UTC