OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [include/] [asm-ia64/] [sn/] [alenlist.h] - Rev 1774

Go to most recent revision | Compare with Previous | Blame | View Log

/* $Id: alenlist.h,v 1.1.1.1 2004-04-15 02:42:28 phoenix Exp $
 *
 * 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.
 *
 * Copyright (C) 1992 - 1997, 2000-2003 Silicon Graphics, Inc. All rights reserved.
 */
#ifndef _ASM_IA64_SN_ALENLIST_H
#define _ASM_IA64_SN_ALENLIST_H
 
#include <linux/types.h>
 
/* Definition of Address/Length List */
 
/*
 * An Address/Length List is used when setting up for an I/O DMA operation.
 * A driver creates an Address/Length List that describes to the the DMA 
 * interface where in memory the DMA should go.  The bus interface sets up 
 * mapping registers, if required, and returns a suitable list of "physical 
 * addresses" or "I/O address" to the driver.  The driver then uses these 
 * to set up an appropriate scatter/gather operation(s).
 */
 
#ifdef __cplusplus
extern "C" {
#endif
 
/*
 * An Address/Length List Address.  It'll get cast to the appropriate type,
 * and must be big enough to hold the largest possible address in any
 * supported address space.
 */
typedef u64 alenaddr_t;
typedef u64 uvaddr_t;
 
typedef struct alenlist_s *alenlist_t;
 
/* 
 * For tracking progress as we walk down an address/length list.
 */
typedef struct alenlist_cursor_s *alenlist_cursor_t;
 
/*
 * alenlist representation that can be passed via an idl
 */
struct external_alenlist {
	alenaddr_t	addr;
	size_t		len;
};
typedef struct external_alenlist *external_alenlist_t;
 
 
/* Return codes from alenlist routines.  */
#define ALENLIST_FAILURE (-1)
#define ALENLIST_SUCCESS 0
 
 
/* Flags to alenlist routines */
#define AL_NOSLEEP	0x01		/* Do not sleep, waiting for memory */
#define AL_NOCOMPACT	0x02		/* Do not try to compact adjacent entries */
#define AL_LEAVE_CURSOR	0x04		/* Do not update cursor */
 
 
/* Create an Address/Length List, and clear it of all entries.  */
extern alenlist_t alenlist_create(unsigned flags);
 
/* Grow/shrink an Address/Length List and FIX its size. */
extern int alenlist_grow(alenlist_t, size_t npairs);
 
/* Clear an Address/Length List so that it now describes 0 pairs. */
extern void alenlist_clear(alenlist_t alenlist);
 
/*
 * Convenience function to create an Address/Length List and then append 
 * the specified Address/Length Pair.  Exactly the same as alenlist_create 
 * followed by alenlist_append.  Can be used when a small list (e.g. 1 pair)
 * is adequate.
 */
extern alenlist_t
alenpair_init(	alenaddr_t address, 			/* init to this address */
		size_t length);				/* init to this length */
 
/* 
 * Peek at the head of an Address/Length List.  This does *NOT* update
 * the internal cursor.
 */
extern int
alenpair_get(	alenlist_t alenlist,		/* in: get from this List */
		alenaddr_t *address,		/* out: address */
		size_t *length);		/* out: length */
 
/* Free the space consumed by an Address/Length List. */
extern void alenlist_destroy(alenlist_t alenlist);
 
/*
 * Indicate that we're done using an Address/Length List.
 * If we are the last user, destroy the List.
 */
extern void
alenlist_done(alenlist_t alenlist);
 
/* Append another Pair to a List */
extern int alenlist_append(alenlist_t alenlist, 	/* append to this list */
			alenaddr_t address,		/* address to append */
			size_t length,			/* length to append */
			unsigned flags);
 
/* 
 * Replace a Pair in the middle of a List, and return old values.
 * (not generally useful for drivers; used by bus providers).
 */
extern int
alenlist_replace(	alenlist_t alenlist, 		/* in: replace in this list */
			alenlist_cursor_t cursorp,	/* inout: which item to replace */
			alenaddr_t *addrp, 		/* inout: address */
			size_t *lengthp,		/* inout: length */
			unsigned flags);
 
 
/* Get the next Pair from a List */
extern int alenlist_get(alenlist_t alenlist, 		/* in: get from this list */
			alenlist_cursor_t cursorp,	/* inout: which item to get */
			size_t maxlength,		/* in: at most length */
			alenaddr_t *addr, 		/* out: address */
			size_t *length,			/* out: length */
			unsigned flags);
 
 
/* Return the number of Pairs stored in this List */
extern int alenlist_size(alenlist_t alenlist);
 
/* Concatenate two Lists. */
extern void alenlist_concat(	alenlist_t from, 	/* copy from this list */
				alenlist_t to);		/* to this list */
 
/* Create a copy of an Address/Length List */
extern alenlist_t alenlist_clone(alenlist_t old,	/* clone this list */
				 unsigned flags);
 
 
/* Allocate and initialize an Address/Length List Cursor */
extern alenlist_cursor_t alenlist_cursor_create(alenlist_t alenlist, unsigned flags);
 
/* Free an Address/Length List Cursor */
extern void alenlist_cursor_destroy(alenlist_cursor_t cursorp);
 
/*
 * Initialize an Address/Length List Cursor in order to walk thru an
 * Address/Length List from the beginning.
 */
extern int alenlist_cursor_init(alenlist_t alenlist, 
				size_t offset, 
				alenlist_cursor_t cursorp);
 
/* Clone an Address/Length List Cursor. */
extern int alenlist_cursor_clone(alenlist_t alenlist, 
				alenlist_cursor_t cursorp_in, 
				alenlist_cursor_t cursorp_out);
 
/* 
 * Return the number of bytes passed so far according to the specified
 * Address/Length List Cursor.
 */
extern size_t alenlist_cursor_offset(alenlist_t alenlist, alenlist_cursor_t cursorp);
 
 
 
 
/* Convert from a Kernel Virtual Address to a Physical Address/Length List */
extern alenlist_t kvaddr_to_alenlist(	alenlist_t alenlist, 
					caddr_t kvaddr, 
					size_t length, 
					unsigned flags);
 
/* Convert from a User Virtual Address to a Physical Address/Length List */
extern alenlist_t uvaddr_to_alenlist(	alenlist_t alenlist,
					uvaddr_t vaddr, 
					size_t length,
					unsigned flags);
 
/* Convert from a buf struct to a Physical Address/Length List */
struct buf;
extern alenlist_t buf_to_alenlist(	alenlist_t alenlist, 
					struct buf *buf, 
					unsigned flags);
 
 
/* 
 * Tracking position as we walk down an Address/Length List.
 * This structure is NOT generally for use by device drivers.
 */
struct alenlist_cursor_s {
	struct alenlist_s	*al_alenlist;	/* which list */
	size_t			al_offset;	/* total bytes passed by cursor */
	struct alenlist_chunk_s	*al_chunk;	/* which chunk in alenlist */
	unsigned int		al_index;	/* which pair in chunk */
	size_t			al_bcount;	/* offset into address/length pair */
};
 
#ifdef __cplusplus
}
#endif
 
#endif /* _ASM_IA64_SN_ALENLIST_H */
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.