/*
 * Copyright (C) 2000, 2001, 2002 Broadcom Corporation
 *
 * 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
 * of the License, or (at your option) any later version.
 *
 * 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.
 */
#ifndef CFE_API_INT_H
#define CFE_API_INT_H

/*
 * Constants.
 */
#define CFE_CMD_FW_GETINFO	0
#define CFE_CMD_FW_RESTART	1
#define CFE_CMD_FW_BOOT		2
#define CFE_CMD_FW_CPUCTL	3
#define CFE_CMD_FW_GETTIME      4
#define CFE_CMD_FW_MEMENUM	5
#define CFE_CMD_FW_FLUSHCACHE	6

#define CFE_CMD_DEV_GETHANDLE	9
#define CFE_CMD_DEV_ENUM	10
#define CFE_CMD_DEV_OPEN	11
#define CFE_CMD_DEV_INPSTAT	12
#define CFE_CMD_DEV_READ	13
#define CFE_CMD_DEV_WRITE	14
#define CFE_CMD_DEV_IOCTL	15
#define CFE_CMD_DEV_CLOSE	16
#define CFE_CMD_DEV_GETINFO	17

#define CFE_CMD_ENV_ENUM	20
#define CFE_CMD_ENV_GET		22
#define CFE_CMD_ENV_SET		23
#define CFE_CMD_ENV_DEL		24

#define CFE_CMD_MAX		32

#define CFE_CMD_VENDOR_USE	0x8000	/* codes above this are for customer use */

/*
 * Structures.
 */

/* eeek, signed "pointers" */
typedef s64 cfe_xptr_t;

struct xiocb_buffer {
	u64 buf_offset;		/* offset on device (bytes) */
	cfe_xptr_t  buf_ptr;		/* pointer to a buffer */
	u64 buf_length;		/* length of this buffer */
	u64 buf_retlen;		/* returned length (for read ops) */
	u64 buf_ioctlcmd;	/* IOCTL command (used only for IOCTLs) */
};

struct xiocb_inpstat {
	u64 inp_status;		/* 1 means input available */
};

struct xiocb_envbuf {
	s64 enum_idx;		/* 0-based enumeration index */
	cfe_xptr_t name_ptr;		/* name string buffer */
	s64 name_length;		/* size of name buffer */
	cfe_xptr_t val_ptr;		/* value string buffer */
	s64 val_length;		/* size of value string buffer */
};

struct xiocb_cpuctl {
	u64 cpu_number;		/* cpu number to control */
	u64 cpu_command;	/* command to issue to CPU */
	u64 start_addr;		/* CPU start address */
	u64 gp_val;		/* starting GP value */
	u64 sp_val;		/* starting SP value */
	u64 a1_val;		/* starting A1 value */
};

struct xiocb_time {
	s64 ticks;		/* current time in ticks */
};

struct xiocb_exitstat{
	s64 status;
};

struct xiocb_meminfo {
	s64 mi_idx;		/* 0-based enumeration index */
	s64 mi_type;		/* type of memory block */
	u64 mi_addr;		/* physical start address */
	u64 mi_size;		/* block size */
};

struct xiocb_fwinfo {
	s64 fwi_version;		/* major, minor, eco version */
	s64 fwi_totalmem;	/* total installed mem */
	s64 fwi_flags;		/* various flags */
	s64 fwi_boardid;		/* board ID */
	s64 fwi_bootarea_va;	/* VA of boot area */
	s64 fwi_bootarea_pa;	/* PA of boot area */
	s64 fwi_bootarea_size;	/* size of boot area */
	s64 fwi_reserved1;
	s64 fwi_reserved2;
	s64 fwi_reserved3;
};

struct cfe_xiocb {
	u64 xiocb_fcode;	/* IOCB function code */
	s64 xiocb_status;	/* return status */
	s64 xiocb_handle;	/* file/device handle */
	u64 xiocb_flags;	/* flags for this IOCB */
	u64 xiocb_psize;	/* size of parameter list */
	union {
		/* buffer parameters */
		struct xiocb_buffer xiocb_buffer;

		/* input status parameters */
		struct xiocb_inpstat xiocb_inpstat;

		/* environment function parameters */
		struct xiocb_envbuf xiocb_envbuf;

		/* CPU control parameters */
		struct xiocb_cpuctl xiocb_cpuctl;

		/* timer parameters */
		struct xiocb_time xiocb_time;

		/* memory arena info parameters */
		struct xiocb_meminfo xiocb_meminfo;

		/* firmware information */
		struct xiocb_fwinfo xiocb_fwinfo;

		/* Exit Status */
		struct xiocb_exitstat xiocb_exitstat;
	} plist;
};

#endif /* CFE_API_INT_H */
