/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    *   Redistributions of source code must retain the above copyright notice,
	    this list of conditions and the following disclaimer.

    *   Redistributions in binary form must reproduce the above copyright
	notice, this list of conditions and the following disclaimer in the
	documentation and/or other materials provided with the distribution.

    *   Neither the name of Marvell nor the names of its contributors may be
	used to endorse or promote products derived from this software without
	specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*******************************************************************************/

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/poll.h>

#include "cesa_dev.h"



void show_usage(int badarg)
{
        fprintf(stderr,
                "Usage:                                                                                 \n"
                " mv_cesa_tool -h                                                                       \n"
                "   Display this help.                                                                  \n"
                "                                                                                       \n"
		" mv_cesa_tool -test  <test_mode> <iter> <req_size> <checkmode>				\n"
		"	(can be used only in Test Mode)							\n"
		"	test_mode: Multi, Size AES, DES, 3DES MD5 SHA1     				\n"
		"	iter	 : number of iteration to run						\n"
		"	req_size : size of the buffer to be encrypt/decrypt/HASING			\n"
		"	checkmode: 0 - Fast verify 							\n"
		"		   1 - Full verify						        \n"
		"		   2 - without verify (for performence)					\n"
		"											\n"
		" mv_cesa_tool -test -s <iter> <req_size> <session_id> <data_id>			\n"
		"       (can be used only in Test Mode)                                                 \n"
		"	+++ for debug usage only +++							\n"
		"	req_size  : size of the buffer to be encrypt/decrypt/HASING                     \n"
		"	iter      : number of iteration to run 						\n"
		"	session_id: which session to open out of the cesa_test session see in kernel.	\n"
		"	data_id   : which data pattern to use out of the cesa_test session see in kernel\n"
		"       checkmode : 0 - Fast verify                                                     \n"
                "                   1 - Full verify                                                     \n"
                "                   2 - without verify (for performence)                                \n"
		"											\n"
		" mv_cesa_tool -debug <debug_mode> [-i index] [-v] [-s size]				\n"
		"	(Tst_req, Tst_stats and Tst_ses can be used only in Test Mode)			\n"
		"	debug_mode: Sts       - display general status 					\n"
		"		    Chan      - display channel index status 				\n"
		"		    Q         - display SW Q 						\n"
		"		    SA        - display SA index 					\n"
		"		    SAD       - display entire SAD					\n"
		"		    Sram - display SRAM contents					\n"
		"		    Tst_req - display request index with buffer of size size		\n"
		"                   Tst_stats - display test statistics                                 \n"
		"		    Tst_ses - display session index					\n"
		"	-i index  : index (only relevant for: Chan, SA, Tst_req and Tst_ses  \n"
		"	-v        : verbose mode							\n"
		"	-s size	  : buffer size (only relevant for Tst_req)				\n\n"
	);

	exit(badarg);
}

static void get_index(int argc, char **argv, CESA_DEBUG *cesa_debug)
{
	int j;
	for(j = 3; j < argc; j++) {
      		if(!strcmp(argv[j], "-i")) {
           		j++;
       			break;
		}
       	}
  	if(!(j < argc)) {
		fprintf(stderr,"missing/ illegal index. \n");
		exit(1);
	}
     	cesa_debug->index = atoi(argv[j]);
}

static void parse_debug_cmdline(int argc, char **argv, CESA_DEBUG *cesa_debug)
{
	unsigned int i = 2,j;

        cesa_debug->mode = 0;
	for(j = i; j < argc; j++) {
		if(!strcmp(argv[j], "-v"))
			cesa_debug->mode++; 
	}

	if(argc < 3) {
                fprintf(stderr,"missing arguments\n");
		exit(1);
	}

	if(!strcmp(argv[i], "Sts")) 
        	cesa_debug->debug = STATUS;
	else if(!strcmp(argv[i], "Chan")) {
                cesa_debug->debug = CHAN;
		get_index(argc, argv, cesa_debug);
	}
        else if(!strcmp(argv[i], "Q"))
                cesa_debug->debug = QUEUE;
        else if(!strcmp(argv[i], "SA")) {
                cesa_debug->debug = SA;
		get_index(argc, argv, cesa_debug);
	}
        else if(!strcmp(argv[i], "Cache_idx")) {
                cesa_debug->debug = CACHE_IDX;
		get_index(argc, argv, cesa_debug);
	}
        else if(!strcmp(argv[i], "Sram"))
                cesa_debug->debug = SRAM;
        else if(!strcmp(argv[i], "SAD"))
                cesa_debug->debug = SAD;
        else if(!strcmp(argv[i], "Tst_req")) {
                cesa_debug->debug = TST_REQ;
        	for(j = i; j < argc; j++) {
                	if(!strcmp(argv[j], "-s")) {
				j++;
                        	break;
			}
		}
		if(!(j < argc)) {
			fprintf(stderr,"missing/illegal size\n");
			exit(1);
		}
		cesa_debug->size = atoi(argv[j]);
		get_index(argc, argv, cesa_debug);
	}
        else if(!strcmp(argv[i], "Tst_ses")) {
                cesa_debug->debug = TST_SES;
		get_index(argc, argv, cesa_debug);
	}
	else if(!strcmp(argv[i], "Tst_stats")) {
		cesa_debug->debug = TST_STATS;
        }
	else{
		fprintf(stderr,"illegal debug option\n");
		exit(1);
	}

}

static void parse_test_cmdline(int argc, char **argv, CESA_TEST *cesa_test)
{
        unsigned int i = 2;

	if(argc < 6) {
        	fprintf(stderr,"missing arguments\n");
		exit(1);
	}

	if(!strcmp(argv[i], "-s")) { /* single test */
		i++;
		if(argc != 8)
                	show_usage(1);
		cesa_test->test = SINGLE;
		cesa_test->iter = atoi(argv[i++]);
		cesa_test->req_size = atoi(argv[i++]);
		cesa_test->session_id = atoi(argv[i++]);
		cesa_test->data_id = atoi(argv[i++]);
                cesa_test->checkmode = atoi(argv[i++]);
	}
        else {
		if(argc != 6)
                        show_usage(1);
		if (!strcmp(argv[i], "Multi"))
                	cesa_test->test = MULTI;
                else if (!strcmp(argv[i], "Size"))
                        cesa_test->test = SIZE;
		else if(!strcmp(argv[i], "AES"))
                        cesa_test->test = AES;
                else if(!strcmp(argv[i], "DES"))
                        cesa_test->test = DES;
                else if(!strcmp(argv[i], "3DES"))
                        cesa_test->test = TRI_DES;
                else if(!strcmp(argv[i], "MD5"))
                        cesa_test->test = MD5;
                else if(!strcmp(argv[i], "SHA1"))
                        cesa_test->test = SHA1;
		else {
			fprintf(stderr,"illegal test option\n");	
			exit(1);
		}
		i++;	
		cesa_test->iter = atoi(argv[i++]);
		cesa_test->req_size = atoi(argv[i++]);
		cesa_test->checkmode = atoi(argv[i++]);
        }
}



int main(int argc, char *argv[])
{
        char *name = "/dev/cesa";
        int fd, t, i, fdflags;
        int rc = 0;
	CESA_TEST	cesa_test;
	CESA_DEBUG	cesa_debug;

	memset(&cesa_test, 0, sizeof(CESA_TEST));
	memset(&cesa_debug, 0, sizeof(CESA_DEBUG));

        /* open the device */
        fd = open(name, O_RDWR);
        if (fd <= 0) {
                printf("## Cannot open %s device.##\n",name);
                exit(2);
        }

        /* set some flags */
        fdflags = fcntl(fd,F_GETFL,0);
        fdflags |= O_NONBLOCK;
        fcntl(fd,F_SETFL,fdflags);

        if(argc < 2) {
                fprintf(stderr,"missing arguments\n");
		exit(1);
        }

	i = 1;

        if (!strcmp(argv[i], "-h")) {
                show_usage(0);
        }

        else if (!strcmp(argv[i], "-test")) { /* test */
		parse_test_cmdline(argc, argv, &cesa_test);
		printf("test %d iter %d req_size %d checkmode %d sess_id %d data_id %d \n", 
			cesa_test.test, cesa_test.iter, cesa_test.req_size, cesa_test.checkmode,
			cesa_test.session_id, cesa_test.data_id );

        	rc = ioctl(fd, CIOCTEST, &cesa_test);
	}
	else { /* debug */
                parse_debug_cmdline(argc, argv, &cesa_debug);
		printf("debug %d index %d mode %d size %d \n",
			cesa_debug.debug, cesa_debug.index, cesa_debug.mode, cesa_debug.size);
                rc = ioctl(fd, CIOCDEBUG, &cesa_debug);
	}
	if(rc < 0) printf("Cesa Tool failed to perform action!\n");

	close(fd);

	return 0;
}
