这里的结构其实很类似我们的mmu的页表了,在arm smmu v3 我们第一层的目录desc的目录结够,大小采用8(STRTAB_S PL IT)位,也就是stream id的高8位,stream id剩下的低位全部用来寻址第二层真正的ste entry; 介绍完了 smmu 中管理设备的ste的表的两种结构后,我们来看看这个ste表的具体结构是啥,里面有啥奥秘呢:...
这里的结构其实很类似我们的mmu的页表了,在arm smmu v3 我们第一层的目录desc的目录结够,大小采用8(STRTAB_SPLIT)位,也就是stream id的高8位,stream id剩下的低位全部用来寻址第二层真正的ste entry; 介绍完了 smmu 中管理设备的ste的表的两种结构后,我们来看看这个ste表的具体结构是啥,里面有啥奥秘呢: 如...
而且SMMUv2和v3本身并不兼容,功能上和数据结构上都有比较大的差别。截至到发帖当日,在网上能够找到关于Linux SMMUv3的代码解读,但是尚未看到关于SMMUv3本身数据结构的详细描述。 因为所有的工作都局限于文档和代码,所以缺少对SMMUv3的直观印象,导致对很多特性的认识模糊甚至没有认识。 本文首次展示ARMv8 SMMUv3的”实景...
这里的结构其实很类似我们的mmu的页表了,在arm smmu v3 我们第一层的目录desc的目录结够,大小采用8(STRTAB_SPLIT)位,也就是stream id的高8位,stream id剩下的低位全部用来寻址第二层真正的ste entry; 介绍完了 smmu 中管理设备的ste的表的两种结构后,我们来看看这个ste表的具体结构是啥,里面有啥奥秘呢: 如...
参见 SMMU_STRTAB_BASE_CFG 和 C_BAD_STREAMID。当 SMMU_S_IDR1.SECURE_IMPL == 1 时,支持两种安全状态时,此时使用SEC_SID 标志识别是安全还是非安全 SMMU 的编程接口,参见第 3.10.1 章节安全状态确定(SSD)。这决定了是使用安全还是非安全的流表(或其缓存)。 3.3.1.1 Linear Stream Table 3.3.1.1 线性...
这里的结构其实很类似我们的mmu的页表了,在arm smmu v3 我们第一层的目录desc的目录结够,大小采用8(STRTAB_SPLIT)位,也就是stream id的高8位,stream id剩下的低位全部用来寻址第二层真正的ste entry; 介绍完了 smmu 中管理设备的ste的表的两种结构后,我们来看看这个ste表的具体结构是啥,里面有啥奥秘呢: ...
arm_smmu_write_strtab_ent(master, sid, step); } } ### Q7. 如何告知smmu driver设备使用的StreamID?以device tree为例,smmu node信息如下 smmu: iommu@2b400000 { compatible = "arm,smmu-v3"; reg = <0x0 0x2b400000 0x0 0x100000>; interrupts...
SMMU根据寄存器配置的STRTAB_BASE地址找到STE, STRTAB_BASE定义了STE的基地值, Stream id定义了STE的偏移。如果使用linear 查找, 通过STRTAB_BASE sid * 64(一个STE的大小为64B)找到STE;若使用2-level查找, 则先通过sid的高位找到L1_STD(STRTAB_BASE sid[9:8] * 8, 一个L1_STD的大小为8B), L1_STD定义了...
Linux 内核的 IOMMU 子系统相关源码位于drivers/iommu,ARM SMMU 驱动实现位于drivers/iommu/arm/arm-smmu-v3。在 Linux 内核的 SMMU 驱动实现中,做地址转换所用到的数据结构,在上面提到的不同步骤中创建: 流表在 SMMU 驱动程序的初始化过程中创建。如果流表的结构为线性流表,则线性流表中所有的 STE 都被配置为...
SMMU根据寄存器配置的STRTAB_BASE地址找到STE, STRTAB_BASE定义了STE的基地值, Stream id定义了STE的偏移。如果使用linear 查找, 通过STRTAB_BASE + sid * 64(一个STE的大小为64B)找到STE;若使用2-level查找, 则先通过sid的高位找到L1_STD(STRTAB_BASE + sid[9:8] * 8, 一个L1_STD的大小为8B), L1_STD...