⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pci.h

📁 此工具是arm-linux-GCC交叉编译工具(cross-3.4.4)
💻 H
📖 第 1 页 / 共 2 页
字号:
/* *	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 + -