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
#嵌入式##通信硬件人笔面经互助##牛客创作赏金赛#