gpt4 book ai didi

drivers - 从 MSI Capability Structure 读取地址

转载 作者:行者123 更新时间:2023-12-02 02:52:04 31 4
gpt4 key购买 nike

是否有可能找到与特定中断关联的 MSI 能力结构的位置?具体来说,我需要知道写入时触发该中断的 PCI 地址。

MSI 中断可以很容易地用 pci_alloc_irq_vectors(9) 函数初始化,但这只是提供了 irq 号,没有对能力结构的引用。

作为引用,此文档中描述了功能结构:https://pcisig.com/sites/default/files/specification_documents/msi-x_ecn.pdf

最佳答案

听起来您希望能够自己写入该值并生成中断。这并不是 MSI 的实际工作方式(尽管它可能仍然是可能的)。使用 MSI(或 MSI-X),您基本上是使用一个地址对 PCI 设备进行编程,它应该向该地址生成数据写入,并在要生成中断时向该地址写入一个数据值。

AFAIK 不能保证您可以通过写入地址自行触发相同的中断。尽管如此,通常 MSI 中给出的地址是由中断 Controller (通常作为 PCI 设备本身实现)控制的地址空间内的一个位置,数据值告诉中断 Controller 触发哪个中断。因此,您很可能会将相同的值写入相同的物理内存地址,从而生成相同的中断。

无论如何,假设您知道哪个 PCI 设备正在生成中断,您就可以找到 MSI 功能结构,因此您可以读回它的编程内容。这很简单。

PCI 功能(因设备而异)被组织到设备配置空间内的链表中。列表的开头始终由设备配置空间中偏移量为 0x34 的字节给出。该字节值为您提供了第一个功能数据结构空间内的偏移量。

每个能力都包含一个单字节的能力类型 ID,后跟一个单字节的“下一个能力”指针,然后是特定于能力的变长数据。因此,从偏移量 0x34 开始,您可以跳过这些功能。

要在任何 Linux 机器上查看此操作,您可以运行 lspci。给它 -v 标志(可以重复它以获得越来越多的细节)给你一个配置空间的注释 View 。您还可以添加 -xxxx 以获得配置空间的完整十六进制转储,因此您可以自行跟踪功能链。 (顺便说一句,您需要使用 sudo 运行它以获取所有功能详细信息。)

内核中有一些接口(interface)可以为您完成这项工作:您可以使用 pci_find_capability 找到您想要的功能的偏移量。当然,您也可以通过从偏移量为 0x34 的 pci_read_config_byte 开始并按照列表查找自己的功能。

找到 MSI 功能后,您便可以根据上面引用的文档解释其内容。您将使用 pci_read_config_byte (/word/dword) 来访问功能数据结构的各个部分。

关于drivers - 从 MSI Capability Structure 读取地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51796021/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com