root/drivers/visorbus/controlvmchannel.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Copyright (C) 2010 - 2015 UNISYS CORPORATION
   4  * All rights reserved.
   5  */
   6 
   7 #ifndef __CONTROLVMCHANNEL_H__
   8 #define __CONTROLVMCHANNEL_H__
   9 
  10 #include <linux/uuid.h>
  11 #include <linux/visorbus.h>
  12 
  13 /* {2B3C2D10-7EF5-4ad8-B966-3448B7386B3D} */
  14 #define VISOR_CONTROLVM_CHANNEL_GUID \
  15         GUID_INIT(0x2b3c2d10, 0x7ef5, 0x4ad8, \
  16                   0xb9, 0x66, 0x34, 0x48, 0xb7, 0x38, 0x6b, 0x3d)
  17 
  18 #define CONTROLVM_MESSAGE_MAX 64
  19 
  20 /*
  21  * Must increment this whenever you insert or delete fields within this channel
  22  * struct.  Also increment whenever you change the meaning of fields within this
  23  * channel struct so as to break pre-existing software. Note that you can
  24  * usually add fields to the END of the channel struct withOUT needing to
  25  * increment this.
  26  */
  27 #define VISOR_CONTROLVM_CHANNEL_VERSIONID 1
  28 
  29 /* Defines for various channel queues */
  30 #define CONTROLVM_QUEUE_REQUEST         0
  31 #define CONTROLVM_QUEUE_RESPONSE        1
  32 #define CONTROLVM_QUEUE_EVENT           2
  33 #define CONTROLVM_QUEUE_ACK             3
  34 
  35 /* Max num of messages stored during IOVM creation to be reused after crash */
  36 #define CONTROLVM_CRASHMSG_MAX 2
  37 
  38 /*
  39  * struct visor_segment_state
  40  * @enabled:   May enter other states.
  41  * @active:    Assigned to active partition.
  42  * @alive:     Configure message sent to service/server.
  43  * @revoked:   Similar to partition state ShuttingDown.
  44  * @allocated: Memory (device/port number) has been selected by Command.
  45  * @known:     Has been introduced to the service/guest partition.
  46  * @ready:     Service/Guest partition has responded to introduction.
  47  * @operating: Resource is configured and operating.
  48  * @reserved:  Natural alignment.
  49  *
  50  * Note: Don't use high bit unless we need to switch to ushort which is
  51  * non-compliant.
  52  */
  53 struct visor_segment_state  {
  54         u16 enabled:1;
  55         u16 active:1;
  56         u16 alive:1;
  57         u16 revoked:1;
  58         u16 allocated:1;
  59         u16 known:1;
  60         u16 ready:1;
  61         u16 operating:1;
  62         u16 reserved:8;
  63 } __packed;
  64 
  65 static const struct visor_segment_state segment_state_running = {
  66         1, 1, 1, 0, 1, 1, 1, 1
  67 };
  68 
  69 static const struct visor_segment_state segment_state_paused = {
  70         1, 1, 1, 0, 1, 1, 1, 0
  71 };
  72 
  73 static const struct visor_segment_state segment_state_standby = {
  74         1, 1, 0, 0, 1, 1, 1, 0
  75 };
  76 
  77 /*
  78  * enum controlvm_id
  79  * @CONTROLVM_INVALID:
  80  * @CONTROLVM_BUS_CREATE:               CP --> SP, GP.
  81  * @CONTROLVM_BUS_DESTROY:              CP --> SP, GP.
  82  * @CONTROLVM_BUS_CONFIGURE:            CP --> SP.
  83  * @CONTROLVM_BUS_CHANGESTATE:          CP --> SP, GP.
  84  * @CONTROLVM_BUS_CHANGESTATE_EVENT:    SP, GP --> CP.
  85  * @CONTROLVM_DEVICE_CREATE:            CP --> SP, GP.
  86  * @CONTROLVM_DEVICE_DESTROY:           CP --> SP, GP.
  87  * @CONTROLVM_DEVICE_CONFIGURE:         CP --> SP.
  88  * @CONTROLVM_DEVICE_CHANGESTATE:       CP --> SP, GP.
  89  * @CONTROLVM_DEVICE_CHANGESTATE_EVENT: SP, GP --> CP.
  90  * @CONTROLVM_DEVICE_RECONFIGURE:       CP --> Boot.
  91  * @CONTROLVM_CHIPSET_INIT:             CP --> SP, GP.
  92  * @CONTROLVM_CHIPSET_STOP:             CP --> SP, GP.
  93  * @CONTROLVM_CHIPSET_READY:            CP --> SP.
  94  * @CONTROLVM_CHIPSET_SELFTEST:         CP --> SP.
  95  *
  96  * Ids for commands that may appear in either queue of a ControlVm channel.
  97  *
  98  * Commands that are initiated by the command partition (CP), by an IO or
  99  * console service partition (SP), or by a guest partition (GP) are:
 100  * - issued on the RequestQueue queue (q #0) in the ControlVm channel
 101  * - responded to on the ResponseQueue queue (q #1) in the ControlVm channel
 102  *
 103  * Events that are initiated by an IO or console service partition (SP) or
 104  * by a guest partition (GP) are:
 105  * - issued on the EventQueue queue (q #2) in the ControlVm channel
 106  * - responded to on the EventAckQueue queue (q #3) in the ControlVm channel
 107  */
 108 enum controlvm_id {
 109         CONTROLVM_INVALID = 0,
 110         /*
 111          * SWITCH commands required Parameter: SwitchNumber.
 112          * BUS commands required Parameter: BusNumber
 113          */
 114         CONTROLVM_BUS_CREATE = 0x101,
 115         CONTROLVM_BUS_DESTROY = 0x102,
 116         CONTROLVM_BUS_CONFIGURE = 0x104,
 117         CONTROLVM_BUS_CHANGESTATE = 0x105,
 118         CONTROLVM_BUS_CHANGESTATE_EVENT = 0x106,
 119         /* DEVICE commands required Parameter: BusNumber, DeviceNumber */
 120         CONTROLVM_DEVICE_CREATE = 0x201,
 121         CONTROLVM_DEVICE_DESTROY = 0x202,
 122         CONTROLVM_DEVICE_CONFIGURE = 0x203,
 123         CONTROLVM_DEVICE_CHANGESTATE = 0x204,
 124         CONTROLVM_DEVICE_CHANGESTATE_EVENT = 0x205,
 125         CONTROLVM_DEVICE_RECONFIGURE = 0x206,
 126         /* CHIPSET commands */
 127         CONTROLVM_CHIPSET_INIT = 0x301,
 128         CONTROLVM_CHIPSET_STOP = 0x302,
 129         CONTROLVM_CHIPSET_READY = 0x304,
 130         CONTROLVM_CHIPSET_SELFTEST = 0x305,
 131 };
 132 
 133 /*
 134  * struct irq_info
 135  * @reserved1:       Natural alignment purposes
 136  * @recv_irq_handle: Specifies interrupt handle. It is used to retrieve the
 137  *                   corresponding interrupt pin from Monitor; and the interrupt
 138  *                   pin is used to connect to the corresponding interrupt.
 139  *                   Used by IOPart-GP only.
 140  * @recv_irq_vector: Specifies interrupt vector. It, interrupt pin, and shared
 141  *                   are used to connect to the corresponding interrupt.
 142  *                   Used by IOPart-GP only.
 143  * @recv_irq_shared: Specifies if the recvInterrupt is shared.  It, interrupt
 144  *                   pin and vector are used to connect to 0 = not shared;
 145  *                   1 = shared the corresponding interrupt.
 146  *                   Used by IOPart-GP only.
 147  * @reserved:        Natural alignment purposes
 148  */
 149 struct irq_info {
 150         u64 reserved1;
 151         u64 recv_irq_handle;
 152         u32 recv_irq_vector;
 153         u8 recv_irq_shared;
 154         u8 reserved[3];
 155 } __packed;
 156 
 157 /*
 158  * struct efi_visor_indication
 159  * @boot_to_fw_ui: Stop in UEFI UI
 160  * @clear_nvram:   Clear NVRAM
 161  * @clear_cmos:    Clear CMOS
 162  * @boot_to_tool:  Run install tool
 163  * @reserved:      Natural alignment
 164  */
 165 struct efi_visor_indication  {
 166         u64 boot_to_fw_ui:1;
 167         u64 clear_nvram:1;
 168         u64 clear_cmos:1;
 169         u64 boot_to_tool:1;
 170         /* Remaining bits are available */
 171         u64 reserved:60;
 172 } __packed;
 173 
 174 enum visor_chipset_feature {
 175         VISOR_CHIPSET_FEATURE_REPLY = 0x00000001,
 176         VISOR_CHIPSET_FEATURE_PARA_HOTPLUG = 0x00000002,
 177 };
 178 
 179 /*
 180  * struct controlvm_message_header
 181  * @id:                See CONTROLVM_ID.
 182  * @message_size:      Includes size of this struct + size of message.
 183  * @segment_index:     Index of segment containing Vm message/information.
 184  * @completion_status: Error status code or result of  message completion.
 185  * @struct flags:
 186  *      @failed:             =1 in a response to signify failure.
 187  *      @response_expected:  =1 in all messages that expect a response.
 188  *      @server:             =1 in all bus & device-related messages where the
 189  *                           message receiver is to act as the bus or device
 190  *                           server.
 191  *      @test_message:       =1 for testing use only (Control and Command
 192  *                           ignore this).
 193  *      @partial_completion: =1 if there are forthcoming responses/acks
 194  *                           associated with this message.
 195  *      @preserve:           =1 this is to let us know to preserve channel
 196  *                           contents.
 197  *      @writer_in_diag:     =1 the DiagWriter is active in the Diagnostic
 198  *                           Partition.
 199  *      @reserve:            Natural alignment.
 200  * @reserved:          Natural alignment.
 201  * @message_handle:    Identifies the particular message instance.
 202  * @payload_vm_offset: Offset of payload area from start of this instance.
 203  * @payload_max_bytes: Maximum bytes allocated in payload area of ControlVm
 204  *                     segment.
 205  * @payload_bytes:     Actual number of bytes of payload area to copy between
 206  *                     IO/Command. If non-zero, there is a payload to copy.
 207  *
 208  * This is the common structure that is at the beginning of every
 209  * ControlVm message (both commands and responses) in any ControlVm
 210  * queue.  Commands are easily distinguished from responses by
 211  * looking at the flags.response field.
 212  */
 213 struct controlvm_message_header  {
 214         u32 id;
 215         /*
 216          * For requests, indicates the message type. For responses, indicates
 217          * the type of message we are responding to.
 218          */
 219         u32 message_size;
 220         u32 segment_index;
 221         u32 completion_status;
 222         struct  {
 223                 u32 failed:1;
 224                 u32 response_expected:1;
 225                 u32 server:1;
 226                 u32 test_message:1;
 227                 u32 partial_completion:1;
 228                 u32 preserve:1;
 229                 u32 writer_in_diag:1;
 230                 u32 reserve:25;
 231         } __packed flags;
 232         u32 reserved;
 233         u64 message_handle;
 234         u64 payload_vm_offset;
 235         u32 payload_max_bytes;
 236         u32 payload_bytes;
 237 } __packed;
 238 
 239 /*
 240  * struct controlvm_packet_device_create - For CONTROLVM_DEVICE_CREATE
 241  * @bus_no:         Bus # (0..n-1) from the msg receiver's end.
 242  * @dev_no:         Bus-relative (0..n-1) device number.
 243  * @channel_addr:   Guest physical address of the channel, which can be
 244  *                  dereferenced by the receiver of this ControlVm command.
 245  * @channel_bytes:  Specifies size of the channel in bytes.
 246  * @data_type_uuid: Specifies format of data in channel.
 247  * @dev_inst_uuid:  Instance guid for the device.
 248  * @irq_info intr:  Specifies interrupt information.
 249  */
 250 struct controlvm_packet_device_create  {
 251         u32 bus_no;
 252         u32 dev_no;
 253         u64 channel_addr;
 254         u64 channel_bytes;
 255         guid_t data_type_guid;
 256         guid_t dev_inst_guid;
 257         struct irq_info intr;
 258 } __packed;
 259 
 260 /*
 261  * struct controlvm_packet_device_configure - For CONTROLVM_DEVICE_CONFIGURE
 262  * @bus_no: Bus number (0..n-1) from the msg receiver's perspective.
 263  * @dev_no: Bus-relative (0..n-1) device number.
 264  */
 265 struct controlvm_packet_device_configure  {
 266         u32 bus_no;
 267         u32 dev_no;
 268 } __packed;
 269 
 270 /* Total 128 bytes */
 271 struct controlvm_message_device_create {
 272         struct controlvm_message_header header;
 273         struct controlvm_packet_device_create packet;
 274 } __packed;
 275 
 276 /* Total 56 bytes */
 277 struct controlvm_message_device_configure  {
 278         struct controlvm_message_header header;
 279         struct controlvm_packet_device_configure packet;
 280 } __packed;
 281 
 282 /*
 283  * struct controlvm_message_packet - This is the format for a message in any
 284  *                                   ControlVm queue.
 285  * @struct create_bus:          For CONTROLVM_BUS_CREATE.
 286  *      @bus_no:             Bus # (0..n-1) from the msg receiver's perspective.
 287  *      @dev_count:          Indicates the max number of devices on this bus.
 288  *      @channel_addr:       Guest physical address of the channel, which can be
 289  *                           dereferenced by the receiver of this ControlVM
 290  *                           command.
 291  *      @channel_bytes:      Size of the channel.
 292  *      @bus_data_type_uuid: Indicates format of data in bus channel.
 293  *      @bus_inst_uuid:      Instance uuid for the bus.
 294  *
 295  * @struct destroy_bus:         For CONTROLVM_BUS_DESTROY.
 296  *      @bus_no: Bus # (0..n-1) from the msg receiver's perspective.
 297  *      @reserved: Natural alignment purposes.
 298  *
 299  * @struct configure_bus:       For CONTROLVM_BUS_CONFIGURE.
 300  *      @bus_no:              Bus # (0..n-1) from the receiver's perspective.
 301  *      @reserved1:           For alignment purposes.
 302  *      @guest_handle:        This is used to convert guest physical address to
 303  *                            physical address.
 304  *      @recv_bus_irq_handle: Specifies interrupt info. It is used by SP to
 305  *                            register to receive interrupts from the CP. This
 306  *                            interrupt is used for bus level notifications.
 307  *                            The corresponding sendBusInterruptHandle is kept
 308  *                            in CP.
 309  *
 310  * @struct create_device:       For CONTROLVM_DEVICE_CREATE.
 311  *
 312  * @struct destroy_device:      For CONTROLVM_DEVICE_DESTROY.
 313  *      @bus_no: Bus # (0..n-1) from the msg receiver's perspective.
 314  *      @dev_no: Bus-relative (0..n-1) device number.
 315  *
 316  * @struct configure_device:    For CONTROLVM_DEVICE_CONFIGURE.
 317  *
 318  * @struct reconfigure_device:  For CONTROLVM_DEVICE_RECONFIGURE.
 319  *      @bus_no: Bus # (0..n-1) from the msg receiver's perspective.
 320  *      @dev_no: Bus-relative (0..n-1) device number.
 321  *
 322  * @struct bus_change_state:    For CONTROLVM_BUS_CHANGESTATE.
 323  *      @bus_no:
 324  *      @struct state:
 325  *      @reserved: Natural alignment purposes.
 326  *
 327  * @struct device_change_state: For CONTROLVM_DEVICE_CHANGESTATE.
 328  *      @bus_no:
 329  *      @dev_no:
 330  *      @struct state:
 331  *      @struct flags:
 332  *              @phys_device: =1 if message is for a physical device.
 333  *              @reserved:    Natural alignment.
 334  *              @reserved1:   Natural alignment.
 335  *      @reserved:    Natural alignment purposes.
 336  *
 337  * @struct device_change_state_event:   For CONTROLVM_DEVICE_CHANGESTATE_EVENT.
 338  *      @bus_no:
 339  *      @dev_no:
 340  *      @struct state:
 341  *      @reserved:     Natural alignment purposes.
 342  *
 343  * @struct init_chipset:        For CONTROLVM_CHIPSET_INIT.
 344  *      @bus_count:       Indicates the max number of busses.
 345  *      @switch_count:    Indicates the max number of switches.
 346  *      @enum features:
 347  *      @platform_number:
 348  *
 349  * @struct chipset_selftest:    For CONTROLVM_CHIPSET_SELFTEST.
 350  *      @options: Reserved.
 351  *      @test:    Bit 0 set to run embedded selftest.
 352  *
 353  * @addr:   A physical address of something, that can be dereferenced by the
 354  *          receiver of this ControlVm command.
 355  *
 356  * @handle: A handle of something (depends on command id).
 357  */
 358 struct controlvm_message_packet  {
 359         union  {
 360                 struct  {
 361                         u32 bus_no;
 362                         u32 dev_count;
 363                         u64 channel_addr;
 364                         u64 channel_bytes;
 365                         guid_t bus_data_type_guid;
 366                         guid_t bus_inst_guid;
 367                 } __packed create_bus;
 368                 struct  {
 369                         u32 bus_no;
 370                         u32 reserved;
 371                 } __packed destroy_bus;
 372                 struct  {
 373                         u32 bus_no;
 374                         u32 reserved1;
 375                         u64 guest_handle;
 376                         u64 recv_bus_irq_handle;
 377                 } __packed configure_bus;
 378                 struct controlvm_packet_device_create create_device;
 379                 struct  {
 380                         u32 bus_no;
 381                         u32 dev_no;
 382                 } __packed destroy_device;
 383                 struct controlvm_packet_device_configure configure_device;
 384                 struct  {
 385                         u32 bus_no;
 386                         u32 dev_no;
 387                 } __packed reconfigure_device;
 388                 struct  {
 389                         u32 bus_no;
 390                         struct visor_segment_state state;
 391                         u8 reserved[2];
 392                 } __packed bus_change_state;
 393                 struct  {
 394                         u32 bus_no;
 395                         u32 dev_no;
 396                         struct visor_segment_state state;
 397                         struct  {
 398                                 u32 phys_device:1;
 399                                 u32 reserved:31;
 400                                 u32 reserved1;
 401                         } __packed flags;
 402                         u8 reserved[2];
 403                 } __packed device_change_state;
 404                 struct  {
 405                         u32 bus_no;
 406                         u32 dev_no;
 407                         struct visor_segment_state state;
 408                         u8 reserved[6];
 409                 } __packed device_change_state_event;
 410                 struct  {
 411                         u32 bus_count;
 412                         u32 switch_count;
 413                         enum visor_chipset_feature features;
 414                         u32 platform_number;
 415                 } __packed init_chipset;
 416                 struct  {
 417                         u32 options;
 418                         u32 test;
 419                 } __packed chipset_selftest;
 420                 u64 addr;
 421                 u64 handle;
 422         };
 423 } __packed;
 424 
 425 /* All messages in any ControlVm queue have this layout. */
 426 struct controlvm_message {
 427         struct controlvm_message_header hdr;
 428         struct controlvm_message_packet cmd;
 429 } __packed;
 430 
 431 /*
 432  * struct visor_controlvm_channel
 433  * @struct header:
 434  * @gp_controlvm:                       Guest phys addr of this channel.
 435  * @gp_partition_tables:                Guest phys addr of partition tables.
 436  * @gp_diag_guest:                      Guest phys addr of diagnostic channel.
 437  * @gp_boot_romdisk:                    Guest phys addr of (read* only) Boot
 438  *                                      ROM disk.
 439  * @gp_boot_ramdisk:                    Guest phys addr of writable Boot RAM
 440  *                                      disk.
 441  * @gp_acpi_table:                      Guest phys addr of acpi table.
 442  * @gp_control_channel:                 Guest phys addr of control channel.
 443  * @gp_diag_romdisk:                    Guest phys addr of diagnostic ROM disk.
 444  * @gp_nvram:                           Guest phys addr of NVRAM channel.
 445  * @request_payload_offset:             Offset to request payload area.
 446  * @event_payload_offset:               Offset to event payload area.
 447  * @request_payload_bytes:              Bytes available in request payload area.
 448  * @event_payload_bytes:                Bytes available in event payload area.
 449  * @control_channel_bytes:
 450  * @nvram_channel_bytes:                Bytes in PartitionNvram segment.
 451  * @message_bytes:                      sizeof(CONTROLVM_MESSAGE).
 452  * @message_count:                      CONTROLVM_MESSAGE_MAX.
 453  * @gp_smbios_table:                    Guest phys addr of SMBIOS tables.
 454  * @gp_physical_smbios_table:           Guest phys addr of SMBIOS table.
 455  * @gp_reserved:                        VISOR_MAX_GUESTS_PER_SERVICE.
 456  * @virtual_guest_firmware_image_base:  Guest physical address of EFI firmware
 457  *                                      image base.
 458  * @virtual_guest_firmware_entry_point: Guest physical address of EFI firmware
 459  *                                      entry point.
 460  * @virtual_guest_firmware_image_size:  Guest EFI firmware image size.
 461  * @virtual_guest_firmware_boot_base:   GPA = 1MB where EFI firmware image is
 462  *                                      copied to.
 463  * @virtual_guest_image_base:
 464  * @virtual_guest_image_size:
 465  * @prototype_control_channel_offset:
 466  * @virtual_guest_partition_handle:
 467  * @restore_action:                     Restore Action field to restore the
 468  *                                      guest partition.
 469  * @dump_action:                        For Windows guests it shows if the
 470  *                                      visordisk is in dump mode.
 471  * @nvram_fail_count:
 472  * @saved_crash_message_count:          = CONTROLVM_CRASHMSG_MAX.
 473  * @saved_crash_message_offset:         Offset to request payload area needed
 474  *                                      for crash dump.
 475  * @installation_error:                 Type of error encountered during
 476  *                                      installation.
 477  * @installation_text_id:               Id of string to display.
 478  * @installation_remaining_steps:       Number of remaining installation steps
 479  *                                      (for progress bars).
 480  * @tool_action:                        VISOR_TOOL_ACTIONS Installation Action
 481  *                                      field.
 482  * @reserved: Alignment.
 483  * @struct efi_visor_ind:
 484  * @sp_reserved:
 485  * @reserved2:                          Force signals to begin on 128-byte
 486  *                                      cache line.
 487  * @struct request_queue:               Guest partition uses this queue to send
 488  *                                      requests to Control.
 489  * @struct response_queue:              Control uses this queue to respond to
 490  *                                      service or guest partition request.
 491  * @struct event_queue:                 Control uses this queue to send events
 492  *                                      to guest partition.
 493  * @struct event_ack_queue:             Service or guest partition uses this
 494  *                                      queue to ack Control events.
 495  * @struct request_msg:                 Request fixed-size message pool -
 496  *                                      does not include payload.
 497  * @struct response_msg:                Response fixed-size message pool -
 498  *                                      does not include payload.
 499  * @struct event_msg:                   Event fixed-size message pool -
 500  *                                      does not include payload.
 501  * @struct event_ack_msg:               Ack fixed-size message pool -
 502  *                                      does not include payload.
 503  * @struct saved_crash_msg:             Message stored during IOVM creation to
 504  *                                      be reused after crash.
 505  */
 506 struct visor_controlvm_channel {
 507         struct channel_header header;
 508         u64 gp_controlvm;
 509         u64 gp_partition_tables;
 510         u64 gp_diag_guest;
 511         u64 gp_boot_romdisk;
 512         u64 gp_boot_ramdisk;
 513         u64 gp_acpi_table;
 514         u64 gp_control_channel;
 515         u64 gp_diag_romdisk;
 516         u64 gp_nvram;
 517         u64 request_payload_offset;
 518         u64 event_payload_offset;
 519         u32 request_payload_bytes;
 520         u32 event_payload_bytes;
 521         u32 control_channel_bytes;
 522         u32 nvram_channel_bytes;
 523         u32 message_bytes;
 524         u32 message_count;
 525         u64 gp_smbios_table;
 526         u64 gp_physical_smbios_table;
 527         char gp_reserved[2688];
 528         u64 virtual_guest_firmware_image_base;
 529         u64 virtual_guest_firmware_entry_point;
 530         u64 virtual_guest_firmware_image_size;
 531         u64 virtual_guest_firmware_boot_base;
 532         u64 virtual_guest_image_base;
 533         u64 virtual_guest_image_size;
 534         u64 prototype_control_channel_offset;
 535         u64 virtual_guest_partition_handle;
 536         u16 restore_action;
 537         u16 dump_action;
 538         u16 nvram_fail_count;
 539         u16 saved_crash_message_count;
 540         u32 saved_crash_message_offset;
 541         u32 installation_error;
 542         u32 installation_text_id;
 543         u16 installation_remaining_steps;
 544         u8 tool_action;
 545         u8 reserved;
 546         struct efi_visor_indication efi_visor_ind;
 547         u32 sp_reserved;
 548         u8 reserved2[28];
 549         struct signal_queue_header request_queue;
 550         struct signal_queue_header response_queue;
 551         struct signal_queue_header event_queue;
 552         struct signal_queue_header event_ack_queue;
 553         struct controlvm_message request_msg[CONTROLVM_MESSAGE_MAX];
 554         struct controlvm_message response_msg[CONTROLVM_MESSAGE_MAX];
 555         struct controlvm_message event_msg[CONTROLVM_MESSAGE_MAX];
 556         struct controlvm_message event_ack_msg[CONTROLVM_MESSAGE_MAX];
 557         struct controlvm_message saved_crash_msg[CONTROLVM_CRASHMSG_MAX];
 558 } __packed;
 559 
 560 /*
 561  * struct visor_controlvm_parameters_header
 562  *
 563  * The following header will be located at the beginning of PayloadVmOffset for
 564  * various ControlVm commands. The receiver of a ControlVm command with a
 565  * PayloadVmOffset will dereference this address and then use connection_offset,
 566  * initiator_offset, and target_offset to get the location of UTF-8 formatted
 567  * strings that can be parsed to obtain command-specific information. The value
 568  * of total_length should equal PayloadBytes. The format of the strings at
 569  * PayloadVmOffset will take different forms depending on the message.
 570  */
 571 struct visor_controlvm_parameters_header {
 572         u32 total_length;
 573         u32 header_length;
 574         u32 connection_offset;
 575         u32 connection_length;
 576         u32 initiator_offset;
 577         u32 initiator_length;
 578         u32 target_offset;
 579         u32 target_length;
 580         u32 client_offset;
 581         u32 client_length;
 582         u32 name_offset;
 583         u32 name_length;
 584         guid_t id;
 585         u32 revision;
 586         /* Natural alignment */
 587         u32 reserved;
 588 } __packed;
 589 
 590 /* General Errors------------------------------------------------------[0-99] */
 591 #define CONTROLVM_RESP_SUCCESS                     0
 592 #define CONTROLVM_RESP_ALREADY_DONE                1
 593 #define CONTROLVM_RESP_IOREMAP_FAILED              2
 594 #define CONTROLVM_RESP_KMALLOC_FAILED              3
 595 #define CONTROLVM_RESP_ID_UNKNOWN                  4
 596 #define CONTROLVM_RESP_ID_INVALID_FOR_CLIENT       5
 597 /* CONTROLVM_INIT_CHIPSET-------------------------------------------[100-199] */
 598 #define CONTROLVM_RESP_CLIENT_SWITCHCOUNT_NONZERO  100
 599 #define CONTROLVM_RESP_EXPECTED_CHIPSET_INIT       101
 600 /* Maximum Limit----------------------------------------------------[200-299] */
 601 /* BUS_CREATE */
 602 #define CONTROLVM_RESP_ERROR_MAX_BUSES             201
 603 /* DEVICE_CREATE */
 604 #define CONTROLVM_RESP_ERROR_MAX_DEVICES           202
 605 /* Payload and Parameter Related------------------------------------[400-499] */
 606 /* SWITCH_ATTACHEXTPORT, DEVICE_CONFIGURE */
 607 #define CONTROLVM_RESP_PAYLOAD_INVALID             400
 608 /* Multiple */
 609 #define CONTROLVM_RESP_INITIATOR_PARAMETER_INVALID 401
 610 /* DEVICE_CONFIGURE */
 611 #define CONTROLVM_RESP_TARGET_PARAMETER_INVALID    402
 612 /* DEVICE_CONFIGURE */
 613 #define CONTROLVM_RESP_CLIENT_PARAMETER_INVALID    403
 614 /* Specified[Packet Structure] Value--------------------------------[500-599] */
 615 /* SWITCH_ATTACHINTPORT */
 616 /* BUS_CONFIGURE, DEVICE_CREATE, DEVICE_CONFIG, DEVICE_DESTROY */
 617 #define CONTROLVM_RESP_BUS_INVALID                 500
 618 /* SWITCH_ATTACHINTPORT*/
 619 /* DEVICE_CREATE, DEVICE_CONFIGURE, DEVICE_DESTROY */
 620 #define CONTROLVM_RESP_DEVICE_INVALID              501
 621 /* DEVICE_CREATE, DEVICE_CONFIGURE */
 622 #define CONTROLVM_RESP_CHANNEL_INVALID             502
 623 /* Partition Driver Callback Interface------------------------------[600-699] */
 624 /* BUS_CREATE, BUS_DESTROY, DEVICE_CREATE, DEVICE_DESTROY */
 625 #define CONTROLVM_RESP_VIRTPCI_DRIVER_FAILURE      604
 626 /* Unable to invoke VIRTPCI callback. VIRTPCI Callback returned error. */
 627 /* BUS_CREATE, BUS_DESTROY, DEVICE_CREATE, DEVICE_DESTROY */
 628 #define CONTROLVM_RESP_VIRTPCI_DRIVER_CALLBACK_ERROR   605
 629 /* Generic device callback returned error. */
 630 /* SWITCH_ATTACHEXTPORT, SWITCH_DETACHEXTPORT, DEVICE_CONFIGURE */
 631 #define CONTROLVM_RESP_GENERIC_DRIVER_CALLBACK_ERROR   606
 632 /* Bus Related------------------------------------------------------[700-799] */
 633 /* BUS_DESTROY */
 634 #define CONTROLVM_RESP_ERROR_BUS_DEVICE_ATTACHED       700
 635 /* Channel Related--------------------------------------------------[800-899] */
 636 /* GET_CHANNELINFO, DEVICE_DESTROY */
 637 #define CONTROLVM_RESP_CHANNEL_TYPE_UNKNOWN            800
 638 /* DEVICE_CREATE */
 639 #define CONTROLVM_RESP_CHANNEL_SIZE_TOO_SMALL          801
 640 /* Chipset Shutdown Related---------------------------------------[1000-1099] */
 641 #define CONTROLVM_RESP_CHIPSET_SHUTDOWN_FAILED         1000
 642 #define CONTROLVM_RESP_CHIPSET_SHUTDOWN_ALREADY_ACTIVE 1001
 643 /* Chipset Stop Related-------------------------------------------[1100-1199] */
 644 #define CONTROLVM_RESP_CHIPSET_STOP_FAILED_BUS         1100
 645 #define CONTROLVM_RESP_CHIPSET_STOP_FAILED_SWITCH      1101
 646 /* Device Related-------------------------------------------------[1400-1499] */
 647 #define CONTROLVM_RESP_DEVICE_UDEV_TIMEOUT             1400
 648 
 649 /* __CONTROLVMCHANNEL_H__ */
 650 #endif

/* [<][>][^][v][top][bottom][index][help] */