Re: sound/driver/hda and ia64

From: John Baldwin <jhb_at_freebsd.org>
Date: Mon, 2 Oct 2006 14:59:59 -0400
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_at_
> > -I_at_/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
_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);


-- 
John Baldwin
Received on Mon Oct 02 2006 - 17:22:08 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:39:01 UTC