没有合适的资源?快使用搜索试试~ 我知道了~
首页linux PCIE架构详解
资源详情
资源评论
资源推荐
linux
驱动结构
pci
Linux 设计了一个通用的数据结构 resource 来描述各种 I/O 资源(如:I/O 端口、外设内存、
DMA 和 IRQ 等)。
该结构定义在 include/linux/ioport.h 头文件中:
struct resource {
const char *name;
unsigned long start, end; \表示资源的起始物理地址和终止物理地址。它们确定了资源
的范围,也即是一个闭区间[start,end]
unsigned long flags; \描述资源的标志
struct resource *parent, *sibling, *child; \分别指向父、兄弟、子资源的指针
};
Linux 是以一种倒置的树形结构来管理每一类 I/O 资源(如:I/O 端口、外设内存、DMA
和 IRQ)的。每一类 I/O 资源都对应有一颗倒置的资源树,树中的每一个节点都是一个
resource 结构,而树的根结点 root 则描述了该类资源的整个资源空间。为什么使用树?例
如,考虑一下 IDE 硬盘接口所使用的 I/O 端口地址-比如说从 0xf000 到 0xf00f。那么,
start 字段为 0xf000 且 end 字段为 0xf00f 的这样一个资源包含在树中,控制器的常规名字存
放在 name 字段中。但是,IDE 设备驱动程序需要记住另外的信息,也就是 IDE 链主盘使用
0xf000 到 0xf007 的子范围,从盘使用 0xf008 到 0xf00f 的子范围。为了做到这点,设备驱
动程序把两个子范围对应的孩子插入到从 0xf000 到 0xf00f 的整个范围对应的资源下。一般
来说,树中的每个节点肯定相当于父节点对应范围的一个子范围。 I/O 端口资源树
(ioport_resource)的根节点跨越了整个 I/O 地址空间(从端口 0 到 65535,即 64K)。
更详细可以参考:
每种类的 PCI 设备都可以用结构类型 pci_dev 来描述。更为准确地说,应该是每一个 PCI 功
能,即 PCI 逻辑设备都唯一地对应有一个 pci_dev 设备描述符。该数据结构的定义如下
(include/linux/pci.h):
struct pci_dev {
struct list_head global_list;
/* 全局链表元素 global_list:每一个 pci_dev 结构都通过该成员连接到全局 pci 设备链表
pci_devices 中*/
struct list_head bus_list;
/* 总线设备链表元素 bus_list:每一个 pci_dev 结构除了链接到全局设备链表中外,还会通
过这个成员连接到其所属 PCI 总线的设备链表中。每一条 PCI 总线都维护一条它自己的设
备链表视图,以便描述所有连接在该 PCI 总线上的设备,其表头由 PCI 总线的 pci_bus 结构
中的 devices 成员所描述 t*/
struct pci_bus *bus;
/* 总线指针 bus:指向这个 PCI 设备所在的 PCI 总线的 pci_bus 结构。因此,对于桥设备而
言,bus 指针将指向桥设备的主总线(primary bus),也即指向桥设备所在的 PCI 总线*/
struct pci_bus *subordinate;
/* 指针 subordinate:指向这个 PCI 设备所桥接的下级总线。这个指针成员仅对桥设备才有
意义,而对于一般的非桥 PCI 设备而言,该指针成员总是为 NULL*/
void *sysdata;
/* 无类型指针 sysdata:指向一片特定于系统的扩展数据*/
struct proc_dir_entry *procent;
/* 指针 procent:指向该 PCI 设备在/proc 文件系统中对应的目录项*/
unsigned int devfn;
/* devfn:这个 PCI 设备的设备功能号,也成为 PCI 逻辑设备号(0-255)。其中 bit[7:3]
是物理设备号(取值范围 0-31), bit[2:0]是功能号(取值范围 0-7)。 */
unsigned short vendor;
/* vendor:这是一个 16 无符号整数,表示 PCI 设备的厂商 ID*/
unsigned short device;
/*device:这是一个 16 无符号整数,表示 PCI 设备的设备 ID */
unsigned short subsystem_vendor;
/* subsystem_vendor:这是一个 16 无符号整数,表示 PCI 设备的子系统厂商 ID*/
unsigned short subsystem_device;
/* subsystem_device:这是一个 16 无符号整数,表示 PCI 设备的子系统设备 ID。*/
unsigned int class;
/* class:32 位的无符号整数,表示该 PCI 设备的类别,其中,bit[7:0]为编程接口,
bit[15:8]为子类别代码,bit [23:16]为基类别代码,bit[31:24]无意义。显然,
class 成员的低 3 字节刚好对应与 PCI 配置空间中的类代码*/
u8 hdr_type;
/* hdr_type:8 位符号整数,表示 PCI 配置空间头部的类型。其中,bit[7]=1 表示这是一
个多功能设备,bit[7]=0 表示这是一个单功能设备。Bit[6:0]则表示 PCI 配置空间头
部的布局类型,值 00h 表示这是一个一般 PCI 设备的配置空间头部,值 01h 表示这是一个
PCI-to-PCI 桥的配置空间头部,值 02h 表示 CardBus 桥的配置空间头部*/
u8 rom_base_reg;
/* rom_base_reg:8 位无符号整数,表示 PCI 配置空间中的 ROM 基地址寄存器在 PCI 配置
空间中的位置。ROM 基地址寄存器在不同类型的 PCI 配置空间头部的位置是不一样的,对
于 type 0 的配置空间布局,ROM 基地址寄存器的起始位置是 30h,而对于 PCI-to-PCI 桥所
用的 type 1 配置空间布局,ROM 基地址寄存器的起始位置是 38h*/
struct pci_driver *driver;
/* 指针 driver:指向这个 PCI 设备所对应的驱动程序定义的 pci_driver 结构。每一个 pci 设
备驱动程序都必须定义它自己的 pci_driver 结构来描述它自己。*/
u64 dma_mask;
/*dma_mask:用于 DMA 的总线地址掩码,一般来说,这个成员的值是 0xffffffff。数据类
型 dma_addr_t 定义在 include/asm/types.h 中,在 x86 平台上,dma_addr_t 类型就是 u32 类型
*/
pci_power_t current_state;
/* 当前操作状态 */
struct device dev;
/* 通用的设备接口*/
unsigned short vendor_compatible[DEVICE_COUNT_COMPATIBLE];
unsigned short device_compatible[DEVICE_COUNT_COMPATIBLE];
/*定义这个 PCI 设备与哪些设备相兼容!/
unsigned int irq;
/* 无符号的整数 irq:表示这个 PCI 设备通过哪根 IRQ 输入线产生中断,一般为 0-15 之间
的某个值 */
struct resource resource[DEVICE_COUNT_RESOURCE];
/*表示该设备可能用到的资源,包括:I/O 断口区域、设备内存地址区域以及扩展 ROM 地
址区域。*/
int cfg_size;
/* 配置空间的大小 */
unsigned int transparent:1;
/* 透明 PCI 桥 */
unsigned int multifunction:1;
/* 多功能设备*/
unsigned int is_enabled:1;
/* pci_enable_device 已经被调用*/
unsigned int is_busmaster:1;
/* 设备是主设备*/
unsigned int no_msi:1;
/* 设备不使用 msi*/
unsigned int block_ucfg_access:1;
/* 配置空间访问形式用块的形式 */
u32 saved_config_space[16];
/* 在挂起时保存配置空间*/
struct bin_attribute *rom_attr;
/* sysfs ROM 入口的属性描述*/
int rom_attr_enabled;
/* 能显示 rom 属性*/
struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE];
/* 资源的 sysfs 文件*/
};
struct pci_bus {
struct list_head node;
/* 链表元素 node:对于 PCI 根总线而言,其 pci_bus 结构通过 node 成员链接到本节一开始
所述的根总线链表中,根总线链表的表头由一个 list_head 类型的全局变量 pci_root_buses 所
描述。而对于非根 pci 总线,其 pci_bus 结构通过 node 成员链接到其父总线的子总线链表
children 中*/
struct pci_bus *parent;
/*parent 指针:指向该 pci 总线的父总线,即 pci 桥所在的那条总线*/
struct list_head children;
/*children 指针:描述了这条 PCI 总线的子总线链表的表头。这条 PCI 总线的所有子总线都
通过上述的 node 链表元素链接成一条子总线链表,而该链表的表头就由父总线的 children
指针所描述*/
struct list_head devices;
/* list of devices on this bus */
struct pci_dev *self;
/* devices 链表头:描述了这条 PCI 总线的逻辑设备链表的表头。除了链接在全局 PCI 设备
链表中之外,每一个 PCI 逻辑设备也通过其 pci_dev 结构中的 bus_list 成员链入其所在 PCI
总线的局部设备链表中,而这个局部的总线设备链表的表头就由 pci_bus 结构中的 devices
成员所描述*/
struct resource *resource[PCI_BUS_NUM_RESOURCES];
/* 资源指针数组:指向应路由到这条 pci 总线的地址空间资源,通常是指向对应桥设备的
pci_dev 结构中的资源数组 resource[10:7]*/
struct pci_ops *ops;
/* 指针 ops:指向一个 pci_ops 结构,表示这条 pci 总线所使用的配置空间访问函数*/
void *sysdata;
/* 无类型指针 sysdata:指向系统特定的扩展数据*/
struct proc_dir_entry *procdir;
/* 指针 procdir:指向该 PCI 总线在/proc 文件系统中对应的目录项*/
unsigned char number;
/* number:这条 PCI 总线的总线编号(bus number),取值范围 0-255 */
unsigned char primary;
/* primary:表示引出这条 PCI 总线的“桥设备的主总线”(也即桥设备所在的 PCI 总线)编
号,取值范围 0-255*/
unsigned char secondary;
/* secondary:表示引出这条 PCI 总线的桥设备的次总线号,因此 secondary 成员总是等于
number 成员的值。取值范围 0-255*/
unsigned char subordinate;
/* subordinate:这条 PCI 总线的下属 PCI 总线(Subordinate pci bus)的总线编号最大值,它
应该等于引出这条 PCI 总线的桥设备的 subordinate 值*/
char name[48];
/* name[48]:这条 PCI 总线的名字字符串*/
unsigned short bridge_ctl;
/**/
unsigned short pad2;
剩余49页未读,继续阅读
fwmao
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论30