pci_bus_read_config_dword实现说明
来源:互联网 发布:blending 算法 编辑:程序博客网 时间:2024/06/09 15:02
在学习linux 内核启动pci总线枚举的过程中,发现跟踪到底层扫描总线上每个设备,是通过读取每个设备的vendor id来确定设备的有无,在这里遇到了一个问题,就是函数pci_bus_read_config_dword没有找到实现,只是找到了EXPORT_SYMBOL(pci_bus_read_config_dword),没有具体的实现,仔细看了一下access.c文件才发现这个问题所在,先贴出代码:
#define PCI_byte_BAD 0
#define PCI_word_BAD (pos & 1)
#define PCI_dword_BAD (pos & 3)
#define PCI_OP_READ(size,type,len) \
int pci_bus_read_config_##size \
(struct pci_bus *bus, unsigned int devfn, int pos, type *value) \
{ \
int res; \
unsigned long flags; \
u32 data = 0; \
if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \
spin_lock_irqsave(&pci_lock, flags); \
res = bus->ops->read(bus, devfn, pos, len, &data); \
*value = (type)data; \
spin_unlock_irqrestore(&pci_lock, flags); \
return res; \
}
#define PCI_OP_WRITE(size,type,len) \
int pci_bus_write_config_##size \
(struct pci_bus *bus, unsigned int devfn, int pos, type value) \
{ \
int res; \
unsigned long flags; \
if (PCI_##size##_BAD) return PCIBIOS_BAD_REGISTER_NUMBER; \
spin_lock_irqsave(&pci_lock, flags); \
res = bus->ops->write(bus, devfn, pos, len, value); \
spin_unlock_irqrestore(&pci_lock, flags); \
return res; \
}
PCI_OP_READ(byte, u8, 1)
PCI_OP_READ(word, u16, 2)
PCI_OP_READ(dword, u32, 4)
PCI_OP_WRITE(byte, u8, 1)
PCI_OP_WRITE(word, u16, 2)
PCI_OP_WRITE(dword, u32, 4)
EXPORT_SYMBOL(pci_bus_read_config_byte);
EXPORT_SYMBOL(pci_bus_read_config_word);
EXPORT_SYMBOL(pci_bus_read_config_dword);
EXPORT_SYMBOL(pci_bus_write_config_byte);
EXPORT_SYMBOL(pci_bus_write_config_word);
EXPORT_SYMBOL(pci_bus_write_config_dword);
看PCI_OP_READ宏定义,##是宏定义中用来字符串替换的,也就是将宏定义穿进来的参数字符串原封不动替换。
这样的话也酒有了相应的函数pci_bus_read_config_byte/word/dword...
- pci_bus_read_config_dword实现说明
- eglSwapBuffers接口实现说明
- 虚函数实现说明
- VC++实现不规则窗口说明
- VC++实现不规则窗口说明
- 配置实现-业务类说明
- UITableView 实现方法详细说明
- 代理实现说明(步骤)
- Android Flowlayout实现的说明
- Java 内部类实现说明
- iOS实现地图标注说明
- Sharepoint技术实现——分类说明
- red5服务器实现远程会议说明
- ftp ALG 功能实现的概要说明
- QtSipPrivateBranchExchange (QSPBX)SIP代理服务器的实现说明
- FTP ALG 功能实现的概要说明
- 继承的映射实现以及说明
- uCOS-II移植要实现函数说明
- java发送邮件
- 谷歌Q3推Android本 蚕食自己平板市场
- 异步非阻塞套接字Winsock开发网络通信程序的经典入门
- 基于stm32f103zet6的FAT16文件系统学习1(初识FAT16)
- POJ-2649-Factovisors
- pci_bus_read_config_dword实现说明
- 利用EBNF生成Syntax/Railroad Diagram
- NativeActivity工程编译及运行
- 360手机卫士的建议
- vs的【warning C4996:'fopen': This function or variable may be unsafe】解决方案
- 网赚培训:先赚钱后收费的骗局
- 360搜索的建议
- 第六周上机任务(改错一)
- py 编译成 pyc pyo