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

📄 pci.h

📁 xen 3.2.2 源码
💻 H
📖 第 1 页 / 共 3 页
字号:
/* *	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 + -