Documentation/translations/zh_CN/core-api/irq/irq-domain.rst

Source file repositories/reference/linux-study-clean/Documentation/translations/zh_CN/core-api/irq/irq-domain.rst

File Facts

System
Linux kernel
Corpus path
Documentation/translations/zh_CN/core-api/irq/irq-domain.rst
Extension
.rst
Size
10893 bytes
Lines
234
Domain
Support Tooling And Documentation
Bucket
Documentation
Inferred role
Support Tooling And Documentation: documentation
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

.. include:: ../../disclaimer-zh_CN.rst

:Original: Documentation/core-api/irq/irq-domain.rst

:翻译:

 司延腾 Yanteng Si <siyanteng@loongson.cn>
 周彬彬 Binbin Zhou <zhoubinbin@loongson.cn>

.. _cn_irq-domain.rst:

=======================
irq_domain 中断号映射库
=======================

目前Linux内核的设计使用了一个巨大的数字空间,每个独立的IRQ源都被分配了一个不
同的数字。
当只有一个中断控制器时,这很简单,但在有多个中断控制器的系统中,内核必须确保每
个中断控制器都能得到非重复的Linux IRQ号(数字)分配。

注册为唯一的irqchips的中断控制器编号呈现出上升的趋势:例如GPIO控制器等不同
种类的子驱动程序通过将其中断处理程序建模为irqchips,即实际上是级联中断控制器,
避免了重新实现与IRQ核心系统相同的回调机制。

在这里,中断号与硬件中断号离散了所有种类的对应关系:而在过去,IRQ号可以选择,
使它们与硬件IRQ线进入根中断控制器(即实际向CPU发射中断线的组件)相匹配,现
在这个编号仅仅是一个数字。

出于这个原因,我们需要一种机制将控制器本地中断号(即硬件irq编号)与Linux IRQ
号分开。

irq_alloc_desc*() 和 irq_free_desc*() API 提供了对irq号的分配,但它们不
提供任何对控制器本地IRQ(hwirq)号到Linux IRQ号空间的反向映射的支持。

irq_domain 库在 irq_alloc_desc*() API 的基础上增加了 hwirq 和 IRQ 号码
之间的映射。 相比于中断控制器驱动开放编码自己的反向映射方案,我们更喜欢用
irq_domain来管理映射。

irq_domain还实现了从抽象的irq_fwspec结构体到hwirq号的转换(到目前为止是
Device Tree和ACPI GSI),并且可以很容易地扩展以支持其它IRQ拓扑数据源。

irq_domain的用法
================

中断控制器驱动程序通过以下方式创建并注册一个irq_domain。调用
irq_domain_add_*() 或 irq_domain_create_*()函数之一(每个映射方法都有不
同的分配器函数,后面会详细介绍)。 函数成功后会返回一个指向irq_domain的指针。
调用者必须向分配器函数提供一个irq_domain_ops结构体。

在大多数情况下,irq_domain在开始时是空的,没有任何hwirq和IRQ号之间的映射。
通过调用irq_create_mapping()将映射添加到irq_domain中,该函数接受
irq_domain和一个hwirq号作为参数。 如果hwirq的映射还不存在,那么它将分配
一个新的Linux irq_desc,将其与hwirq关联起来,并调用.map()回调,这样驱动
程序就可以执行任何必要的硬件设置。

一旦建立了映射,可以通过多种方法检索或使用它:

- irq_resolve_mapping()返回一个指向给定域和hwirq号的irq_desc结构指针,
  如果没有映射则返回NULL。

- irq_find_mapping()返回给定域和hwirq的Linux IRQ号,如果没有映射则返回0。

- generic_handle_domain_irq()处理一个由域和hwirq号描述的中断。

请注意,irq域的查找必须发生在与RCU读临界区兼容的上下文中。

在调用irq_find_mapping()之前,至少要调用一次irq_create_mapping()函数,
以免描述符不能被分配。

如果驱动程序有Linux的IRQ号或irq_data指针,并且需要知道相关的hwirq号(比

Annotation

Implementation Notes