| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* -*- linux-c -*- | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 2 | * | 
|  | 3 | *  iSeries Virtual I/O Message Path header | 
|  | 4 | * | 
|  | 5 | *  Authors: Dave Boutcher <boutcher@us.ibm.com> | 
|  | 6 | *           Ryan Arnold <ryanarn@us.ibm.com> | 
|  | 7 | *           Colin Devilbiss <devilbis@us.ibm.com> | 
|  | 8 | * | 
|  | 9 | * (C) Copyright 2000 IBM Corporation | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 10 | * | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 11 | * This header file is used by the iSeries virtual I/O device | 
|  | 12 | * drivers.  It defines the interfaces to the common functions | 
|  | 13 | * (implemented in drivers/char/viopath.h) as well as defining | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 14 | * common functions and structures.  Currently (at the time I | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 15 | * wrote this comment) the iSeries virtual I/O device drivers | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 16 | * that use this are | 
|  | 17 | *   drivers/block/viodasd.c | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 18 | *   drivers/char/viocons.c | 
|  | 19 | *   drivers/char/viotape.c | 
|  | 20 | *   drivers/cdrom/viocd.c | 
|  | 21 | * | 
|  | 22 | * The iSeries virtual ethernet support (veth.c) uses a whole | 
|  | 23 | * different set of functions. | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 24 | * | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 25 | * This program is free software;  you can redistribute it and/or | 
|  | 26 | * modify it under the terms of the GNU General Public License as | 
|  | 27 | * published by the Free Software Foundation; either version 2 of the | 
|  | 28 | * License, or (at your option) anyu later version. | 
|  | 29 | * | 
|  | 30 | * This program is distributed in the hope that it will be useful, but | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 31 | * WITHOUT ANY WARRANTY; without even the implied warranty of | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 32 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 33 | * General Public License for more details. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 34 | * | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 35 | * You should have received a copy of the GNU General Public License | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 36 | * along with this program; if not, write to the Free Software Foundation, | 
|  | 37 | * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 
|  | 38 | * | 
|  | 39 | */ | 
| Kelly Daly | ecb3ca2 | 2005-11-02 15:53:01 +1100 | [diff] [blame] | 40 | #ifndef _ASM_POWERPC_ISERIES_VIO_H | 
|  | 41 | #define _ASM_POWERPC_ISERIES_VIO_H | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 42 |  | 
| Kelly Daly | 1ec65d7 | 2005-11-02 13:46:07 +1100 | [diff] [blame] | 43 | #include <asm/iseries/hv_types.h> | 
| Kelly Daly | e45423e | 2005-11-02 12:08:31 +1100 | [diff] [blame] | 44 | #include <asm/iseries/hv_lp_event.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 45 |  | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 46 | /* | 
|  | 47 | * iSeries virtual I/O events use the subtype field in | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 48 | * HvLpEvent to figure out what kind of vio event is coming | 
|  | 49 | * in.  We use a table to route these, and this defines | 
|  | 50 | * the maximum number of distinct subtypes | 
|  | 51 | */ | 
|  | 52 | #define VIO_MAX_SUBTYPES 8 | 
|  | 53 |  | 
| Stephen Rothwell | 8251b4c | 2007-10-11 14:59:54 +1000 | [diff] [blame] | 54 | #define VIOMAXBLOCKDMA	12 | 
|  | 55 |  | 
|  | 56 | struct open_data { | 
|  | 57 | u64	disk_size; | 
|  | 58 | u16	max_disk; | 
|  | 59 | u16	cylinders; | 
|  | 60 | u16	tracks; | 
|  | 61 | u16	sectors; | 
|  | 62 | u16	bytes_per_sector; | 
|  | 63 | }; | 
|  | 64 |  | 
|  | 65 | struct rw_data { | 
|  | 66 | u64	offset; | 
|  | 67 | struct { | 
|  | 68 | u32	token; | 
|  | 69 | u32	reserved; | 
|  | 70 | u64	len; | 
|  | 71 | } dma_info[VIOMAXBLOCKDMA]; | 
|  | 72 | }; | 
|  | 73 |  | 
|  | 74 | struct vioblocklpevent { | 
|  | 75 | struct HvLpEvent	event; | 
|  | 76 | u32			reserved; | 
|  | 77 | u16			version; | 
|  | 78 | u16			sub_result; | 
|  | 79 | u16			disk; | 
|  | 80 | u16			flags; | 
|  | 81 | union { | 
|  | 82 | struct open_data	open_data; | 
|  | 83 | struct rw_data		rw_data; | 
|  | 84 | u64			changed; | 
|  | 85 | } u; | 
|  | 86 | }; | 
|  | 87 |  | 
|  | 88 | #define vioblockflags_ro   0x0001 | 
|  | 89 |  | 
|  | 90 | enum vioblocksubtype { | 
|  | 91 | vioblockopen = 0x0001, | 
|  | 92 | vioblockclose = 0x0002, | 
|  | 93 | vioblockread = 0x0003, | 
|  | 94 | vioblockwrite = 0x0004, | 
|  | 95 | vioblockflush = 0x0005, | 
|  | 96 | vioblockcheck = 0x0007 | 
|  | 97 | }; | 
|  | 98 |  | 
| Stephen Rothwell | b833b48 | 2007-10-11 14:57:26 +1000 | [diff] [blame] | 99 | struct viocdlpevent { | 
|  | 100 | struct HvLpEvent	event; | 
|  | 101 | u32			reserved; | 
|  | 102 | u16			version; | 
|  | 103 | u16			sub_result; | 
|  | 104 | u16			disk; | 
|  | 105 | u16			flags; | 
|  | 106 | u32			token; | 
|  | 107 | u64			offset;		/* On open, max number of disks */ | 
|  | 108 | u64			len;		/* On open, size of the disk */ | 
|  | 109 | u32			block_size;	/* Only set on open */ | 
|  | 110 | u32			media_size;	/* Only set on open */ | 
|  | 111 | }; | 
|  | 112 |  | 
|  | 113 | enum viocdsubtype { | 
|  | 114 | viocdopen = 0x0001, | 
|  | 115 | viocdclose = 0x0002, | 
|  | 116 | viocdread = 0x0003, | 
|  | 117 | viocdwrite = 0x0004, | 
|  | 118 | viocdlockdoor = 0x0005, | 
|  | 119 | viocdgetinfo = 0x0006, | 
|  | 120 | viocdcheck = 0x0007 | 
|  | 121 | }; | 
|  | 122 |  | 
| Stephen Rothwell | 7465ce0 | 2007-10-11 14:58:31 +1000 | [diff] [blame] | 123 | struct viotapelpevent { | 
|  | 124 | struct HvLpEvent event; | 
|  | 125 | u32 reserved; | 
|  | 126 | u16 version; | 
|  | 127 | u16 sub_type_result; | 
|  | 128 | u16 tape; | 
|  | 129 | u16 flags; | 
|  | 130 | u32 token; | 
|  | 131 | u64 len; | 
|  | 132 | union { | 
|  | 133 | struct { | 
|  | 134 | u32 tape_op; | 
|  | 135 | u32 count; | 
|  | 136 | } op; | 
|  | 137 | struct { | 
|  | 138 | u32 type; | 
|  | 139 | u32 resid; | 
|  | 140 | u32 dsreg; | 
|  | 141 | u32 gstat; | 
|  | 142 | u32 erreg; | 
|  | 143 | u32 file_no; | 
|  | 144 | u32 block_no; | 
|  | 145 | } get_status; | 
|  | 146 | struct { | 
|  | 147 | u32 block_no; | 
|  | 148 | } get_pos; | 
|  | 149 | } u; | 
|  | 150 | }; | 
|  | 151 |  | 
|  | 152 | enum viotapesubtype { | 
|  | 153 | viotapeopen = 0x0001, | 
|  | 154 | viotapeclose = 0x0002, | 
|  | 155 | viotaperead = 0x0003, | 
|  | 156 | viotapewrite = 0x0004, | 
|  | 157 | viotapegetinfo = 0x0005, | 
|  | 158 | viotapeop = 0x0006, | 
|  | 159 | viotapegetpos = 0x0007, | 
|  | 160 | viotapesetpos = 0x0008, | 
|  | 161 | viotapegetstatus = 0x0009 | 
|  | 162 | }; | 
|  | 163 |  | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 164 | /* | 
|  | 165 | * Each subtype can register a handler to process their events. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 166 | * The handler must have this interface. | 
|  | 167 | */ | 
|  | 168 | typedef void (vio_event_handler_t) (struct HvLpEvent * event); | 
|  | 169 |  | 
| Stephen Rothwell | 6b7feec | 2005-06-21 17:15:35 -0700 | [diff] [blame] | 170 | extern int viopath_open(HvLpIndex remoteLp, int subtype, int numReq); | 
|  | 171 | extern int viopath_close(HvLpIndex remoteLp, int subtype, int numReq); | 
|  | 172 | extern int vio_setHandler(int subtype, vio_event_handler_t * beh); | 
|  | 173 | extern int vio_clearHandler(int subtype); | 
|  | 174 | extern int viopath_isactive(HvLpIndex lp); | 
|  | 175 | extern HvLpInstanceId viopath_sourceinst(HvLpIndex lp); | 
|  | 176 | extern HvLpInstanceId viopath_targetinst(HvLpIndex lp); | 
|  | 177 | extern void vio_set_hostlp(void); | 
|  | 178 | extern void *vio_get_event_buffer(int subtype); | 
|  | 179 | extern void vio_free_event_buffer(int subtype, void *buffer); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 180 |  | 
| Stephen Rothwell | 8251b4c | 2007-10-11 14:59:54 +1000 | [diff] [blame] | 181 | extern struct vio_dev *vio_create_viodasd(u32 unit); | 
|  | 182 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 183 | extern HvLpIndex viopath_hostLp; | 
|  | 184 | extern HvLpIndex viopath_ourLp; | 
|  | 185 |  | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 186 | #define VIOCHAR_MAX_DATA	200 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 187 |  | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 188 | #define VIOMAJOR_SUBTYPE_MASK	0xff00 | 
|  | 189 | #define VIOMINOR_SUBTYPE_MASK	0x00ff | 
|  | 190 | #define VIOMAJOR_SUBTYPE_SHIFT	8 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 191 |  | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 192 | #define VIOVERSION		0x0101 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 193 |  | 
|  | 194 | /* | 
|  | 195 | * This is the general structure for VIO errors; each module should have | 
|  | 196 | * a table of them, and each table should be terminated by an entry of | 
|  | 197 | * { 0, 0, NULL }.  Then, to find a specific error message, a module | 
|  | 198 | * should pass its local table and the return code. | 
|  | 199 | */ | 
|  | 200 | struct vio_error_entry { | 
|  | 201 | u16 rc; | 
|  | 202 | int errno; | 
|  | 203 | const char *msg; | 
|  | 204 | }; | 
| Stephen Rothwell | fcee389 | 2005-06-21 17:15:34 -0700 | [diff] [blame] | 205 | extern const struct vio_error_entry *vio_lookup_rc( | 
|  | 206 | const struct vio_error_entry *local_table, u16 rc); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 207 |  | 
|  | 208 | enum viosubtypes { | 
|  | 209 | viomajorsubtype_monitor = 0x0100, | 
|  | 210 | viomajorsubtype_blockio = 0x0200, | 
|  | 211 | viomajorsubtype_chario = 0x0300, | 
|  | 212 | viomajorsubtype_config = 0x0400, | 
|  | 213 | viomajorsubtype_cdio = 0x0500, | 
|  | 214 | viomajorsubtype_tape = 0x0600, | 
|  | 215 | viomajorsubtype_scsi = 0x0700 | 
|  | 216 | }; | 
|  | 217 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 218 | enum vioconfigsubtype { | 
|  | 219 | vioconfigget = 0x0001, | 
|  | 220 | }; | 
|  | 221 |  | 
|  | 222 | enum viorc { | 
|  | 223 | viorc_good = 0x0000, | 
|  | 224 | viorc_noConnection = 0x0001, | 
|  | 225 | viorc_noReceiver = 0x0002, | 
|  | 226 | viorc_noBufferAvailable = 0x0003, | 
|  | 227 | viorc_invalidMessageType = 0x0004, | 
|  | 228 | viorc_invalidRange = 0x0201, | 
|  | 229 | viorc_invalidToken = 0x0202, | 
|  | 230 | viorc_DMAError = 0x0203, | 
|  | 231 | viorc_useError = 0x0204, | 
|  | 232 | viorc_releaseError = 0x0205, | 
|  | 233 | viorc_invalidDisk = 0x0206, | 
|  | 234 | viorc_openRejected = 0x0301 | 
|  | 235 | }; | 
|  | 236 |  | 
| Stephen Rothwell | 8bff05b | 2006-07-13 18:51:22 +1000 | [diff] [blame] | 237 | /* | 
|  | 238 | * The structure of the events that flow between us and OS/400 for chario | 
|  | 239 | * events.  You can't mess with this unless the OS/400 side changes too. | 
|  | 240 | */ | 
|  | 241 | struct viocharlpevent { | 
|  | 242 | struct HvLpEvent event; | 
|  | 243 | u32 reserved; | 
|  | 244 | u16 version; | 
|  | 245 | u16 subtype_result_code; | 
|  | 246 | u8 virtual_device; | 
|  | 247 | u8 len; | 
|  | 248 | u8 data[VIOCHAR_MAX_DATA]; | 
|  | 249 | }; | 
|  | 250 |  | 
|  | 251 | #define VIOCHAR_WINDOW		10 | 
|  | 252 |  | 
|  | 253 | enum viocharsubtype { | 
|  | 254 | viocharopen = 0x0001, | 
|  | 255 | viocharclose = 0x0002, | 
|  | 256 | viochardata = 0x0003, | 
|  | 257 | viocharack = 0x0004, | 
|  | 258 | viocharconfig = 0x0005 | 
|  | 259 | }; | 
|  | 260 |  | 
|  | 261 | enum viochar_rc { | 
|  | 262 | viochar_rc_ebusy = 1 | 
|  | 263 | }; | 
|  | 264 |  | 
| Kelly Daly | ecb3ca2 | 2005-11-02 15:53:01 +1100 | [diff] [blame] | 265 | #endif /* _ASM_POWERPC_ISERIES_VIO_H */ |