blob: f473e1e3f19d68c836bb622242c642a395d2df20 [file] [log] [blame]
#include <linux/autoconf.h>
#include <linux/types.h>
#include <linux/time.h>
#include <linux/delay.h>
#include <linux/list.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/unistd.h>
#include <linux/module.h>
#include <linux/wait.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/file.h>
#include <linux/miscdevice.h>
#include <linux/version.h>
#include <asm/uaccess.h>
#include "cesa_dev.h"
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,11)
#include <linux/syscalls.h>
#endif
#include "mvOs.h"
#include "mvCommon.h"
#include "ctrlEnv/mvCtrlEnvLib.h"
#include "cesa/mvCesa.h"
#include "mvSysCesaApi.h"
static int debug = 1;
module_param(debug, int, 0);
MODULE_PARM_DESC(debug,
"Enable debug");
#ifdef CONFIG_MV_CESA_TEST
static int buf_size = 20000;
/*MODULE_PARM(buf_size, "i");*/
module_param(buf_size,int,0644);
MODULE_PARM_DESC(buf_size, "Size of each data buffer");
static int buf_num = 1;
/*MODULE_PARM(buf_num, "i");*/
module_param(buf_num,int,0644);
MODULE_PARM_DESC(buf_num, "Number of data buffers for each request");
extern void cesaTestStart(int bufNum, int bufSize);
extern void cesaTestStop(void);
extern void cesaTest(int iter, int reqSize, int checkMode);
extern void combiTest(int iter, int reqSize, int checkMode);
extern void cesaOneTest(int testIdx, int caseIdx, int iter, int reqSize, int checkMode);
extern void multiSizeTest(int idx, int checkMode, int iter, char* inputData);
extern void aesTest(int iter, int reqSize, int checkMode);
extern void desTest(int iter, int reqSize, int checkMode);
extern void tripleDesTest(int iter, int reqSize, int checkMode);
extern void mdTest(int iter, int reqSize, int checkMode);
extern void sha1Test(int iter, int reqSize, int checkMode);
extern void sha2Test(int iter, int reqSize, int checkMode);
int run_cesa_test(CESA_TEST *cesa_test)
{
switch(cesa_test->test){
case(MULTI):
combiTest(cesa_test->iter, cesa_test->req_size, cesa_test->checkmode);
break;
case(SIZE):
multiSizeTest(cesa_test->req_size, cesa_test->iter, cesa_test->checkmode, NULL);
break;
case(SINGLE):
cesaOneTest(cesa_test->session_id, cesa_test->data_id, cesa_test->iter,
cesa_test->req_size, cesa_test->checkmode);
break;
case(AES):
aesTest(cesa_test->iter, cesa_test->req_size, cesa_test->checkmode);
break;
case(DES):
desTest(cesa_test->iter, cesa_test->req_size, cesa_test->checkmode);
break;
case(TRI_DES):
tripleDesTest(cesa_test->iter, cesa_test->req_size, cesa_test->checkmode);
break;
case(MD5):
mdTest(cesa_test->iter, cesa_test->req_size, cesa_test->checkmode);
break;
case(SHA1):
sha1Test(cesa_test->iter, cesa_test->req_size, cesa_test->checkmode);
break;
case(SHA2):
sha2Test(cesa_test->iter, cesa_test->req_size, cesa_test->checkmode);
break;
default:
dprintk("%s(unknown test 0x%x)\n", __FUNCTION__, cesa_test->test);
return -EINVAL;
}
return 0;
}
#endif /* CONFIG_MV_CESA_TEST */
extern void mvCesaDebugSAD(int mode);
extern void mvCesaDebugSA(short sid, int mode);
extern void mvCesaDebugQueue(int mode);
extern void mvCesaDebugStatus(void);
extern void mvCesaDebugSram(int mode);
extern void cesaTestPrintReq(int req, int offset, int size);
extern void cesaTestPrintSession(int idx);
extern void cesaTestPrintStatus(void);
int run_cesa_debug(CESA_DEBUG *cesa_debug)
{
int error = 0;
switch(cesa_debug->debug){
case(STATUS):
mvCesaDebugStatus();
break;
case(QUEUE):
mvCesaDebugQueue(cesa_debug->mode);
break;
case(SA):
mvCesaDebugSA(cesa_debug->index, cesa_debug->mode);
break;
case(SRAM):
mvCesaDebugSram(cesa_debug->mode);
break;
case(SAD):
mvCesaDebugSAD(cesa_debug->mode);
break;
#ifdef CONFIG_MV_CESA_TEST
case(TST_REQ):
cesaTestPrintReq(cesa_debug->index, 0, cesa_debug->size);
break;
case(TST_SES):
cesaTestPrintSession(cesa_debug->index);
break;
case(TST_STATS):
cesaTestPrintStatus();
break;
#endif /* CONFIG_MV_CESA_TEST */
default:
dprintk("%s(unknown debug 0x%x)\n", __FUNCTION__, cesa_debug->debug);
error = EINVAL;
break;
}
return(-error);
}
static int
cesadev_ioctl(
struct inode *inode,
struct file *filp,
unsigned int cmd,
unsigned long arg)
{
CESA_DEBUG cesa_debug;
u32 error = 0;
dprintk("%s: cmd=0x%x, CIOCDEBUG=0x%x, CIOCTEST=0x%x\n",
__FUNCTION__, cmd, CIOCDEBUG, CIOCTEST);
switch (cmd) {
case CIOCDEBUG:
if(copy_from_user(&cesa_debug, (void*)arg, sizeof(CESA_DEBUG)))
error = -EFAULT;
dprintk("%s(CIOCDEBUG): debug %d index %d mode %d size %d\n",
__FUNCTION__, cesa_debug.debug, cesa_debug.index, cesa_debug.mode, cesa_debug.size);
error = run_cesa_debug(&cesa_debug);
break;
#ifdef CONFIG_MV_CESA_TEST
case CIOCTEST:
{
CESA_TEST cesa_test;
if(copy_from_user(&cesa_test, (void*)arg, sizeof(CESA_TEST)))
error = -EFAULT;
dprintk("%s(CIOCTEST): test %d iter %d req_size %d checkmode %d sess_id %d data_id %d \n",
__FUNCTION__, cesa_test.test, cesa_test.iter, cesa_test.req_size, cesa_test.checkmode,
cesa_test.session_id, cesa_test.data_id );
error = run_cesa_test(&cesa_test);
}
break;
#endif /* CONFIG_MV_CESA_TEST */
default:
dprintk("%s (unknown ioctl 0x%x)\n", __FUNCTION__, cmd);
error = EINVAL;
break;
}
return(-error);
}
static int
cesadev_open(struct inode *inode, struct file *filp)
{
dprintk("%s()\n", __FUNCTION__);
return(0);
}
static int
cesadev_release(struct inode *inode, struct file *filp)
{
dprintk("%s()\n", __FUNCTION__);
return(0);
}
static struct file_operations cesadev_fops = {
.owner = THIS_MODULE,
.open = cesadev_open,
.release = cesadev_release,
.ioctl = cesadev_ioctl,
};
static struct miscdevice cesadev = {
.minor = CESADEV_MINOR,
.name = "cesa",
.fops = &cesadev_fops,
};
static int __init
cesadev_init(void)
{
int rc;
if (mvCtrlPwrClckGet(CESA_UNIT_ID, 0) == MV_FALSE)
return 0;
#if defined(CONFIG_MV78200) || defined(CONFIG_MV632X)
if (MV_FALSE == mvSocUnitIsMappedToThisCpu(CESA))
{
dprintk("CESA is not mapped to this CPU\n");
return -ENODEV;
}
#endif
#ifdef CONFIG_MV_CESA_TEST
cesaTestStart(buf_num, buf_size);
#endif
dprintk("%s(%p)\n", __FUNCTION__, cesadev_init);
rc = misc_register(&cesadev);
if (rc) {
printk(KERN_ERR "cesadev: registration of /dev/cesadev failed\n");
return(rc);
}
return(0);
}
static void __exit
cesadev_exit(void)
{
#ifdef CONFIG_MV_CESA_TEST
cesaTestStop();
#endif
dprintk("%s()\n", __FUNCTION__);
misc_deregister(&cesadev);
}
module_init(cesadev_init);
module_exit(cesadev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Ronen Shitrit");
MODULE_DESCRIPTION("Cesadev (user interface to CESA)");