我正在使用通过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
答案 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,那么您就是好的。