sound/driver/hda and ia64
John Baldwin
jhb at freebsd.org
Mon Oct 2 12:22:08 PDT 2006
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 ?
> >
> >
> > ===> sound/driver/hda (all)
> > cc -O2 -fno-strict-aliasing -pipe -Werror -D_KERNEL -DKLD_MODULE
> > -std=c99 -nostd inc -I- -DHAVE_KERNEL_OPTION_HEADERS -include
> > /usr/obj/ia64/src/src0/src/sys/M AC/opt_global.h -I. -I@
> > -I@/contrib/altq -finline-limit=15000 --param inline-uni
> > t-growth=100 --param large-function-growth=1000 -fno-common -g
> > -I/usr/obj/ia64/s rc/src0/src/sys/MAC -ffixed-r13
> > -mfixed-range=f32-f127 -mno-sdata -ffreestanding
> > -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes
> > -Wmissing-prototy
> > pes -Wpointer-arith -Winline -Wcast-qual -Wundef
> > -fformat-extensions -c /src/sr
> > c0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pci/hda/h
> > dac.c
> > /src/src0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pc
> > i/hda/hdac.c:
> > In function `hdac_dma_nocache':
> > /src/src0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pc
> > i/hda/hdac.c: 999: warning: implicit declaration of function
> > `vtopte'
> > /src/src0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pc
> > i/hda/hdac.c: 999: warning: nested extern declaration of `vtopte'
> > /src/src0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pc
> > i/hda/hdac.c: 999: warning: assignment makes pointer from integer
> > without a cast
> > /src/src0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pc
> > i/hda/hdac.c: 1001: error: `PG_N' undeclared (first use in this
> > function)
> > /src/src0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pc
> > i/hda/hdac.c: 1001: error: (Each undeclared identifier is reported
> > only once
> > /src/src0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pc
> > i/hda/hdac.c: 1001: error: for each function it appears in.)
> > /src/src0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pc
> > i/hda/hdac.c: 1002: warning: implicit declaration of function
> > `invltlb'
> > /src/src0/src/sys/modules/sound/driver/hda/../../../../dev/sound/pc
> > i/hda/hdac.c: 1002: warning: nested extern declaration of `invltlb'
> >
> >
>
> 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
@@ -48,6 +48,7 @@
#include <machine/atomic.h>
#include <machine/bus.h>
#include <machine/md_var.h>
+#include <machine/specialreg.h>
#define MAX_BPAGES 8192
@@ -522,6 +523,9 @@
} 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
@@ -51,6 +51,7 @@
#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
@@ -530,6 +531,9 @@
} 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);
--
John Baldwin
More information about the freebsd-current
mailing list