412 lines
16 KiB
C
Raw Normal View History

2023-07-13 11:27:03 +08:00
/******************************************************************
* @file ape_csu.h
* @brief: [file description]
* @author: xinxin.li
* @Date 2022530
* COPYRIGHT NOTICE: (c) smartlogictech. All rights reserved.
* Change_date Owner Change_content
* 2022530 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若要使用CSUAPE0初始化
* APE0没有启动APE1APE1调用该接口CSU的其他接口
* @author: xinxin.li
* @Date: 202261
*/
void ape_csu_init();
/*!
* @brief: tag号对应的dma任务是否完成01
* isWait==1tag对应的任务完成1
* @author: xinxin.li
* @Date: 202261
* @param: task_tag : [DMA Tag: 0~31 ]
* @param: isWait : [DMA结束函数返回0:,1: ]
* @return: 10
*/
int32_t ape_csu_task_lookup(uint8_t task_tag, uint8_t isWait);
/*!
* @brief: 使01L2G的Dma搬移
* @author: xinxin.li
* @Date: 202261
* @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: 使23L2G的Dma搬移
* @author: xinxin.li
* @Date: 202261
* @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: 使01G2L的Dma搬移
* @author: xinxin.li
* @Date: 202261
* @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: 使23G2L的Dma搬移
* @author: xinxin.li
* @Date: 202261
* @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: 202261
* @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 : [245367 ]
* @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: 202261
* @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 : [245367 ]
* @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);
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: 2022611
*/
int16_t qounit_equal_wait_complete();
2023-07-22 20:22:57 +08:00
/*!
* @brief: tag号FIFO80~7FIFO通道有4个0~3
* @author: xinxin.li
* @Date: 2023315
* @param: tag : [DMA Tag: 0~31DMA资源]
* @return: -1DMA资源
!=-1: bit0~7:id0~7bit8~15:FIFO ID0~3
*/
int32_t get_free_reg_group(uint8_t tag);
/*!
* @brief: DMA资源退
* @author: xinxin.li
* @Date: 2023315
* @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: 2023315
* @param: addrSrc : [ ]
* @param: addrDst : [ ]
* @param: dataLen : [ ]
*/
uint32_t spu_csu_dma_1D_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen);
2023-07-13 11:27:03 +08:00
#endif