[PDK-8892] UDMA: Update BCDMA BlkCpy channel allocation in allignment with latest...
authorDon Dominic <a0486429@ti.com>
Fri, 11 Dec 2020 11:06:37 +0000 (16:36 +0530)
committerSivaraj R <sivaraj@ti.com>
Fri, 11 Dec 2020 14:28:50 +0000 (08:28 -0600)
 - As per latest SYSFW,
    - For requesting BCDMA Block Copy channels, set extended_ch_type and pass the valid flag.
    - For requesting BCDMA Split TR TX channels, set extended_ch_type=0 and pass the valid flag.
 - Also remove the existing offset of 32 for blk cpy channel index, in alignment with old sysfw.

Signed-off-by: Don Dominic <a0486429@ti.com>
packages/ti/drv/udma/include/udma_ch.h
packages/ti/drv/udma/soc/am64x/udma_soc.c
packages/ti/drv/udma/soc/am65xx/udma_soc.c
packages/ti/drv/udma/soc/j7200/udma_soc.c
packages/ti/drv/udma/soc/j721e/udma_soc.c
packages/ti/drv/udma/src/udma_ch.c
packages/ti/drv/udma/udma.h

index e80ab3b966a75332548d17efe2dff87aa4ba42d9..a1d40671d6e4c629b1b060ca042a6a3809c0849e 100644 (file)
@@ -82,6 +82,12 @@ extern "C" {
 /** \brief Macro used to specify that the Mapped Channel Group is invalid. */
 #define UDMA_MAPPED_GROUP_INVALID       ((uint32_t) 0xFFFF0004U)
 
+/** \brief DMSC Extended Channel Type Flag for BCDMA Block Copy */
+#define UDMA_DMSC_EXTENDED_CH_TYPE_BCDMA_BLK_CPY     ((uint8_t) 1U)
+
+/** \brief DMSC Extended Channel Type Flag for BCDMA split TR TX channels */
+#define UDMA_DMSC_EXTENDED_CH_TYPE_BCDMA_SPLIT_TR_TX ((uint8_t) 0U)
+
 /**
  *  \anchor Udma_ChFlag
  *  \name UDMA Channel Flag
index 34fc0e01fa1729353b9ffb60f1f9533fc59a321f..f63f91a355a9bd1cdbd7c57f7c54f41d3589e8ba 100644 (file)
@@ -247,10 +247,6 @@ void Udma_initDrvHandle(Udma_DrvHandle drvHandle)
     /* Init other variables */
     if(UDMA_INST_ID_BCDMA_0 == instId)
     {
-       /* DMSC differentiates block copy channel from split tr tx, if the index have an offset of 32.
-        * The offset of 32 is chosen because it’s the next power of 2 above the max split tr tx channel (19).
-        */ 
-        drvHandle->blkCopyChOffset      = 32U; 
         drvHandle->txChOffset           = pBcdmaRegs->bcChanCnt;
            drvHandle->rxChOffset               = drvHandle->txChOffset + pBcdmaRegs->splitTxChanCnt;
        /* The srcIdx passed to Sciclient_rmIrqset API for configuring DMA Completion/Ring events, 
@@ -274,7 +270,6 @@ void Udma_initDrvHandle(Udma_DrvHandle drvHandle)
     }
     else
     {
-        drvHandle->blkCopyChOffset      = 0U; /* Not used for PktDMA Instance */ 
         drvHandle->txChOffset           = CSL_DMSS_PKTDMA_TX_FLOWS_UNMAPPED_START; 
            drvHandle->rxChOffset               = CSL_DMSS_PKTDMA_RX_FLOWS_UNMAPPED_START;
         drvHandle->blkCopyRingIrqOffset = 0U; /* Not used for PktDMA Instance */ 
index 1ef654e0d19cbfb14c3d2d45e557fd620b584359..1d4e909b24ca66584ecaa57b689083600308b59c 100644 (file)
@@ -294,7 +294,6 @@ void Udma_initDrvHandle(Udma_DrvHandle drvHandle)
     drvHandle->blkCopyTrIrqOffset    = TISCI_UDMAP0_RX_OES_IRQ_SRC_IDX_START; 
     drvHandle->txTrIrqOffset         = TISCI_UDMAP0_TX_OES_IRQ_SRC_IDX_START;
     drvHandle->rxTrIrqOffset         = TISCI_UDMAP0_RX_OES_IRQ_SRC_IDX_START;
-    drvHandle->blkCopyChOffset       = 0U; 
     drvHandle->txChOffset            = 0U;
     drvHandle->extChOffset           = drvHandle->txChOffset + pUdmapRegs->txChanCnt;
     drvHandle->rxChOffset            =
index 74c9508d0c0947211dc7be4594c96f5a5fabb5bf..04de105d95aed1103aeea845f370e85d75f46cc0 100644 (file)
@@ -326,7 +326,6 @@ void Udma_initDrvHandle(Udma_DrvHandle drvHandle)
     drvHandle->blkCopyTrIrqOffset    = TISCI_UDMAP0_RX_OES_IRQ_SRC_IDX_START; 
     drvHandle->txTrIrqOffset         = TISCI_UDMAP0_TX_OES_IRQ_SRC_IDX_START;
     drvHandle->rxTrIrqOffset         = TISCI_UDMAP0_RX_OES_IRQ_SRC_IDX_START;
-    drvHandle->blkCopyChOffset       = 0U; 
     drvHandle->txChOffset            = 0U;
     drvHandle->extChOffset           = drvHandle->txChOffset + pUdmapRegs->txChanCnt;
     drvHandle->rxChOffset            =
index a5f1942d5307606dfb677904c07675dc38232f66..8e5dfbdcad74d51b7861fb6ffe99902b1875a52e 100755 (executable)
@@ -509,7 +509,6 @@ void Udma_initDrvHandle(Udma_DrvHandle drvHandle)
     drvHandle->blkCopyTrIrqOffset    = TISCI_UDMAP0_RX_OES_IRQ_SRC_IDX_START; 
     drvHandle->txTrIrqOffset         = TISCI_UDMAP0_TX_OES_IRQ_SRC_IDX_START;
     drvHandle->rxTrIrqOffset         = TISCI_UDMAP0_RX_OES_IRQ_SRC_IDX_START;
-    drvHandle->blkCopyChOffset       = 0U; 
     drvHandle->txChOffset            = 0U;
     drvHandle->extChOffset           = drvHandle->txChOffset + pUdmapRegs->txChanCnt;
     drvHandle->rxChOffset            =
index 835d06a7bad471616d7e8e7983924f1ac4533665..4c1eefa9d94c4125967467daf7d7993b781dd49a 100644 (file)
@@ -324,6 +324,7 @@ int32_t Udma_chConfigTx(Udma_ChHandle chHandle, const Udma_ChTxPrms *txPrms)
                                           TISCI_MSG_VALUE_RM_UDMAP_CH_BURST_SIZE_VALID |
                                           TISCI_MSG_VALUE_RM_UDMAP_CH_TX_CREDIT_COUNT_VALID;
         rmUdmaTxReq.nav_id              = drvHandle->devIdUdma;
+        rmUdmaTxReq.index               = (uint16_t)chHandle->txChNum;
         rmUdmaTxReq.tx_pause_on_err     = txPrms->pauseOnError;
         rmUdmaTxReq.tx_filt_einfo       = txPrms->filterEinfo;
         rmUdmaTxReq.tx_filt_pswords     = txPrms->filterPsWords;
@@ -337,23 +338,21 @@ int32_t Udma_chConfigTx(Udma_ChHandle chHandle, const Udma_ChTxPrms *txPrms)
         rmUdmaTxReq.tx_burst_size       = txPrms->burstSize;
         rmUdmaTxReq.tx_sched_priority   = txPrms->dmaPriority;
         rmUdmaTxReq.tx_credit_count     = txPrms->txCredit;
-        /* This workaround is to support Config of BCDMA Block Copy channel using same Sciclient API.
-        *
-        *  In case of BCDMA, the channels are spread across three MMR regions tchan, rchan, and bchan.
-        *  So when blkCopyChOffset is added to index, the tx_ch_cfg API RM knows it’s a block copy channel
-        *  and programs within the bchan MMR region. Otherwise the tx_ch_cfg API RM knows it’s a
-        *  split tr tx channel and programs within the tchan MMR region.
-        *
-        *  In case of UDMAP blkCopyChOffset must be 0.
-        */
-        if((chHandle->chType & UDMA_CH_FLAG_BLK_COPY) == UDMA_CH_FLAG_BLK_COPY)
-        {
-            rmUdmaTxReq.index           = (uint16_t) (chHandle->txChNum + drvHandle->blkCopyChOffset);
-        }
-        else
+#if (UDMA_SOC_CFG_LCDMA_PRESENT == 1)
+        if(UDMA_INST_TYPE_LCDMA_BCDMA == drvHandle->instType)
         {
-            rmUdmaTxReq.index           = (uint16_t)chHandle->txChNum;
+            if((chHandle->chType & UDMA_CH_FLAG_BLK_COPY) == UDMA_CH_FLAG_BLK_COPY)
+            {
+                rmUdmaTxReq.valid_params    |= TISCI_MSG_VALUE_RM_UDMAP_EXTENDED_CH_TYPE_VALID;
+                rmUdmaTxReq.extended_ch_type = UDMA_DMSC_EXTENDED_CH_TYPE_BCDMA_BLK_CPY;
+            }
+            else if((chHandle->chType & UDMA_CH_FLAG_TX) == UDMA_CH_FLAG_TX)
+            {
+                rmUdmaTxReq.valid_params    |= TISCI_MSG_VALUE_RM_UDMAP_EXTENDED_CH_TYPE_VALID;
+                rmUdmaTxReq.extended_ch_type = UDMA_DMSC_EXTENDED_CH_TYPE_BCDMA_SPLIT_TR_TX;
+            }
         }
+#endif
         if(NULL_PTR != chHandle->tdCqRing)
         {
             Udma_assert(drvHandle,
index 2268c0d8d6cd8d2bd25aaf606adc9fad47345ec8..76a695a78392a1defd372ebdd469bb347e5769de 100755 (executable)
@@ -539,16 +539,6 @@ struct Udma_DrvObj
     /*
      * Channel Offsets
      */
-    uint32_t                blkCopyChOffset;
-    /**< Block Copy channel offset. 
-     *   blkCopyChOffset is used to support Config of BCDMA Block Copy channel using same Sciclient API.
-     *
-     *  In case of BCDMA, the channels are spread across three MMR regions tchan, rchan, and bchan.
-     *  So when blkCopyChOffset is added to index, the tx_ch_cfg API RM knows it’s a block copy channel 
-     *  and programs within the bchan MMR region. Otherwise the tx_ch_cfg API RM knows it’s a 
-     *  split tr tx channel and programs within the tchan MMR region.
-     *
-     *  In case of UDMAP (type SOC's) blkCopyChOffset must be 0.*/
     uint32_t                txChOffset;
     /**< TX channel offset. */
     uint32_t                extChOffset;