/*
 *      RAR Handler (/dev/memrar) internal driver API.
 *      Copyright (C) 2010 Intel Corporation. All rights reserved.
 *
 *      This program is free software; you can redistribute it and/or
 *      modify it under the terms of version 2 of the GNU General
 *      Public License as published by the Free Software Foundation.
 *
 *      This program is distributed in the hope that it will be
 *      useful, but WITHOUT ANY WARRANTY; without even the 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., 59 Temple Place - Suite 330,
 *      Boston, MA  02111-1307, USA.
 *      The full GNU General Public License is included in this
 *      distribution in the file called COPYING.
 */


#ifndef _MEMRAR_H
#define _MEMRAR_H

#include <linux/ioctl.h>
#include <linux/types.h>


/**
 * struct RAR_stat - RAR statistics structure
 * @type:		Type of RAR memory (e.g., audio vs. video)
 * @capacity:		Total size of RAR memory region.
 * @largest_block_size:	Size of the largest reservable block.
 *
 * This structure is used for RAR_HANDLER_STAT ioctl and for the
 * RAR_get_stat() user space wrapper function.
 */
struct RAR_stat {
	__u32 type;
	__u32 capacity;
	__u32 largest_block_size;
};


/**
 * struct RAR_block_info - user space struct that describes RAR buffer
 * @type:	Type of RAR memory (e.g., audio vs. video)
 * @size:	Requested size of a block to be reserved in RAR.
 * @handle:	Handle that can be used to refer to reserved block.
 *
 * This is the basic structure exposed to the user space that
 * describes a given RAR buffer.  The buffer's underlying bus address
 * is not exposed to the user.  User space code refers to the buffer
 * entirely by "handle".
 */
struct RAR_block_info {
	__u32 type;
	__u32 size;
	__u32 handle;
};


#define RAR_IOCTL_BASE 0xE0

/* Reserve RAR block. */
#define RAR_HANDLER_RESERVE _IOWR(RAR_IOCTL_BASE, 0x00, struct RAR_block_info)

/* Release previously reserved RAR block. */
#define RAR_HANDLER_RELEASE _IOW(RAR_IOCTL_BASE, 0x01, __u32)

/* Get RAR stats. */
#define RAR_HANDLER_STAT    _IOWR(RAR_IOCTL_BASE, 0x02, struct RAR_stat)


#ifdef __KERNEL__

/* -------------------------------------------------------------- */
/*               Kernel Side RAR Handler Interface                */
/* -------------------------------------------------------------- */

/**
 * struct RAR_buffer - kernel space struct that describes RAR buffer
 * @info:		structure containing base RAR buffer information
 * @bus_address:	buffer bus address
 *
 * Structure that contains all information related to a given block of
 * memory in RAR.  It is generally only used when retrieving RAR
 * related bus addresses.
 *
 * Note: This structure is used only by RAR-enabled drivers, and is
 *       not intended to be exposed to the user space.
 */
struct RAR_buffer {
	struct RAR_block_info info;
	dma_addr_t bus_address;
};

#if defined(CONFIG_MRST_RAR_HANDLER)
/**
 * rar_reserve() - reserve RAR buffers
 * @buffers:	array of RAR_buffers where type and size of buffers to
 *		reserve are passed in, handle and bus address are
 *		passed out
 * @count:	number of RAR_buffers in the "buffers" array
 *
 * This function will reserve buffers in the restricted access regions
 * of given types.
 *
 * It returns the number of successfully reserved buffers.  Successful
 * buffer reservations will have the corresponding bus_address field
 * set to a non-zero value in the given buffers vector.
 */
extern size_t rar_reserve(struct RAR_buffer *buffers,
			  size_t count);

/**
 * rar_release() - release RAR buffers
 * @buffers:	array of RAR_buffers where handles to buffers to be
 *		released are passed in
 * @count:	number of RAR_buffers in the "buffers" array
 *
 * This function will release RAR buffers that were retrieved through
 * a call to rar_reserve() or rar_handle_to_bus() by decrementing the
 * reference count.  The RAR buffer will be reclaimed when the
 * reference count drops to zero.
 *
 * It returns the number of successfully released buffers.  Successful
 * releases will have their handle field set to zero in the given
 * buffers vector.
 */
extern size_t rar_release(struct RAR_buffer *buffers,
			  size_t count);

/**
 * rar_handle_to_bus() - convert a vector of RAR handles to bus addresses
 * @buffers:	array of RAR_buffers containing handles to be
 *		converted to bus_addresses
 * @count:	number of RAR_buffers in the "buffers" array

 * This function will retrieve the RAR buffer bus addresses, type and
 * size corresponding to the RAR handles provided in the buffers
 * vector.
 *
 * It returns the number of successfully converted buffers.  The bus
 * address will be set to 0 for unrecognized handles.
 *
 * The reference count for each corresponding buffer in RAR will be
 * incremented.  Call rar_release() when done with the buffers.
 */
extern size_t rar_handle_to_bus(struct RAR_buffer *buffers,
				size_t count);

#else

extern inline size_t rar_reserve(struct RAR_buffer *buffers, size_t count)
{
	return 0;
}

extern inline size_t rar_release(struct RAR_buffer *buffers, size_t count)
{
	return 0;
}

extern inline size_t rar_handle_to_bus(struct RAR_buffer *buffers,
				size_t count)
{
	return 0;
}

#endif  /* MRST_RAR_HANDLER */
#endif  /* __KERNEL__ */

#endif  /* _MEMRAR_H */
