⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sec2_init.c

📁 freescale ppc sec2加解密单元驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************** * sec2_init.c -- The Initialization code for SEC2 Driver **************************************************************************** * Copyright (c) Certicom Corp. 1996-2002.  All rights reserved * Copyright (c) 2003-2005 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   Aug 24,2003 dgs - adapted from the final version of mpc18x * 1.1.0 Nov 16,2004 sec - incorporate linux changes from prior versions * 1.1.1 Dec 16,2004 sec - remove old unused diagnostics * 1.2   Jan 27,2005 sec - fix comments associated with global inhibit */#include <stdio.h>#include "vxWorks.h"#include "install.h"#include "drvlib/include/drv_comm.h"#include "sec2_const.h"#include "Sec2Driver.h"#define INIT_C#if DRIVER_IPSEC_DBGunsigned long SEC2DebugLevel = (DBGTXT_SETRQ | DBGTXT_SVCRQ | DBGTXT_INITDEV | DBGTXT_DPDSHOW | DBGTXT_INFO); /*unsigned long SEC2DebugLevel = (DBGTXT_INFO);*/#elseunsigned long SEC2DebugLevel = 0x0;#endif#ifdef __KERNELEXPORT_SYMBOL(SEC2DebugLevel);#endif/********************函数声明********************************/void Init_Drv_Ipsec_Queue(void);int Init_Drv_Fwd_Queue(void);void sec2_init_mem_free(void);int SEC2DriverInit(void);int sec2_channel_pktCnt_debug_init(void);int sec2_pktCnt_debug_init(void);extern int drv_Sec2RegisterDiag(void);/************************************************************************* * Function Name: SEC2DriverInit * Purpose: *          Step1: Build base address by requesting peripheral base *          Step2: Init ChannelRegister & Cha Register *          Step3: Allocate Channel Assignments *          Step4: Init Sec2_ChannelAssignments & ChaAssignments *          Step5: Init ProcessQueueTop & ProcessQueueBottom  *          Step6: Init Semaphores *          Step7: Reset all Chas and Channels *          Step8: Config all Channels *          Step9: Connect Interrupt *          Step10: Enable Interrupt *          Step11: Return Success *           * Input: None *         * Return: SEC2_SUCCESS if everything passed, otherwise the error code *************************************************************************/ int SEC2DriverInit(void){    int             cha;    int             channel;    unsigned long   address;    unsigned int    idx[] = {0,2,4,3,5,1};    char           *coreID;    static  int   first_time = 0;    /*初始化只需要一次*/    if(first_time == 0)    {        first_time = 1;    }    else   /*否则返回*/    {        SEC2Dump(DBGTXT_INFO, ("SEC 2.x Security Processor Core have inited \n"));        return SEC2_ERROR;    }    if (NULL == gpDrvSec2End)    {        gpDrvSec2End = (DRV_SEC2_END *)malloc(sizeof(DRV_SEC2_END));        if ((DRV_SEC2_END *)NULL == gpDrvSec2End)        {            ASSERT(0);            return SEC2_ERROR;        }        else        {            memset((void *)gpDrvSec2End, 0, sizeof(DRV_SEC2_END));        }    }    /* sysGetPeripheralBase() gets the PQ3 CCSBAR from the OS */    sec2_IOBaseAddress = (unsigned long)(drv_GetPeripheralBase() + TALITOS2X_BASE_ADDRESS);/* Identify the running hardware */    SEC2Dump(DBGTXT_INFO, ("SEC 2.x Security Processor Core\n"));    SEC2Dump(DBGTXT_INFO, ("Driver Version %s %s %s\n", VERSION, __DATE__,__TIME__));	/*Identification register,标识哪种版本加密核,这里只是用来打印*/    sec2_coremask = *((volatile unsigned long *)(sec2_IOBaseAddress + IDENTIFICATION_OFFSET) + 1);    switch(sec2_coremask)    {        case SEC_COREID_2_0_0:            coreID = "2.0.0";            break;                case SEC_COREID_2_1_0:            coreID = "2.1.0";            break;                default:            coreID = "unknown";            break;    }    SEC2Dump(DBGTXT_INFO, ("Security Core Version Mask: %s (0x%08lx)\n\n", coreID, sec2_coremask));    /* set up rebound cha index table */    /*PKEU=0,RNG=1,DEU=2,MDEU=3,AESU=4,AFEU=5*/    memcpy ((char *)sec2_cha_idx, (char *)idx, sizeof (idx));    /* set up SEC2 register addresses */    /* controller registers */    sec2_ChaAssignmentStatusRegister = (volatile unsigned long*)        (sec2_IOBaseAddress + CHA_ASSIGNMENT_STATUS_OFFSET);    sec2_InterruptControlRegister = (volatile unsigned long*)        (sec2_IOBaseAddress + INTERRUPT_CONTROL_OFFSET);    sec2_InterruptStatusRegister = (volatile unsigned long*)        (sec2_IOBaseAddress + INTERRUPT_STATUS_OFFSET);    sec2_InterruptClearRegister = (volatile unsigned long*)        (sec2_IOBaseAddress + INTERRUPT_CLEAR_OFFSET);    sec2_IdRegister = (volatile unsigned long*)        (sec2_IOBaseAddress + IDENTIFICATION_OFFSET);    sec2_MasterControlRegister = (volatile unsigned long *)        (sec2_IOBaseAddress + SEC2_MASTER_CONTROL_REGISTER);    SEC2Dump(DBGTXT_INITDEV, ("SEC2DriverInit->IOBaseAddress=0x%08lx\n", sec2_IOBaseAddress));    /* Reset the SEC2 */    /* Note that we turn on global inhibit for all processors. At the time    */    /* of coding, GI only exists in the 8349; it's irrelevant to PQ3 devices. */    /* So, it's just turned on for all processors, which is OK for now.       */    /* In time, this may be need to become an option in build configuration.  */        SEC2Dump(DBGTXT_INITDEV, ("SEC2DriverInit->reset Master Control Register\n"));    *(sec2_MasterControlRegister)     = SEC2_RESET | SEC2_GLOBAL_INHIBIT;    *(sec2_MasterControlRegister + 1) = 0;    SEC2Dump(DBGTXT_INITDEV,            ("SEC2DriverInit->IdRegister=0x%08lx 0x%08lx\n",            *(sec2_IdRegister),             *(sec2_IdRegister + 1)));    /* channel registers */    SEC2Dump(DBGTXT_INITDEV, ("SEC2DriverInit->channel registers\n"));    for (channel=0, address=CHANNEL_CONFIG_BASE; channel<SEC2_NUM_CHANNELS;        channel++,address+=CHANNEL_DISTANCE)    {        sec2_ChannelConfigRegister[channel] =             (volatile unsigned long*)(sec2_IOBaseAddress + address);    }    for (channel=0,address=CHANNEL_POINTER_STATUS_BASE; channel<SEC2_NUM_CHANNELS;        channel++,address+=CHANNEL_DISTANCE)    {        sec2_ChannelPointerStatusRegister[channel] =             (volatile unsigned long*)(sec2_IOBaseAddress + address);    }    for (channel=0,address=CHANNEL_NEXT_DESCRIPTOR_BASE; channel<SEC2_NUM_CHANNELS;        channel++,address+=CHANNEL_DISTANCE)    {        sec2_ChannelNextDescriptorRegister[channel] =             (volatile unsigned long*)(sec2_IOBaseAddress + address);    }    for (channel=0,address=CHANNEL_DBR_BASE; channel<SEC2_NUM_CHANNELS;        channel++,address+=CHANNEL_DISTANCE)    {        sec2_ChannelDataBufferDescriptorRegister[channel] =             (volatile unsigned long*)(sec2_IOBaseAddress + address);    }    for (channel=0,address=CHANNEL_CDPR_BASE; channel<SEC2_NUM_CHANNELS;        channel++,address+=CHANNEL_DISTANCE)    {        sec2_ChannelDataBufferDescriptorRegister[channel] =             (volatile unsigned long*)(sec2_IOBaseAddress + address);    }    /* cha registers */    SEC2Dump(DBGTXT_INITDEV, ("SEC2DriverInit->cha registers\n"));    for (cha=0,address=CHA_RESET_CONTROL_BASE; cha<NUM_CHAS;        cha++,address+=CHA_DISTANCE)    {        sec2_ChaResetControlRegister[cha] =             (volatile unsigned long*)(sec2_IOBaseAddress + address);    }     for (cha=0,address=CHA_INTERRUPT_STATUS_BASE; cha<NUM_CHAS;        cha++,address+=CHA_DISTANCE)    {        Sec2ChaInterruptStatusRegister[sec2_cha_idx[cha]] =             (volatile unsigned long*)(sec2_IOBaseAddress + address);    }    for (cha=0,address=CHA_INTERRUPT_CONTROL_BASE; cha<NUM_CHAS;        cha++,address+=CHA_DISTANCE)    {        sec2_ChaInterruptControlRegister[cha] =             (volatile unsigned long*)(sec2_IOBaseAddress + address);    }    /* allocate other driver variables */    SEC2Dump(DBGTXT_INITDEV, ("SEC2DriverInit->allocating other driver variables\n"));    /* variable init */    sec2_FreeChannels = SEC2_NUM_CHANNELS;    sec2_FreeRngas = SEC2_NUM_RNGAS;    sec2_FreeAfhas = SEC2_NUM_AFHAS;    sec2_FreeDesas = SEC2_NUM_DESAS;    sec2_FreeMdhas = SEC2_NUM_MDHAS;    sec2_FreePkhas = SEC2_NUM_PKHAS;    sec2_FreeAesas = SEC2_NUM_AESAS;    /* Init Sec2_ChannelAssignments */    for (channel=0; channel<SEC2_NUM_CHANNELS; channel++)    {        if (SEC2_SUCCESS != sec2_InitChannelAssignment(channel))        {            SEC2Dump(DBGTXT_INITDEV, ("SEC2DriverInit->init channel assinment failed\n"));            sec2_init_mem_free();            ASSERT(0);            return SEC2_ERROR;        }    }    /* Init ChaAssignments直接初始化为动态  */    for (cha=0; cha<16; cha++)    {        sec2_ChaAssignments[cha] = CHA_DYNAMIC;    }    /* 初始化队列*/    Init_Drv_Ipsec_Queue();        if(SEC2_SUCCESS != Init_Drv_Fwd_Queue())    {          SEC2Dump(DBGTXT_INITDEV, ("SEC2DriverInit->init sec2 fwd queue failed \n"));          sec2_init_mem_free();          ASSERT (0);          return SEC2_ERROR;    }        /*创建通道信号量,失败则挂起*/    if(SEC2_SUCCESS != IOInitChannelSemaphores())    {          SEC2Dump(DBGTXT_INITDEV, ("SEC2DriverInit->init channel semaphores failed \n"));          sec2_init_mem_free();          ASSERT(0);          return SEC2_ERROR;    }    /*创建队列信号量,失败则挂起*/    if(SEC2_SUCCESS != InitGlobalQueueSemaphores())    {          SEC2Dump(DBGTXT_INITDEV, ("SEC2DriverInit->init channel semaphores failed \n"));          sec2_init_mem_free();          ASSERT(0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -