📄 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 <linux/mod_devicetable.h>/* Include the pci register defines */#include <linux/pci_regs.h>/* Include the ID list */#include <linux/pci_ids.h>/* * 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/types.h>#include <linux/config.h>#include <linux/ioport.h>#include <linux/list.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_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 */ 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. */ 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 */ u32 saved_config_space[16]; /* config space saved at suspend time */ 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)/* * 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 */ unsigned short pad2; 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);};struct pci_raw_ops { int (*read)(unsigned int domain, unsigned int bus, unsigned int devfn, int reg, int len, u32 *val); int (*write)(unsigned int domain, unsigned int bus, unsigned int devfn, int reg, int len, u32 val);};extern struct pci_raw_ops *raw_pci_ops;struct pci_bus_region { unsigned long start; unsigned long end;};struct pci_dynids { spinlock_t lock; /* protects list, index */ struct list_head list; /* for IDs added at runtime */ unsigned int use_driver_data:1; /* pci_driver->driver_data is used */};struct module;struct pci_driver { struct list_head node; char *name; struct module *owner; const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */ int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */ void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */ int (*suspend) (struct pci_dev *dev, pm_message_t state); /* Device suspended */ int (*resume) (struct pci_dev *dev); /* Device woken up */ int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable); /* Enable wake event */ void (*shutdown) (struct pci_dev *dev); struct device_driver driver; struct pci_dynids dynids;};#define to_pci_driver(drv) container_of(drv,struct pci_driver, driver)/** * PCI_DEVICE - macro used to describe a specific pci device * @vend: the 16 bit PCI Vendor ID * @dev: the 16 bit PCI Device ID * * This macro is used to create a struct pci_device_id that matches a * specific device. The subvendor and subdevice fields will be set to * PCI_ANY_ID. */#define PCI_DEVICE(vend,dev) \ .vendor = (vend), .device = (dev), \ .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID/** * PCI_DEVICE_CLASS - macro used to describe a specific pci device class * @dev_class: the class, subclass, prog-if triple for this device * @dev_class_mask: the class mask for this device * * This macro is used to create a struct pci_device_id that matches a * specific PCI class. The vendor, device, subvendor, and subdevice * fields will be set to PCI_ANY_ID. */#define PCI_DEVICE_CLASS(dev_class,dev_class_mask) \ .class = (dev_class), .class_mask = (dev_class_mask), \ .vendor = PCI_ANY_ID, .device = PCI_ANY_ID, \ .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID/* * pci_module_init is obsolete, this stays here till we fix up all usages of it * in the tree. */#define pci_module_init pci_register_driver/* these external functions are only available when PCI support is enabled */#ifdef CONFIG_PCIextern struct bus_type pci_bus_type;/* Do NOT directly access these two variables, unless you are arch specific pci * code, or pci core code. */extern struct list_head pci_root_buses; /* list of all known PCI buses */extern struct list_head pci_devices; /* list of all devices */void pcibios_fixup_bus(struct pci_bus *);int pcibios_enable_device(struct pci_dev *, int mask);char *pcibios_setup (char *str);/* Used only when drivers/pci/setup.c is used */void pcibios_align_resource(void *, struct resource *, unsigned long, unsigned long);void pcibios_update_irq(struct pci_dev *, int irq);/* Generic PCI functions used internally */extern struct pci_bus *pci_find_bus(int domain, int busnr);void pci_bus_add_devices(struct pci_bus *bus);struct pci_bus *pci_scan_bus_parented(struct device *parent, int bus, struct pci_ops *ops, void *sysdata);static inline struct pci_bus *pci_scan_bus(int bus, struct pci_ops *ops, void *sysdata){ struct pci_bus *root_bus; root_bus = pci_scan_bus_parented(NULL, bus, ops, sysdata); if (root_bus) pci_bus_add_devices(root_bus); return root_bus;}struct pci_bus *pci_create_bus(struct device *parent, int bus, struct pci_ops *ops, void *sysdata);struct pci_bus * pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr);int pci_scan_slot(struct pci_bus *bus, int devfn);struct pci_dev * pci_scan_single_device(struct pci_bus *bus, int devfn);void pci_device_add(struct pci_dev *dev, struct pci_bus *bus);unsigned int pci_scan_child_bus(struct pci_bus *bus);void pci_bus_add_device(struct pci_dev *dev);void pci_read_bridge_bases(struct pci_bus *child);struct resource *pci_find_parent_resource(const struct pci_dev *dev, struct resource *res);int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge);extern struct pci_dev *pci_dev_get(struct pci_dev *dev);extern void pci_dev_put(struct pci_dev *dev);extern void pci_remove_bus(struct pci_bus *b);extern void pci_remove_bus_device(struct pci_dev *dev);void pci_setup_cardbus(struct pci_bus *bus);/* Generic PCI functions exported to card drivers */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -