1. UCP4008-SL feature enhancement #1885;

2. 修改arm csu代码,支持多核抢占。
This commit is contained in:
xinxin.li 2024-04-25 20:25:08 +08:00
parent adaced954a
commit d09cb323cd

View File

@ -24,14 +24,27 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdatomic.h>
#include <pthread.h>
#include "ucp_utility.h" #include "ucp_utility.h"
#include "ucp_printf.h" #include "ucp_printf.h"
#include "drv_init.h" #include "drv_init.h"
//#include "ospShell.h"
uint8_t* virMemAddr = NULL; uint8_t* virMemAddr = NULL;
uint32_t gTagStatus = 0;
pthread_spinlock_t gLockArmCsu;
#if 0
void arm_csu_show()
{
USHELL_PRINT("%d", gTagStatus);
}
#endif
int arm_csu_init() int arm_csu_init()
{ {
pthread_spin_init((pthread_spinlock_t *)&gLockArmCsu,PTHREAD_PROCESS_PRIVATE);//PTHREAD_PROCESS_SHARED
if (-1 == g_drv_mem_fd0) if (-1 == g_drv_mem_fd0)
{ {
// printf("open dev mem. \r\n"); // printf("open dev mem. \r\n");
@ -72,6 +85,8 @@ int arm_csu_init()
*((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK1)) = 0xFFFFFFFF; *((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK1)) = 0xFFFFFFFF;
*((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK2)) = 0xFFFFFFFF; *((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK2)) = 0xFFFFFFFF;
*((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK3)) = 0xFFFFFFFF; *((volatile uint32_t*)(virMemAddr+AP_CSU_TAGMASK3)) = 0xFFFFFFFF;
//osp_insert_cmd("sc", (OSP_FUNCPTR)arm_csu_show, "arm insert test", 0);
return 0; return 0;
} }
@ -100,38 +115,42 @@ int arm_csu_wait_done(uint8_t tag)
while (1) while (1)
{ {
status = VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS); status = VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS);
// printf("tag = %d, dmastatus = 0x%x. \r\n", tag, status);
if (0 != (status&(1<<tag))) if (0 != (status&(1<<tag)))
{ {
break; break;
} }
} }
// while (0 == (VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS) & (1<<tag)));
return 0; return 0;
} }
int arm_csu_wait_all_done(void) int arm_csu_wait_all_done(void)
{ {
#if 0 volatile uint32_t status = 0;
for (int i = 0; i < 32; i++) while (1)
{ {
arm_csu_wait_done(i); status = VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS);
} if (0xFFFFFFFF == status)
#endif {
while (1) break;
{ }
int cmdNum = 0; }
for (int i = 0; i < 4; i++) #if 0
{ while (1)
cmdNum += VIR_ADDR_VAL(virMemAddr, AP_CSU_CMDFIFO0_NUM+(i<<2)); {
} int cmdNum = 0;
if (0 == cmdNum) for (int i = 0; i < 4; i++)
{ {
break; cmdNum += VIR_ADDR_VAL(virMemAddr, AP_CSU_CMDFIFO0_NUM+(i<<2));
} }
} if (0 == cmdNum) // 命令字个数为0也说明搬完了
{
return 0; break;
}
}
#endif
return 0;
} }
//CmdFIFO 0 1 2 3 //CmdFIFO 0 1 2 3
@ -173,34 +192,37 @@ int get_free_reg_group(uint8_t tag)
return ((fifoNum<<16) | regGroup); // [31:16]fifoNum(0~3), [15:0]reg group(0~7) return ((fifoNum<<16) | regGroup); // [31:16]fifoNum(0~3), [15:0]reg group(0~7)
} }
int get_free_channel() int get_free_channel()
{ {
pthread_spin_lock((pthread_spinlock_t *)&gLockArmCsu);
while (1) while (1)
{ {
for (int tag = 0; tag < 32; tag++) for(int tag = 0; tag < 8; tag++)
{ {
if (0 == (VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS) & (1<<tag))) if((1 << tag) == (VIR_ADDR_VAL(virMemAddr, AP_CSU_DMASTATUS) & (1 << tag)))
{ {
continue; if((1 << tag) & gTagStatus)
} {
else continue;
{ }
uint32_t temp = get_free_reg_group(tag); else
if (-1 == temp) {
{ gTagStatus |= (1 << tag) ; //置上tag使用中
continue; uint8_t regGroup = tag;
} uint8_t fifoNum = tag & 0x3;
else int ret = regGroup | (fifoNum<<8) | (tag<<16);
{ pthread_spin_unlock((pthread_spinlock_t *)&gLockArmCsu);
uint8_t regGroup = temp & 0xFF; return ret;
uint8_t fifoNum = (temp>>16) & 0xFF; }
int ret = regGroup | (fifoNum<<8) | (tag<<16); }
return ret; else
} {
} continue;
} }
}
} }
} }
int arm_csu_dma_1D_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen) int arm_csu_dma_1D_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen)
@ -233,9 +255,13 @@ int arm_csu_dma_1D_transfer(uint64_t addrSrc, uint64_t addrDst, uint32_t dataLen
dmaCmdL.dmaTag = tag; dmaCmdL.dmaTag = tag;
//(uint32_t)(VIR_ADDR_VAL(virMemAddr, AP_CSU_CMDFIFO0+(fifoNum<<2))) = (uint32_t)(*((uint32_t*)(&dmaCmdL))); //(uint32_t)(VIR_ADDR_VAL(virMemAddr, AP_CSU_CMDFIFO0+(fifoNum<<2))) = (uint32_t)(*((uint32_t*)(&dmaCmdL)));
memcpy((uint32_t*)(virMemAddr+AP_CSU_CMDFIFO0+(fifoNum<<2)), (uint32_t*)(&dmaCmdL), 4); memcpy((uint32_t*)(virMemAddr+AP_CSU_CMDFIFO0+(fifoNum<<2)), (uint32_t*)(&dmaCmdL), 4);
//atomic_fetch_and(&gTagStatus, (~(1<<tag)));
pthread_spin_lock((pthread_spinlock_t *)&gLockArmCsu);
gTagStatus &= (~(1<<tag));
pthread_spin_unlock((pthread_spinlock_t *)&gLockArmCsu);
return tag; return tag;
} }