/*
 * cmm.c
 *
 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
 *
 * The Communication(Shared) Memory Management(CMM) module provides
 * shared memory management services for DSP/BIOS Bridge data streaming
 * and messaging.
 *
 * Multiple shared memory segments can be registered with CMM.
 * Each registered SM segment is represented by a SM "allocator" that
 * describes a block of physically contiguous shared memory used for
 * future allocations by CMM.
 *
 * Memory is coalesced back to the appropriate heap when a buffer is
 * freed.
 *
 * Notes:
 *   Va: Virtual address.
 *   Pa: Physical or kernel system address.
 *
 * Copyright (C) 2005-2006 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.
 */
#include <linux/types.h>
#include <linux/list.h>

/*  ----------------------------------- DSP/BIOS Bridge */
#include <dspbridge/dbdefs.h>

/*  ----------------------------------- OS Adaptation Layer */
#include <dspbridge/sync.h>

/*  ----------------------------------- Platform Manager */
#include <dspbridge/dev.h>
#include <dspbridge/proc.h>

/*  ----------------------------------- This */
#include <dspbridge/cmm.h>

/*  ----------------------------------- Defines, Data Structures, Typedefs */
#define NEXT_PA(pnode)   (pnode->pa + pnode->size)

/* Other bus/platform translations */
#define DSPPA2GPPPA(base, x, y)  ((x)+(y))
#define GPPPA2DSPPA(base, x, y)  ((x)-(y))

/*
 *  Allocators define a block of contiguous memory used for future allocations.
 *
 *      sma - shared memory allocator.
 *      vma - virtual memory allocator.(not used).
 */
struct cmm_allocator {		/* sma */
	unsigned int shm_base;	/* Start of physical SM block */
	u32 sm_size;		/* Size of SM block in bytes */
	unsigned int vm_base;	/* Start of VM block. (Dev driver
					 * context for 'sma') */
	u32 dsp_phys_addr_offset;	/* DSP PA to GPP PA offset for this
					 * SM space */
	s8 c_factor;		/* DSPPa to GPPPa Conversion Factor */
	unsigned int dsp_base;	/* DSP virt base byte address */
	u32 dsp_size;	/* DSP seg size in bytes */
	struct cmm_object *cmm_mgr;	/* back ref to parent mgr */
	/* node list of available memory */
	struct list_head free_list;
	/* node list of memory in use */
	struct list_head in_use_list;
};

struct cmm_xlator {		/* Pa<->Va translator object */
	/* CMM object this translator associated */
	struct cmm_object *cmm_mgr;
	/*
	 *  Client process virtual base address that corresponds to phys SM
	 *  base address for translator's seg_id.
	 *  Only 1 segment ID currently supported.
	 */
	unsigned int virt_base;	/* virtual base address */
	u32 virt_size;		/* size of virt space in bytes */
	u32 seg_id;		/* Segment Id */
};

/* CMM Mgr */
struct cmm_object {
	/*
	 * Cmm Lock is used to serialize access mem manager for multi-threads.
	 */
	struct mutex cmm_lock;	/* Lock to access cmm mgr */
	struct list_head node_free_list;	/* Free list of memory nodes */
	u32 min_block_size;	/* Min SM block; default 16 bytes */
	u32 page_size;	/* Memory Page size (1k/4k) */
	/* GPP SM segment ptrs */
	struct cmm_allocator *pa_gppsm_seg_tab[CMM_MAXGPPSEGS];
};

/* Default CMM Mgr attributes */
static struct cmm_mgrattrs cmm_dfltmgrattrs = {
	/* min_block_size, min block size(bytes) allocated by cmm mgr */
	16
};

/* Default allocation attributes */
static struct cmm_attrs cmm_dfltalctattrs = {
	1		/* seg_id, default segment Id for allocator */
};

/* Address translator default attrs */
static struct cmm_xlatorattrs cmm_dfltxlatorattrs = {
	/* seg_id, does not have to match cmm_dfltalctattrs ul_seg_id */
	1,
	0,			/* dsp_bufs */
	0,			/* dsp_buf_size */
	NULL,			/* vm_base */
	0,			/* vm_size */
};

/* SM node representing a block of memory. */
struct cmm_mnode {
	struct list_head link;	/* must be 1st element */
	u32 pa;		/* Phys addr */
	u32 va;			/* Virtual address in device process context */
	u32 size;		/* SM block size in bytes */
	u32 client_proc;	/* Process that allocated this mem block */
};

/*  ----------------------------------- Function Prototypes */
static void add_to_free_list(struct cmm_allocator *allocator,
			     struct cmm_mnode *pnode);
static struct cmm_allocator *get_allocator(struct cmm_object *cmm_mgr_obj,
					   u32 ul_seg_id);
static struct cmm_mnode *get_free_block(struct cmm_allocator *allocator,
					u32 usize);
static struct cmm_mnode *get_node(struct cmm_object *cmm_mgr_obj, u32 dw_pa,
				  u32 dw_va, u32 ul_size);
/* get available slot for new allocator */
static s32 get_slot(struct cmm_object *cmm_mgr_obj);
static void un_register_gppsm_seg(struct cmm_allocator *psma);

/*
 *  ======== cmm_calloc_buf ========
 *  Purpose:
 *      Allocate a SM buffer, zero contents, and return the physical address
 *      and optional driver context virtual address(pp_buf_va).
 *
 *      The freelist is sorted in increasing size order. Get the first
 *      block that satifies the request and sort the remaining back on
 *      the freelist; if large enough. The kept block is placed on the
 *      inUseList.
 */
void *cmm_calloc_buf(struct cmm_object *hcmm_mgr, u32 usize,
		     struct cmm_attrs *pattrs, void **pp_buf_va)
{
	struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr;
	void *buf_pa = NULL;
	struct cmm_mnode *pnode = NULL;
	struct cmm_mnode *new_node = NULL;
	struct cmm_allocator *allocator = NULL;
	u32 delta_size;
	u8 *pbyte = NULL;
	s32 cnt;

	if (pattrs == NULL)
		pattrs = &cmm_dfltalctattrs;

	if (pp_buf_va != NULL)
		*pp_buf_va = NULL;

	if (cmm_mgr_obj && (usize != 0)) {
		if (pattrs->seg_id > 0) {
			/* SegId > 0 is SM */
			/* get the allocator object for this segment id */
			allocator =
			    get_allocator(cmm_mgr_obj, pattrs->seg_id);
			/* keep block size a multiple of min_block_size */
			usize =
			    ((usize - 1) & ~(cmm_mgr_obj->min_block_size -
					     1))
			    + cmm_mgr_obj->min_block_size;
			mutex_lock(&cmm_mgr_obj->cmm_lock);
			pnode = get_free_block(allocator, usize);
		}
		if (pnode) {
			delta_size = (pnode->size - usize);
			if (delta_size >= cmm_mgr_obj->min_block_size) {
				/* create a new block with the leftovers and
				 * add to freelist */
				new_node =
				    get_node(cmm_mgr_obj, pnode->pa + usize,
					     pnode->va + usize,
					     (u32) delta_size);
				/* leftovers go free */
				add_to_free_list(allocator, new_node);
				/* adjust our node's size */
				pnode->size = usize;
			}
			/* Tag node with client process requesting allocation
			 * We'll need to free up a process's alloc'd SM if the
			 * client process goes away.
			 */
			/* Return TGID instead of process handle */
			pnode->client_proc = current->tgid;

			/* put our node on InUse list */
			list_add_tail(&pnode->link, &allocator->in_use_list);
			buf_pa = (void *)pnode->pa;	/* physical address */
			/* clear mem */
			pbyte = (u8 *) pnode->va;
			for (cnt = 0; cnt < (s32) usize; cnt++, pbyte++)
				*pbyte = 0;

			if (pp_buf_va != NULL) {
				/* Virtual address */
				*pp_buf_va = (void *)pnode->va;
			}
		}
		mutex_unlock(&cmm_mgr_obj->cmm_lock);
	}
	return buf_pa;
}

/*
 *  ======== cmm_create ========
 *  Purpose:
 *      Create a communication memory manager object.
 */
int cmm_create(struct cmm_object **ph_cmm_mgr,
		      struct dev_object *hdev_obj,
		      const struct cmm_mgrattrs *mgr_attrts)
{
	struct cmm_object *cmm_obj = NULL;
	int status = 0;

	*ph_cmm_mgr = NULL;
	/* create, zero, and tag a cmm mgr object */
	cmm_obj = kzalloc(sizeof(struct cmm_object), GFP_KERNEL);
	if (!cmm_obj)
		return -ENOMEM;

	if (mgr_attrts == NULL)
		mgr_attrts = &cmm_dfltmgrattrs;	/* set defaults */

	/* save away smallest block allocation for this cmm mgr */
	cmm_obj->min_block_size = mgr_attrts->min_block_size;
	cmm_obj->page_size = PAGE_SIZE;

	/* create node free list */
	INIT_LIST_HEAD(&cmm_obj->node_free_list);
	mutex_init(&cmm_obj->cmm_lock);
	*ph_cmm_mgr = cmm_obj;

	return status;
}

/*
 *  ======== cmm_destroy ========
 *  Purpose:
 *      Release the communication memory manager resources.
 */
int cmm_destroy(struct cmm_object *hcmm_mgr, bool force)
{
	struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr;
	struct cmm_info temp_info;
	int status = 0;
	s32 slot_seg;
	struct cmm_mnode *node, *tmp;

	if (!hcmm_mgr) {
		status = -EFAULT;
		return status;
	}
	mutex_lock(&cmm_mgr_obj->cmm_lock);
	/* If not force then fail if outstanding allocations exist */
	if (!force) {
		/* Check for outstanding memory allocations */
		status = cmm_get_info(hcmm_mgr, &temp_info);
		if (!status) {
			if (temp_info.total_in_use_cnt > 0) {
				/* outstanding allocations */
				status = -EPERM;
			}
		}
	}
	if (!status) {
		/* UnRegister SM allocator */
		for (slot_seg = 0; slot_seg < CMM_MAXGPPSEGS; slot_seg++) {
			if (cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg] != NULL) {
				un_register_gppsm_seg
				    (cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg]);
				/* Set slot to NULL for future reuse */
				cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg] = NULL;
			}
		}
	}
	list_for_each_entry_safe(node, tmp, &cmm_mgr_obj->node_free_list,
			link) {
		list_del(&node->link);
		kfree(node);
	}
	mutex_unlock(&cmm_mgr_obj->cmm_lock);
	if (!status) {
		/* delete CS & cmm mgr object */
		mutex_destroy(&cmm_mgr_obj->cmm_lock);
		kfree(cmm_mgr_obj);
	}
	return status;
}

/*
 *  ======== cmm_free_buf ========
 *  Purpose:
 *      Free the given buffer.
 */
int cmm_free_buf(struct cmm_object *hcmm_mgr, void *buf_pa, u32 ul_seg_id)
{
	struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr;
	int status = -EFAULT;
	struct cmm_mnode *curr, *tmp;
	struct cmm_allocator *allocator;
	struct cmm_attrs *pattrs;

	if (ul_seg_id == 0) {
		pattrs = &cmm_dfltalctattrs;
		ul_seg_id = pattrs->seg_id;
	}
	if (!hcmm_mgr || !(ul_seg_id > 0)) {
		status = -EFAULT;
		return status;
	}

	allocator = get_allocator(cmm_mgr_obj, ul_seg_id);
	if (!allocator)
		return status;

	mutex_lock(&cmm_mgr_obj->cmm_lock);
	list_for_each_entry_safe(curr, tmp, &allocator->in_use_list, link) {
		if (curr->pa == (u32) buf_pa) {
			list_del(&curr->link);
			add_to_free_list(allocator, curr);
			status = 0;
			break;
		}
	}
	mutex_unlock(&cmm_mgr_obj->cmm_lock);

	return status;
}

/*
 *  ======== cmm_get_handle ========
 *  Purpose:
 *      Return the communication memory manager object for this device.
 *      This is typically called from the client process.
 */
int cmm_get_handle(void *hprocessor, struct cmm_object ** ph_cmm_mgr)
{
	int status = 0;
	struct dev_object *hdev_obj;

	if (hprocessor != NULL)
		status = proc_get_dev_object(hprocessor, &hdev_obj);
	else
		hdev_obj = dev_get_first();	/* default */

	if (!status)
		status = dev_get_cmm_mgr(hdev_obj, ph_cmm_mgr);

	return status;
}

/*
 *  ======== cmm_get_info ========
 *  Purpose:
 *      Return the current memory utilization information.
 */
int cmm_get_info(struct cmm_object *hcmm_mgr,
			struct cmm_info *cmm_info_obj)
{
	struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr;
	u32 ul_seg;
	int status = 0;
	struct cmm_allocator *altr;
	struct cmm_mnode *curr;

	if (!hcmm_mgr) {
		status = -EFAULT;
		return status;
	}
	mutex_lock(&cmm_mgr_obj->cmm_lock);
	cmm_info_obj->num_gppsm_segs = 0;	/* # of SM segments */
	/* Total # of outstanding alloc */
	cmm_info_obj->total_in_use_cnt = 0;
	/* min block size */
	cmm_info_obj->min_block_size = cmm_mgr_obj->min_block_size;
	/* check SM memory segments */
	for (ul_seg = 1; ul_seg <= CMM_MAXGPPSEGS; ul_seg++) {
		/* get the allocator object for this segment id */
		altr = get_allocator(cmm_mgr_obj, ul_seg);
		if (!altr)
			continue;
		cmm_info_obj->num_gppsm_segs++;
		cmm_info_obj->seg_info[ul_seg - 1].seg_base_pa =
			altr->shm_base - altr->dsp_size;
		cmm_info_obj->seg_info[ul_seg - 1].total_seg_size =
			altr->dsp_size + altr->sm_size;
		cmm_info_obj->seg_info[ul_seg - 1].gpp_base_pa =
			altr->shm_base;
		cmm_info_obj->seg_info[ul_seg - 1].gpp_size =
			altr->sm_size;
		cmm_info_obj->seg_info[ul_seg - 1].dsp_base_va =
			altr->dsp_base;
		cmm_info_obj->seg_info[ul_seg - 1].dsp_size =
			altr->dsp_size;
		cmm_info_obj->seg_info[ul_seg - 1].seg_base_va =
			altr->vm_base - altr->dsp_size;
		cmm_info_obj->seg_info[ul_seg - 1].in_use_cnt = 0;

		list_for_each_entry(curr, &altr->in_use_list, link) {
			cmm_info_obj->total_in_use_cnt++;
			cmm_info_obj->seg_info[ul_seg - 1].in_use_cnt++;
		}
	}
	mutex_unlock(&cmm_mgr_obj->cmm_lock);
	return status;
}

/*
 *  ======== cmm_register_gppsm_seg ========
 *  Purpose:
 *      Register a block of SM with the CMM to be used for later GPP SM
 *      allocations.
 */
int cmm_register_gppsm_seg(struct cmm_object *hcmm_mgr,
				  u32 dw_gpp_base_pa, u32 ul_size,
				  u32 dsp_addr_offset, s8 c_factor,
				  u32 dw_dsp_base, u32 ul_dsp_size,
				  u32 *sgmt_id, u32 gpp_base_va)
{
	struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr;
	struct cmm_allocator *psma = NULL;
	int status = 0;
	struct cmm_mnode *new_node;
	s32 slot_seg;

	dev_dbg(bridge, "%s: dw_gpp_base_pa %x ul_size %x dsp_addr_offset %x "
			"dw_dsp_base %x ul_dsp_size %x gpp_base_va %x\n",
			__func__, dw_gpp_base_pa, ul_size, dsp_addr_offset,
			dw_dsp_base, ul_dsp_size, gpp_base_va);

	if (!hcmm_mgr)
		return -EFAULT;

	/* make sure we have room for another allocator */
	mutex_lock(&cmm_mgr_obj->cmm_lock);

	slot_seg = get_slot(cmm_mgr_obj);
	if (slot_seg < 0) {
		status = -EPERM;
		goto func_end;
	}

	/* Check if input ul_size is big enough to alloc at least one block */
	if (ul_size < cmm_mgr_obj->min_block_size) {
		status = -EINVAL;
		goto func_end;
	}

	/* create, zero, and tag an SM allocator object */
	psma = kzalloc(sizeof(struct cmm_allocator), GFP_KERNEL);
	if (!psma) {
		status = -ENOMEM;
		goto func_end;
	}

	psma->cmm_mgr = hcmm_mgr;	/* ref to parent */
	psma->shm_base = dw_gpp_base_pa;	/* SM Base phys */
	psma->sm_size = ul_size;	/* SM segment size in bytes */
	psma->vm_base = gpp_base_va;
	psma->dsp_phys_addr_offset = dsp_addr_offset;
	psma->c_factor = c_factor;
	psma->dsp_base = dw_dsp_base;
	psma->dsp_size = ul_dsp_size;
	if (psma->vm_base == 0) {
		status = -EPERM;
		goto func_end;
	}
	/* return the actual segment identifier */
	*sgmt_id = (u32) slot_seg + 1;

	INIT_LIST_HEAD(&psma->free_list);
	INIT_LIST_HEAD(&psma->in_use_list);

	/* Get a mem node for this hunk-o-memory */
	new_node = get_node(cmm_mgr_obj, dw_gpp_base_pa,
			psma->vm_base, ul_size);
	/* Place node on the SM allocator's free list */
	if (new_node) {
		list_add_tail(&new_node->link, &psma->free_list);
	} else {
		status = -ENOMEM;
		goto func_end;
	}
	/* make entry */
	cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg] = psma;

func_end:
	/* Cleanup allocator */
	if (status && psma)
		un_register_gppsm_seg(psma);
	mutex_unlock(&cmm_mgr_obj->cmm_lock);

	return status;
}

/*
 *  ======== cmm_un_register_gppsm_seg ========
 *  Purpose:
 *      UnRegister GPP SM segments with the CMM.
 */
int cmm_un_register_gppsm_seg(struct cmm_object *hcmm_mgr,
				     u32 ul_seg_id)
{
	struct cmm_object *cmm_mgr_obj = (struct cmm_object *)hcmm_mgr;
	int status = 0;
	struct cmm_allocator *psma;
	u32 ul_id = ul_seg_id;

	if (!hcmm_mgr)
		return -EFAULT;

	if (ul_seg_id == CMM_ALLSEGMENTS)
		ul_id = 1;

	if ((ul_id <= 0) || (ul_id > CMM_MAXGPPSEGS))
		return -EINVAL;

	/*
	 * FIXME: CMM_MAXGPPSEGS == 1. why use a while cycle? Seems to me like
	 * the ul_seg_id is not needed here. It must be always 1.
	 */
	while (ul_id <= CMM_MAXGPPSEGS) {
		mutex_lock(&cmm_mgr_obj->cmm_lock);
		/* slot = seg_id-1 */
		psma = cmm_mgr_obj->pa_gppsm_seg_tab[ul_id - 1];
		if (psma != NULL) {
			un_register_gppsm_seg(psma);
			/* Set alctr ptr to NULL for future reuse */
			cmm_mgr_obj->pa_gppsm_seg_tab[ul_id - 1] = NULL;
		} else if (ul_seg_id != CMM_ALLSEGMENTS) {
			status = -EPERM;
		}
		mutex_unlock(&cmm_mgr_obj->cmm_lock);
		if (ul_seg_id != CMM_ALLSEGMENTS)
			break;

		ul_id++;
	}	/* end while */
	return status;
}

/*
 *  ======== un_register_gppsm_seg ========
 *  Purpose:
 *      UnRegister the SM allocator by freeing all its resources and
 *      nulling cmm mgr table entry.
 *  Note:
 *      This routine is always called within cmm lock crit sect.
 */
static void un_register_gppsm_seg(struct cmm_allocator *psma)
{
	struct cmm_mnode *curr, *tmp;

	/* free nodes on free list */
	list_for_each_entry_safe(curr, tmp, &psma->free_list, link) {
		list_del(&curr->link);
		kfree(curr);
	}

	/* free nodes on InUse list */
	list_for_each_entry_safe(curr, tmp, &psma->in_use_list, link) {
		list_del(&curr->link);
		kfree(curr);
	}

	if ((void *)psma->vm_base != NULL)
		MEM_UNMAP_LINEAR_ADDRESS((void *)psma->vm_base);

	/* Free allocator itself */
	kfree(psma);
}

/*
 *  ======== get_slot ========
 *  Purpose:
 *      An available slot # is returned. Returns negative on failure.
 */
static s32 get_slot(struct cmm_object *cmm_mgr_obj)
{
	s32 slot_seg = -1;	/* neg on failure */
	/* get first available slot in cmm mgr SMSegTab[] */
	for (slot_seg = 0; slot_seg < CMM_MAXGPPSEGS; slot_seg++) {
		if (cmm_mgr_obj->pa_gppsm_seg_tab[slot_seg] == NULL)
			break;

	}
	if (slot_seg == CMM_MAXGPPSEGS)
		slot_seg = -1;	/* failed */

	return slot_seg;
}

/*
 *  ======== get_node ========
 *  Purpose:
 *      Get a memory node from freelist or create a new one.
 */
static struct cmm_mnode *get_node(struct cmm_object *cmm_mgr_obj, u32 dw_pa,
				  u32 dw_va, u32 ul_size)
{
	struct cmm_mnode *pnode;

	/* Check cmm mgr's node freelist */
	if (list_empty(&cmm_mgr_obj->node_free_list)) {
		pnode = kzalloc(sizeof(struct cmm_mnode), GFP_KERNEL);
		if (!pnode)
			return NULL;
	} else {
		/* surely a valid element */
		pnode = list_first_entry(&cmm_mgr_obj->node_free_list,
				struct cmm_mnode, link);
		list_del_init(&pnode->link);
	}

	pnode->pa = dw_pa;
	pnode->va = dw_va;
	pnode->size = ul_size;

	return pnode;
}

/*
 *  ======== delete_node ========
 *  Purpose:
 *      Put a memory node on the cmm nodelist for later use.
 *      Doesn't actually delete the node. Heap thrashing friendly.
 */
static void delete_node(struct cmm_object *cmm_mgr_obj, struct cmm_mnode *pnode)
{
	list_add_tail(&pnode->link, &cmm_mgr_obj->node_free_list);
}

/*
 * ====== get_free_block ========
 *  Purpose:
 *      Scan the free block list and return the first block that satisfies
 *      the size.
 */
static struct cmm_mnode *get_free_block(struct cmm_allocator *allocator,
					u32 usize)
{
	struct cmm_mnode *node, *tmp;

	if (!allocator)
		return NULL;

	list_for_each_entry_safe(node, tmp, &allocator->free_list, link) {
		if (usize <= node->size) {
			list_del(&node->link);
			return node;
		}
	}

	return NULL;
}

/*
 *  ======== add_to_free_list ========
 *  Purpose:
 *      Coalesce node into the freelist in ascending size order.
 */
static void add_to_free_list(struct cmm_allocator *allocator,
			     struct cmm_mnode *node)
{
	struct cmm_mnode *curr;

	if (!node) {
		pr_err("%s: failed - node is NULL\n", __func__);
		return;
	}

	list_for_each_entry(curr, &allocator->free_list, link) {
		if (NEXT_PA(curr) == node->pa) {
			curr->size += node->size;
			delete_node(allocator->cmm_mgr, node);
			return;
		}
		if (curr->pa == NEXT_PA(node)) {
			curr->pa = node->pa;
			curr->va = node->va;
			curr->size += node->size;
			delete_node(allocator->cmm_mgr, node);
			return;
		}
	}
	list_for_each_entry(curr, &allocator->free_list, link) {
		if (curr->size >= node->size) {
			list_add_tail(&node->link, &curr->link);
			return;
		}
	}
	list_add_tail(&node->link, &allocator->free_list);
}

/*
 * ======== get_allocator ========
 *  Purpose:
 *      Return the allocator for the given SM Segid.
 *      SegIds:  1,2,3..max.
 */
static struct cmm_allocator *get_allocator(struct cmm_object *cmm_mgr_obj,
					   u32 ul_seg_id)
{
	return cmm_mgr_obj->pa_gppsm_seg_tab[ul_seg_id - 1];
}

/*
 *  The CMM_Xlator[xxx] routines below are used by Node and Stream
 *  to perform SM address translation to the client process address space.
 *  A "translator" object is created by a node/stream for each SM seg used.
 */

/*
 *  ======== cmm_xlator_create ========
 *  Purpose:
 *      Create an address translator object.
 */
int cmm_xlator_create(struct cmm_xlatorobject **xlator,
			     struct cmm_object *hcmm_mgr,
			     struct cmm_xlatorattrs *xlator_attrs)
{
	struct cmm_xlator *xlator_object = NULL;
	int status = 0;

	*xlator = NULL;
	if (xlator_attrs == NULL)
		xlator_attrs = &cmm_dfltxlatorattrs;	/* set defaults */

	xlator_object = kzalloc(sizeof(struct cmm_xlator), GFP_KERNEL);
	if (xlator_object != NULL) {
		xlator_object->cmm_mgr = hcmm_mgr;	/* ref back to CMM */
		/* SM seg_id */
		xlator_object->seg_id = xlator_attrs->seg_id;
	} else {
		status = -ENOMEM;
	}
	if (!status)
		*xlator = (struct cmm_xlatorobject *)xlator_object;

	return status;
}

/*
 *  ======== cmm_xlator_alloc_buf ========
 */
void *cmm_xlator_alloc_buf(struct cmm_xlatorobject *xlator, void *va_buf,
			   u32 pa_size)
{
	struct cmm_xlator *xlator_obj = (struct cmm_xlator *)xlator;
	void *pbuf = NULL;
	void *tmp_va_buff;
	struct cmm_attrs attrs;

	if (xlator_obj) {
		attrs.seg_id = xlator_obj->seg_id;
		__raw_writel(0, va_buf);
		/* Alloc SM */
		pbuf =
		    cmm_calloc_buf(xlator_obj->cmm_mgr, pa_size, &attrs, NULL);
		if (pbuf) {
			/* convert to translator(node/strm) process Virtual
			 * address */
			 tmp_va_buff = cmm_xlator_translate(xlator,
							 pbuf, CMM_PA2VA);
			__raw_writel((u32)tmp_va_buff, va_buf);
		}
	}
	return pbuf;
}

/*
 *  ======== cmm_xlator_free_buf ========
 *  Purpose:
 *      Free the given SM buffer and descriptor.
 *      Does not free virtual memory.
 */
int cmm_xlator_free_buf(struct cmm_xlatorobject *xlator, void *buf_va)
{
	struct cmm_xlator *xlator_obj = (struct cmm_xlator *)xlator;
	int status = -EPERM;
	void *buf_pa = NULL;

	if (xlator_obj) {
		/* convert Va to Pa so we can free it. */
		buf_pa = cmm_xlator_translate(xlator, buf_va, CMM_VA2PA);
		if (buf_pa) {
			status = cmm_free_buf(xlator_obj->cmm_mgr, buf_pa,
					      xlator_obj->seg_id);
			if (status) {
				/* Uh oh, this shouldn't happen. Descriptor
				 * gone! */
				pr_err("%s, line %d: Assertion failed\n",
				       __FILE__, __LINE__);
			}
		}
	}
	return status;
}

/*
 *  ======== cmm_xlator_info ========
 *  Purpose:
 *      Set/Get translator info.
 */
int cmm_xlator_info(struct cmm_xlatorobject *xlator, u8 ** paddr,
			   u32 ul_size, u32 segm_id, bool set_info)
{
	struct cmm_xlator *xlator_obj = (struct cmm_xlator *)xlator;
	int status = 0;

	if (xlator_obj) {
		if (set_info) {
			/* set translators virtual address range */
			xlator_obj->virt_base = (u32) *paddr;
			xlator_obj->virt_size = ul_size;
		} else {	/* return virt base address */
			*paddr = (u8 *) xlator_obj->virt_base;
		}
	} else {
		status = -EFAULT;
	}
	return status;
}

/*
 *  ======== cmm_xlator_translate ========
 */
void *cmm_xlator_translate(struct cmm_xlatorobject *xlator, void *paddr,
			   enum cmm_xlatetype xtype)
{
	u32 dw_addr_xlate = 0;
	struct cmm_xlator *xlator_obj = (struct cmm_xlator *)xlator;
	struct cmm_object *cmm_mgr_obj = NULL;
	struct cmm_allocator *allocator = NULL;
	u32 dw_offset = 0;

	if (!xlator_obj)
		goto loop_cont;

	cmm_mgr_obj = (struct cmm_object *)xlator_obj->cmm_mgr;
	/* get this translator's default SM allocator */
	allocator = cmm_mgr_obj->pa_gppsm_seg_tab[xlator_obj->seg_id - 1];
	if (!allocator)
		goto loop_cont;

	if ((xtype == CMM_VA2DSPPA) || (xtype == CMM_VA2PA) ||
	    (xtype == CMM_PA2VA)) {
		if (xtype == CMM_PA2VA) {
			/* Gpp Va = Va Base + offset */
			dw_offset = (u8 *) paddr - (u8 *) (allocator->shm_base -
							   allocator->
							   dsp_size);
			dw_addr_xlate = xlator_obj->virt_base + dw_offset;
			/* Check if translated Va base is in range */
			if ((dw_addr_xlate < xlator_obj->virt_base) ||
			    (dw_addr_xlate >=
			     (xlator_obj->virt_base +
			      xlator_obj->virt_size))) {
				dw_addr_xlate = 0;	/* bad address */
			}
		} else {
			/* Gpp PA =  Gpp Base + offset */
			dw_offset =
			    (u8 *) paddr - (u8 *) xlator_obj->virt_base;
			dw_addr_xlate =
			    allocator->shm_base - allocator->dsp_size +
			    dw_offset;
		}
	} else {
		dw_addr_xlate = (u32) paddr;
	}
	/*Now convert address to proper target physical address if needed */
	if ((xtype == CMM_VA2DSPPA) || (xtype == CMM_PA2DSPPA)) {
		/* Got Gpp Pa now, convert to DSP Pa */
		dw_addr_xlate =
		    GPPPA2DSPPA((allocator->shm_base - allocator->dsp_size),
				dw_addr_xlate,
				allocator->dsp_phys_addr_offset *
				allocator->c_factor);
	} else if (xtype == CMM_DSPPA2PA) {
		/* Got DSP Pa, convert to GPP Pa */
		dw_addr_xlate =
		    DSPPA2GPPPA(allocator->shm_base - allocator->dsp_size,
				dw_addr_xlate,
				allocator->dsp_phys_addr_offset *
				allocator->c_factor);
	}
loop_cont:
	return (void *)dw_addr_xlate;
}
