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

时间:2016-04-21 14:36:29

标签: 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
    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

1 个答案:

答案 0 :(得分:1)

我不确定你在谈论哪个Linux版本。但在当前的Linux树(4.5)中,pci_resource_start定义为:

#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位系统,并使用CONFIG_PHYS_ADDR_T_64BIT编译Linux,那么您就是好的。