xinxin.li a9180edc85 1.commit normalization drv version;
2.add ecpri code;
3.test case: case34,case44,case21(CPRI/JESD mode)
2023-09-22 19:47:02 +08:00

455 lines
19 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************
* @file ape_csu.h
* @brief: [file description]
* @author: xinxin.li
* @Date 2022年5月30日
* COPYRIGHT NOTICE: (c) smartlogictech. All rights reserved.
* Change_date Owner Change_content
* 2022年5月30日 xinxin.li create file
*****************************************************************/
#ifndef APE_CSU_H
#define APE_CSU_H
#include <string.h>
#include <stdlib.h>
#include "typedef.h"
//------------------------------------------------------------
//define
//------------------------------------------------------------
#define APE_DMA_REG_NUM 8
#define DMA_DIR_L2G 0
#define DMA_DIR_G2L 1
#define DMA_DIR_G2G 1
#define DMA_REG_GROUP0 0
#define DMA_REG_GROUP1 1
#define DMA_REG_GROUP2 2
#define DMA_REG_GROUP3 3
//ape-csu dma chain define
#define MAX_CHAIN_LEN (16)
#define APC_DMA_CHAIN_L2_SIZE_WORD (4)
#define APC_DMA_CHAIN_L1_3D_SIZE_WORD (8)
#define APC_DMA_CHAIN_L1_1D_SIZE_WORD (4)
/* apc-dma chain level2 info */
// word0
// cmdData Low 32bit
#define APC_DMA_CHAIN_L2_CMDDATAL_WORD_OFFSET (0)
#define APC_DMA_CHAIN_L2_CMDDATAL_BIT_OFFSET (0)
// word1
// bit26:24: next node address High 3bit
// bit17:16: base address for level1 chain High 2bit
// bit15:0: number of nodes for level1 chain 16bit
#define APC_DMA_CHAIN_L2_NXTADDRH_L1_BASEADDRH_NUMNODES_WORD_OFFSET (1)
#define APC_DMA_CHAIN_L2_L1_NUMNODES_BIT_OFFSET (0)
#define APC_DMA_CHAIN_L2_L1_BASEADDRH_BIT_OFFSET (16)
#define APC_DMA_CHAIN_L2_NXTADDRH_BIT_OFFSET (24)
// word2
// base address for level1 chain Low 32bit
#define APC_DMA_CHAIN_LEVEL2_L1_BASEADDR_L32_WORD_OFFSET (2)
#define APC_DMA_CHAIN_LEVEL2_L1_BASEADDR_L32_BIT_OFFSET (0)
// word3
// bit31: node address mode 1bit
// bit30:0: next node address Low 31bit
#define APC_DMA_CHAIN_L2_ADDRMODE_NXTADDRL_WORD_OFFSET (3)
#define APC_DMA_CHAIN_L2_NXTADDR_L31_BIT_OFFSET (0)
#define APC_DMA_CHAIN_L2_ADDRMODE_BIT_OFFSET (31)
/* apc-dma chain level1 2-3d info */
// word0
// cmdData Low 32bit
#define APC_DMA_CHAIN_L1_3D_CMDDATAL_WORD_OFFSET (0)
#define APC_DMA_CHAIN_L1_3D_CMDDATAL_BIT_OFFSET (0)
// word1
// xAddr Low 32bit
#define APC_DMA_CHAIN_L1_3D_XADDRL_WORD_OFFSET (1)
#define APC_DMA_CHAIN_L1_3D_XADDRL_BIT_OFFSET (0)
// word2
// bit29:16: cmdData High 14bit
// bit15:0: xNum 16bit
#define APC_DMA_CHAIN_L1_3D_CMDDATAH_XNUM_WORD_OFFSET (2)
#define APC_DMA_CHAIN_L1_3D_XNUM_BIT_OFFSET (0)
#define APC_DMA_CHAIN_L1_3D_CMDDATAH_BIT_OFFSET (16)
// word3
// yStep 32bit
#define APC_DMA_CHAIN_L1_3D_YSTEP_WORD_OFFSET (3)
#define APC_DMA_CHAIN_L1_3D_YSTEP_BIT_OFFSET (0)
// word4
// bit30:28: next node address High 3bit
// bit25:24: xAddr High 2bit
// bit23:20: GRAN
// bit19:16: SIZE
// bit15:0: YNum
#define APC_DMA_CHAIN_L1_3D_NXTADDRH_XADDRH_GRANSIZE_YNUM_WORD_OFFSET (4)
#define APC_DMA_CHAIN_L1_3D_YNUM_BIT_OFFSET (0)
#define APC_DMA_CHAIN_L1_3D_SIZE_BIT_OFFSET (16)
#define APC_DMA_CHAIN_L1_3D_GRAN_BIT_OFFSET (20)
#define APC_DMA_CHAIN_L1_3D_XADDRH_BIT_OFFSET (24)
#define APC_DMA_CHAIN_L1_3D_NXTADDRH_BIT_OFFSET (28)
// word5
// zStep 32bit
#define APC_DMA_CHAIN_L1_3D_ZSTEP_WORD_OFFSET (5)
#define APC_DMA_CHAIN_L1_3D_ZSTEP_BIT_OFFSET (0)
// word6
// AllNum 32bit (valid field is bit23:0)
#define APC_DMA_CHAIN_L1_3D_ALLNUM_WORD_OFFSET (6)
#define APC_DMA_CHAIN_L1_3D_ALLNUM_BIT_OFFSET (0)
// word7
// bit31: node address mode 1bit
// bit30:0: next node address Low 31bit
#define APC_DMA_CHAIN_L1_3D_ADDRMODE_NXTADDRL_WORD_OFFSET (7)
#define APC_DMA_CHAIN_L1_3D_NXTADDRL_BIT_OFFSET (0)
#define APC_DMA_CHAIN_L1_3D_ADDRMODE_BIT_OFFSET (31)
/* apc-dma chain level1 1d info */
// word0
// cmdData Low 32bit
#define APC_DMA_CHAIN_L1_1D_CMDDATAL_WORD_OFFSET (0)
#define APC_DMA_CHAIN_L1_1D_CMDDATAL_BIT_OFFSET (0)
// word1
// xAddr Low 32bit
#define APC_DMA_CHAIN_L1_1D_XADDRL_WORD_OFFSET (1)
#define APC_DMA_CHAIN_L1_1D_XADDRL_BIT_OFFSET (0)
// word2
// bit31:30: xAddr High 2bit
// bit29:16: cmdData High 14bit
// bit15:0: AllNum 16bit (MaxBytes 65535)
#define APC_DMA_CHAIN_L1_1D_XADDRH_CMDDATAH_ALLNUM_WORD_OFFSET (2)
#define APC_DMA_CHAIN_L1_1D_ALLNUM_BIT_OFFSET (0)
#define APC_DMA_CHAIN_L1_1D_CMDDATAH_BIT_OFFSET (16)
#define APC_DMA_CHAIN_L1_1D_XADDRH_BIT_OFFSET (30)
// word3
// bit31: node address mode 1bit
// bit30:0: next node address Low 31bit
#define APC_DMA_CHAIN_L1_1D_ADDRMODE_NXTADDRL_WORD_OFFSET (3)
#define APC_DMA_CHAIN_L1_1D_NXTADDRL_BIT_OFFSET (0)
#define APC_DMA_CHAIN_L1_1D_ADDRMODE_BIT_OFFSET (31)
//-------------------------------------------------------------
//struct define
//-------------------------------------------------------------
// cus dma 寄存器方式,结构体参数
typedef struct _tagCsuDmaReg
{
uint32_t dmaAddrL;
uint32_t dmaAddrH;
uint32_t dmaYStepL;
uint32_t dmaYStepH;
uint32_t dmaZStepL;
uint32_t dmaZStepH;
uint16_t dmaXNum;
uint16_t dmaYNum;
uint32_t dmaAllNum : 24;
uint32_t dmaGran : 4;
uint32_t dmaSize : 4;
}stCsuDmaReg;
typedef struct _tagCsuDmaCmdL
{
uint32_t rCmd : 2; // 0:普通DMA1:一级DMA2:一级DMA并等待ActNum3:二级DMA
uint32_t wCmd : 2;
uint32_t dmaType : 1; // 0:一维1:多维
uint32_t cacheMode : 1; // 0:common mode, 1:cache mode
uint32_t continueNext : 1; // continue the next dma
uint32_t continueLast : 1; // continue the last dma
uint32_t idSrc : 5; // src buffer id
uint32_t idDst : 5; // dst buffer id
uint32_t dmaTag : 5; // tag
uint32_t flush : 1;
uint32_t ecpriEnd : 3;
uint32_t zNumValid : 1;
uint32_t allOrYNum : 2;
uint32_t allNumSel : 1;
uint32_t stall : 1; // stall信号是否在传输之前触发stall中断
}stCsuDmaCmdL;
typedef struct _tagCsuDmaCmdH
{
uint32_t rXNumNextDma : 1; // 读操作完成一个XNum后换下一个DMA
uint32_t rYNumNextDma : 1; // 读操作完成一个YNum后换下一个DMA
uint32_t wXNumNextDma : 1; // 写操作完成一个XNum后换下一个DMA
uint32_t wYNumNextDma : 1; // 写操作完成一个YNum后换下一个DMA
uint32_t rRfpFirstDma : 1; // 读操作位对应AxC的rfp后第一组DMA请求
uint32_t reserved1 : 6;
uint32_t wLinkCycleMode : 1; // 写操作为链表循环模式
uint32_t reserved2 : 1;
uint32_t rLinkCycleMode : 1; // 读操作为链表循环模式
uint32_t reserved3 : 18;
}stCsuDmaCmdH;
typedef struct _tagCsuLinkDesc1L1D
{
}stCsuLinkDesc1L1D;
// 一级链表多维DMA
typedef struct _tagCsuLinkDesc1L3D
{
uint32_t cmdFifoL; // [31:0] // fifo[31:0]
uint32_t dmaAddrL; // [63:32] // addr[31:0]
uint32_t dmaXNum : 16; // [79:64] // XNum
uint32_t cmdFifoH : 14; // [93:80] // fifo[45:32]
uint32_t reserved1 : 2; // [95:94]
uint32_t dmaYStep; // [127:96] // YStep[31:0]
uint32_t dmaYNum : 16; // [143:128] // YNum
uint32_t dmaSize : 4; // [147:144] // dmaSize
uint32_t dmaGran : 3; // [150:148] // gran
uint32_t dmaCGran : 1; // [151] // cgran
uint32_t dmaAddrH : 2; // [153:152] // addr[33:32]
uint32_t reserved2 : 2; // [155:154]
uint32_t nextAddrH : 3; // [158:156] // next addr[33:31]
uint32_t reserved3 : 1; // [159]
uint32_t dmaZStep; // [191:160] // ZStep[31:0]
uint32_t dmaAllNum; // [223:192] // all num
uint32_t nextAddrL : 31; // [254:224] // next addr[30:0]
uint32_t nAddrMode : 1; // [255] // 1使用nextAddr0地址自动加0x20/0x40
}stCsuLinkDesc1L3D;
typedef struct _tagCsuLinkDesc2L1D
{
}stCsuLinkDesc2L1D;
typedef struct _tagCsuLinkDesc2L3D
{
}stCsuLinkDesc2L3D;
//-------------------------------------------------------------
//api
//-------------------------------------------------------------
/*!
* @brief: CSU init for ape0 and ape1
* CSU初始化只在APE0调用即可APE1若要使用CSU先在APE0初始化
* 如果APE0没有启动只启动了APE1也可在APE1调用该接口完成初始化再调用CSU的其他接口
* @author: xinxin.li
* @Date: 2022年6月1日
*/
void ape_csu_init();
/*!
* @brief: 查看tag号对应的dma任务是否完成未完成返回0完成返回1
* 如果isWait==1则等待该tag对应的任务完成再返回返回1
* @author: xinxin.li
* @Date: 2022年6月1日
* @param: task_tag : [DMA Tag: 0~31用于查询是否完成 ]
* @param: isWait : [是否等DMA结束函数返回0:不等待,1:等待 ]
* @return: 1已完成0未完成
*/
int32_t ape_csu_task_lookup(uint8_t task_tag, uint8_t isWait);
/*!
* @brief: 一维搬移到一维使用寄存器组0和组1实现L2G的Dma搬移
* @author: xinxin.li
* @Date: 2022年6月1日
* @param: addrSrc : [源地址 ]
* @param: addrDst : [目的地址 ]
* @param: dataLen : [搬移总字节数 ]
* @param: tag : [DMA Tag: 0~31用于查询是否完成 ]
* @param: isWait : [是否等DMA结束函数返回0:不等待,1:等待 ]
*/
int32_t ape_csu_dma_1D_L2G_ch0ch1_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen, uint8_t tag, uint8_t isWait);
/*!
* @brief: 一维搬移到一维使用寄存器组2和组3实现L2G的Dma搬移
* @author: xinxin.li
* @Date: 2022年6月1日
* @param: addrSrc : [源地址 ]
* @param: addrDst : [目的地址 ]
* @param: dataLen : [搬移总字节数 ]
* @param: tag : [DMA Tag: 0~31用于查询是否完成 ]
* @param: isWait : [是否等DMA结束函数返回0:不等待,1:等待 ]
*/
int32_t ape_csu_dma_1D_L2G_ch2ch3_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen, uint8_t tag, uint8_t isWait);
/*!
* @brief: 一维搬移到一维使用寄存器组0和组1实现G2L的Dma搬移
* @author: xinxin.li
* @Date: 2022年6月1日
* @param: addrSrc : [源地址 ]
* @param: addrDst : [目的地址 ]
* @param: dataLen : [搬移总字节数 ]
* @param: tag : [DMA Tag: 0~31用于查询是否完成 ]
* @param: isWait : [是否等DMA结束函数返回0:不等待,1:等待 ]
*/
int32_t ape_csu_dma_1D_G2L_ch0ch1_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen, uint8_t tag, uint8_t isWait);
/*!
* @brief: 一维搬移到一维使用寄存器组2和组3实现G2L的Dma搬移
* @author: xinxin.li
* @Date: 2022年6月1日
* @param: addrSrc : [源地址 ]
* @param: addrDst : [目的地址 ]
* @param: dataLen : [搬移总字节数 ]
* @param: tag : [DMA Tag: 0~31用于查询是否完成 ]
* @param: isWait : [是否等DMA结束函数返回0:不等待,1:等待 ]
*/
int32_t ape_csu_dma_1D_G2L_ch2ch3_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen, uint8_t tag, uint8_t isWait);
/*!
* @brief: 二维搬移到二维
* @author: xinxin.li
* @Date: 2022年6月1日
* @param: addrSrc : [源地址 ]
* @param: blockLenSrc : [源第一维度搬移字节数 ]
* @param: blockStepSrc : [源第二维度搬移步进字节数 ]
* @param: addrDst : [目的地址 ]
* @param: blockLenDst : [目的第一维度搬移字节数 ]
* @param: blockStepDst : [目的第二维度搬移步进字节数 ]
* @param: dataLen : [搬移总字节数 ]
* @param: tag : [DMA Tag: 0~31用于查询是否完成 ]
* @param: isWait : [是否等DMA结束函数返回0:不等待,1:等待 ]
* @param: regGroup : [寄存器组2源寄存器组4目的寄存器组53源寄存器组6目的寄存器组7 ]
* @param: dir : [0L2G1G2L or G2G ]
*/
int32_t ape_csu_dma_2Dto2D_transfer(uint64_t addrSrc, uint16_t blockLenSrc, uint64_t blockStepSrc,
uint64_t addrDst, uint16_t blockLenDst, uint64_t blockStepDst,
uint32_t dataLen, uint8_t tag, uint8_t isWait, uint8_t regGroup, uint8_t dir);
/*!
* @brief: 三维搬移到一维
* @author: xinxin.li
* @Date: 2022年6月1日
* @param: addrSrc : [源地址 ]
* @param: xNumSrc : [源第一维度搬移字节数 ]
* @param: yNumSrc : [源第二维度搬移个数 ]
* @param: yStepSrc : [源第二维度搬移步进字节数 ]
* @param: zStepSrc : [源第三维度搬移步进字节数 ]
* @param: addrDst : [目的地址 ]
* @param: dataLen : [搬移总字节数 ]
* @param: tag : [DMA Tag: 0~31用于查询是否完成 ]
* @param: isWait : [是否等DMA结束函数返回0:不等待,1:等待 ]
* @param: regGroup : [寄存器组2源寄存器组4目的寄存器组53源寄存器组6目的寄存器组7 ]
* @param: dir : [0L2G1G2L or G2G ]
*/
int32_t ape_csu_dma_3Dto1D_transfer(uint64_t addrSrc, uint16_t xNumSrc, uint16_t yNumSrc, uint64_t yStepSrc, uint64_t zStepSrc,
uint64_t addrDst, uint32_t dataLen, uint8_t tag, uint8_t isWait, uint8_t regGroup, uint8_t dir);
/*!
* @brief: 一维搬移到三维
* @author: xinxin.li
* @Date: 2023年8月28日
* @param: addrSrc : [源地址 ]
* @param: addrDst : [目的地址 ]
* @param: xNumDst : [目的第一维度搬移字节数 ]
* @param: yNumDst : [目的第二维度搬移个数 ]
* @param: yStepDst : [目的第二维度搬移步进字节数 ]
* @param: zStepDst : [目的第三维度搬移步进字节数 ]
* @param: dataLen : [搬移总字节数 ]
* @param: tag : [DMA Tag: 0~31用于查询是否完成 ]
* @param: isWait : [是否等DMA结束函数返回0:不等待,1:等待 ]
* @param: regGroup : [寄存器组2源寄存器组4目的寄存器组53源寄存器组6目的寄存器组7 ]
* @param: dir : [0L2G1G2L or G2G ]
*/
int32_t ape_csu_dma_1Dto3D_transfer(uint64_t addrSrc, uint64_t addrDst, uint16_t xNumDst, uint16_t yNumDst, uint64_t yStepDst, uint64_t zStepDst,
uint32_t dataLen, uint8_t tag, uint8_t isWait, uint8_t regGroup, uint8_t dir);
/*!
* @brief: 三维搬移到三维
* @author: xinxin.li
* @Date: 2023年8月28日
* @param: addrSrc : [源地址 ]
* @param: xNumSrc : [源第一维度搬移字节数 ]
* @param: yNumSrc : [源第二维度搬移个数 ]
* @param: yStepSrc : [源第二维度搬移步进字节数 ]
* @param: zStepSrc : [源第三维度搬移步进字节数 ]
* @param: addrDst : [目的地址 ]
* @param: xNumDst : [目的第一维度搬移字节数 ]
* @param: yNumDst : [目的第二维度搬移个数 ]
* @param: yStepDst : [目的第二维度搬移步进字节数 ]
* @param: zStepDst : [目的第三维度搬移步进字节数 ]
* @param: dataLen : [搬移总字节数 ]
* @param: tag : [DMA Tag: 0~31用于查询是否完成 ]
* @param: isWait : [是否等DMA结束函数返回0:不等待,1:等待 ]
* @param: regGroup : [寄存器组2源寄存器组4目的寄存器组53源寄存器组6目的寄存器组7 ]
* @param: dir : [0L2G1G2L or G2G ]
*/
int32_t ape_csu_dma_3Dto3D_transfer(uint64_t addrSrc, uint16_t xNumSrc, uint16_t yNumSrc, uint64_t yStepSrc, uint64_t zStepSrc,
uint64_t addrDst, uint16_t xNumDst, uint16_t yNumDst, uint64_t yStepDst, uint64_t zStepDst,
uint32_t dataLen, uint8_t tag, uint8_t isWait, uint8_t regGroup, uint8_t dir);
void ape_csu_dma_3Dto1D_G2L_ch4ch0_simp_transfer(uint32_t addrSrc, uint16_t xNumSrc, uint16_t yNumSrc, uint32_t yStepSrc, uint32_t zStepSrc,
uint32_t addrDst, uint32_t dataLen, uint8_t tag, uint8_t isWait);
void ape_csu_dma_3Dto1D_G2L_ch6ch2_simp_transfer(uint32_t addrSrc, uint16_t xNumSrc, uint16_t yNumSrc, uint32_t yStepSrc, uint32_t zStepSrc,
uint32_t addrDst, uint32_t dataLen, uint8_t tag, uint8_t isWait);
void dma_1l3d1s_chain_G2L_ch0ch1_simp_config_start(uint32_t *paramPtr,
uint32_t paramCsuAddr,
uint32_t numNodes,
uint32_t dmaTag,
uint32_t *xAddrSrcPtr,
uint16_t xNum,
uint32_t *allNumPtr,
uint32_t addrDst,
uint32_t allNumTotal,
uint32_t waitFlag);
void dma_1l1d2s_chain_ch3_G2L_start(uint32_t *paramPtr,
uint32_t paramCsuAddr,
uint32_t *srcAddrPtr,
uint32_t *dstAddrPtr,
uint32_t *allNumPtr,
uint32_t numNodes,
uint32_t dmaTag,
uint32_t waitFlag);
void qounit_findK_config_start(uint32_t bitSequenceAddr,
uint32_t seqIndexAddr,
uint32_t seqLength,
uint32_t K0,
uint32_t K1);
void qounit_findEqual_config_start(uint32_t compData,
uint32_t seqAddr,
uint16_t seqLength);
uint32_t qounit_wait_complete();
/*!
* @brief: 等待QOunit处理完成
* @author: yufei.wang
* @Date: 2022年6月11日
*/
int16_t qounit_equal_wait_complete();
/*!
* @brief: 根据tag号获取空闲的寄存器组和FIFO寄存器组有8组0~7FIFO通道有4个0~3
* @author: xinxin.li
* @Date: 2023年3月15日
* @param: tag : [DMA Tag: 0~31用户可用于分配DMA资源]
* @return: -1没有可用的DMA资源
!=-1: bit0~7:寄存器组id0~7bit8~15:FIFO ID0~3
*/
int32_t get_free_reg_group(uint8_t tag);
/*!
* @brief: 获取空闲的DMA资源获取到才退出
* @author: xinxin.li
* @Date: 2023年3月15日
* @param: 无
* @return: bit0~7:寄存器组id0~7bit8~15:FIFO ID0~3bit16~23:tag ID0~31
*/
uint32_t get_free_channel();
/*!
* @brief: 一维搬移到一维如果目前没有可用的DMA资源会一直等待直至获取到可用资源才配置配置完即退出不会等待搬移完成
* @author: xinxin.li
* @Date: 2023年3月15日
* @param: addrSrc : [源地址 ]
* @param: addrDst : [目的地址 ]
* @param: dataLen : [搬移总字节数 ]
*/
uint32_t spu_csu_dma_1D_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen);
#endif