Index: uspace/drv/audio/sb16/dma.h
===================================================================
--- uspace/drv/audio/sb16/dma.h	(revision ea6c83870417e73e052e92cb12eed894e739dbca)
+++ 	(revision )
@@ -1,98 +1,0 @@
-/*
- * Copyright (c) 2011 Jan Vesely
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- * - Redistributions in binary form must reproduce the above copyright
- *   notice, this list of conditions and the following disclaimer in the
- *   documentation and/or other materials provided with the distribution.
- * - The name of the author may not be used to endorse or promote products
- *   derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-/** @addtogroup drvaudiosb16
- * @{
- */
-/** @file
- * @brief DMA memory management
- */
-#ifndef DRV_AUDIO_SB16_DMA_H
-#define DRV_AUDIO_SB16_DMA_H
-
-#include <errno.h>
-#include <mem.h>
-#include <as.h>
-
-#include "ddf_log.h"
-
-#define DMA_ALIGNENT 1024
-
-/** Get physical address translation
- *
- * @param[in] addr Virtual address to translate
- * @return Physical address if exists, NULL otherwise.
- */
-static inline uintptr_t addr_to_phys(const void *addr)
-{
-	if (addr == NULL)
-		return 0;
-
-	uintptr_t result;
-	const int ret = as_get_physical_mapping(addr, &result);
-	if (ret != EOK)
-		return 0;
-	return (result | ((uintptr_t)addr & 0xfff));
-}
-
-/** DMA mallocator simulator
- *
- * @param[in] size Size of the required memory space
- * @return Address of the aligned and big enough memory place, NULL on failure.
- */
-static inline void *dma_create_buffer24(size_t size)
-{
-	void *address =
-	    as_area_create(AS_AREA_ANY, size, AS_AREA_READ | AS_AREA_WRITE);
-	bzero(address, size);
-	uintptr_t ptr = 0;
-	as_get_physical_mapping(address, &ptr);
-	if ((ptr & 0xffffff) != ptr) {
-		ddf_log_debug("%s: Can not provide invalid buffer %x.",
-		    __FUNCTION__, ptr);
-		as_area_destroy(address);
-		return NULL;
-	}
-	ddf_log_verbose("%s: Buffer mapped at %x.", __FUNCTION__, ptr);
-	return address;
-}
-
-/** DMA mallocator simulator
- *
- * @param[in] addr Address of the place allocated by dma_create_buffer24
- */
-static inline void dma_destroy_buffer(void *page)
-{
-        if (page)
-		as_area_destroy(page);
-}
-
-
-#endif
-/**
- * @}
- */
Index: uspace/drv/audio/sb16/dsp.c
===================================================================
--- uspace/drv/audio/sb16/dsp.c	(revision ea6c83870417e73e052e92cb12eed894e739dbca)
+++ uspace/drv/audio/sb16/dsp.c	(revision 2e01b3f1105b1f5750b3f7d726b038336feb514e)
@@ -33,5 +33,7 @@
  */
 
+#include <as.h>
 #include <bool.h>
+#include <ddi.h>
 #include <devman.h>
 #include <device/hw_res.h>
@@ -41,10 +43,10 @@
 #include <audio_pcm_iface.h>
 
-#include "dma.h"
 #include "ddf_log.h"
 #include "dsp_commands.h"
 #include "dsp.h"
 
-#define MAX_BUFFER_SIZE (PAGE_SIZE)
+/* Maximum allowed transfer size for ISA DMA transfers is 64kB */
+#define MAX_BUFFER_SIZE (4 * 1024) // use 4kB for now
 
 #ifndef DSP_RETRY_COUNT
@@ -103,10 +105,9 @@
 	async_sess_t *sess = devman_parent_device_connect(EXCHANGE_ATOMIC,
 	    dsp->sb_dev->handle, IPC_FLAG_BLOCKING);
-	if (!sess)
-		return ENOMEM;
 
 	const int ret = hw_res_dma_channel_setup(sess,
 	    dsp->dma16_channel, pa, size,
 	    DMA_MODE_READ | DMA_MODE_AUTO | DMA_MODE_ON_DEMAND);
+
 	async_hangup(sess);
 	return ret;
@@ -118,23 +119,24 @@
 	if (size > MAX_BUFFER_SIZE || size == 0 || (size % 2) == 1)
 		size = MAX_BUFFER_SIZE;
-	uint8_t *buffer = dma_create_buffer24(size);
-	if (buffer == NULL) {
+	void *buffer = NULL, *pa = NULL;
+	int ret = dmamem_map_anonymous(size, AS_AREA_WRITE | AS_AREA_READ,
+	    0, &pa, &buffer);
+	if (ret != EOK) {
 		ddf_log_error("Failed to allocate DMA buffer.");
 		return ENOMEM;
 	}
 
-	const uintptr_t pa = addr_to_phys(buffer);
-	assert(pa < (1 << 25));
-
-	/* Set 16 bit channel */
-	const int ret = sb_setup_dma(dsp, pa, size);
+	ddf_log_verbose("Setup dma buffer at %p(%p).", buffer, pa, size);
+	assert((uintptr_t)pa < (1 << 25));
+
+	/* Setup 16 bit channel */
+	ret = sb_setup_dma(dsp, (uintptr_t)pa, size);
 	if (ret == EOK) {
 		dsp->buffer.data = buffer;
 		dsp->buffer.size = size;
-		bzero(dsp->buffer.data, dsp->buffer.size);
 	} else {
 		ddf_log_error("Failed to setup DMA16 channel: %s.",
 		    str_error(ret));
-		dma_destroy_buffer(buffer);
+		dmamem_unmap_anonymous(buffer);
 	}
 	return ret;
@@ -143,5 +145,6 @@
 static inline void sb_clear_buffer(sb_dsp_t *dsp)
 {
-	dma_destroy_buffer(dsp->buffer.data);
+	assert(dsp);
+	dmamem_unmap_anonymous(dsp->buffer.data);
 	dsp->buffer.data = NULL;
 	dsp->buffer.size = 0;
