Files
2026-07-30 11:19:44 +05:30

298 lines
9.8 KiB
C

/*
******************************************************************************
* SOURCE FILE
*
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: Sec4Driver.h,v $ $Revision: 1.7.12.1 $
* $Source: /home/interpeak/CVSRoot/ipfreescale/sec4/Sec4Driver.h,v $
* $Author: jsheng $
* $State: Exp $ $Locker: $
*
* INTERPEAK_COPYRIGHT_STRING
******************************************************************************
*/
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
*/
/****************************************************************************
* Sec4Driver.h - Private/local include file for SEC4 security driver
* Based on Sec2Driver.h for SEC2 security driver
****************************************************************************
* Copyright (c) 2003, 2004 Freescale Semiconductor
* All Rights Reserved. Proprietary and Confidential.
*
* NOTICE: The information contained in this file is proprietary
* to Freescale Semiconductor, and is being made available to
* Freescale's customers under strict license agreements.
* Use or disclosure of this information is permissible only
* under the terms of the existing license agreement.
***************************************************************************/
/* Revision History:
* 1.0 Mar 11,2011 Based on Sec2Driver.h v1.2
* 1.1 Added IPSec using shared descriptors and queue interface
*/
#ifndef SEC4DRIVER_H
#define SEC4DRIVER_H
/* assume VXWORKS */
#include "iosLib.h"
#include "msgQLib.h"
#include "semLib.h"
#include "signal.h"
#ifdef _WRS_CONFIG_WRHV_GUEST
#include <wrhv/vbi.h>
#endif /* _WRS_CONFIG_WRHV_GUEST */
#define IVEC_TO_INUM(intVec) ((int) (intVec))
#define INUM_TO_IVEC(intNum) ((VOIDFUNCPTR *) (intNum))
#define __vpa(pa) (pa)
#include "Sec4.h"
#define VERSION "1.1"
#define SEC4_DEVNAME "sec4"
/* Name for Processing Complete task */
#define SEC4_PC_TASKNAME "tSEC4_pc"
/* Interrupt for Job queues of the SEC4 */
#ifdef _WRS_CONFIG_BSP_FSL_P1010_RDB
#define INUM_SEC4_BASE (12 + 29) /* Job queue 0 in SEC4 core is wired to #29 within the P1010 */
#elif defined(_WRS_CONFIG_BSP_FSL_P4080_DS) || defined(_WRS_CONFIG_BSP_WRSBCP4080)
#define INUM_SEC4_BASE (16 + 72) /* Job queue 0 in SEC4 core is wired to #72 within the P4080 */
#define INUM_SEC4_JQ0 (INUM_SEC4_BASE)
#define INUM_SEC4_JQ1 (INUM_SEC4_BASE + 1)
#define INUM_SEC4_JQ2 (INUM_SEC4_BASE + 2)
#define INUM_SEC4_JQ3 (INUM_SEC4_BASE + 3)
#endif
#ifdef _WRS_CONFIG_WRHV_GUEST
/* When we are on top of a hypervisor, this can't be extracted by sysGetPeripheralBase() */
/* This address should correspond to the CCSBAR */
#define PERIPHERAL_BASE (0xFE000000ULL)
#endif
/* Define an offset from the peripheral base register where the core */
/* should be located relative to */
#ifdef _WRS_CONFIG_BSP_FSL_P1010_RDB
#define SEC4X_BASE_OFFSET (0x00030000)
#elif defined(_WRS_CONFIG_BSP_FSL_P4080_DS) || defined(_WRS_CONFIG_BSP_WRSBCP4080)
#define SEC4X_BASE_OFFSET (0x00300000)
#endif
/* Offset relative to SEC4X_BASE_OFFSET for job queues */
#define SEC4X_JQ_BASE_SIZE (0x1000)
#define SEC4X_JQ0_BASE_OFFSET (0x1000)
#define SEC4X_JQ1_BASE_OFFSET (SEC4X_JQ0_BASE_OFFSET + (1 * SEC4X_JQ_BASE_SIZE))
#define SEC4X_JQ2_BASE_OFFSET (SEC4X_JQ0_BASE_OFFSET + (2 * SEC4X_JQ_BASE_SIZE))
#define SEC4X_JQ3_BASE_OFFSET (SEC4X_JQ0_BASE_OFFSET + (3 * SEC4X_JQ_BASE_SIZE))
#define SEC4X_NOOF_JOB_QUEUES (4)
/* Offset relative to SEC4X_BASE_OFFSET for queue interface */
#define SEC4X_QI_BASE_OFFSET (0x00007000)
/* SEC 4 Job Queue ID */
#define SEC4X_JQ0_ID (0)
#define SEC4X_JQ1_ID (1)
#define SEC4X_JQ2_ID (2)
#define SEC4X_JQ3_ID (3)
/* Maximum number of cores using SEC4 */
#define SEC4_MAXNOOF_CORES (7)
/* Spin lock IDs to protect shared between cores objects */
#ifdef SEC4_USE_QI
#define SEC4_SA_CACHE_SPINLOCK_ID (3)
#endif
#ifdef SEC4_USE_SHARED_JOB_QUEUE
#define SEC4_SH_JQ_SPINLOCK_ID (4)
#endif
/* Default IPsec SA cache size (may be altered during run-time) */
#define SEC4_IPSEC_NOOF_SA_CACHE_ENTRIES_DEFAULT (256)
/*
* Debug message type enabler switches for SEC4DebugLevel:
* DBGTXT_SETRQ - all messages from request setups
* DBGTXT_SVCRQ - all messages from request servicing
* DBGTXT_INITDEV - all messages from initialization
* DBGTXT_DESCSHOW - content of each DPD before it's queued
* DBGTXT_INFO - general driver information messages
*/
#ifdef DEBUG
#define DBGTXT_SETRQ ((unsigned long)0x00000001)
#define DBGTXT_SVCRQ ((unsigned long)0x00000002)
#define DBGTXT_INITDEV ((unsigned long)0x00000004)
#define DBGTXT_DESCSHOW ((unsigned long)0x00000008)
#define DBGTXT_INFO ((unsigned long)0x00000010)
#define DBGTXT_INTERPEAK ((unsigned long)0x00000020)
#define DBGTXT_ERROR ((unsigned long)0x00000040)
extern unsigned long SEC4DebugLevel;
#define SEC4Dump(LEVEL,STRING) \
do { \
unsigned long _level = (LEVEL); \
if ((_level == 0)||(SEC4DebugLevel & _level)) { \
printf STRING; \
} \
} while (0)
#define SEC4DbgDo(LEVEL,FUNCTION) \
do { \
unsigned long _level = (LEVEL); \
if ((_level == 0)||(SEC4DebugLevel & _level)) { \
FUNCTION; \
} \
} while (0)
#else
#define SEC4Dump(LEVEL,STRING)
#define SEC4DbgDo(LEVEL,FUNCTION)
#endif
#define IOLockJobEnqueue() (void) semTake(JobEnqueueSemId, WAIT_FOREVER)
#define IOUnLockJobEnqueue() (void) semGive(JobEnqueueSemId)
#define IO_STATUS int
/*! \def PROCESSING_COMPLETE_PRIORITY
\brief #ProcessingComplete() Task priority
*/
#define PROCESSING_COMPLETE_PRIORITY (3)
/*! \def PROCESSING_COMPLETE_STACKSIZE
\brief #ProcessingComplete() Task stack size
*/
/* #define PROCESSING_COMPLETE_STACKSIZE (2048) */
#define PROCESSING_COMPLETE_STACKSIZE (4096)
#ifdef SEC4_POLLED_MODE
/*! \def POLL_COMPLETE_PRIORITY
\brief #PollComplete() Task priority
*/
#define POLL_COMPLETE_PRIORITY (3)
/*! \def POLL_COMPLETE_STACKSIZE
\brief #PollComplete() Task stack size
*/
#define POLL_COMPLETE_STACKSIZE (4096)
#endif
/* SEC4 core values as presented in version register (SECVID) */
#define SEC4_COREID (0x00000a10)
typedef struct completed_job{
int jobStatus;
GENERIC_REQ *req;
} COMPLETED_JOB;
/* SEC4_GLOBAL
A definition used to control allocation and referencing
of global variables.
When the definition is not set it is considered
to be used as a reference (extern is prepended).
When the definition is set (to nothing) it is considered to be
allocating the global variable. This is done in one place
only. In init.c
*/
#ifndef SEC4_GLOBAL
#define SEC4_GLOBAL extern
#endif
/*! \var SEM_ID JobEnqueueSemId
\brief A global variable which is used as a mutual exclusion
semaphore for enqueueing jobs to the SEC4 engine.
The variable is not used directly. It used by calling
#IOLockJobEnqueue() to lock and #IOUnLockJobEnqueue()
to unlock.
*/
SEC4_GLOBAL SEM_ID JobEnqueueSemId;
/* The queue identifier is used to queue register values read by the
ISR (#InterruptServiceRoutine()) to the deferred interrupt process
routine (#ProcessingComplete())
*/
SEC4_GLOBAL MSG_Q_ID IsrMsgQId;
/* OS's identification of the device*/
SEC4_GLOBAL int driverNum;
/*! \var DEV_HDR vxworksDrvDev
\brief Used in driver startup.
*/
SEC4_GLOBAL DEV_HDR vxworksDrvDev;
/* coremask holds the core ID register for version/feature control */
SEC4_GLOBAL unsigned long coremask;
/* Register driver and it's handlers with the OS */
IO_STATUS IORegisterDriver(void);
/* Set up internal driver semaphores */
void IOInitSemaphores(void);
/* Initialize driver queues */
IO_STATUS IOInitQs(uint16_t size);
/* Enable/Disable the hardware interrupt */
IO_STATUS IOConnectInterrupt(void);
void IODisconnectInterrupt(void);
/* Open a new connection to this driver */
int SEC4Open(DEV_HDR *, int, int);
/* Close a connection to this driver */
int SEC4Close(int);
/* Request a driver operation*/
int SEC4_ioctl(int, register int, register void *);
/* Driver's top level ISR handler */
void InterruptServiceRoutine(t_Handle h_App,
void* p_JobDesc,
t_Handle h_Context,
uint32_t jobStatus);
/* ISR's Deferred processing (bottom half) handler */
extern void ProcessingComplete(void);
#ifdef SEC4_POLLED_MODE
extern void PollComplete(void);
#endif
/* Take a user request, build a job descriptor, and submit it for processing */
int ProcessRequest(GENERIC_REQ *req, int callingTaskId);
/* Get current values of SEC4 status registers. */
int GetStatus(STATUS_REQ *pStatus, int callingTaskId);
#ifdef SEC4_USE_QI
int SEC4_ipsec_esp_encrypt(uint16_t sa_index, uint8_t *buf, uint16_t inOffset, uint16_t pktlen,
uint16_t outOffset, uint8_t poolId);
int SEC4_ipsec_esp_decrypt(uint16_t sa_index, uint8_t *buf, uint16_t inOffset, uint16_t pktlen,
uint16_t outOffset, uint8_t poolId);
void SEC4_qportal_set(void *qportal);
void SEC4_bportal_set(void *bportal, uint32_t poolId);
void SEC4_qman_enqueue_fqix_base_set(uint32_t ixBase);
void SEC4_qman_dequeue_fqix_set(uint32_t ixBaseEncrypt, uint32_t ixBaseDecrypt);
int SEC4_populate_sa(uint32_t spi, uint8_t ipsecVer, uint8_t proto,
e_IpsecAuthenAlg authAlg, e_IpsecCryptoAlg cryptoAlg,
uint8_t *authKey, uint8_t authKeySize, uint8_t *cryptoKey,
uint8_t cryptoKeySize, uint8_t *iv, uint16_t sa_index, int enc);
void SEC4_ipsec_set_sa_cache_size(uint32_t noofEntries);
void SEC4_ipsec_set_shm(void *p, uint32_t size);
#endif /* SEC4_USE_QI */
#endif /* SEC4DRIVER_H */