In addition to alpha, grossly work around the 24-bit limitation of the

Audio 1 DMA engine by allocating through the ISA DMA tag on amd64
and i386.
This commit is contained in:
kleink 2004-07-08 21:33:45 +00:00
parent aa1018e714
commit 8e491dbabd
1 changed files with 30 additions and 4 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: eso.c,v 1.34 2004/05/25 21:38:11 kleink Exp $ */
/* $NetBSD: eso.c,v 1.35 2004/07/08 21:33:45 kleink Exp $ */
/*
* Copyright (c) 1999, 2000, 2004 Klaus J. Klein
@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: eso.c,v 1.34 2004/05/25 21:38:11 kleink Exp $");
__KERNEL_RCSID(0, "$NetBSD: eso.c,v 1.35 2004/07/08 21:33:45 kleink Exp $");
#include "mpu.h"
@ -62,6 +62,17 @@ __KERNEL_RCSID(0, "$NetBSD: eso.c,v 1.34 2004/05/25 21:38:11 kleink Exp $");
#include <machine/bus.h>
#include <machine/intr.h>
/*
* XXX Work around the 24-bit implementation limit of the Audio 1 DMA
* XXX engine by allocating through the ISA DMA tag.
*/
#if defined(amd64) || defined(i386)
#include "isa.h"
#if NISA > 0
#include <dev/isa/isavar.h>
#endif
#endif
#if defined(AUDIO_DEBUG) || defined(DEBUG)
#define DPRINTF(x) printf x
#else
@ -1587,14 +1598,25 @@ eso_allocm(hdl, direction, size, type, flags)
else
boundary = 0x100000;
/*
* XXX Work around allocation problems for Audio 1, which
* XXX implements the 24 low address bits only, with
* XXX machine-specific DMA tag use.
*/
#ifdef alpha
/*
* XXX For Audio 1, which implements the 24 low address bits only,
* XXX force allocation through the (ISA) SGMAP.
* XXX Force allocation through the (ISA) SGMAP.
*/
if (direction == AUMODE_RECORD)
ed->ed_dmat = alphabus_dma_get_tag(sc->sc_dmat, ALPHA_BUS_ISA);
else
#elif defined(amd64) || defined(i386)
/*
* XXX Force allocation through the ISA DMA tag.
*/
if (direction == AUMODE_RECORD)
ed->ed_dmat = &isa_bus_dma_tag;
else
#endif
ed->ed_dmat = sc->sc_dmat;
@ -1715,6 +1737,8 @@ eso_trigger_output(hdl, start, end, blksize, intr, arg, param)
sc->sc_dev.dv_xname, start);
return (EINVAL);
}
DPRINTF(("%s: dmaaddr %lx\n",
sc->sc_dev.dv_xname, (unsigned long)DMAADDR(ed)));
sc->sc_pintr = intr;
sc->sc_parg = arg;
@ -1802,6 +1826,8 @@ eso_trigger_input(hdl, start, end, blksize, intr, arg, param)
sc->sc_dev.dv_xname, start);
return (EINVAL);
}
DPRINTF(("%s: dmaaddr %lx\n",
sc->sc_dev.dv_xname, (unsigned long)DMAADDR(ed)));
sc->sc_rintr = intr;
sc->sc_rarg = arg;