前几节分别从 dma-buf 与 PRIME 的角度说明了导出方和导入方的接口。本节换到驱动开发者的角度,说明一个 DRM 驱动接入 BO 共享需要实现哪些接口、按什么步骤实现。工作量主要取决于 BO 的后备存储是否会迁移:不迁移的驱动套用 PRIME 的默认实现即可;会迁移的驱动要自己实现导出方的dma_buf_ops,并以动态方式导入。后一类以 amdgpu 为例,只说明各步骤的关键做法。
1. 选择接入方式
DRM 驱动的 BO 共享都经 PRIME 进入:导出入口是drm_gem_object_funcs.export,为空时使用drm_gem_prime_export();导入入口是drm_driver.gem_prime_import,为空时使用drm_gem_prime_import()。驱动先按后备存储能否迁移选定接入方式,两类方式的区别如表 6.9.1 所示。
| 后备存储固定 | 后备存储可迁移 | |
|---|---|---|
| 典型驱动 | 基于 shmem / DMA helper 的驱动,如 v3d、lima、simpledrm | 以 TTM 管理显存与 GTT 的驱动,如 amdgpu、xe |
| 导 |