问题标签 [iommu]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iommu - 查找 iommu 组的设备
我正在使用适用于 linux 的 IOMMU API,我想获取属于已知组 ID 的特定组的特定设备。
iommu_group 结构有一个设备列表字段,但不可访问。有没有办法得到它?
c - Linux 4.4 PCIe DMA 进入用户空间页面不起作用 - highmem 不能用于 DMA?
我正在更新一个较旧的 linux 驱动程序,该驱动程序通过 DMA 将数据传输到用户空间页面,这些页面通过get_user_pages()
.
我的硬件是一个新的基于 x86 Xeon 的主板,具有 12GB 的 RAM。
驱动程序将数据从 VME 获取到 PCIe FPGA,并且应该将其写入主存储器。我dma_map_pages()
为每一页做一个,我检查它dma_mapping_error()
并将返回的物理 DMA 地址写入 DMA 控制器的缓冲区描述符。然后我启动 DMA。(我们还可以在 FPGA 跟踪器中看到传输开始)。
但是,当我得到 DMA 完成 IRQ 时,我看不到任何数据。对于控制,我可以通过 PIO 模式访问相同的 VME 地址空间,并且可以正常工作。我还尝试将值写入用户页面的 page_address(page) 并且应用程序可以看到这些。一切都好。
深入研究这个问题,我检查了像 DMA-API.txt 这样的常用文档,但我找不到任何其他方法,在其他驱动程序中也找不到。
我的内核是一个自编译的 4.4.59 64 位,各种调试(调试 DMA-API 等)设置为是。
我还尝试通过驱动程序/iommu/ 来查看这里的调试可能性,但那里只有一些 pr_debugs。
有趣的是:我有另一个驱动程序,一个以太网驱动程序,它支持连接到 PCI 的 NIC。这个工作没有问题!
在转储和比较检索到的 DMA 时dma_addr_t
,我看到了这一点:
NIC 驱动程序通过dma_alloc_coherent()
缓冲区描述符等分配内存,它的地址在“lower 4 GB”中:
VME 驱动程序,dma_map_page'ing 用户空间页面大于 4GB,DMA 地址看起来不同:0xffffe010(与应用程序有偏移)。
DMA_BIT_MASK(32)
在两个驱动程序中都设置了,我们的 FPGA 内核是 32 位宽的。
问题:我是否必须具备特殊的先决条件才能使此 DMA 工作?我读到 highmem 内存不能用于 DMA,现在还是这样吗?
dmesg 的一部分:
virtual-machine - GPU 直通后没有主机显示
我正在尝试设置 GPU 直通以在我的系统上的 VM 中使用。我正在使用 Ubuntu 17.04 并在手动将 nouveau 驱动程序列入黑名单后成功按照以下链接中的说明进行操作。
https://medium.com/@calerogers/gpu-virtualization-with-kvm-qemu-63ca98a6a172
当我打开主机系统时,我看到 Ubuntu 启动启动画面,但随后屏幕变黑并且没有显示任何内容。我可以通过 ssh 进入系统并看到 Nvidia GPU 已正确分配给 vfio-pci(如预期的那样)。我还没有测试过直通在 VM 上是否有效,因为我想让我的主机显卡首先与集成的 Intel 显卡一起工作。
我试过xrandr,但它说它无法打开显示器。我希望我必须做一些特定的事情来为主机启用集成显卡。有什么建议么?
系统:华擎 Z77 EXTREME4 Intel i7-4790K Nvidia GTX 650 Ti
谢谢您的帮助!
linux - 检查 linux 上的 IOMMU 支持
我想在任何给定的 Linux 机器上验证是否支持 PCI 直通。经过一番谷歌搜索,我发现我宁愿检查是否支持 IOMMU,我通过运行:
如果它支持 IOMMU(而不是 IOMMUv2),我会得到:
...DMAR: IOMMU enabled
我要找的东西在哪里。
现在,如果机器已经运行了好几天而没有重新启动,那么第一条消息[ 0.000000] DMAR: IOMMU enabled
可能不会再使用上一个命令出现在日志中。
当该消息从日志中消失时,有什么方法可以检查 IOMMU 支持吗?
linux-kernel - 总线层次结构中的地址转换
考虑一个总线层次结构,它包括与另一条总线 B 连接的总线 A。总线 B 连接其他两条总线 C 和 D。ab、bc 和 bd 是相应的桥。此外,这些总线中的每一个都连接了它们的设备。
我了解根据总线的应用,它可能具有其速度和地址范围容量。我想专注于这些总线中的每一个的地址空间。由于 A 是所有总线下层级的主机,它的地址范围应该足够宽以唯一地确定层级中的每个设备。
我的理解是,一般来说,总线 C 上的设备可能与总线 D 上的设备在数字上具有相同(或重叠)的总线本地地址范围。然而,当这些地址范围被映射到总线上层总线B时,它们被映射为两个不同的地址范围。这意味着设备 Cc 可能已分配本地地址范围 0x000 - 0xfff,设备 Dd 也具有相同的本地地址范围 0x000 - 0xfff,但在总线 B 上,它们可能映射到类似 Cc (0x0000-0x0fff) 和 Dd 为 (0xaaaa - 0xeb3f)。虽然这是映射实际上非常特定于一个平台,但想了解这种理解总体上是否正确。
我一直假设的另一点是,当数据在任一方向交叉时,桥会执行地址转换的功能。请让我知道这是否正确。
我的另一个问题是如果桥执行此翻译,当桥填充翻译表时?桥接控制器驱动程序有什么作用吗?它是如何做到的(如果有的话)?
linux - 检查是否在 BIOS/UEFI 中启用了 VT-D / IOMMU
要检查是否在 BIOS/UEFI 中启用了 Intel 的 VT-X 或 AMD 的 AMD-V,我使用:
我找不到检查 BIOS/UEFI 中是否启用了 Intel 的 VT-D 或 AMD 的 IOMMU 的方法。
我需要一种方法来检测它是否已启用,而无需设置 iommu 内核参数(iommu=1
、、、amd_iommu=on
)intel_iommu=on
。
我的一个想法是使用rdmsr
,但我不确定这是否可行。而不是systool
我最初想使用sudo rdmsr 0x3A
,但它对我不起作用。它总是报告:
rdmsr
是msr-tools
顺便说一句的一部分。并且要使用需要msr
先加载 kenel 模块(sudo modprobe msr
)。
据称sudo rdmsr 0x3A
应该已经返回3
或5
表明 VT-X/AMD-V 已启用...
linux - 检查主板/BIOS/UEFI和CPU是否支持VT-D/IOMMU
我发现我可以使用以下代码确定是否启用了 VT-D / IOMMU:
但是在没有启用它的情况下,我无法找到一种方法来检查系统是否首先支持该选项。
我知道 Intel/AMD 已经记录了他们的哪些 CPU 支持 VT-D / IOMMU,但我想知道整个系统(主板+UEFI/BIOS+CPU+芯片组)是否支持此功能,因为我的笔记本例如有一个支持它的 CPU,但 UEFI 中没有启用它的选项。
linux-kernel - 在 x86 平台上,IOMMU 是否默认翻译了 PCI 事务中的地址?
我知道 PCI 具有称为 ATS 的功能,可以将虚拟地址转换为物理地址,但我不确定当前 x86 平台是否默认启用它。
如果是,我应该如何在Linux系统中生成虚拟地址和对应的页表?
这就是我现在的猜测。首先,像 pci_map_* 这样的 DMA API 将调用 intel iommu 驱动程序来设置页表并获取 io 虚拟地址。其次,PCI 设备将使用该虚拟 io 地址开始事务,vt-d 将该虚拟 io 地址转换为物理地址。我说得对吗?
linux-device-driver - 如何将我的设备与 IOMMU 框架连接?
我在我的 linux 驱动程序中添加了 IOMMU 支持,并注意到 IOMMU 组在引导期间分配给了设备:
[0.942274] iommu:将设备 0000:03:00.0 添加到组 28
虽然,当我尝试iommu_attach_device()
进入驱动程序时,它失败了。我发现它在调用iommu_group_get()
我的设备时失败了。
如何为我的设备获取分配的组并在我的驱动程序中使用它?
我正在使用 Ubuntu 4.15.0-45-generic 内核。
编辑:
iommu_group_get()
当struct device
字段iommu_group
未初始化时失败。另外,我在启动后手动加载驱动程序。
Edit2: 我确实看到该设备已添加到 dmesg 输出中的第 28 组。我的驱动程序探测例程中有以下序列,这是通过引用现有内核驱动程序源获得的:
我已经调用 IOCTL 来固定用户空间虚拟地址 ( get_user_pages_fast
) 并执行iommu_map
. 这对于使用用户空间区域为设备启用 DMA 是否有效?