/*
 * cmmdefs.h
 *
 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
 *
 * Global MEM constants and types.
 *
 * Copyright (C) 2008 Texas Instruments, Inc.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

#ifndef CMMDEFS_
#define CMMDEFS_


/* Cmm attributes used in cmm_create() */
struct cmm_mgrattrs {
	/* Minimum SM allocation; default 32 bytes. */
	u32 min_block_size;
};

/* Attributes for CMM_AllocBuf() & CMM_AllocDesc() */
struct cmm_attrs {
	u32 seg_id;		/*  1,2... are SM segments. 0 is not. */
	u32 alignment;		/*  0,1,2,4....min_block_size */
};

/*
 *  DSPPa to GPPPa Conversion Factor.
 *
 *  For typical platforms:
 *      converted Address = PaDSP + ( c_factor * addressToConvert).
 */
#define CMM_SUBFROMDSPPA	-1
#define CMM_ADDTODSPPA		1

#define CMM_ALLSEGMENTS         0xFFFFFF	/* All SegIds */
#define CMM_MAXGPPSEGS          1	/* Maximum # of SM segs */

/*
 *  SMSEGs are SM segments the DSP allocates from.
 *
 *  This info is used by the GPP to xlate DSP allocated PAs.
 */

struct cmm_seginfo {
	u32 seg_base_pa;	/* Start Phys address of SM segment */
	/* Total size in bytes of segment: DSP+GPP */
	u32 total_seg_size;
	u32 gpp_base_pa;	/* Start Phys addr of Gpp SM seg */
	u32 gpp_size;	/* Size of Gpp SM seg in bytes */
	u32 dsp_base_va;	/* DSP virt base byte address */
	u32 dsp_size;		/* DSP seg size in bytes */
	/* # of current GPP allocations from this segment */
	u32 in_use_cnt;
	u32 seg_base_va;	/* Start Virt address of SM seg */

};

/* CMM useful information */
struct cmm_info {
	/* # of SM segments registered with this Cmm. */
	u32 num_gppsm_segs;
	/* Total # of allocations outstanding for CMM */
	u32 total_in_use_cnt;
	/* Min SM block size allocation from cmm_create() */
	u32 min_block_size;
	/* Info per registered SM segment. */
	struct cmm_seginfo seg_info[CMM_MAXGPPSEGS];
};

/* XlatorCreate attributes */
struct cmm_xlatorattrs {
	u32 seg_id;		/* segment Id used for SM allocations */
	u32 dsp_bufs;		/* # of DSP-side bufs */
	u32 dsp_buf_size;	/* size of DSP-side bufs in GPP bytes */
	/* Vm base address alloc'd in client process context */
	void *vm_base;
	/* vm_size must be >= (dwMaxNumBufs * dwMaxSize) */
	u32 vm_size;
};

/*
 * Cmm translation types. Use to map SM addresses to process context.
 */
enum cmm_xlatetype {
	CMM_VA2PA = 0,		/* Virtual to GPP physical address xlation */
	CMM_PA2VA = 1,		/* GPP Physical to virtual */
	CMM_VA2DSPPA = 2,	/* Va to DSP Pa */
	CMM_PA2DSPPA = 3,	/* GPP Pa to DSP Pa */
	CMM_DSPPA2PA = 4,	/* DSP Pa to GPP Pa */
};

struct cmm_object;
struct cmm_xlatorobject;

#endif /* CMMDEFS_ */
