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 + -
显示快捷键?