linux/drivers/staging/unisys/visorbus/controlvmchannel.h
<<
>>
Prefs
   1/* Copyright (C) 2010 - 2015 UNISYS CORPORATION
   2 * All rights reserved.
   3 *
   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.
   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
  18#include <linux/uuid.h>
  19#include "channel.h"
  20
  21/* {2B3C2D10-7EF5-4ad8-B966-3448B7386B3D} */
  22#define SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID    \
  23                UUID_LE(0x2b3c2d10, 0x7ef5, 0x4ad8, \
  24                        0xb9, 0x66, 0x34, 0x48, 0xb7, 0x38, 0x6b, 0x3d)
  25
  26#define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE \
  27        ULTRA_CHANNEL_PROTOCOL_SIGNATURE
  28#define CONTROLVM_MESSAGE_MAX 64
  29
  30/* Must increment this whenever you insert or delete fields within
  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 */
  36#define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID  1
  37
  38#define SPAR_CONTROLVM_CHANNEL_OK_CLIENT(ch)           \
  39        spar_check_channel_client(ch, \
  40                SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID, \
  41                "controlvm", \
  42                sizeof(struct spar_controlvm_channel_protocol), \
  43                ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID, \
  44                ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE)
  45
  46#define MAX_SERIAL_NUM  32
  47
  48/* Defines for various channel queues */
  49#define CONTROLVM_QUEUE_REQUEST         0
  50#define CONTROLVM_QUEUE_RESPONSE        1
  51#define CONTROLVM_QUEUE_EVENT           2
  52#define CONTROLVM_QUEUE_ACK             3
  53
  54/* Max num of messages stored during IOVM creation to be reused after crash */
  55#define CONTROLVM_CRASHMSG_MAX          2
  56
  57struct spar_segment_state  {
  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 */
  77};
  78
  79static const struct spar_segment_state segment_state_running = {
  80        1, 1, 1, 0, 1, 1, 1, 1
  81};
  82
  83static const struct spar_segment_state segment_state_paused = {
  84        1, 1, 1, 0, 1, 1, 1, 0
  85};
  86
  87static const struct spar_segment_state segment_state_standby = {
  88        1, 1, 0, 0, 1, 1, 1, 0
  89};
  90
  91/* Ids for commands that may appear in either queue of a ControlVm channel.
  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 */
 103enum controlvm_id {
 104        CONTROLVM_INVALID = 0,
 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 */
 120/* CHIPSET commands */
 121        CONTROLVM_CHIPSET_INIT = 0x301,                 /* CP --> SP, GP */
 122        CONTROLVM_CHIPSET_STOP = 0x302,                 /* CP --> SP, GP */
 123        CONTROLVM_CHIPSET_READY = 0x304,                /* CP --> SP */
 124        CONTROLVM_CHIPSET_SELFTEST = 0x305,             /* CP --> SP */
 125
 126};
 127
 128struct irq_info {
 129        u64 reserved1;
 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          *   interrupt.  Used by IOPart-GP only.
 135          */
 136        u64 recv_irq_handle;
 137
 138         /* specifies interrupt vector. It, interrupt pin, and shared are
 139          *   used to connect to the corresponding interrupt.  Used by
 140          *   IOPart-GP only.
 141          */
 142        u32 recv_irq_vector;
 143
 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     */
 148        u8 recv_irq_shared;
 149        u8 reserved[3]; /* Natural alignment purposes */
 150};
 151
 152struct pci_id {
 153        u16 domain;
 154        u8 bus;
 155        u8 slot;
 156        u8 func;
 157        u8 reserved[3]; /* Natural alignment purposes */
 158};
 159
 160struct efi_spar_indication  {
 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 */
 165        /* remaining bits are available */
 166};
 167
 168enum ultra_chipset_feature {
 169        ULTRA_CHIPSET_FEATURE_REPLY = 0x00000001,
 170        ULTRA_CHIPSET_FEATURE_PARA_HOTPLUG = 0x00000002,
 171};
 172
 173/* This is the common structure that is at the beginning of every
 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 */
 178struct controlvm_message_header  {
 179        u32 id;         /* See CONTROLVM_ID. */
 180        /* For requests, indicates the message type. */
 181        /* For responses, indicates the type of message we are responding to. */
 182
 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;
 189        struct  {
 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;
 208        } flags;
 209        /* Natural alignment */
 210        u32 reserved;
 211        /* Identifies the particular message instance */
 212        u64 message_handle;
 213        /* request instances with the corresponding response instance. */
 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;
 220        /* if non-zero, there is a payload to copy. */
 221};
 222
 223struct controlvm_packet_device_create  {
 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 */
 226        /* Guest physical address of the channel, which can be dereferenced by
 227         * the receiver of this ControlVm command
 228         */
 229        u64 channel_addr;
 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 */
 235
 236struct controlvm_packet_device_configure  {
 237        /* bus # (0..n-1) from the msg receiver's perspective */
 238        u32 bus_no;
 239        /* Control uses header SegmentIndex field to access bus number... */
 240        u32 dev_no;           /* bus-relative (0..n-1) device number */
 241} ;     /* for CONTROLVM_DEVICE_CONFIGURE */
 242
 243struct controlvm_message_device_create {
 244        struct controlvm_message_header header;
 245        struct controlvm_packet_device_create packet;
 246};      /* total 128 bytes */
 247
 248struct controlvm_message_device_configure  {
 249        struct controlvm_message_header header;
 250        struct controlvm_packet_device_configure packet;
 251};      /* total 56 bytes */
 252
 253/* This is the format for a message in any ControlVm queue. */
 254struct controlvm_message_packet  {
 255        union  {
 256                struct  {
 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;
 265                        u64 channel_bytes;      /* size of the channel */
 266        /* indicates format of data in bus channel*/
 267                        uuid_le bus_data_type_uuid;
 268                        uuid_le bus_inst_uuid;  /* instance uuid for the bus */
 269                } create_bus;   /* for CONTROLVM_BUS_CREATE */
 270                struct  {
 271        /* bus # (0..n-1) from the msg receiver's perspective */
 272                        u32 bus_no;
 273                        u32 reserved;   /* Natural alignment purposes */
 274                } destroy_bus;  /* for CONTROLVM_BUS_DESTROY */
 275                struct  {
 276        /* bus # (0..n-1) from the receiver's perspective */
 277                        u32 bus_no;
 278                        u32 reserved1;  /* for alignment purposes */
 279        /* This is used to convert guest physical address to physical address */
 280                        u64 guest_handle;
 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
 286                                 * sendBusInterruptHandle is kept in CP.
 287                                 */
 288                } configure_bus;        /* for CONTROLVM_BUS_CONFIGURE */
 289                /* for CONTROLVM_DEVICE_CREATE */
 290                struct controlvm_packet_device_create create_device;
 291                struct  {
 292                /* bus # (0..n-1) from the msg receiver's perspective */
 293                        u32 bus_no;
 294                        u32 dev_no;     /* bus-relative (0..n-1) device # */
 295                } destroy_device;       /* for CONTROLVM_DEVICE_DESTROY */
 296                /* for CONTROLVM_DEVICE_CONFIGURE */
 297                struct controlvm_packet_device_configure configure_device;
 298                struct  {
 299                /* bus # (0..n-1) from the msg receiver's perspective */
 300                        u32 bus_no;
 301                        u32 dev_no;     /* bus-relative (0..n-1) device # */
 302                } reconfigure_device;   /* for CONTROLVM_DEVICE_RECONFIGURE */
 303                struct  {
 304                        u32 bus_no;
 305                        struct spar_segment_state state;
 306                        u8 reserved[2]; /* Natural alignment purposes */
 307                } bus_change_state;     /* for CONTROLVM_BUS_CHANGESTATE */
 308                struct  {
 309                        u32 bus_no;
 310                        u32 dev_no;
 311                        struct spar_segment_state state;
 312                        struct  {
 313                                /* =1 if message is for a physical device */
 314                                u32 phys_device:1;
 315                        } flags;
 316                        u8 reserved[2]; /* Natural alignment purposes */
 317                } device_change_state;  /* for CONTROLVM_DEVICE_CHANGESTATE */
 318                struct  {
 319                        u32 bus_no;
 320                        u32 dev_no;
 321                        struct spar_segment_state state;
 322                        u8 reserved[6]; /* Natural alignment purposes */
 323                } device_change_state_event;
 324                        /* for CONTROLVM_DEVICE_CHANGESTATE_EVENT */
 325                struct  {
 326                        /* indicates the max number of busses */
 327                        u32 bus_count;
 328                        /* indicates the max number of switches */
 329                        u32 switch_count;
 330                        enum ultra_chipset_feature features;
 331                        u32 platform_number;    /* Platform Number */
 332                } init_chipset; /* for CONTROLVM_CHIPSET_INIT */
 333                struct  {
 334                        u32 options;    /* reserved */
 335                        u32 test;       /* bit 0 set to run embedded selftest */
 336                } chipset_selftest;     /* for CONTROLVM_CHIPSET_SELFTEST */
 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;
 343        };
 344};
 345
 346/* All messages in any ControlVm queue have this layout. */
 347struct controlvm_message {
 348        struct controlvm_message_header hdr;
 349        struct controlvm_message_packet cmd;
 350};
 351
 352struct spar_controlvm_channel_protocol {
 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 */
 365        /* Bytes available in request payload area */
 366        u32 request_payload_bytes;
 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 */
 375        char gp_reserved[2688];
 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;
 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;
 396        u16 nvram_fail_count;
 397        u16 saved_crash_message_count;  /* = CONTROLVM_CRASHMSG_MAX */
 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;
 402        u32 installation_text_id;       /* Id of string to display */
 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;
 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;
 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;
 423         /* Request fixed-size message pool - does not include payload */
 424         struct controlvm_message request_msg[CONTROLVM_MESSAGE_MAX];
 425
 426         /* Response fixed-size message pool - does not include payload */
 427         struct controlvm_message response_msg[CONTROLVM_MESSAGE_MAX];
 428
 429         /* Event fixed-size message pool - does not include payload */
 430         struct controlvm_message event_msg[CONTROLVM_MESSAGE_MAX];
 431
 432         /* Ack fixed-size message pool - does not include payload */
 433         struct controlvm_message event_ack_msg[CONTROLVM_MESSAGE_MAX];
 434
 435         /* Message stored during IOVM creation to be reused after crash */
 436         struct controlvm_message saved_crash_msg[CONTROLVM_CRASHMSG_MAX];
 437};
 438
 439/* Offsets for VM channel attributes */
 440#define VM_CH_REQ_QUEUE_OFFSET \
 441        offsetof(struct spar_controlvm_channel_protocol, request_queue)
 442#define VM_CH_RESP_QUEUE_OFFSET \
 443        offsetof(struct spar_controlvm_channel_protocol, response_queue)
 444#define VM_CH_EVENT_QUEUE_OFFSET \
 445        offsetof(struct spar_controlvm_channel_protocol, event_queue)
 446#define VM_CH_ACK_QUEUE_OFFSET \
 447        offsetof(struct spar_controlvm_channel_protocol, event_ack_queue)
 448#define VM_CH_REQ_MSG_OFFSET \
 449        offsetof(struct spar_controlvm_channel_protocol, request_msg)
 450#define VM_CH_RESP_MSG_OFFSET \
 451        offsetof(struct spar_controlvm_channel_protocol, response_msg)
 452#define VM_CH_EVENT_MSG_OFFSET \
 453        offsetof(struct spar_controlvm_channel_protocol, event_msg)
 454#define VM_CH_ACK_MSG_OFFSET \
 455        offsetof(struct spar_controlvm_channel_protocol, event_ack_msg)
 456#define VM_CH_CRASH_MSG_OFFSET \
 457        offsetof(struct spar_controlvm_channel_protocol, saved_crash_msg)
 458
 459/* The following header will be located at the beginning of PayloadVmOffset for
 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.
 466 */
 467struct 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};
 484
 485#endif                          /* __CONTROLVMCHANNEL_H__ */
 486