162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci.. include:: ../disclaimer-zh_CN.rst 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci:Original: Documentation/PCI/sysfs-pci.rst 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci:翻译: 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci 司延腾 Yanteng Si <siyanteng@loongson.cn> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci:校译: 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci======================== 1562306a36Sopenharmony_ci通过sysfs访问PCI设备资源 1662306a36Sopenharmony_ci======================== 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cisysfs,通常挂载在/sys,在支持它的平台上提供对PCI资源的访问。例如,一个特定的总线可能看起 1962306a36Sopenharmony_ci来像这样:: 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci /sys/devices/pci0000:17 2262306a36Sopenharmony_ci |-- 0000:17:00.0 2362306a36Sopenharmony_ci | |-- class 2462306a36Sopenharmony_ci | |-- config 2562306a36Sopenharmony_ci | |-- device 2662306a36Sopenharmony_ci | |-- enable 2762306a36Sopenharmony_ci | |-- irq 2862306a36Sopenharmony_ci | |-- local_cpus 2962306a36Sopenharmony_ci | |-- remove 3062306a36Sopenharmony_ci | |-- resource 3162306a36Sopenharmony_ci | |-- resource0 3262306a36Sopenharmony_ci | |-- resource1 3362306a36Sopenharmony_ci | |-- resource2 3462306a36Sopenharmony_ci | |-- revision 3562306a36Sopenharmony_ci | |-- rom 3662306a36Sopenharmony_ci | |-- subsystem_device 3762306a36Sopenharmony_ci | |-- subsystem_vendor 3862306a36Sopenharmony_ci | `-- vendor 3962306a36Sopenharmony_ci `-- ... 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci最上面的元素描述了PCI域和总线号码。在这种情况下,域号是0000,总线号是17(两个值都是十六进制)。 4262306a36Sopenharmony_ci这个总线在0号插槽中包含一个单一功能的设备。为了方便起见,我们复制了域和总线的编号。在设备目录 4362306a36Sopenharmony_ci下有几个文件,每个文件都有自己的功能。 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci =================== ===================================================== 4662306a36Sopenharmony_ci 文件 功能 4762306a36Sopenharmony_ci =================== ===================================================== 4862306a36Sopenharmony_ci class PCI级别 (ascii, ro) 4962306a36Sopenharmony_ci config PCI配置空间 (binary, rw) 5062306a36Sopenharmony_ci device PCI设备 (ascii, ro) 5162306a36Sopenharmony_ci enable 设备是否被启用 (ascii, rw) 5262306a36Sopenharmony_ci irq IRQ编号 (ascii, ro) 5362306a36Sopenharmony_ci local_cpus 临近CPU掩码(cpumask, ro) 5462306a36Sopenharmony_ci remove 从内核的列表中删除设备 (ascii, wo) 5562306a36Sopenharmony_ci resource PCI资源主机地址 (ascii, ro) 5662306a36Sopenharmony_ci resource0..N PCI资源N,如果存在的话 (binary, mmap, rw\ [1]_) 5762306a36Sopenharmony_ci resource0_wc..N_wc PCI WC映射资源N,如果可预取的话 (binary, mmap) 5862306a36Sopenharmony_ci revision PCI修订版 (ascii, ro) 5962306a36Sopenharmony_ci rom PCI ROM资源,如果存在的话 (binary, ro) 6062306a36Sopenharmony_ci subsystem_device PCI子系统设备 (ascii, ro) 6162306a36Sopenharmony_ci subsystem_vendor PCI子系统供应商 (ascii, ro) 6262306a36Sopenharmony_ci vendor PCI供应商 (ascii, ro) 6362306a36Sopenharmony_ci =================== ===================================================== 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci:: 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci ro - 只读文件 6862306a36Sopenharmony_ci rw - 文件是可读和可写的 6962306a36Sopenharmony_ci wo - 只写文件 7062306a36Sopenharmony_ci mmap - 文件是可移动的 7162306a36Sopenharmony_ci ascii - 文件包含ascii文本 7262306a36Sopenharmony_ci binary - 文件包含二进制数据 7362306a36Sopenharmony_ci cpumask - 文件包含一个cpumask类型的 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci.. [1] rw 仅适用于 IORESOURCE_IO(I/O 端口)区域 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci只读文件是信息性的,对它们的写入将被忽略,但 "rom "文件除外。可写文件可以用来在设备上执 7862306a36Sopenharmony_ci行操作(例如,改变配置空间,分离设备)。 mmapable文件可以通过偏移量为0的文件的mmap获得, 7962306a36Sopenharmony_ci可以用来从用户空间进行实际的设备编程。注意,有些平台不支持某些资源的mmapping,所以一定要 8062306a36Sopenharmony_ci检查任何尝试的mmap的返回值。其中最值得注意的是I/O端口资源,它也提供读/写访问。 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_cienable "文件提供了一个计数器,表明设备已经被启用了多少次。如果'enable'文件目前返回'4', 8362306a36Sopenharmony_ci而一个'1'被呼入它,它将返回'5'。向它呼入一个'0'会减少计数。不过,即使它返回到0,一些初始 8462306a36Sopenharmony_ci化可能也不会被逆转。 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cirom "文件很特别,因为它提供了对设备ROM文件的只读访问,如果有的话。然而,它在默认情况下是 8762306a36Sopenharmony_ci禁用的,所以应用程序应该在尝试读取调用之前将字符串 "1 "写入该文件以启用它,并在访问之后将 8862306a36Sopenharmony_ci"0 "写入该文件以禁用它。请注意,设备必须被启用,才能成功返回数据。如果驱动没有被绑定到设备 8962306a36Sopenharmony_ci上,可以使用上面提到的 "enable "文件将其启用。 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciremove "文件是用来移除PCI设备的,通过向该文件写入一个非零的整数。这并不涉及任何形式的热插 9262306a36Sopenharmony_ci拔功能,例如关闭设备的电源。该设备被从内核的PCI设备列表中移除,它的sysfs目录被移除,并且该 9362306a36Sopenharmony_ci设备将被从任何连接到它的驱动程序中移除。移除PCI根总线是不允许的。 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci通过sysfs访问原有资源 9662306a36Sopenharmony_ci--------------------- 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci如果底层平台支持的话,传统的I/O端口和ISA内存资源也会在sysfs中提供。它们位于PCI类的层次结构 9962306a36Sopenharmony_ci中,例如:: 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci /sys/class/pci_bus/0000:17/ 10262306a36Sopenharmony_ci |-- bridge -> ../../../devices/pci0000:17 10362306a36Sopenharmony_ci |-- cpuaffinity 10462306a36Sopenharmony_ci |-- legacy_io 10562306a36Sopenharmony_ci `-- legacy_mem 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cilegacy_io文件是一个读/写文件,可以被应用程序用来做传统的端口I/O。应用程序应该打开该文件,寻 10862306a36Sopenharmony_ci找所需的端口(例如0x3e8),并进行1、2或4字节的读或写。legacy_mem文件应该被mmapped,其偏移 10962306a36Sopenharmony_ci量与所需的内存偏移量相对应,例如0xa0000用于VGA帧缓冲器。然后,应用程序可以简单地解除引用返回 11062306a36Sopenharmony_ci的指针(当然是在检查了错误之后)来访问遗留内存空间。 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci支持新平台上的PCI访问 11362306a36Sopenharmony_ci--------------------- 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci为了支持上述的PCI资源映射,Linux平台代码最好定义ARCH_GENERIC_PCI_MMAP_RESOURCE并使用该 11662306a36Sopenharmony_ci功能的通用实现。为了支持通过/proc/bus/pci中的文件实现mmap()的历史接口,平台也可以设置 11762306a36Sopenharmony_ciHAVE_PCI_MMAP。 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci另外,设置了 HAVE_PCI_MMAP 的平台可以提供他们自己的 pci_mmap_page_range() 实现,而不是定 12062306a36Sopenharmony_ci义 ARCH_GENERIC_PCI_MMAP_RESOURCE。 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci支持PCI资源的写组合映射的平台必须定义arch_can_pci_mmap_wc(),当写组合被允许时,在运行时应 12362306a36Sopenharmony_ci评估为非零。支持I/O资源映射的平台同样定义arch_can_pci_mmap_io()。 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci遗留资源由HAVE_PCI_LEGACY定义保护。希望支持遗留功能的平台应该定义它并提供 pci_legacy_read, 12662306a36Sopenharmony_cipci_legacy_write 和 pci_mmap_legacy_page_range 函数。 127