
/* OS abstraction functions used by PFE control code */

#include <linux/slab.h>

#include "pfe_ctrl_hal.h"

#include "pfe_mod.h"

extern char *__class_dmem_sh;
extern char *__class_pe_lmem_sh;
extern char *__tmu_dmem_sh;
extern char *__util_dmem_sh;
extern char *__util_ddr_sh;

HostMessage msg_buf;
static int msg_buf_used = 0;

unsigned long virt_to_class(void *p)
{
	if (!p)
		return 0;

	if (p >= (void *)&__class_pe_lmem_sh)
		return virt_to_class_pe_lmem(p);
	else
		return virt_to_class_dmem(p);
}

unsigned long virt_to_class_dmem(void *p)
{
	struct pfe_ctrl *ctrl = &pfe->ctrl;

	if (p)
		return (unsigned long)p - (unsigned long)&__class_dmem_sh + ctrl->class_dmem_sh;
	else
		return 0;
}

unsigned long virt_to_class_pe_lmem(void *p)
{
	struct pfe_ctrl *ctrl = &pfe->ctrl;

	if (p)
		return (unsigned long)p - (unsigned long)&__class_pe_lmem_sh + ctrl->class_pe_lmem_sh;
	else
		return 0;
}

unsigned long virt_to_tmu_dmem(void *p)
{
	struct pfe_ctrl *ctrl = &pfe->ctrl;

	if (p)
		return (unsigned long)p - (unsigned long)&__tmu_dmem_sh + ctrl->tmu_dmem_sh;
	else
		return 0;
}


unsigned long virt_to_util_dmem(void *p)
{
	struct pfe_ctrl *ctrl = &pfe->ctrl;

	if (p)
		return (unsigned long)p - (unsigned long)&__util_dmem_sh + ctrl->util_dmem_sh;
	else
		return 0;
}

/** Returns the DDR physical address of a Util PE shared DDR variable.
 *
 * @param p	pointer (kernel space, virtual) to be converted to a physical address.
 */
unsigned long virt_to_util_ddr(void *p)
{
	struct pfe_ctrl *ctrl = &pfe->ctrl;

	if (p)
		return (unsigned long)p - (unsigned long)&__util_ddr_sh + ctrl->util_ddr_sh;
	else
		return 0;
}
/** Returns the virtual address of a Util PE shared DDR variable.
 *
 * @param p pointer (kernel space, virtual) to be converted to a pointer (usable in kernel space)
 * pointing to the actual data.
 */

void * virt_to_util_virt(void *p)
{
	if (p)
		return DDR_PHYS_TO_VIRT(virt_to_util_ddr(p));
	else
		return NULL;
}

unsigned long virt_to_phys_iram(void *p)
{
	if (p)
		return (p - pfe->iram_baseaddr) + pfe->iram_phys_baseaddr;
	else
		return 0;
}

unsigned long virt_to_phys_ipsec_lmem(void *p)
{
	struct pfe_ctrl *ctrl = &pfe->ctrl;

	if (p)
		return (p - ctrl->ipsec_lmem_baseaddr) + ctrl->ipsec_lmem_phys_baseaddr;
	else
		return 0;
}

unsigned long virt_to_phys_ipsec_axi(void *p)
{
	if (p)
		return (p - pfe->ipsec_baseaddr) + pfe->ipsec_phys_baseaddr;
	else
		return 0;
}


HostMessage *msg_alloc(void)
{
	if (msg_buf_used)
	{
		printk(KERN_ERR "%s: failed\n", __func__);
		return NULL;
	}

	msg_buf_used = 1;

	return &msg_buf;
}

void msg_free(HostMessage *msg)
{
	if (!msg_buf_used)
		printk(KERN_ERR "%s: freing already free msg buffer\n", __func__);

	msg_buf_used = 0;
}

int msg_send(HostMessage *msg)
{
	struct pfe_ctrl *ctrl = &pfe->ctrl;
	int rc = -1;

	if (!ctrl->event_cb)
		goto out;

	if (ctrl->event_cb(msg->code, msg->length, msg->data) < 0)
		goto out;

	rc = 0;

out:
	msg_free(msg);

	return rc;
}


void timer_init(TIMER_ENTRY *timer, TIMER_HANDLER handler)
{
	timer->handler = handler;
	timer->running = 0;
}


void timer_add(TIMER_ENTRY *timer, u16 granularity)
{
	struct pfe_ctrl *ctrl = &pfe->ctrl;

	//printk(KERN_INFO "%s %lx\n", __func__, (unsigned long)timer);

	timer->period = granularity;
	timer->timeout = jiffies + timer->period;

	if (!timer->running)
	{
		list_add(&timer->list, &ctrl->timer_list);
		timer->running = 1;
	}
}


void timer_del(TIMER_ENTRY *timer)
{
	//printk(KERN_INFO "%s %lx\n", __func__, (unsigned long)timer);

	if (timer->running)
	{
		list_del(&timer->list);
		timer->running = 0;
	}
}


void *Heap_Alloc(int size)
{
	/* FIXME we may want to use dma API's and use non cacheable memory */
	return pfe_kmalloc(size, GFP_KERNEL);
}


void Heap_Free(void *p)
{
	pfe_kfree(p);
}
