i2o.h

来自「Linux Kernel 2.6.9 for OMAP1710」· C头文件 代码 · 共 960 行 · 第 1/2 页

H
960
字号
/* * I2O kernel space accessible structures/APIs * * (c) Copyright 1999, 2000 Red Hat Software * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * ************************************************************************* * * This header file defined the I2O APIs/structures for use by * the I2O kernel modules. * */#ifndef _I2O_H#define _I2O_H#ifdef __KERNEL__		/* This file to be included by kernel only */#include <linux/i2o-dev.h>/* How many different OSM's are we allowing */#define I2O_MAX_DRIVERS		4#include <asm/io.h>#include <asm/semaphore.h>	/* Needed for MUTEX init macros */#include <linux/pci.h>#include <linux/dma-mapping.h>/* message queue empty */#define I2O_QUEUE_EMPTY		0xffffffff/* *	Message structures */struct i2o_message {	union {		struct {			u8 version_offset;			u8 flags;			u16 size;			u32 target_tid:12;			u32 init_tid:12;			u32 function:8;			u32 icntxt;	/* initiator context */			u32 tcntxt;	/* transaction context */		} s;		u32 head[4];	} u;	/* List follows */	u32 body[0];};/* *	Each I2O device entity has one of these. There is one per device. */struct i2o_device {	i2o_lct_entry lct_data;	/* Device LCT information */	struct i2o_controller *iop;	/* Controlling IOP */	struct list_head list;	/* node in IOP devices list */	struct device device;	struct semaphore lock;	/* device lock */	struct class_device classdev;	/* i2o device class */};/* *	Event structure provided to the event handling function */struct i2o_event {	struct work_struct work;	struct i2o_device *i2o_dev;	/* I2O device pointer from which the					   event reply was initiated */	u16 size;		/* Size of data in 32-bit words */	u32 tcntxt;		/* Transaction context used at				   registration */	u32 event_indicator;	/* Event indicator from reply */	u32 data[0];		/* Event data from reply */};/* *	I2O classes which could be handled by the OSM */struct i2o_class_id {	u16 class_id:12;};/* *	I2O driver structure for OSMs */struct i2o_driver {	char *name;		/* OSM name */	int context;		/* Low 8 bits of the transaction info */	struct i2o_class_id *classes;	/* I2O classes that this OSM handles */	/* Message reply handler */	int (*reply) (struct i2o_controller *, u32, struct i2o_message *);	/* Event handler */	void (*event) (struct i2o_event *);	struct workqueue_struct *event_queue;	/* Event queue */	struct device_driver driver;	/* notification of changes */	void (*notify_controller_add) (struct i2o_controller *);	void (*notify_controller_remove) (struct i2o_controller *);	void (*notify_device_add) (struct i2o_device *);	void (*notify_device_remove) (struct i2o_device *);	struct semaphore lock;};/* *	Contains all information which are necessary for DMA operations */struct i2o_dma {	void *virt;	dma_addr_t phys;	u32 len;};/* *	Context queue entry, used for 32-bit context on 64-bit systems */struct i2o_context_list_element {	struct list_head list;	u32 context;	void *ptr;	unsigned long timestamp;};/* * Each I2O controller has one of these objects */struct i2o_controller {	char name[16];	int unit;	int type;	struct pci_dev *pdev;	/* PCI device */	int short_req:1;	/* use small block sizes */	int no_quiesce:1;	/* dont quiesce before reset */	int raptor:1;		/* split bar */	int promise:1;		/* Promise controller */#ifdef CONFIG_MTRR	int mtrr_reg0;	int mtrr_reg1;#endif	struct list_head devices;	/* list of I2O devices */	struct notifier_block *event_notifer;	/* Events */	atomic_t users;	struct list_head list;	/* Controller list */	void *post_port;	/* Inbout port address */	void *reply_port;	/* Outbound port address */	void *irq_mask;		/* Interrupt register address */	/* Dynamic LCT related data */	struct i2o_dma status;	/* status of IOP */	struct i2o_dma hrt;	/* HW Resource Table */	i2o_lct *lct;		/* Logical Config Table */	struct i2o_dma dlct;	/* Temp LCT */	struct semaphore lct_lock;	/* Lock for LCT updates */	struct i2o_dma status_block;	/* IOP status block */	struct i2o_dma base;	/* controller messaging unit */	struct i2o_dma in_queue;	/* inbound message queue Host->IOP */	struct i2o_dma out_queue;	/* outbound message queue IOP->Host */	int battery:1;		/* Has a battery backup */	int io_alloc:1;		/* An I/O resource was allocated */	int mem_alloc:1;	/* A memory resource was allocated */	struct resource io_resource;	/* I/O resource allocated to the IOP */	struct resource mem_resource;	/* Mem resource allocated to the IOP */	struct proc_dir_entry *proc_entry;	/* /proc dir */	struct list_head bus_list;	/* list of busses on IOP */	struct device device;	struct i2o_device *exec;	/* Executive */#if BITS_PER_LONG == 64	spinlock_t context_list_lock;	/* lock for context_list */	atomic_t context_list_counter;	/* needed for unique contexts */	struct list_head context_list;	/* list of context id's					   and pointers */#endif	spinlock_t lock;	/* lock for controller				   configuration */	void *driver_data[I2O_MAX_DRIVERS];	/* storage for drivers */};/* * I2O System table entry * * The system table contains information about all the IOPs in the * system.  It is sent to all IOPs so that they can create peer2peer * connections between them. */struct i2o_sys_tbl_entry {	u16 org_id;	u16 reserved1;	u32 iop_id:12;	u32 reserved2:20;	u16 seg_num:12;	u16 i2o_version:4;	u8 iop_state;	u8 msg_type;	u16 frame_size;	u16 reserved3;	u32 last_changed;	u32 iop_capabilities;	u32 inbound_low;	u32 inbound_high;};struct i2o_sys_tbl {	u8 num_entries;	u8 version;	u16 reserved1;	u32 change_ind;	u32 reserved2;	u32 reserved3;	struct i2o_sys_tbl_entry iops[0];};extern struct list_head i2o_controllers;/* Message functions */static inline u32 i2o_msg_get(struct i2o_controller *, struct i2o_message **);extern u32 i2o_msg_get_wait(struct i2o_controller *, struct i2o_message **,			    int);static inline void i2o_msg_post(struct i2o_controller *, u32);static inline int i2o_msg_post_wait(struct i2o_controller *, u32,				    unsigned long);extern int i2o_msg_post_wait_mem(struct i2o_controller *, u32, unsigned long,				 struct i2o_dma *);extern void i2o_msg_nop(struct i2o_controller *, u32);static inline void i2o_flush_reply(struct i2o_controller *, u32);/* DMA handling functions */static inline int i2o_dma_alloc(struct device *, struct i2o_dma *, size_t,				unsigned int);static inline void i2o_dma_free(struct device *, struct i2o_dma *);int i2o_dma_realloc(struct device *, struct i2o_dma *, size_t, unsigned int);static inline int i2o_dma_map(struct device *, struct i2o_dma *);static inline void i2o_dma_unmap(struct device *, struct i2o_dma *);/* IOP functions */extern int i2o_status_get(struct i2o_controller *);extern int i2o_hrt_get(struct i2o_controller *);extern int i2o_event_register(struct i2o_device *, struct i2o_driver *, int,			      u32);extern struct i2o_device *i2o_iop_find_device(struct i2o_controller *, u16);extern struct i2o_controller *i2o_find_iop(int);/* Functions needed for handling 64-bit pointers in 32-bit context */#if BITS_PER_LONG == 64extern u32 i2o_cntxt_list_add(struct i2o_controller *, void *);extern void *i2o_cntxt_list_get(struct i2o_controller *, u32);extern u32 i2o_cntxt_list_remove(struct i2o_controller *, void *);extern u32 i2o_cntxt_list_get_ptr(struct i2o_controller *, void *);static inline u32 i2o_ptr_low(void *ptr){	return (u32) (u64) ptr;};static inline u32 i2o_ptr_high(void *ptr){	return (u32) ((u64) ptr >> 32);};#elsestatic inline u32 i2o_cntxt_list_add(struct i2o_controller *c, void *ptr){	return (u32) ptr;};static inline void *i2o_cntxt_list_get(struct i2o_controller *c, u32 context){	return (void *)context;};static inline u32 i2o_cntxt_list_remove(struct i2o_controller *c, void *ptr){	return (u32) ptr;};static inline u32 i2o_cntxt_list_get_ptr(struct i2o_controller *c, void *ptr){	return (u32) ptr;};static inline u32 i2o_ptr_low(void *ptr){	return (u32) ptr;};static inline u32 i2o_ptr_high(void *ptr){	return 0;};#endif/* I2O driver (OSM) functions */extern int i2o_driver_register(struct i2o_driver *);extern void i2o_driver_unregister(struct i2o_driver *);/** *	i2o_driver_notify_controller_add - Send notification of added controller *					   to a single I2O driver * *	Send notification of added controller to a single registered driver. */static inline void i2o_driver_notify_controller_add(struct i2o_driver *drv,						    struct i2o_controller *c){	if (drv->notify_controller_add)		drv->notify_controller_add(c);};/** *	i2o_driver_notify_controller_remove - Send notification of removed *					      controller to a single I2O driver * *	Send notification of removed controller to a single registered driver. */static inline void i2o_driver_notify_controller_remove(struct i2o_driver *drv,						       struct i2o_controller *c){	if (drv->notify_controller_remove)		drv->notify_controller_remove(c);};/** *	i2o_driver_notify_device_add - Send notification of added device to a *				       single I2O driver * *	Send notification of added device to a single registered driver. */static inline void i2o_driver_notify_device_add(struct i2o_driver *drv,						struct i2o_device *i2o_dev){	if (drv->notify_device_add)		drv->notify_device_add(i2o_dev);};/** *	i2o_driver_notify_device_remove - Send notification of removed device *					  to a single I2O driver * *	Send notification of removed device to a single registered driver. */static inline void i2o_driver_notify_device_remove(struct i2o_driver *drv,						   struct i2o_device *i2o_dev){	if (drv->notify_device_remove)		drv->notify_device_remove(i2o_dev);};extern void i2o_driver_notify_controller_add_all(struct i2o_controller *);extern void i2o_driver_notify_controller_remove_all(struct i2o_controller *);extern void i2o_driver_notify_device_add_all(struct i2o_device *);extern void i2o_driver_notify_device_remove_all(struct i2o_device *);/* I2O device functions */extern int i2o_device_claim(struct i2o_device *);extern int i2o_device_claim_release(struct i2o_device *);/* Exec OSM functions */extern int i2o_exec_lct_get(struct i2o_controller *);extern int i2o_exec_lct_notify(struct i2o_controller *, u32);/* device to i2o_device and driver to i2o_driver convertion functions */#define to_i2o_driver(drv) container_of(drv,struct i2o_driver, driver)#define to_i2o_device(dev) container_of(dev, struct i2o_device, device)/* *	Messenger inlines */static inline u32 I2O_POST_READ32(struct i2o_controller *c){	rmb();	return readl(c->post_port);};static inline void I2O_POST_WRITE32(struct i2o_controller *c, u32 val){	wmb();	writel(val, c->post_port);};static inline u32 I2O_REPLY_READ32(struct i2o_controller *c){	rmb();	return readl(c->reply_port);};static inline void I2O_REPLY_WRITE32(struct i2o_controller *c, u32 val){	wmb();	writel(val, c->reply_port);};static inline u32 I2O_IRQ_READ32(struct i2o_controller *c){	rmb();	return readl(c->irq_mask);};static inline void I2O_IRQ_WRITE32(struct i2o_controller *c, u32 val){	wmb();	writel(val, c->irq_mask);	wmb();};/** *	i2o_msg_get - obtain an I2O message from the IOP *	@c: I2O controller *	@msg: pointer to a I2O message pointer * *	This function tries to get a message slot. If no message slot is *	available do not wait until one is availabe (see also i2o_msg_get_wait). * *	On a success the message is returned and the pointer to the message is *	set in msg. The returned message is the physical page frame offset *	address from the read port (see the i2o spec). If no message is *	available returns I2O_QUEUE_EMPTY and msg is leaved untouched. */static inline u32 i2o_msg_get(struct i2o_controller *c,			      struct i2o_message **msg){	u32 m;	if ((m = I2O_POST_READ32(c)) != I2O_QUEUE_EMPTY)		*msg = c->in_queue.virt + m;	return m;};/** *	i2o_msg_post - Post I2O message to I2O controller *	@c: I2O controller to which the message should be send *	@m: the message identifier * *	Post the message to the I2O controller. */static inline void i2o_msg_post(struct i2o_controller *c, u32 m){	I2O_POST_WRITE32(c, m);};/** * 	i2o_msg_post_wait - Post and wait a message and wait until return *	@c: controller *	@m: message to post *	@timeout: time in seconds to wait * * 	This API allows an OSM to post a message and then be told whether or *	not the system received a successful reply. If the message times out *	then the value '-ETIMEDOUT' is returned. * *	Returns 0 on success or negative error code on failure.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?