驱动定义:

static struct platform_driver arm_smmu_driver = {.driver    = {.name           = "arm-smmu-v3",.of_match_table      = arm_smmu_of_match,.suppress_bind_attrs   = true,},.probe    = arm_smmu_device_probe,.remove    = arm_smmu_device_remove,.shutdown = arm_smmu_device_shutdown,
};

注册为platform_driver,对"arm,smmu-v3"设备识别并驱动其初始化,设备参数参考arm,smmu-v3.txt

smmu@2b400000 {
                compatible = "arm,smmu-v3";
                reg = <0x0 0x2b400000 0x0 0x20000>;
                interrupts = <GIC_SPI 74 IRQ_TYPE_EDGE_RISING>,
                             <GIC_SPI 75 IRQ_TYPE_EDGE_RISING>,
                             <GIC_SPI 77 IRQ_TYPE_EDGE_RISING>,
                             <GIC_SPI 79 IRQ_TYPE_EDGE_RISING>;
                interrupt-names = "eventq", "priq", "cmdq-sync", "gerror";
                dma-coherent;
                #iommu-cells = <1>;
                msi-parent = <&its 0xff0000>;
        };

probe过程:

调用函数arm_smmu_device_probe进行probe,首先devm_kzalloc分配struct arm_smmu_device结构,调用arm_smmu_device_dt_probe对dts参数进行解析来初始化smmu结构,具体参数如上面所示,解析过程不再详细展开。

接着判断是否bypass,然后通过platform_get_resource获取到smmu的io资源信息,合法性检查之后对其进行ioremap并将虚拟地址记录在smmu->base中。通过platform_get_irq_byname_optional解析irq并记录。

至此基本的参数解析过程已经完成,紧接着根据参数进行硬件的初始化,通过函数arm_smmu_device_hw_probe完成。arm_smmu_init_structures用于完成smmu对应的结构,初始化完成后将smmu信息设置为platform device的private driver。至此开始reset设备,如设定bypass模式,清空数据等,然后将其添加到iommu系统中以供其他模块调用,同时将arm_smmu_ops赋值给iommu,通过iommu_device_register进行注册。最后是通过arm_smmu_set_bus_ops,对支持的bus设置iommu操作方法结构,均设置为arm_smmu_ops。

重点需要分析的就是arm_smmu_ops,也就是smmu提供给外界设置其功能的接口。

ARM架构SMMU驱动详解相关推荐

  1. Linux的tty架构及UART驱动详解

    Linux的tty架构及UART驱动详解 一.模块硬件学习 1.1. Uart介绍 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称 ...

  2. 嵌入式处理器的体系架构与内核详解

    嵌入式处理器的体系架构与内核详解 当我们谈及嵌入式处理器的体系架构时,一般都是想到Intel的X86架构和ARM公司的ARM架构.X86架构和ARM架构最大的不同点就是使用的指令集不同,前者使用的CI ...

  3. ARM 编译工具链详解

    ARM 编译工具链详解 GNU Arm Embedded Toolchain 是用于 C/C++ 和汇编编程的即用型开源工具套件.GNU Arm 嵌入式开发工具链适用于 32 位 Arm Cortex ...

  4. 2010年系统架构师考试题详解

    原文地址为: 2010年系统架构师考试题详解 考试科目一:综合知识 采用微内核结构的操作系统提高了系统的灵活性和可扩展性,(1) (1)A.并增强了系统的可靠性和可移植性,可运行于分布式系统中 B.并 ...

  5. 2015年系统架构师考试题详解

    原文地址为: 2015年系统架构师考试题详解 考试科目一:综合知识 某航空公司机票销售系统有n个售票点,该系统为每个售票点创建一个进程Pi(i=1,2,-,n)管理机票销售.假设Tj(j=1,2,-, ...

  6. linux usb gadget驱动详解(一)

    由于PC的推广,USB(通用串行总线)是我们最熟知的通信总线规范之一,其他的还有诸如以太网.PCIE总线和RS232串口等.这里我们主要讨论USB. USB是一个主从通信架构,但只能一主多从.其中us ...

  7. 博通wifi驱动详解

    1        WLAN技术 WLAN是英文WirelessLAN的缩写,就是无线局域网的意思.无线以太网技术是一种基于无线传输的局域网技术,与有线网络技术相比,具有灵活.建网迅速.个人化等特点.将 ...

  8. LCD液晶屏驱动详解

    开发环境: 开发板:JZ2440V3 CPU:samsunS3C2440 内核:Linux3.4.2 编译工具:arm-linux-gcc 4.3.2 LCD:4.3存液晶屏AT043TN24 参考文 ...

  9. 2011年系统架构师考试题详解

    原文地址为: 2011年系统架构师考试题详解 考试科目一:综合知识 操作系统为用户提供了两类接口:操作一级和程序控制一级的接口,以下不属于操作一级的接口是(1). (1)A.操作控制命令 B.系统调用 ...

最新文章

  1. OpenCV(26)图像分割 -- 距离变换与分水岭算法(硬币检测、扑克牌检测、车道检测)
  2. matlab 仿真步长,MATLAB Simulink变步长仿真与固定步长仿真简单对比
  3. 在eclipse中搭建maven工程(第二种方法)
  4. vba调用计算机,如何实现跨工作表自动引用数据? 求:EXCEL公式(函数)或VBA宏程序...
  5. js ...运算符_「 giao-js 」用js写一个js解释器
  6. python的变量在使用之前是否要进行声明_python – 如何在使用之前测试变量是否已初始化?...
  7. 和老公去出吃饭,每次我出钱。这样正常吗?
  8. 【行为识别】基于matlab轨迹法行为识别【含Matlab源码 375期】
  9. 使用liteide开发go问题收集
  10. js 拖拽上传文件及文件夹
  11. 【聚客通scrm】-微信个人号sdk实现的微信云控方案
  12. python飞机大战爆炸效果实现_Python飞机大战实战项目案例
  13. handsome主题添加服务器信息,handsome主题部分常用markdown语法
  14. python决策树实例_机器学习中的决策树及python实例
  15. JS 下载 URL 链接文件(点击按钮、点击a标签、支持代理与非代理下载)
  16. ngrok使用/踩坑分析-http代理
  17. 大家来参与一个外包项目的需求分析,考察自己是否有当项目经理/总监的潜力
  18. Python摇骰子-A05
  19. 初中数学与计算机论文,初中数学论文范文
  20. Materials and Manufacturing Processes期刊投稿经验分享

热门文章

  1. 当SWOOLE遇上PROTOCOL
  2. 微信小程序开发初学者之入门步骤和体验
  3. 我的大学六年-郭天祥
  4. 关于制作FlappyBird无限地面的一些问题
  5. BPF学习笔记(六)-- 使用bpf实现xdp的例子
  6. 系统集成项目管理工程师高频考点(第一章)
  7. 电子制造业如何快速回复客户订单交期?
  8. 云模式下的固定资产管理是什么样的?
  9. 小程序使用vant中的步骤条 vant-steps
  10. 皮卡丘的python程序_皮卡丘第一种