Commit | Line | Data |
---|---|---|
6f14cc18 | 1 | /* Copyright (C) 2010 - 2015 UNISYS CORPORATION |
12e364b9 KC |
2 | * All rights reserved. |
3 | * | |
6f14cc18 BR |
4 | * This program is free software; you can redistribute it and/or modify it |
5 | * under the terms and conditions of the GNU General Public License, | |
6 | * version 2, as published by the Free Software Foundation. | |
12e364b9 KC |
7 | * |
8 | * This program is distributed in the hope that it will be useful, but | |
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | |
11 | * NON INFRINGEMENT. See the GNU General Public License for more | |
12 | * details. | |
13 | */ | |
14 | ||
15 | #ifndef __CONTROLVMCHANNEL_H__ | |
16 | #define __CONTROLVMCHANNEL_H__ | |
17 | ||
90addb02 | 18 | #include <linux/uuid.h> |
12e364b9 | 19 | #include "channel.h" |
af96e9c0 | 20 | |
12e364b9 | 21 | /* {2B3C2D10-7EF5-4ad8-B966-3448B7386B3D} */ |
5fbaa4b3 | 22 | #define SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID \ |
90addb02 | 23 | UUID_LE(0x2b3c2d10, 0x7ef5, 0x4ad8, \ |
7e5a1a76 | 24 | 0xb9, 0x66, 0x34, 0x48, 0xb7, 0x38, 0x6b, 0x3d) |
12e364b9 | 25 | |
12e364b9 KC |
26 | #define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE \ |
27 | ULTRA_CHANNEL_PROTOCOL_SIGNATURE | |
7e5a1a76 | 28 | #define CONTROLVM_MESSAGE_MAX 64 |
12e364b9 KC |
29 | |
30 | /* Must increment this whenever you insert or delete fields within | |
7e5a1a76 EA |
31 | * this channel struct. Also increment whenever you change the meaning |
32 | * of fields within this channel struct so as to break pre-existing | |
33 | * software. Note that you can usually add fields to the END of the | |
34 | * channel struct withOUT needing to increment this. | |
35 | */ | |
12e364b9 KC |
36 | #define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID 1 |
37 | ||
600832fd BR |
38 | #define SPAR_CONTROLVM_CHANNEL_OK_CLIENT(ch) \ |
39 | spar_check_channel_client(ch, \ | |
df94247a | 40 | SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID, \ |
d19642f6 BR |
41 | "controlvm", \ |
42 | sizeof(struct spar_controlvm_channel_protocol), \ | |
43 | ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID, \ | |
44 | ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE) | |
12e364b9 | 45 | |
12e364b9 KC |
46 | #define MAX_SERIAL_NUM 32 |
47 | ||
7e5a1a76 | 48 | /* Defines for various channel queues */ |
12e364b9 KC |
49 | #define CONTROLVM_QUEUE_REQUEST 0 |
50 | #define CONTROLVM_QUEUE_RESPONSE 1 | |
7e5a1a76 | 51 | #define CONTROLVM_QUEUE_EVENT 2 |
12e364b9 KC |
52 | #define CONTROLVM_QUEUE_ACK 3 |
53 | ||
7e5a1a76 | 54 | /* Max num of messages stored during IOVM creation to be reused after crash */ |
12e364b9 KC |
55 | #define CONTROLVM_CRASHMSG_MAX 2 |
56 | ||
389f5592 | 57 | struct spar_segment_state { |
1e3ab521 EA |
58 | /* Bit 0: May enter other states */ |
59 | u16 enabled:1; | |
60 | /* Bit 1: Assigned to active partition */ | |
61 | u16 active:1; | |
62 | /* Bit 2: Configure message sent to service/server */ | |
63 | u16 alive:1; | |
64 | /* Bit 3: similar to partition state ShuttingDown */ | |
65 | u16 revoked:1; | |
66 | /* Bit 4: memory (device/port number) has been selected by Command */ | |
67 | u16 allocated:1; | |
68 | /* Bit 5: has been introduced to the service/guest partition */ | |
69 | u16 known:1; | |
70 | /* Bit 6: service/Guest partition has responded to introduction */ | |
71 | u16 ready:1; | |
72 | /* Bit 7: resource is configured and operating */ | |
73 | u16 operating:1; | |
74 | /* Note: don't use high bit unless we need to switch to ushort | |
75 | * which is non-compliant | |
76 | */ | |
389f5592 DK |
77 | }; |
78 | ||
79 | static const struct spar_segment_state segment_state_running = { | |
80 | 1, 1, 1, 0, 1, 1, 1, 1 | |
81 | }; | |
82 | ||
83 | static const struct spar_segment_state segment_state_paused = { | |
84 | 1, 1, 1, 0, 1, 1, 1, 0 | |
85 | }; | |
86 | ||
87 | static const struct spar_segment_state segment_state_standby = { | |
88 | 1, 1, 0, 0, 1, 1, 1, 0 | |
89 | }; | |
90 | ||
7e5a1a76 | 91 | /* Ids for commands that may appear in either queue of a ControlVm channel. |
12e364b9 KC |
92 | * |
93 | * Commands that are initiated by the command partition (CP), by an IO or | |
94 | * console service partition (SP), or by a guest partition (GP)are: | |
95 | * - issued on the RequestQueue queue (q #0) in the ControlVm channel | |
96 | * - responded to on the ResponseQueue queue (q #1) in the ControlVm channel | |
97 | * | |
98 | * Events that are initiated by an IO or console service partition (SP) or | |
99 | * by a guest partition (GP) are: | |
100 | * - issued on the EventQueue queue (q #2) in the ControlVm channel | |
101 | * - responded to on the EventAckQueue queue (q #3) in the ControlVm channel | |
102 | */ | |
53bebb13 | 103 | enum controlvm_id { |
12e364b9 | 104 | CONTROLVM_INVALID = 0, |
7e5a1a76 EA |
105 | /* SWITCH commands required Parameter: SwitchNumber */ |
106 | /* BUS commands required Parameter: BusNumber */ | |
107 | CONTROLVM_BUS_CREATE = 0x101, /* CP --> SP, GP */ | |
108 | CONTROLVM_BUS_DESTROY = 0x102, /* CP --> SP, GP */ | |
109 | CONTROLVM_BUS_CONFIGURE = 0x104, /* CP --> SP */ | |
110 | CONTROLVM_BUS_CHANGESTATE = 0x105, /* CP --> SP, GP */ | |
111 | CONTROLVM_BUS_CHANGESTATE_EVENT = 0x106, /* SP, GP --> CP */ | |
112 | /* DEVICE commands required Parameter: BusNumber, DeviceNumber */ | |
113 | ||
114 | CONTROLVM_DEVICE_CREATE = 0x201, /* CP --> SP, GP */ | |
115 | CONTROLVM_DEVICE_DESTROY = 0x202, /* CP --> SP, GP */ | |
116 | CONTROLVM_DEVICE_CONFIGURE = 0x203, /* CP --> SP */ | |
117 | CONTROLVM_DEVICE_CHANGESTATE = 0x204, /* CP --> SP, GP */ | |
118 | CONTROLVM_DEVICE_CHANGESTATE_EVENT = 0x205, /* SP, GP --> CP */ | |
119 | CONTROLVM_DEVICE_RECONFIGURE = 0x206, /* CP --> Boot */ | |
12e364b9 | 120 | /* CHIPSET commands */ |
7e5a1a76 EA |
121 | CONTROLVM_CHIPSET_INIT = 0x301, /* CP --> SP, GP */ |
122 | CONTROLVM_CHIPSET_STOP = 0x302, /* CP --> SP, GP */ | |
7e5a1a76 EA |
123 | CONTROLVM_CHIPSET_READY = 0x304, /* CP --> SP */ |
124 | CONTROLVM_CHIPSET_SELFTEST = 0x305, /* CP --> SP */ | |
12e364b9 | 125 | |
d8ad8b0c | 126 | }; |
12e364b9 | 127 | |
4eddbf13 | 128 | struct irq_info { |
22a0350b | 129 | u64 reserved1; |
12e364b9 | 130 | |
7e5a1a76 | 131 | /* specifies interrupt handle. It is used to retrieve the |
12e364b9 KC |
132 | * corresponding interrupt pin from Monitor; and the |
133 | * interrupt pin is used to connect to the corresponding | |
7e5a1a76 EA |
134 | * interrupt. Used by IOPart-GP only. |
135 | */ | |
af3286bd | 136 | u64 recv_irq_handle; |
12e364b9 | 137 | |
7e5a1a76 | 138 | /* specifies interrupt vector. It, interrupt pin, and shared are |
12e364b9 | 139 | * used to connect to the corresponding interrupt. Used by |
7e5a1a76 EA |
140 | * IOPart-GP only. |
141 | */ | |
af3286bd | 142 | u32 recv_irq_vector; |
12e364b9 | 143 | |
7e5a1a76 EA |
144 | /* specifies if the recvInterrupt is shared. It, interrupt pin |
145 | * and vector are used to connect to 0 = not shared; 1 = shared. | |
146 | * the corresponding interrupt. Used by IOPart-GP only. | |
147 | */ | |
af3286bd | 148 | u8 recv_irq_shared; |
c242233e | 149 | u8 reserved[3]; /* Natural alignment purposes */ |
12e364b9 KC |
150 | }; |
151 | ||
c12ad837 | 152 | struct pci_id { |
6822f736 BR |
153 | u16 domain; |
154 | u8 bus; | |
155 | u8 slot; | |
156 | u8 func; | |
157 | u8 reserved[3]; /* Natural alignment purposes */ | |
12e364b9 KC |
158 | }; |
159 | ||
755e2ecc | 160 | struct efi_spar_indication { |
7e5a1a76 EA |
161 | u64 boot_to_fw_ui:1; /* Bit 0: Stop in uefi ui */ |
162 | u64 clear_nvram:1; /* Bit 1: Clear NVRAM */ | |
163 | u64 clear_cmos:1; /* Bit 2: Clear CMOS */ | |
164 | u64 boot_to_tool:1; /* Bit 3: Run install tool */ | |
12e364b9 | 165 | /* remaining bits are available */ |
755e2ecc | 166 | }; |
12e364b9 | 167 | |
b9b141e8 | 168 | enum ultra_chipset_feature { |
12e364b9 KC |
169 | ULTRA_CHIPSET_FEATURE_REPLY = 0x00000001, |
170 | ULTRA_CHIPSET_FEATURE_PARA_HOTPLUG = 0x00000002, | |
b9b141e8 | 171 | }; |
12e364b9 | 172 | |
7e5a1a76 | 173 | /* This is the common structure that is at the beginning of every |
12e364b9 KC |
174 | * ControlVm message (both commands and responses) in any ControlVm |
175 | * queue. Commands are easily distinguished from responses by | |
176 | * looking at the flags.response field. | |
177 | */ | |
98d7b594 BR |
178 | struct controlvm_message_header { |
179 | u32 id; /* See CONTROLVM_ID. */ | |
12e364b9 KC |
180 | /* For requests, indicates the message type. */ |
181 | /* For responses, indicates the type of message we are responding to. */ | |
182 | ||
1e3ab521 EA |
183 | /* Includes size of this struct + size of message */ |
184 | u32 message_size; | |
185 | /* Index of segment containing Vm message/information */ | |
186 | u32 segment_index; | |
187 | /* Error status code or result of message completion */ | |
188 | u32 completion_status; | |
12e364b9 | 189 | struct { |
1e3ab521 EA |
190 | /* =1 in a response to signify failure */ |
191 | u32 failed:1; | |
192 | /* =1 in all messages that expect a response */ | |
193 | u32 response_expected:1; | |
194 | /* =1 in all bus & device-related messages where the message | |
195 | * receiver is to act as the bus or device server | |
196 | */ | |
197 | u32 server:1; | |
198 | /* =1 for testing use only (Control and Command ignore this */ | |
199 | u32 test_message:1; | |
200 | /* =1 if there are forthcoming responses/acks associated | |
201 | * with this message | |
202 | */ | |
203 | u32 partial_completion:1; | |
204 | /* =1 this is to let us know to preserve channel contents */ | |
205 | u32 preserve:1; | |
206 | /* =1 the DiagWriter is active in the Diagnostic Partition */ | |
207 | u32 writer_in_diag:1; | |
98d7b594 | 208 | } flags; |
1e3ab521 EA |
209 | /* Natural alignment */ |
210 | u32 reserved; | |
211 | /* Identifies the particular message instance */ | |
212 | u64 message_handle; | |
12e364b9 | 213 | /* request instances with the corresponding response instance. */ |
1e3ab521 EA |
214 | /* Offset of payload area from start of this instance */ |
215 | u64 payload_vm_offset; | |
216 | /* Maximum bytes allocated in payload area of ControlVm segment */ | |
217 | u32 payload_max_bytes; | |
218 | /* Actual number of bytes of payload area to copy between IO/Command */ | |
219 | u32 payload_bytes; | |
12e364b9 | 220 | /* if non-zero, there is a payload to copy. */ |
98d7b594 | 221 | }; |
12e364b9 | 222 | |
f91b9262 | 223 | struct controlvm_packet_device_create { |
7e5a1a76 EA |
224 | u32 bus_no; /* bus # (0..n-1) from the msg receiver's end */ |
225 | u32 dev_no; /* bus-relative (0..n-1) device number */ | |
1e3ab521 EA |
226 | /* Guest physical address of the channel, which can be dereferenced by |
227 | * the receiver of this ControlVm command | |
228 | */ | |
229 | u64 channel_addr; | |
f91b9262 BR |
230 | u64 channel_bytes; /* specifies size of the channel in bytes */ |
231 | uuid_le data_type_uuid; /* specifies format of data in channel */ | |
232 | uuid_le dev_inst_uuid; /* instance guid for the device */ | |
233 | struct irq_info intr; /* specifies interrupt information */ | |
234 | }; /* for CONTROLVM_DEVICE_CREATE */ | |
12e364b9 | 235 | |
e6ad00bb | 236 | struct controlvm_packet_device_configure { |
1e3ab521 EA |
237 | /* bus # (0..n-1) from the msg receiver's perspective */ |
238 | u32 bus_no; | |
7e5a1a76 EA |
239 | /* Control uses header SegmentIndex field to access bus number... */ |
240 | u32 dev_no; /* bus-relative (0..n-1) device number */ | |
e6ad00bb | 241 | } ; /* for CONTROLVM_DEVICE_CONFIGURE */ |
12e364b9 | 242 | |
c36acb55 BR |
243 | struct controlvm_message_device_create { |
244 | struct controlvm_message_header header; | |
245 | struct controlvm_packet_device_create packet; | |
246 | }; /* total 128 bytes */ | |
12e364b9 | 247 | |
f676054d BR |
248 | struct controlvm_message_device_configure { |
249 | struct controlvm_message_header header; | |
250 | struct controlvm_packet_device_configure packet; | |
251 | }; /* total 56 bytes */ | |
12e364b9 KC |
252 | |
253 | /* This is the format for a message in any ControlVm queue. */ | |
2ea5117b | 254 | struct controlvm_message_packet { |
12e364b9 | 255 | union { |
12e364b9 | 256 | struct { |
1e3ab521 EA |
257 | /* bus # (0..n-1) from the msg receiver's perspective */ |
258 | u32 bus_no; | |
259 | /* indicates the max number of devices on this bus */ | |
260 | u32 dev_count; | |
261 | /* Guest physical address of the channel, which can be | |
262 | * dereferenced by the receiver of this ControlVm command | |
263 | */ | |
264 | u64 channel_addr; | |
2ea5117b | 265 | u64 channel_bytes; /* size of the channel */ |
1e3ab521 EA |
266 | /* indicates format of data in bus channel*/ |
267 | uuid_le bus_data_type_uuid; | |
2ea5117b BR |
268 | uuid_le bus_inst_uuid; /* instance uuid for the bus */ |
269 | } create_bus; /* for CONTROLVM_BUS_CREATE */ | |
12e364b9 | 270 | struct { |
1e3ab521 EA |
271 | /* bus # (0..n-1) from the msg receiver's perspective */ |
272 | u32 bus_no; | |
b3c55b13 | 273 | u32 reserved; /* Natural alignment purposes */ |
2ea5117b | 274 | } destroy_bus; /* for CONTROLVM_BUS_DESTROY */ |
12e364b9 | 275 | struct { |
1e3ab521 EA |
276 | /* bus # (0..n-1) from the receiver's perspective */ |
277 | u32 bus_no; | |
2ea5117b | 278 | u32 reserved1; /* for alignment purposes */ |
1e3ab521 EA |
279 | /* This is used to convert guest physical address to physical address */ |
280 | u64 guest_handle; | |
2ea5117b BR |
281 | u64 recv_bus_irq_handle; |
282 | /* specifies interrupt info. It is used by SP | |
283 | * to register to receive interrupts from the | |
284 | * CP. This interrupt is used for bus level | |
285 | * notifications. The corresponding | |
1e3ab521 EA |
286 | * sendBusInterruptHandle is kept in CP. |
287 | */ | |
2ea5117b | 288 | } configure_bus; /* for CONTROLVM_BUS_CONFIGURE */ |
12e364b9 | 289 | /* for CONTROLVM_DEVICE_CREATE */ |
f91b9262 | 290 | struct controlvm_packet_device_create create_device; |
12e364b9 | 291 | struct { |
1e3ab521 EA |
292 | /* bus # (0..n-1) from the msg receiver's perspective */ |
293 | u32 bus_no; | |
2ea5117b BR |
294 | u32 dev_no; /* bus-relative (0..n-1) device # */ |
295 | } destroy_device; /* for CONTROLVM_DEVICE_DESTROY */ | |
12e364b9 | 296 | /* for CONTROLVM_DEVICE_CONFIGURE */ |
e6ad00bb | 297 | struct controlvm_packet_device_configure configure_device; |
12e364b9 | 298 | struct { |
1e3ab521 EA |
299 | /* bus # (0..n-1) from the msg receiver's perspective */ |
300 | u32 bus_no; | |
2ea5117b BR |
301 | u32 dev_no; /* bus-relative (0..n-1) device # */ |
302 | } reconfigure_device; /* for CONTROLVM_DEVICE_RECONFIGURE */ | |
12e364b9 | 303 | struct { |
2ea5117b | 304 | u32 bus_no; |
3f833b54 | 305 | struct spar_segment_state state; |
c242233e | 306 | u8 reserved[2]; /* Natural alignment purposes */ |
2ea5117b | 307 | } bus_change_state; /* for CONTROLVM_BUS_CHANGESTATE */ |
12e364b9 | 308 | struct { |
2ea5117b BR |
309 | u32 bus_no; |
310 | u32 dev_no; | |
3f833b54 | 311 | struct spar_segment_state state; |
12e364b9 | 312 | struct { |
1e3ab521 EA |
313 | /* =1 if message is for a physical device */ |
314 | u32 phys_device:1; | |
12e364b9 | 315 | } flags; |
c242233e | 316 | u8 reserved[2]; /* Natural alignment purposes */ |
2ea5117b | 317 | } device_change_state; /* for CONTROLVM_DEVICE_CHANGESTATE */ |
12e364b9 | 318 | struct { |
2ea5117b BR |
319 | u32 bus_no; |
320 | u32 dev_no; | |
3f833b54 | 321 | struct spar_segment_state state; |
c242233e | 322 | u8 reserved[6]; /* Natural alignment purposes */ |
2ea5117b BR |
323 | } device_change_state_event; |
324 | /* for CONTROLVM_DEVICE_CHANGESTATE_EVENT */ | |
12e364b9 | 325 | struct { |
1e3ab521 EA |
326 | /* indicates the max number of busses */ |
327 | u32 bus_count; | |
328 | /* indicates the max number of switches */ | |
329 | u32 switch_count; | |
b9b141e8 | 330 | enum ultra_chipset_feature features; |
2ea5117b BR |
331 | u32 platform_number; /* Platform Number */ |
332 | } init_chipset; /* for CONTROLVM_CHIPSET_INIT */ | |
12e364b9 | 333 | struct { |
2ea5117b BR |
334 | u32 options; /* reserved */ |
335 | u32 test; /* bit 0 set to run embedded selftest */ | |
336 | } chipset_selftest; /* for CONTROLVM_CHIPSET_SELFTEST */ | |
1e3ab521 EA |
337 | /* a physical address of something, that can be dereferenced |
338 | * by the receiver of this ControlVm command | |
339 | */ | |
340 | u64 addr; | |
341 | /* a handle of something (depends on command id) */ | |
342 | u64 handle; | |
12e364b9 | 343 | }; |
2ea5117b | 344 | }; |
12e364b9 KC |
345 | |
346 | /* All messages in any ControlVm queue have this layout. */ | |
3ab47701 | 347 | struct controlvm_message { |
98d7b594 | 348 | struct controlvm_message_header hdr; |
2ea5117b | 349 | struct controlvm_message_packet cmd; |
3ab47701 | 350 | }; |
12e364b9 | 351 | |
d19642f6 | 352 | struct spar_controlvm_channel_protocol { |
7e5a1a76 EA |
353 | struct channel_header header; |
354 | u64 gp_controlvm; /* guest phys addr of this channel */ | |
355 | u64 gp_partition_tables;/* guest phys addr of partition tables */ | |
356 | u64 gp_diag_guest; /* guest phys addr of diagnostic channel */ | |
357 | u64 gp_boot_romdisk;/* guest phys addr of (read* only) Boot ROM disk */ | |
358 | u64 gp_boot_ramdisk;/* guest phys addr of writable Boot RAM disk */ | |
359 | u64 gp_acpi_table; /* guest phys addr of acpi table */ | |
360 | u64 gp_control_channel;/* guest phys addr of control channel */ | |
361 | u64 gp_diag_romdisk;/* guest phys addr of diagnostic ROM disk */ | |
362 | u64 gp_nvram; /* guest phys addr of NVRAM channel */ | |
363 | u64 request_payload_offset; /* Offset to request payload area */ | |
364 | u64 event_payload_offset; /* Offset to event payload area */ | |
1e3ab521 EA |
365 | /* Bytes available in request payload area */ |
366 | u32 request_payload_bytes; | |
7e5a1a76 EA |
367 | u32 event_payload_bytes;/* Bytes available in event payload area */ |
368 | u32 control_channel_bytes; | |
369 | u32 nvram_channel_bytes; /* Bytes in PartitionNvram segment */ | |
370 | u32 message_bytes; /* sizeof(CONTROLVM_MESSAGE) */ | |
371 | u32 message_count; /* CONTROLVM_MESSAGE_MAX */ | |
372 | u64 gp_smbios_table; /* guest phys addr of SMBIOS tables */ | |
373 | u64 gp_physical_smbios_table; /* guest phys addr of SMBIOS table */ | |
374 | /* ULTRA_MAX_GUESTS_PER_SERVICE */ | |
680385e3 | 375 | char gp_reserved[2688]; |
7e5a1a76 EA |
376 | |
377 | /* guest physical address of EFI firmware image base */ | |
378 | u64 virtual_guest_firmware_image_base; | |
379 | ||
380 | /* guest physical address of EFI firmware entry point */ | |
381 | u64 virtual_guest_firmware_entry_point; | |
382 | ||
383 | /* guest EFI firmware image size */ | |
384 | u64 virtual_guest_firmware_image_size; | |
385 | ||
386 | /* GPA = 1MB where EFI firmware image is copied to */ | |
387 | u64 virtual_guest_firmware_boot_base; | |
388 | u64 virtual_guest_image_base; | |
389 | u64 virtual_guest_image_size; | |
390 | u64 prototype_control_channel_offset; | |
391 | u64 virtual_guest_partition_handle; | |
1e3ab521 EA |
392 | /* Restore Action field to restore the guest partition */ |
393 | u16 restore_action; | |
394 | /* For Windows guests it shows if the visordisk is in dump mode */ | |
395 | u16 dump_action; | |
d19642f6 BR |
396 | u16 nvram_fail_count; |
397 | u16 saved_crash_message_count; /* = CONTROLVM_CRASHMSG_MAX */ | |
1e3ab521 EA |
398 | /* Offset to request payload area needed for crash dump */ |
399 | u32 saved_crash_message_offset; | |
400 | /* Type of error encountered during installation */ | |
401 | u32 installation_error; | |
d19642f6 | 402 | u32 installation_text_id; /* Id of string to display */ |
1e3ab521 EA |
403 | /* Number of remaining installation steps (for progress bars) */ |
404 | u16 installation_remaining_steps; | |
405 | /* ULTRA_TOOL_ACTIONS Installation Action field */ | |
406 | u8 tool_action; | |
d19642f6 BR |
407 | u8 reserved; /* alignment */ |
408 | struct efi_spar_indication efi_spar_ind; | |
409 | struct efi_spar_indication efi_spar_ind_supported; | |
410 | u32 sp_reserved; | |
1e3ab521 EA |
411 | /* Force signals to begin on 128-byte cache line */ |
412 | u8 reserved2[28]; | |
413 | /* guest partition uses this queue to send requests to Control */ | |
414 | struct signal_queue_header request_queue; | |
415 | /* Control uses this queue to respond to service or guest | |
416 | * partition requests | |
417 | */ | |
418 | struct signal_queue_header response_queue; | |
419 | /* Control uses this queue to send events to guest partition */ | |
420 | struct signal_queue_header event_queue; | |
421 | /* Service or guest partition uses this queue to ack Control events */ | |
422 | struct signal_queue_header event_ack_queue; | |
12e364b9 | 423 | /* Request fixed-size message pool - does not include payload */ |
d19642f6 | 424 | struct controlvm_message request_msg[CONTROLVM_MESSAGE_MAX]; |
12e364b9 KC |
425 | |
426 | /* Response fixed-size message pool - does not include payload */ | |
d19642f6 | 427 | struct controlvm_message response_msg[CONTROLVM_MESSAGE_MAX]; |
12e364b9 KC |
428 | |
429 | /* Event fixed-size message pool - does not include payload */ | |
d19642f6 | 430 | struct controlvm_message event_msg[CONTROLVM_MESSAGE_MAX]; |
12e364b9 KC |
431 | |
432 | /* Ack fixed-size message pool - does not include payload */ | |
d19642f6 | 433 | struct controlvm_message event_ack_msg[CONTROLVM_MESSAGE_MAX]; |
12e364b9 KC |
434 | |
435 | /* Message stored during IOVM creation to be reused after crash */ | |
d19642f6 BR |
436 | struct controlvm_message saved_crash_msg[CONTROLVM_CRASHMSG_MAX]; |
437 | }; | |
12e364b9 | 438 | |
7e5a1a76 | 439 | /* Offsets for VM channel attributes */ |
12e364b9 | 440 | #define VM_CH_REQ_QUEUE_OFFSET \ |
d19642f6 | 441 | offsetof(struct spar_controlvm_channel_protocol, request_queue) |
12e364b9 | 442 | #define VM_CH_RESP_QUEUE_OFFSET \ |
d19642f6 | 443 | offsetof(struct spar_controlvm_channel_protocol, response_queue) |
12e364b9 | 444 | #define VM_CH_EVENT_QUEUE_OFFSET \ |
d19642f6 | 445 | offsetof(struct spar_controlvm_channel_protocol, event_queue) |
12e364b9 | 446 | #define VM_CH_ACK_QUEUE_OFFSET \ |
d19642f6 | 447 | offsetof(struct spar_controlvm_channel_protocol, event_ack_queue) |
12e364b9 | 448 | #define VM_CH_REQ_MSG_OFFSET \ |
d19642f6 | 449 | offsetof(struct spar_controlvm_channel_protocol, request_msg) |
12e364b9 | 450 | #define VM_CH_RESP_MSG_OFFSET \ |
d19642f6 | 451 | offsetof(struct spar_controlvm_channel_protocol, response_msg) |
12e364b9 | 452 | #define VM_CH_EVENT_MSG_OFFSET \ |
d19642f6 | 453 | offsetof(struct spar_controlvm_channel_protocol, event_msg) |
12e364b9 | 454 | #define VM_CH_ACK_MSG_OFFSET \ |
d19642f6 | 455 | offsetof(struct spar_controlvm_channel_protocol, event_ack_msg) |
12e364b9 | 456 | #define VM_CH_CRASH_MSG_OFFSET \ |
d19642f6 | 457 | offsetof(struct spar_controlvm_channel_protocol, saved_crash_msg) |
12e364b9 KC |
458 | |
459 | /* The following header will be located at the beginning of PayloadVmOffset for | |
62420893 BR |
460 | * various ControlVm commands. The receiver of a ControlVm command with a |
461 | * PayloadVmOffset will dereference this address and then use connection_offset, | |
462 | * initiator_offset, and target_offset to get the location of UTF-8 formatted | |
463 | * strings that can be parsed to obtain command-specific information. The value | |
464 | * of total_length should equal PayloadBytes. The format of the strings at | |
465 | * PayloadVmOffset will take different forms depending on the message. | |
12e364b9 | 466 | */ |
62420893 BR |
467 | struct spar_controlvm_parameters_header { |
468 | u32 total_length; | |
469 | u32 header_length; | |
470 | u32 connection_offset; | |
471 | u32 connection_length; | |
472 | u32 initiator_offset; | |
473 | u32 initiator_length; | |
474 | u32 target_offset; | |
475 | u32 target_length; | |
476 | u32 client_offset; | |
477 | u32 client_length; | |
478 | u32 name_offset; | |
479 | u32 name_length; | |
480 | uuid_le id; | |
481 | u32 revision; | |
482 | u32 reserved; /* Natural alignment */ | |
483 | }; | |
12e364b9 | 484 | |
8a7a2fde DK |
485 | /* General Errors------------------------------------------------------[0-99] */ |
486 | #define CONTROLVM_RESP_SUCCESS 0 | |
487 | #define CONTROLVM_RESP_ERROR_ALREADY_DONE 1 | |
488 | #define CONTROLVM_RESP_ERROR_IOREMAP_FAILED 2 | |
489 | #define CONTROLVM_RESP_ERROR_KMALLOC_FAILED 3 | |
490 | #define CONTROLVM_RESP_ERROR_MESSAGE_ID_UNKNOWN 4 | |
491 | #define CONTROLVM_RESP_ERROR_MESSAGE_ID_INVALID_FOR_CLIENT 5 | |
492 | ||
493 | /* CONTROLVM_INIT_CHIPSET-------------------------------------------[100-199] */ | |
494 | #define CONTROLVM_RESP_ERROR_CLIENT_SWITCHCOUNT_NONZERO 100 | |
495 | #define CONTROLVM_RESP_ERROR_EXPECTED_CHIPSET_INIT 101 | |
496 | ||
497 | /* Maximum Limit----------------------------------------------------[200-299] */ | |
498 | #define CONTROLVM_RESP_ERROR_MAX_BUSES 201 /* BUS_CREATE */ | |
499 | #define CONTROLVM_RESP_ERROR_MAX_DEVICES 202 /* DEVICE_CREATE */ | |
500 | /* Payload and Parameter Related------------------------------------[400-499] */ | |
501 | #define CONTROLVM_RESP_ERROR_PAYLOAD_INVALID 400 /* SWITCH_ATTACHEXTPORT, | |
502 | * DEVICE_CONFIGURE | |
503 | */ | |
504 | #define CONTROLVM_RESP_ERROR_INITIATOR_PARAMETER_INVALID 401 /* Multiple */ | |
505 | #define CONTROLVM_RESP_ERROR_TARGET_PARAMETER_INVALID 402 /* DEVICE_CONFIGURE */ | |
506 | #define CONTROLVM_RESP_ERROR_CLIENT_PARAMETER_INVALID 403 /* DEVICE_CONFIGURE */ | |
507 | /* Specified[Packet Structure] Value-------------------------------[500-599] */ | |
508 | #define CONTROLVM_RESP_ERROR_BUS_INVALID 500 /* SWITCH_ATTACHINTPORT, | |
509 | * BUS_CONFIGURE, | |
510 | * DEVICE_CREATE, | |
511 | * DEVICE_CONFIG | |
512 | * DEVICE_DESTROY | |
513 | */ | |
514 | #define CONTROLVM_RESP_ERROR_DEVICE_INVALID 501 /* SWITCH_ATTACHINTPORT */ | |
515 | /* DEVICE_CREATE, | |
516 | * DEVICE_CONFIGURE, | |
517 | * DEVICE_DESTROY | |
518 | */ | |
519 | #define CONTROLVM_RESP_ERROR_CHANNEL_INVALID 502 /* DEVICE_CREATE, | |
520 | * DEVICE_CONFIGURE | |
521 | */ | |
522 | /* Partition Driver Callback Interface----------------------[600-699] */ | |
523 | #define CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_FAILURE 604 /* BUS_CREATE, | |
524 | * BUS_DESTROY, | |
525 | * DEVICE_CREATE, | |
526 | * DEVICE_DESTROY | |
527 | */ | |
528 | /* Unable to invoke VIRTPCI callback */ | |
529 | #define CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_CALLBACK_ERROR 605 | |
530 | /* BUS_CREATE, | |
531 | * BUS_DESTROY, | |
532 | * DEVICE_CREATE, | |
533 | * DEVICE_DESTROY | |
534 | */ | |
535 | /* VIRTPCI Callback returned error */ | |
536 | #define CONTROLVM_RESP_ERROR_GENERIC_DRIVER_CALLBACK_ERROR 606 | |
537 | /* SWITCH_ATTACHEXTPORT, | |
538 | * SWITCH_DETACHEXTPORT | |
539 | * DEVICE_CONFIGURE | |
540 | */ | |
541 | ||
542 | /* generic device callback returned error */ | |
543 | /* Bus Related------------------------------------------------------[700-799] */ | |
544 | #define CONTROLVM_RESP_ERROR_BUS_DEVICE_ATTACHED 700 /* BUS_DESTROY */ | |
545 | /* Channel Related--------------------------------------------------[800-899] */ | |
546 | #define CONTROLVM_RESP_ERROR_CHANNEL_TYPE_UNKNOWN 800 /* GET_CHANNELINFO, | |
547 | * DEVICE_DESTROY | |
548 | */ | |
549 | #define CONTROLVM_RESP_ERROR_CHANNEL_SIZE_TOO_SMALL 801 /* DEVICE_CREATE */ | |
550 | /* Chipset Shutdown Related---------------------------------------[1000-1099] */ | |
551 | #define CONTROLVM_RESP_ERROR_CHIPSET_SHUTDOWN_FAILED 1000 | |
552 | #define CONTROLVM_RESP_ERROR_CHIPSET_SHUTDOWN_ALREADY_ACTIVE 1001 | |
553 | ||
554 | /* Chipset Stop Related-------------------------------------------[1100-1199] */ | |
555 | #define CONTROLVM_RESP_ERROR_CHIPSET_STOP_FAILED_BUS 1100 | |
556 | #define CONTROLVM_RESP_ERROR_CHIPSET_STOP_FAILED_SWITCH 1101 | |
557 | ||
558 | /* Device Related-------------------------------------------------[1400-1499] */ | |
559 | #define CONTROLVM_RESP_ERROR_DEVICE_UDEV_TIMEOUT 1400 | |
560 | ||
12e364b9 | 561 | #endif /* __CONTROLVMCHANNEL_H__ */ |