MHI Host 控制器、通道与状态机

MHI Host 控制器、通道与状态机

1. 定位

MHI(Modem Host Interface)用于Host处理器通过PCIe等高速transport控制modem。drivers/bus/mhi/host实现协议Core,mhi_pci_generic提供常见PCI modem glue。

1
2
3
4
5
6
MHI function driver
-> mhi bus/channel API
-> transfer/event/command rings
-> MHI controller
-> PCIe/shared memory
-> modem

2. 对象

  • mhi_controller:transport callback、MMIO、DMA、IRQ、PM和ring集合;
  • mhi_device:controller或成对UL/DL channel设备;
  • mhi_driver:按channel name匹配的功能driver;
  • mhi_chan:方向、TRE ring、doorbell、状态;
  • mhi_event:完成和状态事件ring;
  • mhi_cmd:start/stop/reset channel等命令ring。

3. 注册

mhi_register_controller()

  1. 校验controller config;
  2. 分配channel/event/command对象;
  3. 初始化锁、workqueue、waitqueue和状态;
  4. 创建controller mhi_device
  5. 注册到mhi bus;
  6. 可选创建debugfs。

注册不自动给modem上电。Transport随后调用:

1
2
3
4
5
6
7
mhi_prepare_for_power_up
-> allocate DMA/context/rings
mhi_async_power_up or mhi_sync_power_up
-> RESET/READY
-> M0
-> mission mode
-> create channel devices

4. Ring

Host在一致性DMA内存中维护:

  • channel TRE ring;
  • event ring;
  • command ring;
  • channel/event/command context。

Queue传输:

1
2
3
4
5
6
mhi_queue_buf/mhi_queue_skb/mhi_queue_dma
-> map buffer
-> fill TRE
-> advance write pointer
-> memory barrier
-> ring channel doorbell

Modem写event ring并触发IRQ。Host解析completion code,回收TRE、unmap DMA并调用client callback。

5. Doorbell与并发

Doorbell可按burst mode配置,避免每个TRE都写MMIO。Ring更新需保证:

  1. descriptor和payload mapping对device可见;
  2. write pointer先更新;
  3. barrier之后再doorbell。

Channel/event各有锁;controller PM使用pm_lock和状态转换work。不能在持有spinlock时执行会睡眠的runtime PM或固件操作。

6. 状态机

MHI设备状态主要为RESET、READY、M0、M1、M2、M3、SYS_ERR:

  • M0:活动;
  • M1:进入低功耗的过渡;
  • M2:轻度低功耗,Host仍可唤醒;
  • M3:深度低功耗;
  • SYS_ERR:协议/设备错误,需要恢复。

Execution Environment包括PBL、SBL、AMSS、RDDM等,决定当前是boot、mission还是RAM dump。

mhi_queue_state_transition()把变化排入单线程state transition worker,按序执行READY、MISSION_MODE等复杂流程。

7. 固件和崩溃转储

boot.c实现BHI/BHIE:

  • 装载modem firmware;
  • 分段DMA传输;
  • 等待boot状态;
  • 进入mission mode;
  • RDDM时收集RAM dump。

固件名和超时来自controller profile。固件必须按产品信任链校验,不能仅依赖文件路径。

8. PCI Generic

mhi_pci_generic按PCI ID选择不同controller config,覆盖Qualcomm SDX、Quectel、Foxconn、Sierra、Telit等设备。

Probe:

1
2
3
4
5
6
7
pci_enable_device
-> request/map BAR
-> DMA mask
-> allocate MSI vectors
-> mhi_register_controller
-> prepare + sync power up
-> runtime PM/health timer

PCI AER、health check或SYS_ERR会调度recovery work,power down、reset PCI function、重新prepare/power up。

9. PM

功能driver使用mhi_device_get[_sync]()/mhi_device_put()维持device wake。Controller suspend要求channel可挂起并进入M3;resume重新进入M0。

计数不配对会导致modem无法休眠或I/O期间被挂起。

10. RK3588

MHI协议与SoC无关。受支持MHI PCI modem可以物理插到RK3588 PCIe,但还需要:

  • CONFIG_MHI_BUSCONFIG_MHI_BUS_PCI_GENERIC
  • 对应PCI ID;
  • PCIe、MSI和DMA正常;
  • firmware文件;
    -供电/reset/W_DISABLE等板级控制。

本树Rockchip defconfig未启用MHI,故不是默认数据路径。

文章互动

阅读 --

留言

0 条留言

正在加载留言…