blob: bbeb60e3e1ffb0ff7cd830df37d5b50057ee4c1e [file] [log] [blame]
/* 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);
}