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

📄 ssx31asa.c

📁 海思KEY驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
        }

    }
    if (i >= ulTmt)
    {
#ifdef HI_DBG    
    	PRINT ("\r\nnot finish");
#endif	
	ucRes = ERR;
    }


    return ucRes;
}
/****************************************************** ENCRYPT DECRYPT ************************************************/
/****************************************************** ENCRYPT DECRYPT ************************************************/
/****************************************************** ENCRYPT DECRYPT ************************************************/
/*
 pucRes 4 bytes aligned
*/
ULONG SSX31A_EncryptDecrypt(ULONG ulPhyLink, UCHAR ucFlag, UCHAR* ucKeyIv, UCHAR* pucData, USHORT usDataLen, UCHAR* pucRes)
{
	
    SSX31ADRV_CTRL *  pDrvCtrl = (SSX31ADRV_CTRL *)ulPhyLink;
    LONG  lIntMask;
    PEBD_DESC * pCurBD = NULL;
    PERD_DESC * pCurRD = NULL;
    ULONG ulCnt = 0;
    ULONG i;
    SSX31A_ICD* pGatherDesc = NULL;
    ULONG ulTmt = 0;
    UCHAR ucRes = ERR;

    SplImp(&lIntMask);
    
    
    if ( pDrvCtrl->ulCurrDMA1BdReadPtr == ((pDrvCtrl->ulCurrDMA1BdWritePtr + 1) & (SSX31A_DMA1_BDQUEUE_LEN - 1)) )
    {
#ifdef HI_DBG    
        PRINT("Queue full:BD Read:%d write %d\r\n",
            pDrvCtrl->ulCurrDMA1BdReadPtr,
            pDrvCtrl->ulCurrDMA1BdWritePtr );
#endif	    
        return ERR;
    }

    pCurBD = &((PEBD_DESC *)(pDrvCtrl->ulDMA1BDMemBase))[pDrvCtrl->ulCurrDMA1BdWritePtr];


    /* icd */
    pGatherDesc = (SSX31A_ICD*)Malloc( 2 * sizeof(SSX31A_ICD) );
	
    if (pGatherDesc == NULL)
    {
#ifdef HI_DBG    
        PRINT("SSX31A driver PE send mem alloc fail\r\n");
#endif	
        return ERR;                               
    }

    pCurBD->ulInputContext  = (ULONG)virt_to_bus(pGatherDesc);  
    pCurBD->ulInputNum = 2;
    pCurBD->ulInputLength= 32 + usDataLen;
    pCurBD->ulGatherEnable = BD_GATHER_ENABLE;
    
    pGatherDesc->ulInputPtr = (ULONG)virt_to_bus(ucKeyIv);
    pGatherDesc->ulInputLen = 32;
    pGatherDesc->ulInputAttrib = ICD_ATTRIB_LAST_PART;
    pGatherDesc->ulOrig = 0;
	
    pGatherDesc ++;
    pGatherDesc->ulInputPtr = (ULONG)virt_to_bus(pucData);
    pGatherDesc->ulInputLen = usDataLen;
    pGatherDesc->ulInputAttrib = ICD_ATTRIB_LAST_PART;
    pGatherDesc->ulOrig = 0x04;
    /* */

    pCurBD->ulOutputContext = virt_to_bus ( (ULONG)pucRes );
    pCurBD->ulOutputNum  = 0;
    pCurBD->ulOutputLength0 = usDataLen;
    pCurBD->ulScatterEnable &= ~BD_SCATTER_ENABLE;


    pCurBD->ulOpCode = BD_OPCODE_DES_OPERATION;
    pCurBD->ulFlag = ucFlag;
    


#ifdef HI_DBG
{
	ULONG* pulTmp = NULL;
	ULONG* pulTmp1 = NULL;
	int i;
	
	pulTmp = (ULONG*)pCurBD;
	
	printk ("\r\nBD: %08x %08x %08x %08x %08x %08x ", pulTmp[0], pulTmp[1], pulTmp[2], pulTmp[3], pulTmp[4], pulTmp[5]); 
	
	pulTmp1 = (ULONG*)((ULONG)bus_to_virt ( pulTmp[1] ));
	for (i=0; i<2; i++)
	{
		printk ("\r\nicd %d: %08x %08x", i, pulTmp1[0], pulTmp1[1]);
		pulTmp = (ULONG*)((ULONG)bus_to_virt ( pulTmp1[0] ));
		printk ("\r\n buf: %08x %08x %08x %08x %08x %08x %08x %08x", pulTmp[0],pulTmp[1],pulTmp[2],pulTmp[3],pulTmp[4],pulTmp[5],pulTmp[6],pulTmp[7] );
		
		pulTmp1 += 2;
	}
	
}
#endif


   
    pDrvCtrl->ulCurrDMA1BdWritePtr = (pDrvCtrl->ulCurrDMA1BdWritePtr + 1) & (SSX31A_DMA1_BDQUEUE_LEN - 1);
    PciWrite32(SSX31A_BQWP1_RW, pDrvCtrl->ulCurrDMA1BdWritePtr);

    pDrvCtrl->ulFreeDMA1BDs --;

    SplX(lIntMask);    


    ulTmt = (DMA1_TMOUT & 0xffff)*100 + 100000;


    for (i = 0; i < ulTmt; i ++)
    {
        UsDelay(10);


        PciRead32(SSX31A_BQRP1_RW, &pDrvCtrl->ulCurrDMA1BdReadPtr);

        PciRead32(SSX31A_RQWP1_RW, &pDrvCtrl->ulCurrDMA1RdWritePtr);


        if (pDrvCtrl->ulCurrDMA1RdWritePtr == pDrvCtrl->ulCurrDMA1RdReadPtr)
        {
            continue;
        }
        else
        {
            pCurRD = &((PERD_DESC*)(pDrvCtrl->ulDMA1RDMemBase))[pDrvCtrl->ulCurrDMA1RdReadPtr];
#ifdef HI_DBG
{
	ULONG* pulTmp = NULL;
	pulTmp = (ULONG*)pCurRD;
	
	printk ("\r\nRD %08x %08x %08x %08x %08x %08x", 
		pulTmp[0],pulTmp[1],pulTmp[2],pulTmp[3],pulTmp[4],pulTmp[5]);
		

}
#endif

	    if (pCurRD->ulGatherEnable == BD_GATHER_ENABLE )
    	    {
    	    	if (pCurRD->ulInputContext )
            	{

           		 Free( bus_to_virt(pCurRD->ulInputContext) );
        	         pCurRD->ulInputContext = NULL;
            	}
            }
            if (pCurRD->ulScatterEnable == BD_SCATTER_ENABLE )
            {
                if (pCurRD->ulOutputContext )
                {
                    Free( bus_to_virt(pCurRD->ulOutputContext) );
                    pCurRD->ulOutputContext = NULL;
                }
            }

            if ((pCurRD->ulStatus & MASK_RD_STATUS_ERRCODE) == RD_STATUS_RDVALID)
            {
                ucRes = OK;
            }
            else
            {
#ifdef HI_DBG	    
                PRINT("\r\nSSX31A encrypt or decrypt failed. RD status %04x", pCurRD->ulStatus);
		ucRes = ERR;
#endif		
            }
        
            pDrvCtrl->ulCurrDMA1RdReadPtr = (pDrvCtrl->ulCurrDMA1RdReadPtr + 1) & (SSX31A_DMA1_RDQUEUE_LEN - 1);  


            if (pDrvCtrl->ulCurrDMA1RdWritePtr == pDrvCtrl->ulCurrDMA1RdReadPtr)
            {
                PciWrite32(SSX31A_RQRP1_RW, pDrvCtrl->ulCurrDMA1RdReadPtr); 

                pDrvCtrl->ulFreeDMA1BDs ++;

                break;
            }

        }

    }
    
    
    
    
    
    if (i >= ulTmt)
    {
#ifdef HI_DBG    
    	PRINT ("\r\nnot finish");
#endif	
	ucRes = ERR;
    }

    return ucRes;
}


/****************************************************** HASH ************************************************/
/****************************************************** HASH ************************************************/
/****************************************************** HASH ************************************************/
/*
 pucRes 4 bytes aligned
*/
ULONG SSX31A_Hash(ULONG ulPhyLink, UCHAR ucFlag, UCHAR* ucHmacState, UCHAR* pucData, USHORT usDataLen, UCHAR* pucRes)
{
	
    SSX31ADRV_CTRL *  pDrvCtrl = (SSX31ADRV_CTRL *)ulPhyLink;
    LONG  lIntMask;
    PEBD_DESC * pCurBD = NULL;
    PERD_DESC * pCurRD = NULL;
    ULONG ulCnt = 0;
    ULONG i;
    SSX31A_ICD* pGatherDesc = NULL;
    ULONG ulTmt = 0;
    UCHAR ucRes = ERR;


    SplImp(&lIntMask);
    
    
    if ( pDrvCtrl->ulCurrDMA1BdReadPtr == ((pDrvCtrl->ulCurrDMA1BdWritePtr + 1) & (SSX31A_DMA1_BDQUEUE_LEN - 1)) )
    {
#ifdef HI_DBG    
        PRINT("Queue full:BD Read:%d write %d\r\n",
            pDrvCtrl->ulCurrDMA1BdReadPtr,
            pDrvCtrl->ulCurrDMA1BdWritePtr );
#endif	    
        return ERR;
    }

    pCurBD = &((PEBD_DESC *)(pDrvCtrl->ulDMA1BDMemBase))[pDrvCtrl->ulCurrDMA1BdWritePtr];


    /* icd */
    pGatherDesc = (SSX31A_ICD*)Malloc( 2 * sizeof(SSX31A_ICD) );
	
    if (pGatherDesc == NULL)
    {
#ifdef HI_DBG    
        PRINT("SSX31A driver PE send mem alloc fail\r\n");
#endif	
        return ERR;                               
    }

    pCurBD->ulInputContext  = (ULONG)virt_to_bus(pGatherDesc);  
    pCurBD->ulInputNum = 2;
    pCurBD->ulInputLength= 40 + usDataLen;
    pCurBD->ulGatherEnable = BD_GATHER_ENABLE;
    
    pGatherDesc->ulInputPtr = (ULONG)virt_to_bus(ucHmacState);
    pGatherDesc->ulInputLen = 40;
    pGatherDesc->ulInputAttrib = ICD_ATTRIB_LAST_PART;
    pGatherDesc->ulOrig = 0;
	
    pGatherDesc ++;
    pGatherDesc->ulInputPtr = (ULONG)virt_to_bus(pucData);
    pGatherDesc->ulInputLen = usDataLen;
    pGatherDesc->ulInputAttrib = ICD_ATTRIB_LAST_PART;
    pGatherDesc->ulOrig = 0x04;
    /* */

    pCurBD->ulOutputContext = virt_to_bus ( (ULONG)pucRes );
    pCurBD->ulOutputNum  = 0;
    pCurBD->ulScatterEnable &= ~BD_SCATTER_ENABLE;


    pCurBD->ulOpCode = BD_OPCODE_HASH_OPERATION;
    pCurBD->ulFlag = ucFlag;
    


#ifdef HI_DBG
{
	ULONG* pulTmp = NULL;
	ULONG* pulTmp1 = NULL;
	int i;
	
	pulTmp = (ULONG*)pCurBD;
	
	printk ("\r\nBD: %08x %08x %08x %08x %08x %08x ", pulTmp[0], pulTmp[1], pulTmp[2], pulTmp[3], pulTmp[4], pulTmp[5]); 
	
	pulTmp1 = (ULONG*)((ULONG)bus_to_virt ( pulTmp[1] ));
	for (i=0; i<2; i++)
	{
		printk ("\r\nicd %d: %08x %08x", i, pulTmp1[0], pulTmp1[1]);
		pulTmp = (ULONG*)((ULONG)bus_to_virt ( pulTmp1[0] ));
		printk ("\r\n buf: %08x %08x %08x %08x %08x %08x %08x %08x", pulTmp[0],pulTmp[1],pulTmp[2],pulTmp[3],pulTmp[4],pulTmp[5],pulTmp[6],pulTmp[7] );
		
		pulTmp1 += 2;
	}
	
}
#endif


   
    pDrvCtrl->ulCurrDMA1BdWritePtr = (pDrvCtrl->ulCurrDMA1BdWritePtr + 1) & (SSX31A_DMA1_BDQUEUE_LEN - 1);
    PciWrite32(SSX31A_BQWP1_RW, pDrvCtrl->ulCurrDMA1BdWritePtr);

    pDrvCtrl->ulFreeDMA1BDs --;

    SplX(lIntMask);    


    ulTmt = (DMA1_TMOUT & 0xffff)*100 + 100000;
    
    for (i = 0; i < ulTmt; i ++)
    {
        UsDelay(10);


        PciRead32(SSX31A_BQRP1_RW, &pDrvCtrl->ulCurrDMA1BdReadPtr);

        PciRead32(SSX31A_RQWP1_RW, &pDrvCtrl->ulCurrDMA1RdWritePtr);


        if (pDrvCtrl->ulCurrDMA1RdWritePtr == pDrvCtrl->ulCurrDMA1RdReadPtr)
        {
            continue;
        }
        else
        {
            pCurRD = &((PERD_DESC*)(pDrvCtrl->ulDMA1RDMemBase))[pDrvCtrl->ulCurrDMA1RdReadPtr];
#ifdef HI_DBG
{
	ULONG* pulTmp = NULL;
	pulTmp = (ULONG*)pCurRD;
	
	printk ("\r\nRD %08x %08x %08x %08x %08x %08x", 
		pulTmp[0],pulTmp[1],pulTmp[2],pulTmp[3],pulTmp[4],pulTmp[5]);
		

}
#endif
	    if (pCurRD->ulGatherEnable == BD_GATHER_ENABLE )
    	    {
    	    	if (pCurRD->ulInputContext )
            	{

           		 Free( bus_to_virt(pCurRD->ulInputContext) );
        	         pCurRD->ulInputContext = NULL;
            	}
            }
            if (pCurRD->ulScatterEnable == BD_SCATTER_ENABLE )
            {
                if (pCurRD->ulOutputContext )
                {
                    Free( bus_to_virt(pCurRD->ulOutputContext) );
                    pCurRD->ulOutputContext = NULL;
                }
            }



            if ((pCurRD->ulStatus & MASK_RD_STATUS_ERRCODE) == RD_STATUS_RDVALID)
            {
               ucRes = OK;
            }
            else
            {
#ifdef HI_DBG	    
                PRINT("\r\nSSX31A hash failed. RD status %04x", pCurRD->ulStatus);
		ucRes = ERR;
#endif		
            }
        
            pDrvCtrl->ulCurrDMA1RdReadPtr = (pDrvCtrl->ulCurrDMA1RdReadPtr + 1) & (SSX31A_DMA1_RDQUEUE_LEN - 1);  


            if (pDrvCtrl->ulCurrDMA1RdWritePtr == pDrvCtrl->ulCurrDMA1RdReadPtr)
            {
                PciWrite32(SSX31A_RQRP1_RW, pDrvCtrl->ulCurrDMA1RdReadPtr); 

                pDrvCtrl->ulFreeDMA1BDs ++;

                break;
            }

        }

    }
    
    if (i >= ulTmt)
    {
#ifdef HI_DBG    
    	PRINT ("\r\nnot finish");
#endif	
	ucRes = ERR;
    }

    return ucRes;
}

⌨️ 快捷键说明

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