remoteproc(5) 启动remoteproc(ops->load/ops->start)

参考代码kernel 6.6

蓝色部分是sysfs部分,然后进入rproc_fw_boot, 其中分为四部分

1)iommu

1.为设备分配一个新的iommu域

2.设置故障处理程序,为iommu域设置故障处理程序,以便在发生iommu故障时进行处理

3.attach device 到 iommu域(iommu: 将设备可见的虚拟地址(设备地址)转换成物理地址

2)handle resources

初始化并检查是否有资源需要处理/遍历资源表/处理资源条目(会调用ops->handle_rsc)

3)

遍历获取resource table中的carveout条目,每个carveout条目记录了特定内存分割的详细信息

1.分配carveout, 进行内存分配分割

2.更新资源表(令资源表中的条目记录所使用的PA,以便rproc能够正确访问内存区域)

知识点小科普:

VA转换成PA

DMA Addr转换成PA

https://elixir.bootlin.com/linux/v6.6/source/drivers/remoteproc/remoteproc_core.c#L1195

VA: OS提供给进程的地址 (VA通过MMU映射到PA)

PA: 内存硬件的实际地址

DMA addr: 这里是PA,DMA控制器直接访问的内存的地址(所以直接让PA = DMA addr)

示例:比如adsp processor

VA: adsp processor driver 通过VA访问音频数据

PA:VA通过MMU映射到PA,内存控制器通过PA访问实际内存

DMA addr:通过DMA控制器直接从PA读取音频数据

IOMMU让具有 DMA(Direct Memory Access)能力的设备可以使用虚拟地址,然后经过 IOMMU 翻译成可以直接访问内存的物理地址

4)firmware load/start

load(紫色): 1.读取并处理固件的元数据,并将元数据复制到内存缓冲区 2.将固件加载到指定的内存区域,并处理固件的重定位信息 3.固件重定位

start(紫色): 1.认证并重启rproc 2. 启动rproc

#嵌入式##通信硬件人笔面经互助##牛客创作赏金赛#
全部评论

相关推荐

04-11 23:51
门头沟学院 Java
坚定的芭乐反对画饼_许愿Offer版:人人都能过要面试干嘛,发个美团问卷填一下,明天来上班不就好了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务