Linux PCI设备(64位)配置内存访问

Linux PCI设备(64位)配置内存访问,linux,linux-device-driver,pci,Linux,Linux Device Driver,Pci,我使用的是通过PCI连接的64位FPGA。我正在使用下一个函数: unsigned long pci_resource_[start|len|end|flags](struct pci_dev *pdev, int bar); 但是,我没有得到正确的结果,因为这些函数用于32位PCI设备 还有其他64位的函数吗?你可以看到我从lspci得到的信息 0002:01:00.0 Memory controller: Xilinx Corporation Device 7022 Subsys

我使用的是通过PCI连接的64位FPGA。我正在使用下一个函数:

unsigned long pci_resource_[start|len|end|flags](struct pci_dev *pdev, int bar); 
但是,我没有得到正确的结果,因为这些函数用于32位PCI设备

还有其他64位的函数吗?你可以看到我从lspci得到的信息

0002:01:00.0 Memory controller: Xilinx Corporation Device 7022
    Subsystem: Xilinx Corporation Device 0007
    Flags: bus master, fast devsel, latency 0
    Memory at <ignored> (64-bit, prefetchable)
    Memory at c40000000 (64-bit, prefetchable) [size=64K]
    Capabilities: [40] Power Management version 3
    Capabilities: [48] MSI: Enable- Count=1/8 Maskable- 64bit+
    Capabilities: [60] Express Endpoint, MSI 00
    Capabilities: [100] Device Serial Number 00-00-00-00-00-00-00-00
0002:01:00.0内存控制器:Xilinx公司设备7022
子系统:Xilinx公司设备0007
标志:总线主控、快速devsel、延迟0
内存位于(64位,可预取)
c40000000处的内存(64位,可预取)[大小=64K]
功能:[40]电源管理版本3
功能:[48]MSI:启用-计数=1/8可屏蔽-64位+
功能:[60]快速端点,MSI 00
功能:[100]设备序列号00-00-00-00-00-00-00-00

我不确定你说的是哪个Linux版本。但在当前的Linux树(4.5)中,pci_资源_启动定义为:

#define pci_resource_start(dev, bar)    ((dev)->resource[(bar)].start)
并且嵌入结构是

/* Linux/include/linux/pci.h */
struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */

/* Linux/include/linux/ioport.h */
struct resource {
    resource_size_t start;
    resource_size_t end;
    const char *name;
    unsigned long flags;
    struct resource *parent, *sibling, *child;
};

/* Linux/include/linux/types.h */
typedef phys_addr_t resource_size_t;

/* Linux/include/linux/types.h */
#ifdef CONFIG_PHYS_ADDR_T_64BIT
typedef u64 phys_addr_t;
#else
typedef u32 phys_addr_t;
#endif

因此,如果您使用的是64位系统,并且Linux是使用CONFIG\u PHYS\u ADDR\u T\u 64位编译的,那么您就很好了。

非常感谢您的回答。我使用的是内核版本3.16。如果我有下两个PCI设备,会发生什么;一个有32位内存,另一个有64位:c20100000(32位,可预取)[size=1M]c40000000(64位,可预取)[size=64K]@manolotunez我没有使用32位设备的经验。实际上,我很惊讶地看到32位资源映射到4GB之外。