irq_domain msi_domain 的 使用和关系

news2024/11/13 18:41:31

文章目录

  • 如何创建一个 irq_domain
  • 如何创建一个 msi_domain
  • irq domain 和 msi domain 的关系
  • MSI对IRQdomain打的补丁
    • 变量
    • 结构体
    • API
      • 初始化时的API
      • 申请IRQ时的API
  • 实例 GICV3-ITS & GICV3-ITS-PCI 相关结构体变量所在文件

如何创建一个 irq_domain

内核文档说,我们可以调用如下的API 来创建domain

irq_domain_add_linear/irq_domain_create_linear
irq_domain_add_tree/irq_domain_create_tree
irq_domain_add_nomap
irq_domain_add_simple/irq_domain_add_legacy/irq_domain_add_legacy_isa

注意 : create_ 和 add_ 都是调用了 __irq_domain_add
注意 : 现在好像都用 irq_domain_create_ 了 

如何创建一个 msi_domain

  • 参考 GICV3-ITS-PCI
  • 参考 GICV3-ITS-PLATFORM
    在这里插入图片描述
  • 参考 GICV3-ITS
    在这里插入图片描述

irq domain 和 msi domain 的关系

  • msi domain 是 irq domain的一个user
host_data: private data pointer for use by owner. Not touched by irq_domain core code
很明显msi irq domain就是那个user
	还有其他的user  : gpiolib 中的 gpio_chip 等等,可用用以下命令搜索
		// grep "host_data;" * -nr |grep  " = "
  • msi domain 只是粘在 irq domain的一个结构体,并没有父子关系
msi irq domain跟irq domain的关系是什么,是irq domain 的user? 
也就是附着在狼身上的一个狈,狼有等级制度(parent),但是狈没有。
但是狈利用了这个等级制度。

所以我们一般说 msi-domain 或者 msi-irq-domain 的时候,就默认指 msi-domain + irq_domain , 即狈 和狼
但是我们一般说 irq-domain 的时候, 特指 狼,没有狈

  • msi domain 是 irq domain 的一个补丁
msi domain其实是基于irqdomain的一个补丁,这个补丁不太好看
	在结构体上,
		1.msi irq domain 使用了 host_data,实现了flag和prepare。
        2.新增了一系列 结构体
	在变量上,
		1. 新增了一些 static 变量,供MSI系统私用
           
    在API上,
		实现了一些内部函数,以驱使流程
		新增了一系列api,供用户使用
    
     在流程观感上
    	在普通流程的基础上增加了prepare(准备硬件中断号)的动作

        msi irq的流程 相对于 普通的irq 的流程,多了一个硬件中断号的获取
            普通irq的hwirq是写到设备树中的
            但是msi的hwirq是系统分配的。
	
		如果一个plicsw要支持这两种,就必须 在系统中管理好这两种索取hwirq的途径

MSI对IRQdomain打的补丁

变量

MSI层的  结构体变量
	// 被用作 ITS irq domain 的 子 irq domain 的ops    
	// 例如 GICV3-ITS-PCI irq domain的 ops 就使用了它                    
	static const struct irq_domain_ops msi_domain_ops = {   
	    .alloc      = msi_domain_alloc,                                                 
	    .free       = msi_domain_free,                                                  
	    .activate   = msi_domain_activate,                                              
	    .deactivate = msi_domain_deactivate,                                            
	};

	 // 被用作 填充 ITS irq domain 的 子 irq domain 的ops 中的未定义的指针 
	 // 例如 GICV3-ITS-PCI msi domain的 ops : its_msi_domain_ops ,其中的一些字段被它填充了
	 // msi_create_irq_domain->msi_domain_update_dom_ops                   
	static struct msi_domain_ops msi_domain_ops_default = {    
	    .get_hwirq      = msi_domain_ops_get_hwirq,                                     
	    .msi_init       = msi_domain_ops_init,                                          
	    .msi_check      = msi_domain_ops_check,                                         
	    .msi_prepare        = msi_domain_ops_prepare,                                   
	    .set_desc       = msi_domain_ops_set_desc,                                      
	    .domain_alloc_irqs  = __msi_domain_alloc_irqs,                                  
	    .domain_free_irqs   = __msi_domain_free_irqs,                                   
	};

结构体

MSI层的结构体,待用户填充

// 被用作 ITS irq domain 的 host_data   
337 struct msi_domain_info {                                                                                                                                   
338     u32         flags;                                                           
339     struct msi_domain_ops   *ops;                                                
340     struct irq_chip     *chip;                                                   
341     void            *chip_data;                                                  
342     irq_flow_handler_t  handler;                                                 
343     void            *handler_data;                                               
344     const char      *handler_name;                                               
345     void            *data;                                                       
346 }; 

// 被用作 ITS irq domain 的 host_data  的 ops
// 里面的 msi_prepare    用于 准备硬件中断号
static struct msi_domain_ops its_pci_msi_ops = {                                 
    .msi_prepare    = its_pci_msi_prepare,                                       
};

API

初始化时的API

MSI层 的API
	msi_create_irq_domain
MSI-PCI 层的API
	platform_msi_create_irq_domain
MSI-PLATFORM 层的API
	platform_msi_create_irq_domain

申请IRQ时的API

MSI层 的API
	msi_domain_alloc_irqs
	__msi_domain_alloc_irqs
	msi_domain_prepare_irqs
MSI-PCI 层的API
	__pci_enable_msix_range
	__pci_enable_msix
	msix_capability_init
	pci_msi_setup_msi_irqs
MSI-PLATFORM 层的API
	platform_msi_domain_alloc_irqs

实例 GICV3-ITS & GICV3-ITS-PCI 相关结构体变量所在文件

GICV3-ITS
	irq-domain
		its_domain_ops 				drivers/irqchip/irq-gic-v3-its.c
		its_irq_chip  				drivers/irqchip/irq-gic-v3-its.c
	msi-domain
		局部变量info
		its_msi_domain_ops 			drivers/irqchip/irq-gic-v3-its.c
		its_msi_prepare  			drivers/irqchip/irq-gic-v3-its.c
GICV3-ITS-PCI
	irq-domain
		msi_domain_ops 				kernel/irq/msi.c
		its_msi_irq_chip 			drivers/irqchip/irq-gic-v3-its-pci-msi.c
	msi-domain
		its_pci_msi_domain_info		drivers/irqchip/irq-gic-v3-its-pci-msi.c
		its_pci_msi_ops 			drivers/irqchip/irq-gic-v3-its-pci-msi.c
		its_pci_msi_prepare			drivers/irqchip/irq-gic-v3-its-pci-msi.c
		msi_domain_ops_default 		kernel/irq/msi.c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/536050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于 FPGA 的彩色图像灰度化的设计实现

文章目录 前言一、系统整体设计二、各模块的功能三、彩色图像灰度化处理模块的设计1.基本原理2.彩色图像灰度化处理方法介绍方法 1:分量法方法 2:最大值法方法 3:平均值法平均值法的实现方法 4 加权平均法加权平均法的实现rgb2gray 模块rgb2g…

LeetCode965. 单值二叉树,100. 相同的树

965. 单值二叉树,100. 相同的树 965描述示例解题思路以及代码 100描述示例解题思路以及代码 965 描述 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 fals…

获得GitHub Copilot并结合VS Code使用

一、什么是GitHub Copilot GitHub Copilot是一种基于AI的代码生成工具。它使用OpenAI的GPT(生成式预训练Transformer)技术来提供建议。它可以根据您正在编写的代码上下文建议代码片段甚至整个函数。 要使用GitHub Copilot,您需要在编辑器中…

(四)Photon Voice2 的使用

一、入门 1.Voice简介 Photon Voice 2 是一个 SDK,可以轻松地向 Unity 应用程序添加高质量的低延迟语音聊天。它建立在 Photon Realtime 之上,并继承了它的所有功能,包括配对和兴趣小组。客户端加入房间并创建传出流(本地语音&a…

双目、结构光、tof,三种深度相机的原理区别看这一篇就够了!

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…

win10屏幕录像哪个好用?这2款录屏软件值得推荐!

案例:win10电脑如何录屏? 【我使用的电脑是win10系统,我想对它进行屏幕录制。有没有小伙伴知道win10电脑如何录屏?win10录屏软件哪款比较好用?】 在如今互联网时代,屏幕录像是一项非常实用的功能&#xf…

【大数据之Hadoop】三十二、MapReduce生产经验

1 MapReduce跑的慢的原因 MapReduce程序效率的瓶颈在于两点: 1)计算机性能:CPU、内存、磁盘、网络 2)I/O操作优化 (1)数据倾斜 (2)Map运行时间太长,导致Reduce等待过久 …

高斯-约旦消元法

1,思想 该算法基于高斯消元,但是思想是把矩阵化为对角阵,从而避免回代的操作思路是一列一列处理,每次选为处理过的行中主元最大(极大避免精度损失)的行处理。把这一列除了主元这一行的元素,其余该列的其他…

c#笔记-委托

委托 委托是方法的类型。 有了类型就可以声明方法的变量,参数,字段。然后再调用他。 很多新人很困惑,为什么要把方法做成变量,不直接去调用它呢? 这是因为在目前你的认知里,代码都是你一个人写出来的。 如…

计算机图形学-GAMES101-5

一、观测变换 通过Viewing(观测)transformation,最终我们将世界坐标系中的物体投影到了一个xyz都处于【-1,1】的立方体中。那么接下来,我们该做什么? 二、光栅化(Rasterization) (1)透视投影的定义 定义透视投影的视…

〖大学生·技术人必学的职业规划白宝书 - 职业规划篇①〗- 大学生选择职业前的自我认知与剖析

历时18个月,采访 850 得到的需求。 不管你是在校大学生、研究生、还是在职的小伙伴,该专栏有你想要的职业规划、简历、面试的答案。说明:该文属于 大学生技术人职业规划白宝书 专栏,购买任意白宝书体系化专栏可加入TFS-CLUB 私域社…

linux之线程同步

1. 互斥锁 定义锁: pthread_mutex_t 初始化锁函数: int pthread_mutex_init(pthread_mutex_t* mutex,pthread_mutexattr_t* attr); 第一个参数是定义的互斥锁的地址,第二个参数是锁的属性,一般传NULL 互斥锁的属性在创建…

(C语言版)力扣(LeetCode)+牛客网(nowcoder)二叉树基础oj练习

二叉树基础oj练习 965. 单值二叉树题目解法 100. 相同的树题目解法 101. 对称二叉树题目解法 144. 二叉树的前序遍历题目解法 94. 二叉树的中序遍历题目解法 145. 二叉树的后序遍历题目解法 572. 另一棵树的子树题目解法 KY11 二叉树遍历题目解法 结语 965. 单值二叉树 题目 …

Linux安装MongoDB数据库并内网穿透在外远程访问

文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 转发自CSDN cpolarlisa的文章:Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接「内网穿透…

LeetCode572. 另一棵树的子树LeetCode

572. 另一棵树的子树 描述示例解题思路以及代码 描述 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节…

数据库|SQL调优案例之TiFlash帮倒忙该怎么办?

一、背景 早上收到某系统的告警tidb节点挂掉无法访问,情况十万火急。登录中控机查了一下display信息,4个TiDB、Prometheus、Grafana全挂了,某台机器hang死无法连接,经过快速重启后集群恢复,经排查后是昨天上线的某个S…

Flink消费pubsub问题

我看网上flink消费pubsub的资料并不多,最近跑通了,大家有问题的可以给我留言。 一、基本资料 1.flink官网接入方式 Google Cloud PubSub | Apache Flink StreamExecutionEnvironment streamExecEnv StreamExecutionEnvironment.getExecutionEnviron…

Android平台如何实现外部编码后(H.264/H.265)数据实时预览播放

技术背景 我们在对接开发者的时候,遇到这样的诉求:除了正常的RTMP、RTSP直播播放外,有些硬件设备输出编码后(H.264/H.265)的数据,比如无人机或类似硬件产品,回调出来的H.264/H.265数据&#xf…

C#中的委托是什么

https://www.cnblogs.com/deepalley/p/12150931.html 1.什么是委托?(方法作另一个方法的参数) delegate void MyDel(int value); //声明委托类型 和类一样,委托是用户自定义的类型,但是类是数据和方法的集合&#…

vue实现功能完整的购物商城,商品零食、电商通用商城

目录 一、项目结构 1.项目截图 2.项目简介 3.项目布局 二、首页 1.效果图 2.源码 三、商品详情 1.效果图 2.源码 四、分类 1.效果图 五、购物车、提交订单 1.效果图 六、个人中心 1.源码结构 2、效果图 七、总结 一、项目结构 1.项目截图 2.项目简介 项目基于vue…