+#define PCI_DEVICE(devbase) (container_of((devbase), struct pci_device, dev))
+
+struct pci_device_list
+{
+ struct llist_header peers;
+ struct pci_device* pcidev;
+};
+
+typedef void* (*pci_drv_init)(struct pci_device*);
+
+#define PCI_DEVIDENT(vendor, id) \
+ ((((id) & 0xffff) << 16) | (((vendor) & 0xffff)))
+
+struct pci_device_def
+{
+ struct device_def devdef;
+
+ bool (*test_compatibility)(struct pci_device_def*, struct pci_device*);
+};
+#define pcidev_def(dev_def_ptr) \
+ container_of((dev_def_ptr), struct pci_device_def, devdef)
+
+#define binded_pcidev(pcidev) ((pcidev)->binding.def)
+
+/**
+ * @brief 根据类型代码(Class Code)去在拓扑中寻找一个设备
+ * 类型代码请参阅: PCI LB Spec. Appendix D.
+ *
+ * @return struct pci_device*
+ */
+struct pci_device* pci_get_device_by_class(u32_t class);
+
+/**
+ * @brief 根据设备商ID和设备ID,在拓扑中寻找一个设备
+ *
+ * @param vendorId
+ * @param deviceId
+ * @return struct pci_device*
+ */
+struct pci_device*
+pci_get_device_by_id(u16_t vendorId, u16_t deviceId);
+
+/**
+ * @brief 初始化PCI设备的基地址寄存器。返回由该基地址代表的,
+ * 设备所使用的MMIO或I/O地址空间的,大小。
+ * 参阅:PCI LB Spec. (Rev 3) Section 6.2.5.1, Implementation Note.
+ *
+ * @param dev The PCI device
+ * @param bar_out Value in BAR
+ * @param bar_num The index of BAR (starting from 1)
+ * @return size_t
+ */
+size_t
+pci_bar_sizing(struct pci_device* dev, u32_t* bar_out, u32_t bar_num);
+
+/**
+ * @brief Bind an abstract device instance to the pci device
+ *
+ * @param pcidev pci device
+ * @param devobj abstract device instance
+ */
+void
+pci_bind_instance(struct pci_device* pcidev, void* devobj);
+
+void
+pci_probe_bar_info(struct pci_device* device);
+
+void
+pci_setup_msi(struct pci_device* device, msi_vector_t msiv);
+
+void
+pci_probe_msi_info(struct pci_device* device);
+
+int
+pci_bind_definition(struct pci_device_def* pcidev_def, bool* more);