/*
 * arch/sh/pci/dma-dreamcast.c
 *
 * PCI DMA support for the Sega Dreamcast
 *
 * Copyright (C) 2001, 2002  M. R. Brown
 * Copyright (C) 2002, 2003  Paul Mundt
 *
 * This file originally bore the message (with enclosed-$):
 *	Id: pci.c,v 1.3 2003/05/04 19:29:46 lethal Exp
 *	Dreamcast PCI: Supports SEGA Broadband Adaptor only.
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 */

#include <linux/config.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/param.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/pci.h>
#include <linux/dma-mapping.h>
#include <linux/device.h>

#include <asm/io.h>
#include <asm/irq.h>
#include <asm/mach/pci.h>

static int gapspci_dma_used = 0;

void *dreamcast_consistent_alloc(struct device *dev, size_t size,
				 dma_addr_t *dma_handle, int flag)
{
	unsigned long buf;

	if (dev && dev->bus != &pci_bus_type)
		return NULL;

	if (gapspci_dma_used + size > GAPSPCI_DMA_SIZE)
		return ERR_PTR(-EINVAL);

	buf = GAPSPCI_DMA_BASE + gapspci_dma_used;

	gapspci_dma_used = PAGE_ALIGN(gapspci_dma_used+size);

	*dma_handle = (dma_addr_t)buf;

	buf = P2SEGADDR(buf);

	/* Flush the dcache before we hand off the buffer */
	dma_cache_wback_inv((void *)buf, size);

	return (void *)buf;
}

int dreamcast_consistent_free(struct device *dev, size_t size,
			 void *vaddr, dma_addr_t dma_handle)
{
	if (dev && dev->bus != &pci_bus_type)
		return -EINVAL;

	/* XXX */
	gapspci_dma_used = 0;

	return 0;
}

