
/*
 *
 Copyright (c) Eicon Networks, 2002.
 *
 This source file is supplied for the use with
 Eicon Networks range of DIVA Server Adapters.
 *
 Eicon File Revision :    2.1
 *
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.
 *
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY OF ANY KIND WHATSOEVER INCLUDING ANY
 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 See the GNU General Public License for more details.
 *
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */
#include "platform.h"
#include "diva_dma.h"
/*
  Every entry has length of PAGE_SIZE
  and represents one single physical page
*/
struct _diva_dma_map_entry {
	int busy;
	dword phys_bus_addr;  /* 32bit address as seen by the card */
	void *local_ram_addr; /* local address as seen by the host */
	void *addr_handle;    /* handle uset to free allocated memory */
};
/*
  Create local mapping structure and init it to default state
*/
struct _diva_dma_map_entry *diva_alloc_dma_map(void *os_context, int nentries) {
	diva_dma_map_entry_t *pmap = diva_os_malloc(0, sizeof(*pmap) * (nentries + 1));
	if (pmap)
		memset(pmap, 0, sizeof(*pmap) * (nentries + 1));
	return pmap;
}
/*
  Free local map (context should be freed before) if any
*/
void diva_free_dma_mapping(struct _diva_dma_map_entry *pmap) {
	if (pmap) {
		diva_os_free(0, pmap);
	}
}
/*
  Set information saved on the map entry
*/
void diva_init_dma_map_entry(struct _diva_dma_map_entry *pmap,
			     int nr, void *virt, dword phys,
			     void *addr_handle) {
	pmap[nr].phys_bus_addr  = phys;
	pmap[nr].local_ram_addr = virt;
	pmap[nr].addr_handle    = addr_handle;
}
/*
  Allocate one single entry in the map
*/
int diva_alloc_dma_map_entry(struct _diva_dma_map_entry *pmap) {
	int i;
	for (i = 0; (pmap && pmap[i].local_ram_addr); i++) {
		if (!pmap[i].busy) {
			pmap[i].busy = 1;
			return (i);
		}
	}
	return (-1);
}
/*
  Free one single entry in the map
*/
void diva_free_dma_map_entry(struct _diva_dma_map_entry *pmap, int nr) {
	pmap[nr].busy = 0;
}
/*
  Get information saved on the map entry
*/
void diva_get_dma_map_entry(struct _diva_dma_map_entry *pmap, int nr,
			    void **pvirt, dword *pphys) {
	*pphys = pmap[nr].phys_bus_addr;
	*pvirt = pmap[nr].local_ram_addr;
}
void *diva_get_entry_handle(struct _diva_dma_map_entry *pmap, int nr) {
	return (pmap[nr].addr_handle);
}
