立即注册
查看: 2277|回复: 16

[瑞芯微RK资料] Rockchip平台Linux IOMMU开发指南(中英文)

已绑定手机
发表于 2022-5-21 16:16:50 | 显示全部楼层 |阅读模式 来自 广东省深圳市
IOMMU结构
使用二级页表结构, 如下:
1.jpg
32位地址结构,前10位第一级页表偏移,中间10位二级页表偏移,最后12位页内偏移
DTE结构:
2.jpg
bit0:下一级页表是否存在
PTE结构:
3.jpg
bit0:实际的物理页是否存在
bit1:读允许
bit2:写允许

IOMMU驱动
驱动文件
驱动文件所在位置: drivers/iommu/rockchip-iommu.c
DTS 节点配置
DTS 配置参考文档 为 Documentation/devicetree/bindings/iommu/rockchip,iommu.txt ,本文主
要说明如下参数:
compatible = "rockchip,iommu"; 对于所有设备的iommu,compatible字段值相同
interrupts = <GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH 0>; 用于异常中断,比如缺页中断
clocks = <&cru ACLK_VOP1>, <&cru HCLK_VOP1>;
clock-names = "aclk", "hclk"; iommu和master共享clock,这里用于iommu驱动单独控制clock
power-domains = <&power RK3399_PD_VOPL>; 用于iommu驱动操作pd功能
iommu-cells = <0>; 必须为0,详见iommu.txt

IOMMU使用
ROCKCHIP IOMMU驱动依赖IOMMU框架( drivers/iommu/iommu.c ),主要实现 struct iommu_ops rk_iommu_ops 当中的回调函数,然后master调用iommu框架提供的API对iommu进行操作,如下: 1. iommu attach iommu_attach_device -> rk_iommu_attach_device /* enable iommu */
2. iommu detach iommu_detach_device -> rk_iommu_detach_device /* disable iommu */
3. iommu map iommu_map -> rk_iommu_map 创建页表,建立虚拟地址和物理地址的映射关系,
debug时候将iommu_map里面的dbg打印打开,观察mapping过程
4. iommu unmap iommu_unmap -> rk_iommu_unmap 解除虚拟地址和物理地址的映射关系,释放虚
拟地址空间,debug时候将iommu_unmap里面的dbg打印打开,观察 unmapping过程
5. domain alloc iommu_domain_alloc -> rk_iommu_domain_alloc 申请页表基地址,用于attach/detach操作
6. domain free iommu_domain_free -> rk_iommu_domain_free 释放页表空间
7. dump iommu页表 以3399 vopl_iommu为例,假设当前访问的虚拟地址VA为0x00001000,依照如下顺序dump页表:
a. 获取一级页表基地址: DT io -4 0xff8f3f00
b. 计算一级页表偏移 index1 = VA >>22
c. 计算一级页表物理地址: DTE DTE = index1 * 4 + DT
d. 获取二级页表基地址:PT PT = io -4DTE
e. 计算二级页表偏移 index2 = VA && 0x3ff000
e. 计算二级页表物理地址: PTE PTE = index2 *4 + PT
f. 获取PAGE物理地址: page page = io -4 PTE
g. 计算页内偏移: offset offset = page + (VA &&0xfff) offset就是虚拟地址0x00001000对应的物理地址,master可以用此来分析数据是否正确
8. dma-mapping
a. dev为非iommu设备 ARM32: dev->dma_ops = arm_dma_ops; ARM64: dev- >dma_ops = arm64_swiotlb_dma_ops;
b. dev为iommu设备 ARM32: dev->dma_ops = iommu_ops; ARM64: dev->dma_ops = iommu_dma_ops; 以dma_alloc_attrs函数为例:
1. 非iommu dev,从a的dma_ops调用alloc回调申请连续物理内存和内核态虚拟地址
2. iommu dev,从b的dma_ops调用alloc回调申请物理内存,并通过iommu框架调用 iommu_map来创建iommu页表,建立虚拟地址和物理地址映射关系,返回iommu虚拟地址首 地址和内核态虚拟地址
一个最简单的使用iommu的步骤
1. domain = iommu_domain_alloc(&platform_bus_type);
2. iommu_map(domain, iova, paddr, size, prot);
3. iommu_attach_device(domain, dev);
4. master启动访问iommu
iommu是一个基础的部件,可以嵌入各种内存分配的框架中,比如ion/drm,以ARM64环境下drm为例,一次完整的iommu buffer分配以及映射过程如下:
rockchip_gem_alloc_buf ->
rockchip_gem_get_pages ->
rockchip_gem_iommu_map ->
iommu_map_sg ->
iommu_map

更多详细内容请下载附件查看
游客,如果您要查看本帖隐藏内容请回复

已绑定手机
发表于 2022-5-21 16:30:31 | 显示全部楼层 来自 四川省成都市
看看学习一下
发表于 2022-5-23 21:22:53 | 显示全部楼层 来自 上海市
谢谢分享
已绑定手机
发表于 2022-5-23 21:23:10 | 显示全部楼层 来自 上海市
学习学习
已绑定手机
已实名认证
发表于 2022-5-24 03:48:20 | 显示全部楼层 来自 广东省深圳市
looklook!!
已绑定手机
发表于 2022-5-24 08:29:17 | 显示全部楼层 来自 浙江省嘉兴市
好资料,看看
已绑定手机
发表于 2022-5-26 09:29:38 | 显示全部楼层 来自 广东省深圳市
感谢分享好资料。。。。。。。。。
已绑定手机
发表于 2023-1-17 18:52:19 | 显示全部楼层 来自 美国
0987654321
已绑定手机
发表于 2023-1-18 00:25:40 | 显示全部楼层 来自 广东省深圳市
good data for us
已绑定手机
发表于 2023-1-18 00:28:47 | 显示全部楼层 来自 广东省深圳市
goood data for us
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表