工具/软件:Linux
问题表现为此错误
TI-mctd:/home/gtbldadm/processor-sdk-linux-krogoth-build/build-CORTEX_1/arago-tmp-external-linaro-toolchain/work/k2hk_evm-linux-gnueabi/opencl/1.1.12.0-r0.0/git/host/mct-demon/cmem_allocator.h:80:CmemAllocator::CmemAllocator ():断言`ddr_alloc_dsp_addr_= DDR_addr'失败。
启动 ti-MCT-daemon 时。 我进行了大量挖掘、并在 ludev/include/ti/cmem.h 中找到
UNION CMEM_Allocunion{ [... 等等...] struct{/**<*/ unsigned long physp; unsigned long long size; } get_block_outparams;/**<*/ [... 等等...] };
和 ludev src/cmem/module/cmemk.c 中
案例 CMEM_IOCGETBLOCK:
_D (收到"GETBLOCK ioctl。\n");
if (copy_ffrom _user (&allocDesc、argp、sizeof (allocDesc))){
返回-efault;
}
BI = allocDesc.blockid;
if (bi >= nblocks || bi < 0){
__E ("GETBLOCK:无效的块 ID %d\n"、bi);
return -EINVAL;
}
allocDesc.get_block_outparams.physp = block_start[bi];
allocDesc.get_block_outparams.size = block_end[bi]-
block_start[bi];
_D ("GETBLOCK:正在返回 PHY 基体"
"%#llx、size %#llx。\n"、allocDesc.get_block_outparams.physp、
allocDesc.get_block_outparams.size);
if (copy_to _user (argp、&allocDesc、sizeof (allocDesc))){
返回-efault;
}
中断;
因此、至少就 cmemk 器件驱动程序中的 ioctl 而言、返回的物理地址和大小都是"unsigned long long"、即64位值。
同时、在 ludev/src/cmem/api/cmem.c 中、我们看到物理地址的类型为"off_t":
静态 int getBlock (int blockid、off_t * pphys_base、unsigned long * psize)
{
UNION CMEM_Allocunion 块;
Int RV;
_D ("getBlock:entered\n");
if (!validate_init()){
return -1;
}
block.blockid = blockid;
RV = ioctl (cmem_fd、CMEM_IOCGETBLOCK | CMEM_IOCMAGIC、&block);
如果(RV!= 0){
_E ("getBlock:Failed to retrieve memory block bounds for block %d "(getBlock:无法检索块%d 的内存块边界)
"从驱动程序:%d.\n"、blockid、rv);
返回-1;
}
*pphys_base =(off_t) block.get_block_outparams.physp;
*psize = block.get_block_outparams.size;
_D ("getBlock:正在退出,ioctl CMEM_IOCGETBLOCK 成功,"
"返回*pphys_base=%#llx、*psize=%#llx\n"、
(unsigned long long)(*pphys_base)、*psize);
返回0;
}
int CMEM_getBlock (off_t *pphys_base、unsigned long * psize)
{
返回 getBlock (0、pphys_base、psize);
}
遗憾的是、"off_t"是一种32位类型:
$ cat off_t.c
#include
int main (int argc、char * argv[])
{
printf ("sizeof (off_t)=%d 位\n"、sizeof (off_t)*8);
返回0;
}
root@k2hk EVM:~#./off_t
sizeof (off_t)= 32位
K2H 上的物理地址实际上是36位值、DDR 从0x800000000开始、因此如果 CMEM 块在 DDR 中、API 会失败。 据我所知、这一点在 Processor SDK 的 v4中也没有得到修复。