]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/pdk.git/commitdiff
PDK-11354: Board: Updated j784s4 evm ddr configurations
authorM V Pratap Reddy <x0257344@ti.com>
Wed, 6 Jul 2022 08:01:04 +0000 (13:31 +0530)
committerM V Pratap Reddy <x0257344@ti.com>
Wed, 6 Jul 2022 08:01:04 +0000 (13:31 +0530)
 - Updated DDR configurations to enable access to full memory
 - Enabled support for DDR ECC

packages/ti/board/src/j721s2_evm/include/board_ddr.h
packages/ti/board/src/j784s4_evm/board_clock.c
packages/ti/board/src/j784s4_evm/board_ddr.c
packages/ti/board/src/j784s4_evm/board_ddr_prime_dma.c [new file with mode: 0644]
packages/ti/board/src/j784s4_evm/include/board_ddr.h
packages/ti/board/src/j784s4_evm/include/board_ddrRegInit.h
packages/ti/board/src/j784s4_evm/src_files_j784s4_evm.mk

index 99d331609deb35decd3dbd62358356dc84e5e7e2..60213e0ebdce6ffaf3f3d4bd227f745dd7398504 100644 (file)
@@ -91,7 +91,7 @@ extern "C" {
 #define BOARD_DDR_LOCK0                         (0x115008U)
 #define BOARD_DDR_LOCK1                         (0x11500CU)
 
-#define BOARD_DDR_CFG_LOAD_VALUE                (0x11500CU)
+#define BOARD_DDR_CFG_LOAD_VALUE                (0x60000000U)
 
 /**
  * \brief DDR object structure
index 96521b96c11a996691af113edf55b20e4c91ecc9..19213f280f12df3ebe48c13836252218667d2bd5 100644 (file)
@@ -105,6 +105,8 @@ uint32_t gBoardClkModuleMainIDInitGroup1[] = {
     TISCI_DEV_DDR3,
     TISCI_DEV_EMIF_DATA_0_VD,
     TISCI_DEV_EMIF_DATA_1_VD,
+    TISCI_DEV_EMIF_DATA_2_VD,
+    TISCI_DEV_EMIF_DATA_3_VD,
     TISCI_DEV_MMCSD0,
     TISCI_DEV_MMCSD1,
     TISCI_DEV_GPIO4,
index a72b7b2a18e0a9b7b2b037e771b4fa7e59a1e663..23518fc4191f0c6898a3a953cbb8fe1222dd4ef9 100644 (file)
@@ -321,6 +321,44 @@ static Board_STATUS Board_DDRStart(Board_DdrHandle ddrHandle)
     return BOARD_SOK;
 }
 
+/**
+ * \brief Configures DDR ECC
+ *
+ * Invokes EMIF CSL APIs to configure ECC and Primes the memory
+ *
+ * \return  BOARD_SOK in case of success or appropriate error code
+ *
+ */
+/* Refer EMIF ECC Configuration Section in TRM */
+Board_STATUS emif_ConfigureECC(Board_DdrHandle ddrHandle)
+{
+    Board_STATUS   status    = BOARD_SOK;
+    int32_t        cslResult = CSL_PASS;
+    CSL_EmifConfig emifCfg;
+
+    BOARD_DEBUG_LOG("\r\n Configuring ECC");
+
+    memset(&emifCfg, 0, sizeof(emifCfg));
+
+    emifCfg.bEnableMemoryECC = true;
+    emifCfg.bReadModifyWriteEnable = true;
+    emifCfg.bECCCheck = true;
+    emifCfg.bWriteAlloc = true;
+    emifCfg.ECCThreshold = 1U;
+    emifCfg.pMemEccCfg.startAddr[0] = BOARD_DDR_START_ADDR-BOARD_DDR_START_ADDR;
+    emifCfg.pMemEccCfg.endAddr[0] = BOARD_DDR_ECC_END_ADDR-BOARD_DDR_START_ADDR;
+
+    cslResult = CSL_emifConfig((CSL_emif_sscfgRegs *)ddrHandle->eccAddr,
+                               &emifCfg);
+    if ( cslResult == BOARD_SOK )
+    {
+        /* Clears ECC errors */
+        CSL_emifClearAllECCErrors((CSL_emif_sscfgRegs *)ddrHandle->eccAddr);
+    }
+
+    return status;
+}
+
 /**
  * \brief DDR4 Configuration function
  *
@@ -386,24 +424,28 @@ static Board_DdrHandle Board_DDROpen(uint32_t ddrInstance)
                     ddrHandle->ddrCtlReg      = DDRSS0_ctlReg;
                     ddrHandle->ddrPhyIndepReg = DDRSS0_phyIndepReg;
                     ddrHandle->ddrPhyReg      = DDRSS0_phyReg;
+                    ddrHandle->eccAddr        = CSL_COMPUTE_CLUSTER0_VBUSP_DDRSS0_SSCFG_BASE;
                     break;
                  case BOARD_DDR_INSTANCE_1:
                     ddrHandle->ddrCtlAddr     = (void *)BOARD_DDR1_CTL_CFG_BASE;
                     ddrHandle->ddrCtlReg      = DDRSS1_ctlReg;
                     ddrHandle->ddrPhyIndepReg = DDRSS1_phyIndepReg;
                     ddrHandle->ddrPhyReg      = DDRSS1_phyReg;
+                    ddrHandle->eccAddr        = CSL_COMPUTE_CLUSTER0_VBUSP_DDRSS1_SSCFG_BASE;
                     break;
                  case BOARD_DDR_INSTANCE_2:
                     ddrHandle->ddrCtlAddr     = (void *)BOARD_DDR2_CTL_CFG_BASE;
                     ddrHandle->ddrCtlReg      = DDRSS2_ctlReg;
                     ddrHandle->ddrPhyIndepReg = DDRSS2_phyIndepReg;
                     ddrHandle->ddrPhyReg      = DDRSS2_phyReg;
+                    ddrHandle->eccAddr        = CSL_COMPUTE_CLUSTER0_VBUSP_DDRSS2_SSCFG_BASE;
                     break;
                  case BOARD_DDR_INSTANCE_3:
                     ddrHandle->ddrCtlAddr     = (void *)BOARD_DDR3_CTL_CFG_BASE;
                     ddrHandle->ddrCtlReg      = DDRSS3_ctlReg;
                     ddrHandle->ddrPhyIndepReg = DDRSS3_phyIndepReg;
                     ddrHandle->ddrPhyReg      = DDRSS3_phyReg;
+                    ddrHandle->eccAddr        = CSL_COMPUTE_CLUSTER0_VBUSP_DDRSS3_SSCFG_BASE;
                     break;
             }
         }
@@ -490,9 +532,30 @@ Board_STATUS Board_DDRInit(Bool eccEnable)
             return status;
         }
 
+        if (eccEnable == TRUE)
+        {
+            status = emif_ConfigureECC(ddrHandle);
+            if ( status != BOARD_SOK )
+            {
+                BOARD_DEBUG_LOG("\r\n CSL_emifConfig Failed");
+                return status;
+            }
+        }
         Board_DDRClose(ddrHandle);
     }
 
+    if (eccEnable == TRUE)
+    {
+#ifdef BOARD_DDR_ENABLE_DDR_MEM_PRIME
+        status = BOARD_udmaPrimeDDR((void *)BOARD_DDR_START_ADDR, BOARD_DDR_ECC_END_ADDR-BOARD_DDR_START_ADDR+1U);
+        if ( status != BOARD_SOK )
+        {
+            BOARD_DEBUG_LOG("\r\n UDMAPrime Failed");
+            return status;
+        }
+#endif
+    }
+
     /* Lock the register access */
     HW_WR_REG32(BOARD_PLL12_LOCK0, KICK_LOCK);
     HW_WR_REG32(BOARD_PLL12_LOCK1, KICK_LOCK);
diff --git a/packages/ti/board/src/j784s4_evm/board_ddr_prime_dma.c b/packages/ti/board/src/j784s4_evm/board_ddr_prime_dma.c
new file mode 100644 (file)
index 0000000..59bf311
--- /dev/null
@@ -0,0 +1,669 @@
+/*
+ *
+ * Copyright (c) 2021 Texas Instruments Incorporated
+ *
+ * All rights reserved not granted herein.
+ *
+ * Limited License.
+ *
+ * Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
+ * license under copyrights and patents it now or hereafter owns or controls to make,
+ * have made, use, import, offer to sell and sell ("Utilize") this software subject to the
+ * terms herein.  With respect to the foregoing patent license, such license is granted
+ * solely to the extent that any such patent is necessary to Utilize the software alone.
+ * The patent license shall not apply to any combinations which include this software,
+ * other than combinations with devices manufactured by or for TI ("TI Devices").
+ * No hardware patent is licensed hereunder.
+ *
+ * Redistributions must preserve existing copyright notices and reproduce this license
+ * (including the above copyright notice and the disclaimer and (if applicable) source
+ * code license limitations below) in the documentation and/or other materials provided
+ * with the distribution
+ *
+ * Redistribution and use in binary form, without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *       No reverse engineering, de-compilation, or disassembly of this software is
+ * permitted with respect to any software provided in binary form.
+ *
+ * *       any redistribution and use are licensed by TI for use only with TI Devices.
+ *
+ * *       Nothing shall obligate TI to provide you with source code for the software
+ * licensed and provided to you in object code.
+ *
+ * If software source code is provided to you, modification and redistribution of the
+ * source code are permitted provided that the following conditions are met:
+ *
+ * *       any redistribution and use of the source code, including any resulting derivative
+ * works, are licensed by TI for use only with TI Devices.
+ *
+ * *       any redistribution and use of any object code compiled from the source code
+ * and any resulting derivative works, are licensed by TI for use only with TI Devices.
+ *
+ * Neither the name of Texas Instruments Incorporated nor the names of its suppliers
+ *
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * DISCLAIMER.
+ *
+ * THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "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 TI AND TI'S LICENSORS 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 <ti/csl/arch/csl_arch.h>
+#include <ti/osal/osal.h>
+#include <ti/drv/uart/UART_stdio.h>
+#include <ti/drv/udma/udma.h>
+
+#include "board_ddr.h"
+
+#ifdef BOARD_DDR_ENABLE_DDR_MEM_PRIME
+
+/* ========================================================================== */
+/*                           Macros & Typedefs                                */
+/* ========================================================================== */
+
+/** \brief Buffer Size in bytes */
+#define BOARD_DDR_PRIME_BUFFER_NUM_BYTES  (UDMA_CACHELINE_ALIGNMENT)
+
+/*
+ * Ring parameters
+ */
+/** \brief Number of ring entries - we can prime this much memcpy operations */
+#define BOARD_RING_ENTRIES                (1U)
+/** \brief Size (in bytes) of each ring entry (Size of pointer - 64-bit) */
+#define BOARD_RING_ENTRY_SIZE             (sizeof(uint64_t))
+/** \brief Total ring memory */
+#define BOARD_RING_MEM_SIZE               (BOARD_RING_ENTRIES * BOARD_RING_ENTRY_SIZE)
+/** \brief This ensures every channel memory is aligned */
+#define BOARD_RING_MEM_SIZE_ALIGN ((BOARD_RING_MEM_SIZE + UDMA_CACHELINE_ALIGNMENT) & ~(UDMA_CACHELINE_ALIGNMENT - 1U))
+
+/** 
+ * \brief Maximum no.of TR's. 
+ * Size to prime is of 32 bytes. TR ICNT is 16 bytes and hence use max of 2 TR's to 
+ * effectively split all cases, without causing any left over.
+ *  */
+#define BOARD_MAX_TR                    (2U)
+/* ICNT Split Size. This will be used to split to multiple TR's if required.
+ * Set this to half of 0xFFFF(max of 16 bytes ICNT) */
+#define BOARD_UDMA_ICNT_SPLIT_SIZE      (0x8000U)
+
+/**
+ *  \brief UDMA TR packet descriptor memory.
+ *  This contains the CSL_UdmapCppi5TRPD + Padding to sizeof(CSL_UdmapTR15) +
+ *  one Type_15 TR (CSL_UdmapTR15) + one TR response of 4 bytes.
+ *  Since CSL_UdmapCppi5TRPD is less than CSL_UdmapTR15, size is just two times
+ *  CSL_UdmapTR15 for alignment.
+ */
+#define BOARD_TRPD_SIZE         ((sizeof(CSL_UdmapTR15) * (BOARD_MAX_TR + 1U)) + 4U)
+/** \brief This ensures every channel memory is aligned */
+#define BOARD_TRPD_SIZE_ALIGN   ((BOARD_TRPD_SIZE + UDMA_CACHELINE_ALIGNMENT) & ~(UDMA_CACHELINE_ALIGNMENT - 1U))
+
+/* ========================================================================== */
+/*                         Structure Declarations                             */
+/* ========================================================================== */
+
+/* None */
+
+/* ========================================================================== */
+/*                          Function Declarations                             */
+/* ========================================================================== */
+
+int32_t BOARD_udmaPrime(Udma_ChHandle chHandle, 
+                        const void *startAddr, 
+                        uint32_t size);
+
+static void BOARD_udmaEventDmaCb(Udma_EventHandle eventHandle,
+                                 uint32_t eventType,
+                                 void *appData);
+static void BOARD_udmaEventTdCb(Udma_EventHandle eventHandle,
+                                uint32_t eventType,
+                                void *appData);
+
+static int32_t BOARD_udmaInit(Udma_DrvHandle drvHandle);
+static int32_t BOARD_udmaDeInit(Udma_DrvHandle drvHandle);
+
+static int32_t BOARD_udmaCreate(Udma_DrvHandle drvHandle, Udma_ChHandle chHandle);
+static int32_t BOARD_udmaDelete(Udma_DrvHandle drvHandle, Udma_ChHandle chHandle);
+
+static uint32_t BOARD_udmaTrpdinit(Udma_ChHandle chHandle,
+                                   uint8_t *pTrpdMem,
+                                   const void *startAddr, 
+                                   uint32_t totalSize,
+                                   const void *srcAddr,
+                                   uint32_t srcBufSize);
+
+/* ========================================================================== */
+/*                            Global Variables                                */
+/* ========================================================================== */
+
+/*
+ * UDMA driver objects
+ */
+struct Udma_DrvObj      gBoardUdmaDrvObj;
+struct Udma_ChObj       gBoardUdmaChObj;
+struct Udma_EventObj    gBoardUdmaCqEventObj;
+struct Udma_EventObj    gBoardUdmaTdCqEventObj;
+
+/*
+ * UDMA Memories
+ */
+uint8_t gBoardTxRingMem[BOARD_RING_MEM_SIZE_ALIGN] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
+uint8_t gBoardTxCompRingMem[BOARD_RING_MEM_SIZE_ALIGN] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
+uint8_t gBoardTxTdCompRingMem[BOARD_RING_MEM_SIZE_ALIGN] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
+uint8_t gBoardUdmaTrpdMem[BOARD_TRPD_SIZE_ALIGN] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
+
+uint32_t gBoardUdmaPrimeSrcBuffer[BOARD_DDR_PRIME_BUFFER_NUM_BYTES/4U] __attribute__((aligned(UDMA_CACHELINE_ALIGNMENT)));
+
+/* Semaphore to indicate priming completion */
+static SemaphoreP_Handle gBoardUdmaDDRPrimeDoneSem = NULL;
+
+/* ========================================================================== */
+/*                          Function Definitions                              */
+/* ========================================================================== */
+
+Board_STATUS BOARD_udmaPrimeDDR(void *startAddr, uint32_t size)
+{
+    Board_STATUS    status    = BOARD_SOK;
+    int32_t         retVal;
+    Udma_DrvHandle  drvHandle = &gBoardUdmaDrvObj;
+    Udma_ChHandle   chHandle = &gBoardUdmaChObj;
+
+    retVal = BOARD_udmaInit(drvHandle);
+    if(UDMA_SOK != retVal)
+    {
+        BOARD_DEBUG_LOG("[DMA] BOARD UDMA init failed!!\n");
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        retVal = BOARD_udmaCreate(drvHandle, chHandle);
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] BOARD UDMA create failed!!\n");
+        }
+
+        if(UDMA_SOK == retVal)
+        {
+            retVal = BOARD_udmaPrime(chHandle, startAddr, size);
+            if(UDMA_SOK != retVal)
+            {
+                BOARD_DEBUG_LOG("[DMA] BOARD UDMA prime failed!!\n");
+            }
+        }
+
+        retVal += BOARD_udmaDelete(drvHandle, chHandle);
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] BOARD UDMA delete failed!!\n");
+        }
+    }
+
+    retVal += BOARD_udmaDeInit(drvHandle);
+    if(UDMA_SOK != retVal)
+    {
+        BOARD_DEBUG_LOG("[DMA] BOARD UDMA deinit failed!!\n");
+    }
+
+    return (status);
+}
+
+int32_t BOARD_udmaPrime(Udma_ChHandle chHandle, const void *startAddr, uint32_t size)
+{
+    int32_t         retVal = UDMA_SOK;
+    uint32_t       *pTrResp, trRespStatus;
+    uint64_t        pDesc = 0;
+    uint32_t       *srcBuf = &gBoardUdmaPrimeSrcBuffer[0U];
+    uint8_t        *trpdMem = &gBoardUdmaTrpdMem[0U];
+    uintptr_t       memPtr;
+    uint32_t        offset;
+    uint32_t        numTR;
+    
+    /* Init Src Buffer */
+    for (offset = 0U; offset < BOARD_DDR_PRIME_BUFFER_NUM_BYTES; offset += 4)
+    {
+        *((volatile uint32_t *) srcBuf) = 0xA5A5A5A5;
+        srcBuf++;
+    }
+    /* Writeback buffer */
+    CacheP_wb(&gBoardUdmaPrimeSrcBuffer[0U], BOARD_DDR_PRIME_BUFFER_NUM_BYTES);
+
+    /* Update TRPD and get no. of TR's used */
+    numTR = BOARD_udmaTrpdinit(chHandle, trpdMem, startAddr, size, &gBoardUdmaPrimeSrcBuffer[0U], BOARD_DDR_PRIME_BUFFER_NUM_BYTES);
+
+    /* Submit TRPD to channel */
+    retVal = Udma_ringQueueRaw(
+                    Udma_chGetFqRingHandle(chHandle),
+                    (uint64_t) trpdMem);
+    if(UDMA_SOK != retVal)
+    {
+        BOARD_DEBUG_LOG("[DMA] Channel queue failed!!\n");
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        /* Wait for return descriptor in completion ring for the last channel
+         * This marks the entire transfer completion */
+        SemaphoreP_pend(gBoardUdmaDDRPrimeDoneSem, SemaphoreP_WAIT_FOREVER);
+
+        /* Response received in completion queue */
+        retVal =
+            Udma_ringDequeueRaw(Udma_chGetCqRingHandle(chHandle), &pDesc);
+
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] No descriptor after callback!!\n");
+            retVal = UDMA_EFAIL;
+        }
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        /*
+         * Sanity check
+         */
+        /* Check returned descriptor pointer */
+        if(pDesc != ((uint64_t) trpdMem))
+        {
+            BOARD_DEBUG_LOG("[DMA] TR descriptor pointer returned doesn't "
+                    "match the submitted address!!\n");
+            retVal = UDMA_EFAIL;
+        }
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        /* Invalidate cache */
+        CacheP_Inv(&gBoardUdmaTrpdMem[0U], BOARD_TRPD_SIZE);
+
+        /* check TR response status */
+        pTrResp = (uint32_t *) (trpdMem + (sizeof(CSL_UdmapTR15) * (numTR + 1U)));
+        trRespStatus = CSL_FEXT(*pTrResp, UDMAP_TR_RESPONSE_STATUS_TYPE);
+        if(trRespStatus != CSL_UDMAP_TR_RESPONSE_STATUS_COMPLETE)
+        {
+            BOARD_DEBUG_LOG("[DMA] TR Response not completed!!\n");
+            retVal = UDMA_EFAIL;
+        }
+    }
+
+    /* Prime any chunk left over towards end, in case when total size is not multiple of BOARD_DDR_PRIME_BUFFER_NUM_BYTES */
+    if(size % BOARD_DDR_PRIME_BUFFER_NUM_BYTES)
+    {
+        memPtr = (uintptr_t)startAddr + size;
+        for (offset = 0U; offset <= (size % BOARD_DDR_PRIME_BUFFER_NUM_BYTES); offset += 4)
+        {
+            memPtr -= 4;
+            *((volatile uint32_t *) memPtr) = 0xA5A5A5A5;
+        }
+    }
+
+    return (retVal);
+}
+
+static void BOARD_udmaEventDmaCb(Udma_EventHandle eventHandle,
+                                 uint32_t eventType,
+                                 void *appData)
+{
+    if(UDMA_EVENT_TYPE_DMA_COMPLETION == eventType)
+    {
+        SemaphoreP_post(gBoardUdmaDDRPrimeDoneSem);
+    }
+
+    return;
+}
+
+static void BOARD_udmaEventTdCb(Udma_EventHandle eventHandle,
+                         uint32_t eventType,
+                         void *appData)
+{
+    CSL_UdmapTdResponse tdResp;
+
+    if(UDMA_EVENT_TYPE_TEARDOWN_PACKET == eventType)
+    {
+        /* Response received in Teardown completion queue */
+        Udma_chDequeueTdResponse(&gBoardUdmaChObj, &tdResp);
+    }
+
+    return;
+}
+
+static int32_t BOARD_udmaInit(Udma_DrvHandle drvHandle)
+{
+    int32_t         retVal;
+    Udma_InitPrms   initPrms;
+    uint32_t        instId;
+    uint32_t        socDomain;
+
+    /* Use MCU NAVSS for MCU domain cores. Rest cores all uses Main NAVSS */
+    socDomain = Board_getSocDomain();
+    if(socDomain == BOARD_SOC_DOMAIN_MCU)
+    {
+        instId = UDMA_INST_ID_MCU_0;
+    }
+    else
+    {
+        instId = UDMA_INST_ID_MAIN_0;
+    }
+
+    /* UDMA driver init */
+    retVal = UdmaInitPrms_init(instId, &initPrms);
+    if(UDMA_SOK != retVal)
+    {
+        BOARD_DEBUG_LOG("[DMA] UDMA init prms init failed!!\n");
+    }
+    else
+    {
+        retVal = Udma_init(drvHandle, &initPrms);
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] UDMA init failed!!\n");
+        }
+    }
+    return (retVal);
+}
+
+static int32_t BOARD_udmaDeInit(Udma_DrvHandle drvHandle)
+{
+    int32_t         retVal;
+    
+    retVal = Udma_deinit(drvHandle);
+    if(UDMA_SOK != retVal)
+    {
+        BOARD_DEBUG_LOG("[DMA] UDMA deinit failed!!\n");
+    }
+
+    return (retVal);
+}
+
+static int32_t BOARD_udmaCreate(Udma_DrvHandle drvHandle, Udma_ChHandle chHandle)
+{
+
+    int32_t             retVal = UDMA_SOK;
+    uint32_t            chType;
+    Udma_ChPrms         chPrms;
+    Udma_ChTxPrms       txPrms;
+    Udma_ChRxPrms       rxPrms;
+    Udma_EventHandle    tdCqEventHandle;
+    Udma_EventPrms      tdCqEventPrms;
+    Udma_EventHandle    cqEventHandle;
+    Udma_EventPrms      cqEventPrms;
+    SemaphoreP_Params   semPrms;
+
+    SemaphoreP_Params_init(&semPrms);
+    gBoardUdmaDDRPrimeDoneSem = SemaphoreP_create(0, &semPrms);
+    if(NULL == gBoardUdmaDDRPrimeDoneSem)
+    {
+        BOARD_DEBUG_LOG("[DMA] Sem create failed!!\n");
+        retVal = UDMA_EFAIL;
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        /* Init channel parameters */
+        chType = UDMA_CH_TYPE_TR_BLK_COPY;
+        UdmaChPrms_init(&chPrms, chType);
+        chPrms.fqRingPrms.ringMem       = &gBoardTxRingMem[0U];
+        chPrms.cqRingPrms.ringMem       = &gBoardTxCompRingMem[0U];
+        chPrms.tdCqRingPrms.ringMem     = &gBoardTxTdCompRingMem[0U];
+        chPrms.fqRingPrms.ringMemSize   = BOARD_RING_MEM_SIZE;
+        chPrms.cqRingPrms.ringMemSize   = BOARD_RING_MEM_SIZE;
+        chPrms.tdCqRingPrms.ringMemSize = BOARD_RING_MEM_SIZE;
+
+        chPrms.fqRingPrms.elemCnt   = BOARD_RING_ENTRIES;
+        chPrms.cqRingPrms.elemCnt   = BOARD_RING_ENTRIES;
+        chPrms.tdCqRingPrms.elemCnt = BOARD_RING_ENTRIES;
+
+        /* Open channel for block copy */
+        retVal = Udma_chOpen(drvHandle, chHandle, chType, &chPrms);
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] UDMA channel open failed!!\n");
+        }
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        /* Config TX channel */
+        UdmaChTxPrms_init(&txPrms, chType);
+        retVal = Udma_chConfigTx(chHandle, &txPrms);
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] UDMA TX channel config failed!!\n");
+        }
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        /* Config RX channel - which is implicitly paired to TX channel in
+         * block copy mode */
+        UdmaChRxPrms_init(&rxPrms, chType);
+        retVal = Udma_chConfigRx(chHandle, &rxPrms);
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] UDMA RX channel config failed!!\n");
+        }
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        /* Register ring completion callback */
+        cqEventHandle = &gBoardUdmaCqEventObj;
+        UdmaEventPrms_init(&cqEventPrms);
+        cqEventPrms.eventType         = UDMA_EVENT_TYPE_DMA_COMPLETION;
+        cqEventPrms.eventMode         = UDMA_EVENT_MODE_SHARED;
+        cqEventPrms.chHandle          = chHandle;
+        cqEventPrms.masterEventHandle = Udma_eventGetGlobalHandle(drvHandle);
+        cqEventPrms.eventCb           = &BOARD_udmaEventDmaCb;
+        retVal = Udma_eventRegister(drvHandle, cqEventHandle, &cqEventPrms);
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] UDMA CQ event register failed!!\n");
+        }
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        /* Register teardown ring completion callback */
+        tdCqEventHandle = &gBoardUdmaTdCqEventObj;
+        UdmaEventPrms_init(&tdCqEventPrms);
+        tdCqEventPrms.eventType         = UDMA_EVENT_TYPE_TEARDOWN_PACKET;
+        tdCqEventPrms.eventMode         = UDMA_EVENT_MODE_SHARED;
+        tdCqEventPrms.chHandle          = chHandle;
+        tdCqEventPrms.masterEventHandle = Udma_eventGetGlobalHandle(drvHandle);
+        tdCqEventPrms.eventCb           = &BOARD_udmaEventTdCb;
+        retVal = Udma_eventRegister(drvHandle, tdCqEventHandle, &tdCqEventPrms);
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] UDMA Teardown CQ event register failed!!\n");
+        }
+    }
+
+    if(UDMA_SOK == retVal)
+    {
+        /* Channel enable */
+        retVal = Udma_chEnable(chHandle);
+        if(UDMA_SOK != retVal)
+        {
+            BOARD_DEBUG_LOG("[DMA] UDMA channel enable failed!!\n");
+        }
+    }
+
+    return (retVal);
+}
+
+static int32_t BOARD_udmaDelete(Udma_DrvHandle drvHandle, Udma_ChHandle chHandle)
+{
+    int32_t         retVal = UDMA_SOK, tempRetVal;
+    uint64_t        pDesc;
+    Udma_EventHandle    cqEventHandle;
+    Udma_EventHandle    tdCqEventHandle;
+
+    retVal = Udma_chDisable(chHandle, UDMA_DEFAULT_CH_DISABLE_TIMEOUT);
+    if(UDMA_SOK != retVal)
+    {
+        BOARD_DEBUG_LOG("[DMA] UDMA channel disable failed!!\n");
+    }
+
+    /* Flush any pending request from the free queue */
+    while(1)
+    {
+        tempRetVal = Udma_ringFlushRaw(
+                         Udma_chGetFqRingHandle(chHandle), &pDesc);
+        if(UDMA_ETIMEOUT == tempRetVal)
+        {
+            break;
+        }
+    }
+
+    /* Unregister all events */
+    cqEventHandle = &gBoardUdmaCqEventObj;
+    retVal += Udma_eventUnRegister(cqEventHandle);
+    if(UDMA_SOK != retVal)
+    {
+        BOARD_DEBUG_LOG("[DMA] UDMA event unregister failed!!\n");
+    }
+    tdCqEventHandle = &gBoardUdmaTdCqEventObj;
+    retVal += Udma_eventUnRegister(tdCqEventHandle);
+    if(UDMA_SOK != retVal)
+    {
+        BOARD_DEBUG_LOG("[DMA] UDMA event unregister failed!!\n");
+    }
+
+    retVal += Udma_chClose(chHandle);
+    if(UDMA_SOK != retVal)
+    {
+        BOARD_DEBUG_LOG("[DMA] UDMA channel close failed!!\n");
+    }
+
+    if(gBoardUdmaDDRPrimeDoneSem != NULL)
+    {
+        SemaphoreP_delete(gBoardUdmaDDRPrimeDoneSem);
+        gBoardUdmaDDRPrimeDoneSem = NULL;
+    }
+
+    return (retVal);
+}
+
+static uint32_t BOARD_udmaTrpdinit(Udma_ChHandle chHandle,
+                                   uint8_t *pTrpdMem,
+                                   const void *startAddr, 
+                                   uint32_t totalSize,
+                                   const void *srcAddr,
+                                   uint32_t srcBufSize)
+{
+    CSL_UdmapCppi5TRPD  *pTrpd  = (CSL_UdmapCppi5TRPD *) pTrpdMem;
+    CSL_UdmapTR15       *pTr    = (CSL_UdmapTR15 *)(pTrpdMem + sizeof(CSL_UdmapTR15));
+
+    uint32_t *pTrResp;
+    uint32_t cqRingNum = Udma_chGetCqRingNum(chHandle);
+
+    uint32_t numTR = 1, trIdx;
+    uint16_t icnt[BOARD_MAX_TR][4] = {0};
+    uint32_t addrOffset[BOARD_MAX_TR] = {0};
+
+    uint32_t remainder    = totalSize/srcBufSize;
+    uint32_t residue      = remainder & (BOARD_UDMA_ICNT_SPLIT_SIZE - 1U);
+
+    /* Calculate number of TR's */
+    if (remainder < BOARD_UDMA_ICNT_SPLIT_SIZE)
+    {
+        numTR = 1U;
+    }
+    else if ((remainder > BOARD_UDMA_ICNT_SPLIT_SIZE) && (0U != residue))
+    {
+        numTR = 2U;
+    }
+    else
+    {
+        numTR = 1U;
+    }
+
+    pTrResp = (uint32_t *)(pTrpdMem + (sizeof(CSL_UdmapTR15) * (numTR + 1U)));
+    
+    if (remainder < BOARD_UDMA_ICNT_SPLIT_SIZE)
+    {
+        icnt[0][0] = (uint16_t)srcBufSize;
+        icnt[0][1] = (uint16_t)remainder;
+        icnt[0][2] = (uint16_t)1U;
+        icnt[0][3] = (uint16_t)1U;
+    }
+    else
+    {
+        icnt[0][0] = (uint16_t)srcBufSize;
+        icnt[0][1] = (uint16_t)BOARD_UDMA_ICNT_SPLIT_SIZE;
+        icnt[0][2] = (uint16_t)(remainder / BOARD_UDMA_ICNT_SPLIT_SIZE);
+        icnt[0][3] = (uint16_t)1U;
+    }
+    if (numTR > 1)
+    {
+        icnt[1][0] = (uint16_t)srcBufSize;
+        icnt[1][1] = (uint16_t)residue;
+        icnt[1][2] = (uint16_t)1U;
+        icnt[1][3] = (uint16_t)1U;
+        addrOffset[1] = srcBufSize * (remainder - residue);
+    }
+
+    /* Make TRPD */
+    UdmaUtils_makeTrpd(pTrpd, UDMA_TR_TYPE_15, numTR, cqRingNum);
+
+    for (trIdx = 0u; trIdx < numTR; trIdx ++)
+    {
+        /* Setup TR */
+        pTr->flags    = CSL_FMK(UDMAP_TR_FLAGS_TYPE, 15)                                            |
+                        CSL_FMK(UDMAP_TR_FLAGS_STATIC, 0U)                                          |
+                        CSL_FMK(UDMAP_TR_FLAGS_EOL, 0U)                                             |   /* NA */
+                        CSL_FMK(UDMAP_TR_FLAGS_EVENT_SIZE, CSL_UDMAP_TR_FLAGS_EVENT_SIZE_COMPLETION)|
+                        CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0, CSL_UDMAP_TR_FLAGS_TRIGGER_NONE)           |
+                        CSL_FMK(UDMAP_TR_FLAGS_TRIGGER0_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL)  |
+                        CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1, CSL_UDMAP_TR_FLAGS_TRIGGER_NONE)           |
+                        CSL_FMK(UDMAP_TR_FLAGS_TRIGGER1_TYPE, CSL_UDMAP_TR_FLAGS_TRIGGER_TYPE_ALL)  |
+                        CSL_FMK(UDMAP_TR_FLAGS_CMD_ID, 0x25U)                                       |   /* This will come back in TR response */
+                        CSL_FMK(UDMAP_TR_FLAGS_SA_INDIRECT, 0U)                                     |
+                        CSL_FMK(UDMAP_TR_FLAGS_DA_INDIRECT, 0U)                                     |
+                        CSL_FMK(UDMAP_TR_FLAGS_EOP, 1U);
+
+        pTr->icnt0    = icnt[trIdx][0];
+        pTr->icnt1    = icnt[trIdx][1];
+        pTr->icnt2    = icnt[trIdx][2];
+        pTr->icnt3    = icnt[trIdx][3];
+        pTr->dim1     = 0U;
+        pTr->dim2     = 0U;
+        pTr->dim3     = 0U;
+        pTr->addr     = (uint64_t)srcAddr;
+        pTr->fmtflags = 0x00000000U;        /* Linear addressing, 1 byte per elem.
+                                            Replace with CSL-FL API */
+        pTr->dicnt0   = icnt[trIdx][0];
+        pTr->dicnt1   = icnt[trIdx][1];
+        pTr->dicnt2   = icnt[trIdx][2];
+        pTr->dicnt3   = icnt[trIdx][3];
+        pTr->ddim1    = pTr->dicnt0;
+        pTr->ddim2    = (pTr->dicnt0 * pTr->dicnt1);
+        pTr->ddim3    = (pTr->dicnt0 * pTr->dicnt1 * pTr->dicnt2);
+        pTr->daddr    = (uint64_t)startAddr + addrOffset[trIdx];
+
+        pTr ++;
+    }
+
+    /* Clear TR response memory */
+    *pTrResp = 0xFFFFFFFFU;
+
+    /* Writeback cache */
+    CacheP_wb(pTrpdMem, BOARD_TRPD_SIZE);
+
+    return (numTR);
+}
+
+#endif /* #ifdef BOARD_DDR_ENABLE_DDR_MEM_PRIME */
+
index fef786c9ed1e2ccb99f06108c93e25e7155a36e1..b6bf78acf85a1a0055a55da3fb74b8313567d9cf 100644 (file)
@@ -97,7 +97,7 @@ extern "C" {
 #define BOARD_DDR_LOCK0                         (0x115008U)
 #define BOARD_DDR_LOCK1                         (0x11500CU)
 
-#define BOARD_DDR_CFG_LOAD_VALUE                (0x11500CU)
+#define BOARD_DDR_CFG_LOAD_VALUE                (0x60000000U)
 
 /**
  * \brief DDR object structure
@@ -120,6 +120,8 @@ typedef struct Board_DdrObject_s
     uint32_t *ddrPhyIndepReg;
     /** Pointer to DDR PHY register array */
     uint32_t *ddrPhyReg;
+    /** ECC base address */
+    uint32_t eccAddr;
 } Board_DdrObject_t;
 
 typedef Board_DdrObject_t * Board_DdrHandle;
index dca368103527f8ca1665885dadc9d945161d0e16..929922052db39885f8d2f47eec1c902a96f361e1 100644 (file)
@@ -44,8 +44,8 @@
 #define MULTI_DDR_CFG_INTRLV_GRAN 0
 #define MULTI_DDR_CFG_INTRLV_SIZE 12
 #define MULTI_DDR_CFG_ECC_ENABLE 0
-#define MULTI_DDR_CFG_HYBRID_SELECT 1
-#define MULTI_DDR_CFG_EMIFS_ACTIVE 4
+#define MULTI_DDR_CFG_HYBRID_SELECT 24
+#define MULTI_DDR_CFG_EMIFS_ACTIVE 15
 
 uint32_t DDRSS0_ctlReg[] = {
     0x00000B00U,
index 7d85d9a6f56cad507be3ea3e2b55115c74febeb7..359c11869509b14d3f47dc9a337ff7607157bfe2 100644 (file)
@@ -6,4 +6,5 @@ INCDIR += src/j784s4_evm src/j784s4_evm/include
 SRCS_COMMON += board_init.c board_lld_init.c board_clock.c board_mmr.c board_pll.c board_serdes_cfg.c
 SRCS_COMMON += board_ddr.c board_info.c board_ethernet_config.c board_utils.c board_control.c board_i2c_io_exp.c
 SRCS_COMMON += board_pinmux.c J784S4_pinmux_data.c
+SRCS_COMMON += board_ddr_prime_dma.c
 PACKAGE_SRCS_COMMON = src/j784s4_evm/src_files_j784s4_evm.mk