[][openwrt][mt7988][crypto][EIP197 DDK Porting]

[Description]
Add eip197 DDK(Driver Development Kit) and firmware
to eip197 package(crypto-eip)

eip197 DDK v5.6.1
eip197b-iew firmware v3.5

[Release-log]
N/A

Change-Id: I662327ecfbdac69742bf0b50362d7c28fc06372b
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7895272
diff --git a/package-21.02/kernel/crypto-eip/src/ddk/kit/eip197/eip202_rd_format.c b/package-21.02/kernel/crypto-eip/src/ddk/kit/eip197/eip202_rd_format.c
new file mode 100644
index 0000000..d3ce3c6
--- /dev/null
+++ b/package-21.02/kernel/crypto-eip/src/ddk/kit/eip197/eip202_rd_format.c
@@ -0,0 +1,313 @@
+/* eip202_rd_format.c
+ *
+ * EIP-202 Ring Control Driver Library
+ * Result Descriptor Internal interface
+ *
+ * This module contains the EIP-202 Result Descriptor specific functionality
+ */
+
+/* -------------------------------------------------------------------------- */
+/*                                                                            */
+/*   Module        : ddk197                                                   */
+/*   Version       : 5.6.1                                                    */
+/*   Configuration : DDK-197-GPL                                              */
+/*                                                                            */
+/*   Date          : 2022-Dec-16                                              */
+/*                                                                            */
+/* Copyright (c) 2008-2022 by Rambus, Inc. and/or its subsidiaries.           */
+/*                                                                            */
+/* This program is free software: you can redistribute it and/or modify       */
+/* it under the terms of the GNU General Public License as published by       */
+/* the Free Software Foundation, either version 2 of the License, or          */
+/* any later version.                                                         */
+/*                                                                            */
+/* This program is distributed in the hope that it will be useful,            */
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of             */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the               */
+/* GNU General Public License for more details.                               */
+/*                                                                            */
+/* You should have received a copy of the GNU General Public License          */
+/* along with this program. If not, see <http://www.gnu.org/licenses/>.       */
+/* -------------------------------------------------------------------------- */
+
+/*----------------------------------------------------------------------------
+ * This module implements (provides) the following interface(s):
+ */
+
+#include "eip202_rd_format.h"
+
+// Descriptor I/O Driver Library API implementation
+#include "eip202_rdr.h"                 // EIP202_ARM_CommandDescriptor_t
+
+
+/*----------------------------------------------------------------------------
+ * This module uses (requires) the following interface(s):
+ */
+
+// Default configuration
+#include "c_eip202_ring.h"
+
+// EIP-202 Ring Control Driver Library Internal interfaces
+#include "eip202_ring_internal.h"
+
+// Driver Framework Basic Definitions API
+#include "basic_defs.h"                // bool, uint32_t, uint8_t
+
+// Driver Framework DMA Resource API
+#include "dmares_types.h"              // DMAResource_Handle_t
+#include "dmares_rw.h"                 // DMAResource_Write/Read
+
+// Standard IOToken API
+#include "iotoken.h"
+
+
+/*----------------------------------------------------------------------------
+ * Definitions and macros
+ */
+
+
+/*----------------------------------------------------------------------------
+ * Local variables
+ */
+
+
+/*----------------------------------------------------------------------------
+ * EIP202_RD_Make_ControlWord
+ */
+uint32_t
+EIP202_RD_Make_ControlWord(
+        const uint8_t ExpectedResultWordCount,
+        const uint32_t PrepSegmentByteCount,
+        const bool fFirstSegment,
+        const bool fLastSegment)
+{
+    uint32_t Value = 0;
+
+    if(fFirstSegment)
+        Value |= BIT_23;
+
+    if(fLastSegment)
+        Value |= BIT_22;
+
+    Value |= ((((uint32_t)ExpectedResultWordCount) & MASK_8_BITS) << 24);
+    Value |= ((((uint32_t)PrepSegmentByteCount)    & MASK_20_BITS));
+
+    return Value;
+}
+
+
+/*----------------------------------------------------------------------------
+ * EIP202_Prepared_Write
+ */
+void
+EIP202_Prepared_Write(
+        DMAResource_Handle_t Handle,
+        const unsigned int WordOffset,
+        const EIP202_ARM_PreparedDescriptor_t * const Descr_p)
+{
+#ifdef EIP202_64BIT_DEVICE
+    // Write Control Word
+    DMAResource_Write32(Handle, WordOffset, Descr_p->PrepControlWord);
+
+    // Do not support lengths greater than 20 bit.
+    DMAResource_Write32(Handle, WordOffset + 1, 0);
+
+    // Write Destination Packet Data address
+    DMAResource_Write32(Handle, WordOffset + 2, Descr_p->DstPacketAddr.Addr);
+    DMAResource_Write32(Handle, WordOffset + 3, Descr_p->DstPacketAddr.UpperAddr);
+
+#else
+    // Write Control Word
+    DMAResource_Write32(Handle, WordOffset, Descr_p->PrepControlWord);
+
+    // Write Destination Packet Data address
+    DMAResource_Write32(Handle, WordOffset + 1, Descr_p->DstPacketAddr.Addr);
+#endif
+
+    return;
+}
+
+
+/*----------------------------------------------------------------------------
+ * EIP202_ReadDescriptor
+ */
+void
+EIP202_ReadDescriptor(
+        EIP202_ARM_ResultDescriptor_t * const Descr_p,
+        const DMAResource_Handle_t Handle,
+        const unsigned int WordOffset,
+        const unsigned int DscrOffsWordCount,
+        const unsigned int TokenOffsWordCount,
+        bool * const fLastSegment,
+        bool * const fFirstSegment)
+{
+    unsigned int OutTokenWordOffset;
+
+#ifdef EIP202_64BIT_DEVICE
+    // Word 0 - Control Word
+    Descr_p->ProcControlWord = DMAResource_Read32(Handle, WordOffset);
+
+    // Word 1 - extended length, not read.
+
+    // Word 2 & 3 - Destination Packet Data Buffer Address
+    Descr_p->DstPacketAddr.Addr = DMAResource_Read32(Handle, WordOffset + 2);
+    Descr_p->DstPacketAddr.UpperAddr = DMAResource_Read32(Handle, WordOffset + 3);
+
+    OutTokenWordOffset = WordOffset + TokenOffsWordCount;
+#else // EIP202_64BIT_DEVICE
+    // Word 0 - Control Word
+    Descr_p->ProcControlWord = DMAResource_Read32(Handle, WordOffset);
+
+    // Word 1 - Destination Packet Data Buffer Address
+    Descr_p->DstPacketAddr.Addr = DMAResource_Read32(Handle, WordOffset + 1);
+
+    OutTokenWordOffset = WordOffset + 2;
+#endif // !EIP202_64BIT_DEVICE
+
+    if (Descr_p->Token_p == NULL)
+    {
+        *fLastSegment   = false;
+        *fFirstSegment  = false;
+        return; // Fatal error
+    }
+
+    // Read token data
+    {
+        unsigned int i;
+
+#ifdef EIP202_RING_ANTI_DMA_RACE_CONDITION_CDS
+        for (i = 0; i < IOToken_OutWordCount_Get(); i++)
+            if (i != (unsigned int)IOToken_OutMarkOffset_Get())
+                Descr_p->Token_p[i] = DMAResource_Read32(
+                                          Handle,
+                                          OutTokenWordOffset + i);
+#else
+        for (i = 0; i < IOToken_OutWordCount_Get(); i++)
+            Descr_p->Token_p[i] = DMAResource_Read32(
+                                    Handle,
+                                    OutTokenWordOffset + i);
+#endif
+    }
+
+    // Check if this descriptor is for the last segment
+    if((Descr_p->ProcControlWord & BIT_22) != 0)
+        *fLastSegment = true; // Processed packet
+    else
+        *fLastSegment = false;
+
+    // Check if this descriptor is for the first segment
+    if((Descr_p->ProcControlWord & BIT_23) != 0)
+        *fFirstSegment = true; // New packet descriptor chain detected
+    else
+        *fFirstSegment = false;
+
+    IDENTIFIER_NOT_USED(DscrOffsWordCount);
+
+    return;
+}
+
+
+/*----------------------------------------------------------------------------
+ * EIP202_ClearDescriptor
+ */
+void
+EIP202_ClearDescriptor(
+        EIP202_ARM_ResultDescriptor_t * const Descr_p,
+        const DMAResource_Handle_t Handle,
+        const unsigned int WordOffset,
+        const unsigned int TokenOffsWordCount,
+        const unsigned int DscrWordCount)
+{
+    IDENTIFIER_NOT_USED(Descr_p);
+
+#if defined(EIP202_RDR_OWNERSHIP_WORD_ENABLE)
+
+    DMAResource_Write32(Handle, WordOffset + DscrWordCount - 1, 0);
+    IDENTIFIER_NOT_USED(TokenOffsWordCount);
+
+#elif defined(EIP202_RING_ANTI_DMA_RACE_CONDITION_CDS)
+
+    IDENTIFIER_NOT_USED(DscrWordCount);
+
+    DMAResource_Write32(Handle,
+                        WordOffset + TokenOffsWordCount +
+                                  IOToken_OutMarkOffset_Get(),
+                        0);
+#else
+    IDENTIFIER_NOT_USED(Handle);
+    IDENTIFIER_NOT_USED(WordOffset);
+    IDENTIFIER_NOT_USED(DscrWordCount);
+    IDENTIFIER_NOT_USED(TokenOffsWordCount);
+#endif // !EIP202_RDR_OWNERSHIP_WORD_ENABLE
+}
+
+
+/*----------------------------------------------------------------------------
+ * EIP202_RD_Read_ControlWord
+ */
+void
+EIP202_RD_Read_ControlWord(
+        const uint32_t ControlWord,
+        uint32_t * TokenData_p,
+        EIP202_RDR_Result_Control_t * const RDControl_p,
+        EIP202_RDR_Result_Token_t * const ResToken_p)
+{
+    RDControl_p->ProcSegmentByteCount =  (ControlWord        & MASK_20_BITS);
+    RDControl_p->ProcResultWordCount  = ((ControlWord >> 24) & MASK_8_BITS);
+
+    // Fill in EIP202_RDR_Result_Control_t
+    if((ControlWord & BIT_20) != 0)
+        RDControl_p->fDscrOverflow = true;
+    else
+        RDControl_p->fDscrOverflow = false;
+
+    if((ControlWord & BIT_21) != 0)
+        RDControl_p->fBufferOverflow = true;
+    else
+        RDControl_p->fBufferOverflow = false;
+
+    if((ControlWord & BIT_22) != 0)
+        RDControl_p->fLastSegment = true;
+    else
+        RDControl_p->fLastSegment = false;
+
+    if((ControlWord & BIT_23) != 0)
+        RDControl_p->fFirstSegment = true;
+    else
+        RDControl_p->fFirstSegment = false;
+
+    IDENTIFIER_NOT_USED(TokenData_p);
+    IDENTIFIER_NOT_USED(ResToken_p);
+}
+
+
+/*----------------------------------------------------------------------------
+ * EIP202_RD_Read_BypassData
+ */
+void
+EIP202_RD_Read_BypassData(
+        const uint32_t * BypassData_p,
+        const uint8_t BypassWordCount,
+        EIP202_RDR_BypassData_t * const BD_p)
+{
+    if (BypassWordCount == 1)
+    {
+        BD_p->Fail.ErrorFlags = BypassData_p[0] & MASK_2_BITS;
+    }
+    else if (BypassWordCount == 2)
+    {
+        BD_p->Pass.TOS_TC           = BypassData_p[0] & MASK_8_BITS;
+        BD_p->Pass.fDF              = ((BypassData_p[0] & BIT_8) != 0);
+        BD_p->Pass.NextHeaderOffset = (BypassData_p[0] >> 8) & MASK_16_BITS;
+        BD_p->Pass.HdrProcCtxRef    = BypassData_p[1];
+    }
+    else
+    {
+        IDENTIFIER_NOT_USED(BypassData_p);
+        IDENTIFIER_NOT_USED(BypassWordCount);
+        IDENTIFIER_NOT_USED(BD_p);
+    }
+}
+
+
+/* end of file eip202_rd_format.c */