]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blob - drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h
staging: unisys: remove U8 type
[mirror_ubuntu-zesty-kernel.git] / drivers / staging / unisys / common-spar / include / channels / controlvmchannel.h
1 /* Copyright (C) 2010 - 2013 UNISYS CORPORATION
2 * All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or (at
7 * your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
12 * NON INFRINGEMENT. See the GNU General Public License for more
13 * details.
14 */
15
16 #ifndef __CONTROLVMCHANNEL_H__
17 #define __CONTROLVMCHANNEL_H__
18
19 #include <linux/uuid.h>
20 #include "commontypes.h"
21 #include "channel.h"
22 #include "controlframework.h"
23 enum { INVALID_GUEST_FIRMWARE, SAMPLE_GUEST_FIRMWARE,
24 TIANO32_GUEST_FIRMWARE, TIANO64_GUEST_FIRMWARE
25 };
26
27 /* {2B3C2D10-7EF5-4ad8-B966-3448B7386B3D} */
28 #define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_GUID \
29 UUID_LE(0x2b3c2d10, 0x7ef5, 0x4ad8, \
30 0xb9, 0x66, 0x34, 0x48, 0xb7, 0x38, 0x6b, 0x3d)
31
32 static const uuid_le UltraControlvmChannelProtocolGuid =
33 ULTRA_CONTROLVM_CHANNEL_PROTOCOL_GUID;
34
35 #define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE \
36 ULTRA_CHANNEL_PROTOCOL_SIGNATURE
37 #define CONTROLVM_MESSAGE_MAX 64
38
39 /* Must increment this whenever you insert or delete fields within
40 * this channel struct. Also increment whenever you change the meaning
41 * of fields within this channel struct so as to break pre-existing
42 * software. Note that you can usually add fields to the END of the
43 * channel struct withOUT needing to increment this. */
44 #define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID 1
45
46 #define ULTRA_CONTROLVM_CHANNEL_OK_CLIENT(pChannel, logCtx) \
47 (ULTRA_check_channel_client(pChannel, \
48 UltraControlvmChannelProtocolGuid, \
49 "controlvm", \
50 sizeof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL), \
51 ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID, \
52 ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE, \
53 __FILE__, __LINE__, logCtx))
54 #define ULTRA_CONTROLVM_CHANNEL_OK_SERVER(actualBytes, logCtx) \
55 (ULTRA_check_channel_server(UltraControlvmChannelProtocolGuid, \
56 "controlvm", \
57 sizeof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL), \
58 actualBytes, __FILE__, __LINE__, logCtx))
59
60 #define MY_DEVICE_INDEX 0
61 #define MAX_MACDATA_LEN 8 /* number of bytes for MAC address in config packet */
62 #define MAX_SERIAL_NUM 32
63
64 #define DISK_ZERO_PUN_NUMBER 1 /* Target ID on the SCSI bus for LUN 0 */
65 #define DISK_ZERO_LUN_NUMBER 3 /* Logical Unit Number */
66
67 /* Defines for various channel queues... */
68 #define CONTROLVM_QUEUE_REQUEST 0
69 #define CONTROLVM_QUEUE_RESPONSE 1
70 #define CONTROLVM_QUEUE_EVENT 2
71 #define CONTROLVM_QUEUE_ACK 3
72
73 /* Max number of messages stored during IOVM creation to be reused
74 * after crash */
75 #define CONTROLVM_CRASHMSG_MAX 2
76
77 /** Ids for commands that may appear in either queue of a ControlVm channel.
78 *
79 * Commands that are initiated by the command partition (CP), by an IO or
80 * console service partition (SP), or by a guest partition (GP)are:
81 * - issued on the RequestQueue queue (q #0) in the ControlVm channel
82 * - responded to on the ResponseQueue queue (q #1) in the ControlVm channel
83 *
84 * Events that are initiated by an IO or console service partition (SP) or
85 * by a guest partition (GP) are:
86 * - issued on the EventQueue queue (q #2) in the ControlVm channel
87 * - responded to on the EventAckQueue queue (q #3) in the ControlVm channel
88 */
89 typedef enum {
90 CONTROLVM_INVALID = 0,
91 /* SWITCH commands required Parameter: SwitchNumber */
92 /* BUS commands required Parameter: BusNumber */
93 CONTROLVM_BUS_CREATE = 0x101, /* CP --> SP, GP */
94 CONTROLVM_BUS_DESTROY = 0x102, /* CP --> SP, GP */
95 CONTROLVM_BUS_CONFIGURE = 0x104, /* CP --> SP */
96 CONTROLVM_BUS_CHANGESTATE = 0x105, /* CP --> SP, GP */
97 CONTROLVM_BUS_CHANGESTATE_EVENT = 0x106, /* SP, GP --> CP */
98 /* DEVICE commands required Parameter: BusNumber, DeviceNumber */
99
100 CONTROLVM_DEVICE_CREATE = 0x201, /* CP --> SP, GP */
101 CONTROLVM_DEVICE_DESTROY = 0x202, /* CP --> SP, GP */
102 CONTROLVM_DEVICE_CONFIGURE = 0x203, /* CP --> SP */
103 CONTROLVM_DEVICE_CHANGESTATE = 0x204, /* CP --> SP, GP */
104 CONTROLVM_DEVICE_CHANGESTATE_EVENT = 0x205, /* SP, GP --> CP */
105 CONTROLVM_DEVICE_RECONFIGURE = 0x206, /* CP --> Boot */
106 /* DISK commands required Parameter: BusNumber, DeviceNumber */
107 CONTROLVM_DISK_CREATE = 0x221, /* CP --> SP */
108 CONTROLVM_DISK_DESTROY = 0x222, /* CP --> SP */
109 CONTROLVM_DISK_CONFIGURE = 0x223, /* CP --> SP */
110 CONTROLVM_DISK_CHANGESTATE = 0x224, /* CP --> SP */
111 /* CHIPSET commands */
112 CONTROLVM_CHIPSET_INIT = 0x301, /* CP --> SP, GP */
113 CONTROLVM_CHIPSET_STOP = 0x302, /* CP --> SP, GP */
114 CONTROLVM_CHIPSET_SHUTDOWN = 0x303, /* CP --> SP */
115 CONTROLVM_CHIPSET_READY = 0x304, /* CP --> SP */
116 CONTROLVM_CHIPSET_SELFTEST = 0x305, /* CP --> SP */
117
118 } CONTROLVM_ID;
119
120 struct InterruptInfo {
121 /**< specifies interrupt info. It is used to send interrupts
122 * for this channel. The peer at the end of this channel
123 * who has registered an interrupt (using recv fields
124 * above) will receive the interrupt. Passed as a parameter
125 * to Issue_VMCALL_IO_QUEUE_TRANSITION, which generates the
126 * interrupt. Currently this is used by IOPart-SP to wake
127 * up GP when Data Channel transitions from empty to
128 * non-empty.*/
129 U64 sendInterruptHandle;
130
131 /**< specifies interrupt handle. It is used to retrieve the
132 * corresponding interrupt pin from Monitor; and the
133 * interrupt pin is used to connect to the corresponding
134 * intrrupt. Used by IOPart-GP only. */
135 U64 recvInterruptHandle;
136
137 /**< specifies interrupt vector. It, interrupt pin, and shared are
138 * used to connect to the corresponding interrupt. Used by
139 * IOPart-GP only. */
140 U32 recvInterruptVector;
141
142 /**< specifies if the recvInterrupt is shared. It, interrupt pin
143 * and vector are used to connect to 0 = not shared; 1 = shared.
144 * the corresponding interrupt. Used by IOPart-GP only. */
145 u8 recvInterruptShared;
146 u8 reserved[3]; /* Natural alignment purposes */
147 };
148
149 struct PciId {
150 U16 Domain;
151 u8 Bus;
152 u8 Slot;
153 u8 Func;
154 u8 Reserved[3]; /* Natural alignment purposes */
155 };
156
157 struct PciConfigHdr {
158 U16 VendorId;
159 U16 SubSysVendor;
160 U16 DeviceId;
161 U16 SubSysDevice;
162 U32 ClassCode;
163 U32 Reserved; /* Natural alignment purposes */
164 };
165
166 struct ScsiId {
167 U32 Bus;
168 U32 Target;
169 U32 Lun;
170 U32 Host; /* Command should ignore this for *
171 * DiskArrival/RemovalEvents */
172 };
173
174 struct WWID {
175 U32 wwid1;
176 U32 wwid2;
177 };
178
179 struct virtDiskInfo {
180 U32 switchNo; /* defined by SWITCH_CREATE */
181 U32 externalPortNo; /* 0 for SAS RAID provided (external)
182 * virtual disks, 1 for virtual disk
183 * images, 2 for gold disk images */
184 U16 VirtualDiskIndex; /* Index of disk descriptor in the
185 * VirtualDisk segment associated with
186 * externalPortNo */
187 U16 Reserved1;
188 U32 Reserved2;
189 };
190
191 typedef enum {
192 CONTROLVM_ACTION_NONE = 0,
193 CONTROLVM_ACTION_SET_RESTORE = 0x05E7,
194 CONTROLVM_ACTION_CLEAR_RESTORE = 0x0C18,
195 CONTROLVM_ACTION_RESTORING = 0x08E5,
196 CONTROLVM_ACTION_RESTORE_BUSY = 0x0999,
197 CONTROLVM_ACTION_CLEAR_NVRAM = 0xB01
198 } CONTROLVM_ACTION;
199
200 typedef enum _ULTRA_TOOL_ACTIONS {
201 /* enumeration that defines intended action */
202 ULTRA_TOOL_ACTION_NONE = 0, /* normal boot of boot disk */
203 ULTRA_TOOL_ACTION_INSTALL = 1, /* install source disk(s) to boot
204 * disk */
205 ULTRA_TOOL_ACTION_CAPTURE = 2, /* capture boot disk to target disk(s)
206 * as 'gold image' */
207 ULTRA_TOOL_ACTION_REPAIR = 3, /* use source disk(s) to repair
208 * installation on boot disk */
209 ULTRA_TOOL_ACTION_CLEAN = 4, /* 'scrub' virtual disk before
210 * releasing back to storage pool */
211 ULTRA_TOOL_ACTION_UPGRADE = 5, /* upgrade to use content of images
212 * referenced from newer blueprint */
213 ULTRA_TOOL_ACTION_DIAG = 6, /* use tool to invoke diagnostic script
214 * provided by blueprint */
215 ULTRA_TOOL_ACTION_FAILED = 7, /* used when tool fails installation
216 and cannot continue */
217 ULTRA_TOOL_ACTION_COUNT = 8
218 } ULTRA_TOOL_ACTIONS;
219
220 typedef struct _ULTRA_EFI_SPAR_INDICATION {
221 U64 BootToFirmwareUI:1; /* Bit 0: Stop in uefi ui */
222 U64 ClearNvram:1; /* Bit 1: Clear NVRAM */
223 U64 ClearCmos:1; /* Bit 2: Clear CMOS */
224 U64 BootToTool:1; /* Bit 3: Run install tool */
225 /* remaining bits are available */
226 } ULTRA_EFI_SPAR_INDICATION;
227
228 typedef enum {
229 ULTRA_CHIPSET_FEATURE_REPLY = 0x00000001,
230 ULTRA_CHIPSET_FEATURE_PARA_HOTPLUG = 0x00000002,
231 ULTRA_CHIPSET_FEATURE_PCIVBUS = 0x00000004
232 } ULTRA_CHIPSET_FEATURE;
233
234 /** This is the common structure that is at the beginning of every
235 * ControlVm message (both commands and responses) in any ControlVm
236 * queue. Commands are easily distinguished from responses by
237 * looking at the flags.response field.
238 */
239 typedef struct _CONTROLVM_MESSAGE_HEADER {
240 U32 Id; /* See CONTROLVM_ID. */
241 /* For requests, indicates the message type. */
242 /* For responses, indicates the type of message we are responding to. */
243
244 U32 MessageSize; /* Includes size of this struct + size
245 * of message */
246 U32 SegmentIndex; /* Index of segment containing Vm
247 * message/information */
248 U32 CompletionStatus; /* Error status code or result of
249 * message completion */
250 struct {
251 U32 failed:1; /**< =1 in a response to * signify
252 * failure */
253 U32 responseExpected:1; /**< =1 in all messages that expect a
254 * response (Control ignores this
255 * bit) */
256 U32 server:1; /**< =1 in all bus & device-related
257 * messages where the message
258 * receiver is to act as the bus or
259 * device server */
260 U32 testMessage:1; /**< =1 for testing use only
261 * (Control and Command ignore this
262 * bit) */
263 U32 partialCompletion:1; /**< =1 if there are forthcoming
264 * responses/acks associated
265 * with this message */
266 U32 preserve:1; /**< =1 this is to let us know to
267 * preserve channel contents
268 * (for running guests)*/
269 U32 writerInDiag:1; /**< =1 the DiagWriter is active in the
270 * Diagnostic Partition*/
271
272 /* remaining bits in this 32-bit word are available */
273 } Flags;
274 U32 Reserved; /* Natural alignment */
275 U64 MessageHandle; /* Identifies the particular message instance,
276 * and is used to match particular */
277 /* request instances with the corresponding response instance. */
278 U64 PayloadVmOffset; /* Offset of payload area from start of this
279 * instance of ControlVm segment */
280 U32 PayloadMaxBytes; /* Maximum bytes allocated in payload
281 * area of ControlVm segment */
282 U32 PayloadBytes; /* Actual number of bytes of payload
283 * area to copy between IO/Command; */
284 /* if non-zero, there is a payload to copy. */
285 } CONTROLVM_MESSAGE_HEADER;
286
287 typedef struct _CONTROLVM_PACKET_DEVICE_CREATE {
288 U32 busNo; /**< bus # (0..n-1) from the msg receiver's
289 * perspective */
290
291 /* Control uses header SegmentIndex field to access bus number... */
292 U32 devNo; /**< bus-relative (0..n-1) device number */
293 U64 channelAddr; /**< Guest physical address of the channel, which
294 * can be dereferenced by the receiver
295 * of this ControlVm command */
296 U64 channelBytes; /**< specifies size of the channel in bytes */
297 uuid_le dataTypeGuid;/**< specifies format of data in channel */
298 uuid_le devInstGuid; /**< instance guid for the device */
299 struct InterruptInfo intr; /**< specifies interrupt information */
300 } CONTROLVM_PACKET_DEVICE_CREATE; /* for CONTROLVM_DEVICE_CREATE */
301
302 typedef struct _CONTROLVM_PACKET_DEVICE_CONFIGURE {
303 U32 busNo; /**< bus # (0..n-1) from the msg
304 * receiver's perspective */
305
306 /* Control uses header SegmentIndex field to access bus number... */
307 U32 devNo; /**< bus-relative (0..n-1) device number */
308 } CONTROLVM_PACKET_DEVICE_CONFIGURE; /* for CONTROLVM_DEVICE_CONFIGURE */
309
310 typedef struct _CONTROLVM_MESSAGE_DEVICE_CREATE {
311 CONTROLVM_MESSAGE_HEADER Header;
312 CONTROLVM_PACKET_DEVICE_CREATE Packet;
313 } CONTROLVM_MESSAGE_DEVICE_CREATE; /* total 128 bytes */
314
315 typedef struct _CONTROLVM_MESSAGE_DEVICE_CONFIGURE {
316 CONTROLVM_MESSAGE_HEADER Header;
317 CONTROLVM_PACKET_DEVICE_CONFIGURE Packet;
318 } CONTROLVM_MESSAGE_DEVICE_CONFIGURE; /* total 56 bytes */
319
320 /* This is the format for a message in any ControlVm queue. */
321 typedef struct _CONTROLVM_MESSAGE_PACKET {
322 union {
323
324 /* BEGIN Request messages */
325 struct {
326 U32 busNo; /*< bus # (0..n-1) from the msg
327 * receiver's perspective */
328
329 /* Control uses header SegmentIndex field to access bus number... */
330 U32 deviceCount; /*< indicates the max number of
331 * devices on this bus */
332 U64 channelAddr; /*< Guest physical address of the
333 * channel, which can be
334 * dereferenced by the receiver
335 * of this ControlVm command */
336 U64 channelBytes; /*< size of the channel in bytes */
337 uuid_le busDataTypeGuid;/*< indicates format of data in
338 bus channel */
339 uuid_le busInstGuid; /*< instance guid for the bus */
340 } createBus; /* for CONTROLVM_BUS_CREATE */
341 struct {
342 U32 busNo; /*< bus # (0..n-1) from the msg
343 * receiver's perspective */
344
345 /* Control uses header SegmentIndex field to access bus number... */
346 U32 reserved; /* Natural alignment purposes */
347 } destroyBus; /* for CONTROLVM_BUS_DESTROY */
348 struct {
349 U32 busNo; /*< bus # (0..n-1) from the
350 * msg receiver's
351 * perspective */
352
353 /* Control uses header SegmentIndex field to access bus number... */
354 U32 reserved1; /* for alignment purposes */
355 U64 guestHandle; /* This is used to convert
356 * guest physical address to real
357 * physical address for DMA, for ex. */
358 U64 recvBusInterruptHandle;/*< specifies interrupt
359 * info. It is used by SP to register
360 * to receive interrupts from the CP.
361 * This interrupt is used for bus
362 * level notifications. The
363 * corresponding
364 * sendBusInterruptHandle is kept in
365 * CP. */
366 } configureBus; /* for CONTROLVM_BUS_CONFIGURE */
367
368 /* for CONTROLVM_DEVICE_CREATE */
369 CONTROLVM_PACKET_DEVICE_CREATE createDevice;
370 struct {
371 U32 busNo; /*< bus # (0..n-1) from the msg
372 * receiver's perspective */
373
374 /* Control uses header SegmentIndex field to access bus number... */
375 U32 devNo; /*< bus-relative (0..n-1) device
376 * number */
377 } destroyDevice; /* for CONTROLVM_DEVICE_DESTROY */
378
379 /* for CONTROLVM_DEVICE_CONFIGURE */
380 CONTROLVM_PACKET_DEVICE_CONFIGURE configureDevice;
381 struct {
382 U32 busNo; /*< bus # (0..n-1) from the msg
383 * receiver's perspective */
384
385 /* Control uses header SegmentIndex field to access bus number... */
386 U32 devNo; /*< bus-relative (0..n-1) device
387 * number */
388 } reconfigureDevice; /* for CONTROLVM_DEVICE_RECONFIGURE */
389 struct {
390 U32 busNo;
391 ULTRA_SEGMENT_STATE state;
392 u8 reserved[2]; /* Natural alignment purposes */
393 } busChangeState; /* for CONTROLVM_BUS_CHANGESTATE */
394 struct {
395 U32 busNo;
396 U32 devNo;
397 ULTRA_SEGMENT_STATE state;
398 struct {
399 U32 physicalDevice:1; /* =1 if message is for
400 * a physical device */
401 /* remaining bits in this 32-bit word are available */
402 } flags;
403 u8 reserved[2]; /* Natural alignment purposes */
404 } deviceChangeState; /* for CONTROLVM_DEVICE_CHANGESTATE */
405 struct {
406 U32 busNo;
407 U32 devNo;
408 ULTRA_SEGMENT_STATE state;
409 u8 reserved[6]; /* Natural alignment purposes */
410 } deviceChangeStateEvent; /* for CONTROLVM_DEVICE_CHANGESTATE_EVENT */
411 struct {
412 U32 busCount; /*< indicates the max number of busses */
413 U32 switchCount; /*< indicates the max number of
414 * switches (applicable for service
415 * partition only) */
416 ULTRA_CHIPSET_FEATURE features;
417 U32 platformNumber; /* Platform Number */
418 } initChipset; /* for CONTROLVM_CHIPSET_INIT */
419 struct {
420 U32 Options; /*< reserved */
421 U32 Test; /*< bit 0 set to run embedded selftest */
422 } chipsetSelftest; /* for CONTROLVM_CHIPSET_SELFTEST */
423
424 /* END Request messages */
425
426 /* BEGIN Response messages */
427
428 /* END Response messages */
429
430 /* BEGIN Event messages */
431
432 /* END Event messages */
433
434 /* BEGIN Ack messages */
435
436 /* END Ack messages */
437 U64 addr; /*< a physical address of something, that
438 * can be dereferenced by the receiver of
439 * this ControlVm command (depends on
440 * command id) */
441 U64 handle; /*< a handle of something (depends on
442 * command id) */
443 };
444 } CONTROLVM_MESSAGE_PACKET;
445
446 /* All messages in any ControlVm queue have this layout. */
447 typedef struct _CONTROLVM_MESSAGE {
448 CONTROLVM_MESSAGE_HEADER hdr;
449 CONTROLVM_MESSAGE_PACKET cmd;
450 } CONTROLVM_MESSAGE;
451
452 typedef struct _DEVICE_MAP {
453 GUEST_PHYSICAL_ADDRESS DeviceChannelAddress;
454 U64 DeviceChannelSize;
455 U32 CA_Index;
456 U32 Reserved; /* natural alignment */
457 U64 Reserved2; /* Align structure on 32-byte boundary */
458 } DEVICE_MAP;
459
460 typedef struct _GUEST_DEVICES {
461 DEVICE_MAP VideoChannel;
462 DEVICE_MAP KeyboardChannel;
463 DEVICE_MAP NetworkChannel;
464 DEVICE_MAP StorageChannel;
465 DEVICE_MAP ConsoleChannel;
466 U32 PartitionIndex;
467 U32 Pad;
468 } GUEST_DEVICES;
469
470 typedef struct _ULTRA_CONTROLVM_CHANNEL_PROTOCOL {
471 CHANNEL_HEADER Header;
472 GUEST_PHYSICAL_ADDRESS gpControlVm; /* guest physical address of
473 * this channel */
474 GUEST_PHYSICAL_ADDRESS gpPartitionTables; /* guest physical address of
475 * partition tables */
476 GUEST_PHYSICAL_ADDRESS gpDiagGuest; /* guest physical address of
477 * diagnostic channel */
478 GUEST_PHYSICAL_ADDRESS gpBootRomDisk; /* guest phys addr of (read
479 * only) Boot ROM disk */
480 GUEST_PHYSICAL_ADDRESS gpBootRamDisk; /* guest phys addr of writable
481 * Boot RAM disk */
482 GUEST_PHYSICAL_ADDRESS gpAcpiTable; /* guest phys addr of acpi
483 * table */
484 GUEST_PHYSICAL_ADDRESS gpControlChannel; /* guest phys addr of control
485 * channel */
486 GUEST_PHYSICAL_ADDRESS gpDiagRomDisk; /* guest phys addr of diagnostic
487 * ROM disk */
488 GUEST_PHYSICAL_ADDRESS gpNvram; /* guest phys addr of NVRAM
489 * channel */
490 U64 RequestPayloadOffset; /* Offset to request payload area */
491 U64 EventPayloadOffset; /* Offset to event payload area */
492 U32 RequestPayloadBytes; /* Bytes available in request payload
493 * area */
494 U32 EventPayloadBytes; /* Bytes available in event payload area */
495 U32 ControlChannelBytes;
496 U32 NvramChannelBytes; /* Bytes in PartitionNvram segment */
497 U32 MessageBytes; /* sizeof(CONTROLVM_MESSAGE) */
498 U32 MessageCount; /* CONTROLVM_MESSAGE_MAX */
499 GUEST_PHYSICAL_ADDRESS gpSmbiosTable; /* guest phys addr of SMBIOS
500 * tables */
501 GUEST_PHYSICAL_ADDRESS gpPhysicalSmbiosTable; /* guest phys addr of
502 * SMBIOS table */
503 /* ULTRA_MAX_GUESTS_PER_SERVICE */
504 GUEST_DEVICES gpObsoleteGuestDevices[16];
505
506 /* guest physical address of EFI firmware image base */
507 GUEST_PHYSICAL_ADDRESS VirtualGuestFirmwareImageBase;
508
509 /* guest physical address of EFI firmware entry point */
510 GUEST_PHYSICAL_ADDRESS VirtualGuestFirmwareEntryPoint;
511
512 /* guest EFI firmware image size */
513 U64 VirtualGuestFirmwareImageSize;
514
515 /* GPA = 1MB where EFI firmware image is copied to */
516 GUEST_PHYSICAL_ADDRESS VirtualGuestFirmwareBootBase;
517 GUEST_PHYSICAL_ADDRESS VirtualGuestImageBase;
518 GUEST_PHYSICAL_ADDRESS VirtualGuestImageSize;
519 U64 PrototypeControlChannelOffset;
520 GUEST_PHYSICAL_ADDRESS VirtualGuestPartitionHandle;
521
522 U16 RestoreAction; /* Restore Action field to restore the guest
523 * partition */
524 U16 DumpAction; /* For Windows guests it shows if the visordisk
525 * is running in dump mode */
526 U16 NvramFailCount;
527 U16 SavedCrashMsgCount; /* = CONTROLVM_CRASHMSG_MAX */
528 U32 SavedCrashMsgOffset; /* Offset to request payload area needed
529 * for crash dump */
530 U32 InstallationError; /* Type of error encountered during
531 * installation */
532 U32 InstallationTextId; /* Id of string to display */
533 U16 InstallationRemainingSteps; /* Number of remaining installation
534 * steps (for progress bars) */
535 u8 ToolAction; /* ULTRA_TOOL_ACTIONS Installation Action
536 * field */
537 u8 Reserved; /* alignment */
538 ULTRA_EFI_SPAR_INDICATION EfiSparIndication;
539 ULTRA_EFI_SPAR_INDICATION EfiSparIndicationSupported;
540 U32 SPReserved;
541 u8 Reserved2[28]; /* Force signals to begin on 128-byte cache
542 * line */
543 SIGNAL_QUEUE_HEADER RequestQueue; /* Service or guest partition
544 * uses this queue to send
545 * requests to Control */
546 SIGNAL_QUEUE_HEADER ResponseQueue; /* Control uses this queue to
547 * respond to service or guest
548 * partition requests */
549 SIGNAL_QUEUE_HEADER EventQueue; /* Control uses this queue to
550 * send events to service or
551 * guest partition */
552 SIGNAL_QUEUE_HEADER EventAckQueue; /* Service or guest partition
553 * uses this queue to ack
554 * Control events */
555
556 /* Request fixed-size message pool - does not include payload */
557 CONTROLVM_MESSAGE RequestMsg[CONTROLVM_MESSAGE_MAX];
558
559 /* Response fixed-size message pool - does not include payload */
560 CONTROLVM_MESSAGE ResponseMsg[CONTROLVM_MESSAGE_MAX];
561
562 /* Event fixed-size message pool - does not include payload */
563 CONTROLVM_MESSAGE EventMsg[CONTROLVM_MESSAGE_MAX];
564
565 /* Ack fixed-size message pool - does not include payload */
566 CONTROLVM_MESSAGE EventAckMsg[CONTROLVM_MESSAGE_MAX];
567
568 /* Message stored during IOVM creation to be reused after crash */
569 CONTROLVM_MESSAGE SavedCrashMsg[CONTROLVM_CRASHMSG_MAX];
570 } ULTRA_CONTROLVM_CHANNEL_PROTOCOL;
571
572 /* Offsets for VM channel attributes... */
573 #define VM_CH_REQ_QUEUE_OFFSET \
574 offsetof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL, RequestQueue)
575 #define VM_CH_RESP_QUEUE_OFFSET \
576 offsetof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL, ResponseQueue)
577 #define VM_CH_EVENT_QUEUE_OFFSET \
578 offsetof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL, EventQueue)
579 #define VM_CH_ACK_QUEUE_OFFSET \
580 offsetof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL, EventAckQueue)
581 #define VM_CH_REQ_MSG_OFFSET \
582 offsetof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL, RequestMsg)
583 #define VM_CH_RESP_MSG_OFFSET \
584 offsetof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL, ResponseMsg)
585 #define VM_CH_EVENT_MSG_OFFSET \
586 offsetof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL, EventMsg)
587 #define VM_CH_ACK_MSG_OFFSET \
588 offsetof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL, EventAckMsg)
589 #define VM_CH_CRASH_MSG_OFFSET \
590 offsetof(ULTRA_CONTROLVM_CHANNEL_PROTOCOL, SavedCrashMsg)
591
592 /* The following header will be located at the beginning of PayloadVmOffset for
593 * various ControlVm commands. The receiver of a ControlVm command with a
594 * PayloadVmOffset will dereference this address and then use ConnectionOffset,
595 * InitiatorOffset, and TargetOffset to get the location of UTF-8 formatted
596 * strings that can be parsed to obtain command-specific information. The value
597 * of TotalLength should equal PayloadBytes. The format of the strings at
598 * PayloadVmOffset will take different forms depending on the message. See the
599 * following Wiki page for more information:
600 * https://ustr-linux-1.na.uis.unisys.com/spar/index.php/ControlVm_Parameters_Area
601 */
602 typedef struct _ULTRA_CONTROLVM_PARAMETERS_HEADER {
603 U32 TotalLength;
604 U32 HeaderLength;
605 U32 ConnectionOffset;
606 U32 ConnectionLength;
607 U32 InitiatorOffset;
608 U32 InitiatorLength;
609 U32 TargetOffset;
610 U32 TargetLength;
611 U32 ClientOffset;
612 U32 ClientLength;
613 U32 NameOffset;
614 U32 NameLength;
615 uuid_le Id;
616 U32 Revision;
617 U32 Reserved; /* Natural alignment */
618 } ULTRA_CONTROLVM_PARAMETERS_HEADER;
619
620 #endif /* __CONTROLVMCHANNEL_H__ */