1 .. SPDX-License-Identifier: GPL-2.0 2 .. include:: <isonum.txt> 3 .. include:: ../disclaimer-zh_CN.rst 4 5 :Original: Documentation/PCI/pciebus-howto.rst 6 7 :翻译: 8 9 司延腾 Yanteng Si <siyanteng@loongson.cn> 10 11 :校译: 12 13 14 15 .. _cn_pciebus-howto: 16 17 =========================== 18 PCI Express端口总线驱动指南 19 =========================== 20 21 :作者: Tom L Nguyen tom.l.nguyen@intel.com 1 22 :版权: |copy| 2004 Intel Corporation 23 24 关于本指南 25 ========== 26 27 本指南介绍了PCI Express端口总线驱 28 动程序在PCI Express端口总线驱动程 29 30 31 什么是PCI Express端口总线驱动程序 32 ================================= 33 34 一个PCI Express端口是一个逻辑的PCI-P 35 口:根端口和交换端口。根端口从P 36 交换端口将PCI Express链接连接到内 37 交换机的内部路由逻辑,被称为交 38 路由总线桥接到代表来自PCI Express 39 40 一个PCI Express端口可以提供多达四 41 其端口类型。PCI Express端口的服务 42 高级错误报告支持(AER)和虚拟通 43 处理,也可以单独分布并由相应的 44 45 为什么要使用PCI Express端口总线驱 46 ========================================= 47 48 在现有的Linux内核中,Linux设备驱动 49 PCI Express端口是一个具有多个不同 50 单的解决方案,每个服务都可以有 51 竞争一个PCI-PCI桥设备。例如,如果 52 首先被加载,它就会要求一个PCI-PCI 53 务驱动。换句话说,使用当前的驱 54 PCI-PCI桥设备上。 55 56 为了使多个服务驱动程序同时运行 57 理所有填充的PCI Express端口,并根 58 驱动程序。下面列出了使用PCI Expres 59 60 - 允许在一个PCI-PCI桥接端口设备 61 62 - 允许以独立的分阶段方式实施服 63 64 - 允许一个服务驱动程序在多个PCI 65 66 - 管理和分配PCI-PCI桥接端口设备 67 68 配置PCI Express端口总线驱动程序与 69 ============================================= 70 71 将PCI Express端口总线驱动支持纳入 72 ------------------------------------- 73 74 包括PCI Express端口总线驱动程序取 75 中的PCI Express支持被启用时,内核 76 驱动程序。 77 78 启用服务驱动支持 79 ---------------- 80 81 PCI设备驱动是基于Linux设备驱动模 82 一旦内核加载了PCI Express端口总线 83 足PCI Express端口总线驱动程序模型 84 对现有的服务驱动程序的功能没有 85 86 服务驱动程序需要使用下面所示的 87 序中(见第5.2.1和5.2.2节)。在调用 88 /include/linux/pcieport_if.h中的pcie_port_se 89 样做,将导致身份不匹配,从而使P 90 91 pcie_port_service_register 92 ~~~~~~~~~~~~~~~~~~~~~~~~~~ 93 :: 94 95 int pcie_port_service_register(struct pcie_p 96 97 这个API取代了Linux驱动模型的 pci_reg 98 块启动时调用 pcie_port_service_register 99 pci_enable_device(dev) 和 pci_set_master(dev) 100 PCI端口总线驱动执行。 101 102 pcie_port_service_unregister 103 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 104 :: 105 106 void pcie_port_service_unregister(struct pci 107 108 pcie_port_service_unregister取代了Linux驱 109 个模块退出时,它总是被服务驱动 110 111 示例代码 112 ~~~~~~~~ 113 114 下面是服务驱动代码示例,用于初 115 :: 116 117 static struct pcie_port_service_id service_i 118 .vendor = PCI_ANY_ID, 119 .device = PCI_ANY_ID, 120 .port_type = PCIE_RC_PORT, 121 .service_type = PCIE_PORT_SERVICE_AER, 122 }, { /* end: all zeroes */ } 123 }; 124 125 static struct pcie_port_service_driver root_ 126 .name = (char *)device_name, 127 .id_table = service_id, 128 129 .probe = aerdrv_load, 130 .remove = aerdrv_unload, 131 132 .suspend = aerdrv_suspend, 133 .resume = aerdrv_resume, 134 }; 135 136 下面是一个注册/取消注册服务驱动 137 :: 138 139 static int __init aerdrv_service_init(void) 140 { 141 int retval = 0; 142 143 retval = pcie_port_service_register(&root_ 144 if (!retval) { 145 /* 146 * FIX ME 147 */ 148 } 149 return retval; 150 } 151 152 static void __exit aerdrv_service_exit(void) 153 { 154 pcie_port_service_unregister(&root_aerdrv) 155 } 156 157 module_init(aerdrv_service_init); 158 module_exit(aerdrv_service_exit); 159 160 可能的资源冲突 161 ============== 162 163 由于PCI-PCI桥接端口设备的所有服务 164 建议的解决方案。 165 166 MSI 和 MSI-X 向量资源 167 --------------------- 168 169 一旦设备上的MSI或MSI-X中断被启用 170 一个PCI-PCI桥接端口的服务驱动程序 171 禁用MSI/MSI-X模式,可能会导致不可 172 173 为了避免这种情况,所有的服务驱 174 总线驱动程序负责确定中断模式, 175 分配给结构体pcie_device的字段irq的 176 个服务驱动程序时,它被传入。服 177 request_irq/free_irq。此外,中断模式 178 字段中。 179 180 PCI内存/IO映射的区域 181 -------------------- 182 183 PCI Express电源管理(PME)、高级错 184 驱动程序访问PCI Express端口的PCI配 185 个补丁假定所有的服务驱动程序都 186 187 PCI配置寄存器 188 ------------- 189 190 每个服务驱动都在自己的功能结构 191 寄存器和设备控制寄存器是在PME和A 192 覆盖其他服务驱动的配置设置。
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.