📄 pci.h
字号:
/* * pci.h * * PCI defines and function prototypes * Copyright 1994, Drew Eckhardt * Copyright 1997--1999 Martin Mares <mj@ucw.cz> * * For more information, please consult the following manuals (look at * http://www.pcisig.com/ for how to get them): * * PCI BIOS Specification * PCI Local Bus Specification * PCI to PCI Bridge Specification * PCI System Design Guide */#ifndef LINUX_PCI_H#define LINUX_PCI_H/* Include the pci register defines */#include <linux/pci_regs.h>/* Include the ID list */#include <linux/pci_ids.h>#ifdef XEN#include <asm/processor.h>#endif/* * The PCI interface treats multi-function devices as independent * devices. The slot/function address of each device is encoded * in a single byte as follows: * * 7:3 = slot * 2:0 = function */#define PCI_DEVFN(slot,func) ((((slot) & 0x1f) << 3) | ((func) & 0x07))#define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f)#define PCI_FUNC(devfn) ((devfn) & 0x07)/* Ioctls for /proc/bus/pci/X/Y nodes. */#define PCIIOC_BASE ('P' << 24 | 'C' << 16 | 'I' << 8)#define PCIIOC_CONTROLLER (PCIIOC_BASE | 0x00) /* Get controller for PCI device. */#define PCIIOC_MMAP_IS_IO (PCIIOC_BASE | 0x01) /* Set mmap state to I/O space. */#define PCIIOC_MMAP_IS_MEM (PCIIOC_BASE | 0x02) /* Set mmap state to MEM space. */#define PCIIOC_WRITE_COMBINE (PCIIOC_BASE | 0x03) /* Enable/disable write-combining. */#ifdef __KERNEL__#include <linux/mod_devicetable.h>#include <linux/types.h>#include <linux/ioport.h>#include <linux/list.h>#include <linux/compiler.h>#include <linux/errno.h>#include <linux/device.h>/* File state for mmap()s on /proc/bus/pci/X/Y */enum pci_mmap_state { pci_mmap_io, pci_mmap_mem};/* This defines the direction arg to the DMA mapping routines. */#define PCI_DMA_BIDIRECTIONAL 0#define PCI_DMA_TODEVICE 1#define PCI_DMA_FROMDEVICE 2#define PCI_DMA_NONE 3#define DEVICE_COUNT_COMPATIBLE 4#define DEVICE_COUNT_RESOURCE 12typedef int __bitwise pci_power_t;#define PCI_D0 ((pci_power_t __force) 0)#define PCI_D1 ((pci_power_t __force) 1)#define PCI_D2 ((pci_power_t __force) 2)#define PCI_D3hot ((pci_power_t __force) 3)#define PCI_D3cold ((pci_power_t __force) 4)#define PCI_UNKNOWN ((pci_power_t __force) 5)#define PCI_POWER_ERROR ((pci_power_t __force) -1)/** The pci_channel state describes connectivity between the CPU and * the pci device. If some PCI bus between here and the pci device * has crashed or locked up, this info is reflected here. */typedef unsigned int __bitwise pci_channel_state_t;enum pci_channel_state { /* I/O channel is in normal state */ pci_channel_io_normal = (__force pci_channel_state_t) 1, /* I/O to channel is blocked */ pci_channel_io_frozen = (__force pci_channel_state_t) 2, /* PCI card is dead */ pci_channel_io_perm_failure = (__force pci_channel_state_t) 3,};typedef unsigned short __bitwise pci_bus_flags_t;enum pci_bus_flags { PCI_BUS_FLAGS_NO_MSI = (__force pci_bus_flags_t) 1,};struct pci_cap_saved_state { struct hlist_node next; char cap_nr; u32 data[0];};/* * The pci_dev structure is used to describe PCI devices. */struct pci_dev { struct list_head global_list; /* node in list of all PCI devices */ 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 */ unsigned int devfn; /* encoded device & function index */ unsigned short vendor; unsigned short device; unsigned short subsystem_vendor; unsigned short subsystem_device; unsigned int class; /* 3 bytes: (base,sub,prog-if) */ u8 hdr_type; /* PCI header type (`multi' flag masked out) */ 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. */ pci_power_t current_state; /* Current operating state. In ACPI-speak, this is D0-D3, D0 being fully functional, and D3 being off. */ pci_channel_state_t error_state; /* current connectivity state */ struct device dev; /* Generic device interface */ /* device is compatible with these IDs */ unsigned short vendor_compatible[DEVICE_COUNT_COMPATIBLE]; unsigned short device_compatible[DEVICE_COUNT_COMPATIBLE]; int cfg_size; /* Size of configuration space */ /* * Instead of touching interrupt line and base address registers * directly, use the values stored here. They might be different! */ unsigned int irq; struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */ /* These fields are used by common fixups */ unsigned int transparent:1; /* Transparent PCI bridge */ unsigned int multifunction:1;/* Part of multi-function device */ /* keep track of device state */ unsigned int is_enabled:1; /* pci_enable_device has been called */ unsigned int is_busmaster:1; /* device is busmaster */ unsigned int no_msi:1; /* device may not use msi */ unsigned int no_d1d2:1; /* only allow d0 or d3 */ unsigned int block_ucfg_access:1; /* userspace config space access is blocked */ unsigned int broken_parity_status:1; /* Device generates false positive parity */ unsigned int msi_enabled:1; unsigned int msix_enabled:1; 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 */};#define pci_dev_g(n) list_entry(n, struct pci_dev, global_list)#define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list)#define to_pci_dev(n) container_of(n, struct pci_dev, dev)#define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL)static inline struct pci_cap_saved_state *pci_find_saved_cap( struct pci_dev *pci_dev,char cap){ struct pci_cap_saved_state *tmp; struct hlist_node *pos; hlist_for_each_entry(tmp, pos, &pci_dev->saved_cap_space, next) { if (tmp->cap_nr == cap) return tmp; } return NULL;}static inline void pci_add_saved_cap(struct pci_dev *pci_dev, struct pci_cap_saved_state *new_cap){ hlist_add_head(&new_cap->next, &pci_dev->saved_cap_space);}static inline void pci_remove_saved_cap(struct pci_cap_saved_state *cap){ hlist_del(&cap->next);}/* * For PCI devices, the region numbers are assigned this way: * * 0-5 standard PCI regions * 6 expansion ROM * 7-10 bridges: address space assigned to buses behind the bridge */#define PCI_ROM_RESOURCE 6#define PCI_BRIDGE_RESOURCES 7#define PCI_NUM_RESOURCES 11#ifndef PCI_BUS_NUM_RESOURCES#define PCI_BUS_NUM_RESOURCES 8#endif#define PCI_REGION_FLAG_MASK 0x0fU /* These bits of resource flags tell us the PCI region flags */struct pci_bus { struct list_head node; /* node in list of buses */ struct pci_bus *parent; /* parent bus this bridge is on */ struct list_head children; /* list of child buses */ struct list_head devices; /* list of devices on this bus */ struct pci_dev *self; /* bridge device as seen by parent */ struct resource *resource[PCI_BUS_NUM_RESOURCES]; /* address space routed to this bus */ struct pci_ops *ops; /* configuration access functions */ void *sysdata; /* hook for sys-specific extension */ struct proc_dir_entry *procdir; /* directory entry in /proc/bus/pci */ unsigned char number; /* bus number */ unsigned char primary; /* number of primary bridge */ unsigned char secondary; /* number of secondary bridge */ unsigned char subordinate; /* max number of subordinate buses */ char name[48]; unsigned short bridge_ctl; /* manage NO_ISA/FBB/et al behaviors */ pci_bus_flags_t bus_flags; /* Inherited by child busses */ struct device *bridge; struct class_device class_dev; struct bin_attribute *legacy_io; /* legacy I/O for this bus */ struct bin_attribute *legacy_mem; /* legacy mem */};#define pci_bus_b(n) list_entry(n, struct pci_bus, node)#define to_pci_bus(n) container_of(n, struct pci_bus, class_dev)/* * Error values that may be returned by PCI functions. */#define PCIBIOS_SUCCESSFUL 0x00#define PCIBIOS_FUNC_NOT_SUPPORTED 0x81#define PCIBIOS_BAD_VENDOR_ID 0x83#define PCIBIOS_DEVICE_NOT_FOUND 0x86#define PCIBIOS_BAD_REGISTER_NUMBER 0x87#define PCIBIOS_SET_FAILED 0x88#define PCIBIOS_BUFFER_TOO_SMALL 0x89/* Low-level architecture-dependent routines */struct pci_ops { int (*read)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *val); int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -