linux驱动- PCI-E设备驱动-PCIE设备结构体

时间:2022-06-27 17:58:43
/*
* The pci_dev structure is used to describe PCI devices.
*/
struct pci_dev {
struct list_head bus_list;/* node in per-bus list */
struct pci_bus *bus;/* bus this device is on */
struct pci_bus *subordinate;/* bus this device bridges to */

void*sysdata;/* hook for sys-specific extension */
struct proc_dir_entry *procent;/* device entry in /proc/bus/pci */
struct pci_slot *slot;/* Physical slot this device is in */

unsignedint devfn;
/* encoded device & function index */
unsignedshort vendor;
unsignedshort device;
unsignedshort subsystem_vendor;
unsignedshort subsystem_device;
unsignedintclass;
/* 3 bytes: (base,sub,prog-if) */
u8 revision;
/* PCI revision, low byte of class word */
u8 hdr_type;
/* PCI header type (`multi' flag masked out) */
u8 pcie_cap;
/* PCI-E capability offset */
u8 pcie_type;
/* PCI-E device/port type */
u8 rom_base_reg;
/* which config register controls the ROM */
u8 pin;
/* which interrupt pin this device uses */

struct pci_driver *driver;/* which driver has allocated this device */
u64 dma_mask;
/* Mask of the bits of bus address this
device implements. Normally this is
0xffffffff. You only need to change
this if your device has broken DMA
or supports 64-bit transfers.
*/

struct device_dma_parameters dma_parms;

pci_power_t current_state;
/* Current operating state. In ACPI-speak,
this is D0-D3, D0 being fully functional,
and D3 being off.
*/
int pm_cap;/* PM capability offset in the
configuration space
*/
unsignedint pme_support:
5;/* Bitmask of states from which PME#
can be generated
*/
unsignedint pme_interrupt:
1;
unsignedint d1_support:
1;/* Low power state D1 is supported */
unsignedint d2_support:
1;/* Low power state D2 is supported */
unsignedint no_d1d2:
1;/* Only allow D0 and D3 */
unsignedint mmio_always_on:
1;/* disallow turning off io/mem
decoding during bar sizing
*/
unsignedint wakeup_prepared:
1;
unsignedint d3_delay;
/* D3->D0 transition time in ms */

#ifdef CONFIG_PCIEASPM
struct pcie_link_state *link_state;/* ASPM link state. */
#endif

pci_channel_state_t error_state;
/* current connectivity state */
struct device dev;/* Generic device interface */

int cfg_size;/* Size of configuration space */

/*
* Instead of touching interrupt line and base address registers  使用储存在irq的值取代直接接触中断线和基地址寄存器。
* directly, use the values stored here. They might be different!
*/
unsignedint irq;
struct resource resource[DEVICE_COUNT_RESOURCE];/* I/O and memory regions + expansion ROMs */
resource_size_t fw_addr[DEVICE_COUNT_RESOURCE];
/* FW-assigned addr */

/* These fields are used by common fixups */
unsignedint transparent:
1;/* Transparent PCI bridge */
unsignedint multifunction:
1;/* Part of multi-function device */
/* keep track of device state */
unsignedint is_added:
1;
unsignedint is_busmaster:
1;/* device is busmaster */
unsignedint no_msi:
1;/* device may not use msi */
unsignedint block_ucfg_access:
1;/* userspace config space access is blocked */
unsignedint broken_parity_status:
1;/* Device generates false positive parity */
unsignedint irq_reroute_variant:
2;/* device needs IRQ rerouting variant */
unsignedint msi_enabled:
1;
unsignedint msix_enabled:
1;
unsignedint ari_enabled:
1;/* ARI forwarding */
unsignedint is_managed:
1;
unsignedint is_pcie:
1;/* Obsolete. Will be removed.
Use pci_is_pcie() instead
*/
unsignedint needs_freset:
1;/* Dev requires fundamental reset */
unsignedint state_saved:
1;
unsignedint is_physfn:
1;
unsignedint is_virtfn:
1;
unsignedint reset_fn:
1;
unsignedint is_hotplug_bridge:
1;
unsignedint __aer_firmware_first_valid:
1;
unsignedint __aer_firmware_first:
1;
pci_dev_flags_t dev_flags;
atomic_t enable_cnt;
/* pci_enable_device has been called */

u32 saved_config_space[
16];/* config space saved at suspend time */
struct hlist_head saved_cap_space;
struct bin_attribute *rom_attr;/* attribute descriptor for sysfs ROM entry */
int rom_attr_enabled;/* has display of the rom attribute been enabled? */
struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE];/* sysfs file for resources */
struct bin_attribute *res_attr_wc[DEVICE_COUNT_RESOURCE];/* sysfs file for WC mapping of resources */
#ifdef CONFIG_PCI_MSI
struct list_head msi_list;
#endif
struct pci_vpd *vpd;
#ifdef CONFIG_PCI_IOV
union{
struct pci_sriov *sriov;/* SR-IOV capability related */
struct pci_dev *physfn;/* the PF this VF is associated with */
};
struct pci_ats *ats;/* Address Translation Service */
#endif
};