i2o.h
来自「此工具是arm-linux-GCC交叉编译工具(cross-3.4.4)」· C头文件 代码 · 共 1,127 行 · 第 1/3 页
H
1,127 行
/* * 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 8#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 DMA mapped address information */struct i2o_dma { void *virt; dma_addr_t phys; size_t len;};/* * Contains IO mapped address information */struct i2o_io { void __iomem *virt; unsigned long phys; unsigned long 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 */ unsigned int promise:1; /* Promise controller */ unsigned int adaptec:1; /* DPT / Adaptec controller */ unsigned int raptor:1; /* split bar */ unsigned int no_quiesce:1; /* dont quiesce before reset */ unsigned int short_req:1; /* use small block sizes */ unsigned int limit_sectors:1; /* limit number of sectors / request */ unsigned int pae_support:1; /* controller has 64-bit SGL support */ struct list_head devices; /* list of I2O devices */ struct list_head list; /* Controller list */ void __iomem *in_port; /* Inbout port address */ void __iomem *out_port; /* Outbound port address */ void __iomem *irq_status; /* Interrupt status register address */ void __iomem *irq_mask; /* Interrupt mask register address */ /* Dynamic LCT related data */ struct i2o_dma status; /* IOP status block */ 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_io base; /* controller messaging unit */ struct i2o_io in_queue; /* inbound message queue Host->IOP */ struct i2o_dma out_queue; /* outbound message queue IOP->Host */ unsigned int battery:1; /* Has a battery backup */ unsigned int io_alloc:1; /* An I/O resource was allocated */ unsigned 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 device device; struct class_device classdev; /* I2O controller class */ 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 __iomem **);extern u32 i2o_msg_get_wait(struct i2o_controller *, struct i2o_message __iomem **, 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);/* IOP functions */extern int i2o_status_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);};static inline u32 i2o_dma_low(dma_addr_t dma_addr){ return (u32) (u64) dma_addr;};static inline u32 i2o_dma_high(dma_addr_t dma_addr){ return (u32) ((u64) dma_addr >> 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;};static inline u32 i2o_dma_low(dma_addr_t dma_addr){ return (u32) dma_addr;};static inline u32 i2o_dma_high(dma_addr_t dma_addr){ return 0;};#endif/** * i2o_sg_tablesize - Calculate the maximum number of elements in a SGL * @c: I2O controller for which the calculation should be done * @body_size: maximum body size used for message in 32-bit words. * * Return the maximum number of SG elements in a SG list. */static inline u16 i2o_sg_tablesize(struct i2o_controller *c, u16 body_size){ i2o_status_block *sb = c->status_block.virt; u16 sg_count = (sb->inbound_frame_size - sizeof(struct i2o_message) / 4) - body_size; if (c->pae_support) { /* * for 64-bit a SG attribute element must be added and each * SG element needs 12 bytes instead of 8. */ sg_count -= 2; sg_count /= 3; } else sg_count /= 2; if (c->short_req && (sg_count > 8)) sg_count = 8; return sg_count;};/** * i2o_dma_map_single - Map pointer to controller and fill in I2O message. * @c: I2O controller * @ptr: pointer to the data which should be mapped * @size: size of data in bytes * @direction: DMA_TO_DEVICE / DMA_FROM_DEVICE * @sg_ptr: pointer to the SG list inside the I2O message * * This function does all necessary DMA handling and also writes the I2O * SGL elements into the I2O message. For details on DMA handling see also * dma_map_single(). The pointer sg_ptr will only be set to the end of the
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?