linux/drivers/hv/hyperv_vmbus.h
<<
>>
Prefs
   1/*
   2 *
   3 * Copyright (c) 2011, Microsoft Corporation.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms and conditions of the GNU General Public License,
   7 * version 2, as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * You should have received a copy of the GNU General Public License along with
  15 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  16 * Place - Suite 330, Boston, MA 02111-1307 USA.
  17 *
  18 * Authors:
  19 *   Haiyang Zhang <haiyangz@microsoft.com>
  20 *   Hank Janssen  <hjanssen@microsoft.com>
  21 *   K. Y. Srinivasan <kys@microsoft.com>
  22 *
  23 */
  24
  25#ifndef _HYPERV_VMBUS_H
  26#define _HYPERV_VMBUS_H
  27
  28#include <linux/list.h>
  29#include <asm/sync_bitops.h>
  30#include <linux/atomic.h>
  31#include <linux/hyperv.h>
  32
  33/*
  34 * Timeout for services such as KVP and fcopy.
  35 */
  36#define HV_UTIL_TIMEOUT 30
  37
  38/*
  39 * Timeout for guest-host handshake for services.
  40 */
  41#define HV_UTIL_NEGO_TIMEOUT 55
  42
  43/*
  44 * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent
  45 * is set by CPUID(HVCPUID_VERSION_FEATURES).
  46 */
  47enum hv_cpuid_function {
  48        HVCPUID_VERSION_FEATURES                = 0x00000001,
  49        HVCPUID_VENDOR_MAXFUNCTION              = 0x40000000,
  50        HVCPUID_INTERFACE                       = 0x40000001,
  51
  52        /*
  53         * The remaining functions depend on the value of
  54         * HVCPUID_INTERFACE
  55         */
  56        HVCPUID_VERSION                 = 0x40000002,
  57        HVCPUID_FEATURES                        = 0x40000003,
  58        HVCPUID_ENLIGHTENMENT_INFO      = 0x40000004,
  59        HVCPUID_IMPLEMENTATION_LIMITS           = 0x40000005,
  60};
  61
  62#define  HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE   0x400
  63
  64#define HV_X64_MSR_CRASH_P0   0x40000100
  65#define HV_X64_MSR_CRASH_P1   0x40000101
  66#define HV_X64_MSR_CRASH_P2   0x40000102
  67#define HV_X64_MSR_CRASH_P3   0x40000103
  68#define HV_X64_MSR_CRASH_P4   0x40000104
  69#define HV_X64_MSR_CRASH_CTL  0x40000105
  70
  71#define HV_CRASH_CTL_CRASH_NOTIFY (1ULL << 63)
  72
  73/* Define version of the synthetic interrupt controller. */
  74#define HV_SYNIC_VERSION                (1)
  75
  76/* Define synthetic interrupt controller message constants. */
  77#define HV_MESSAGE_SIZE                 (256)
  78#define HV_MESSAGE_PAYLOAD_BYTE_COUNT   (240)
  79#define HV_MESSAGE_PAYLOAD_QWORD_COUNT  (30)
  80#define HV_ANY_VP                       (0xFFFFFFFF)
  81
  82/* Define synthetic interrupt controller flag constants. */
  83#define HV_EVENT_FLAGS_COUNT            (256 * 8)
  84#define HV_EVENT_FLAGS_BYTE_COUNT       (256)
  85#define HV_EVENT_FLAGS_DWORD_COUNT      (256 / sizeof(u32))
  86
  87/* Define hypervisor message types. */
  88enum hv_message_type {
  89        HVMSG_NONE                      = 0x00000000,
  90
  91        /* Memory access messages. */
  92        HVMSG_UNMAPPED_GPA              = 0x80000000,
  93        HVMSG_GPA_INTERCEPT             = 0x80000001,
  94
  95        /* Timer notification messages. */
  96        HVMSG_TIMER_EXPIRED                     = 0x80000010,
  97
  98        /* Error messages. */
  99        HVMSG_INVALID_VP_REGISTER_VALUE = 0x80000020,
 100        HVMSG_UNRECOVERABLE_EXCEPTION   = 0x80000021,
 101        HVMSG_UNSUPPORTED_FEATURE               = 0x80000022,
 102
 103        /* Trace buffer complete messages. */
 104        HVMSG_EVENTLOG_BUFFERCOMPLETE   = 0x80000040,
 105
 106        /* Platform-specific processor intercept messages. */
 107        HVMSG_X64_IOPORT_INTERCEPT              = 0x80010000,
 108        HVMSG_X64_MSR_INTERCEPT         = 0x80010001,
 109        HVMSG_X64_CPUID_INTERCEPT               = 0x80010002,
 110        HVMSG_X64_EXCEPTION_INTERCEPT   = 0x80010003,
 111        HVMSG_X64_APIC_EOI                      = 0x80010004,
 112        HVMSG_X64_LEGACY_FP_ERROR               = 0x80010005
 113};
 114
 115#define HV_SYNIC_STIMER_COUNT           (4)
 116
 117/* Define invalid partition identifier. */
 118#define HV_PARTITION_ID_INVALID         ((u64)0x0)
 119
 120/* Define port identifier type. */
 121union hv_port_id {
 122        u32 asu32;
 123        struct {
 124                u32 id:24;
 125                u32 reserved:8;
 126        } u ;
 127};
 128
 129/* Define port type. */
 130enum hv_port_type {
 131        HVPORT_MSG      = 1,
 132        HVPORT_EVENT            = 2,
 133        HVPORT_MONITOR  = 3
 134};
 135
 136/* Define port information structure. */
 137struct hv_port_info {
 138        enum hv_port_type port_type;
 139        u32 padding;
 140        union {
 141                struct {
 142                        u32 target_sint;
 143                        u32 target_vp;
 144                        u64 rsvdz;
 145                } message_port_info;
 146                struct {
 147                        u32 target_sint;
 148                        u32 target_vp;
 149                        u16 base_flag_number;
 150                        u16 flag_count;
 151                        u32 rsvdz;
 152                } event_port_info;
 153                struct {
 154                        u64 monitor_address;
 155                        u64 rsvdz;
 156                } monitor_port_info;
 157        };
 158};
 159
 160struct hv_connection_info {
 161        enum hv_port_type port_type;
 162        u32 padding;
 163        union {
 164                struct {
 165                        u64 rsvdz;
 166                } message_connection_info;
 167                struct {
 168                        u64 rsvdz;
 169                } event_connection_info;
 170                struct {
 171                        u64 monitor_address;
 172                } monitor_connection_info;
 173        };
 174};
 175
 176/* Define synthetic interrupt controller message flags. */
 177union hv_message_flags {
 178        u8 asu8;
 179        struct {
 180                u8 msg_pending:1;
 181                u8 reserved:7;
 182        };
 183};
 184
 185/* Define synthetic interrupt controller message header. */
 186struct hv_message_header {
 187        u32 message_type;
 188        u8 payload_size;
 189        union hv_message_flags message_flags;
 190        u8 reserved[2];
 191        union {
 192                u64 sender;
 193                union hv_port_id port;
 194        };
 195};
 196
 197/*
 198 * Timer configuration register.
 199 */
 200union hv_timer_config {
 201        u64 as_uint64;
 202        struct {
 203                u64 enable:1;
 204                u64 periodic:1;
 205                u64 lazy:1;
 206                u64 auto_enable:1;
 207                u64 reserved_z0:12;
 208                u64 sintx:4;
 209                u64 reserved_z1:44;
 210        };
 211};
 212
 213
 214/* Define timer message payload structure. */
 215struct hv_timer_message_payload {
 216        u32 timer_index;
 217        u32 reserved;
 218        u64 expiration_time;    /* When the timer expired */
 219        u64 delivery_time;      /* When the message was delivered */
 220};
 221
 222/* Define synthetic interrupt controller message format. */
 223struct hv_message {
 224        struct hv_message_header header;
 225        union {
 226                u64 payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
 227        } u ;
 228};
 229
 230/* Define the number of message buffers associated with each port. */
 231#define HV_PORT_MESSAGE_BUFFER_COUNT    (16)
 232
 233/* Define the synthetic interrupt message page layout. */
 234struct hv_message_page {
 235        struct hv_message sint_message[HV_SYNIC_SINT_COUNT];
 236};
 237
 238/* Define the synthetic interrupt controller event flags format. */
 239union hv_synic_event_flags {
 240        u8 flags8[HV_EVENT_FLAGS_BYTE_COUNT];
 241        u32 flags32[HV_EVENT_FLAGS_DWORD_COUNT];
 242};
 243
 244/* Define the synthetic interrupt flags page layout. */
 245struct hv_synic_event_flags_page {
 246        union hv_synic_event_flags sintevent_flags[HV_SYNIC_SINT_COUNT];
 247};
 248
 249/* Define SynIC control register. */
 250union hv_synic_scontrol {
 251        u64 as_uint64;
 252        struct {
 253                u64 enable:1;
 254                u64 reserved:63;
 255        };
 256};
 257
 258/* Define synthetic interrupt source. */
 259union hv_synic_sint {
 260        u64 as_uint64;
 261        struct {
 262                u64 vector:8;
 263                u64 reserved1:8;
 264                u64 masked:1;
 265                u64 auto_eoi:1;
 266                u64 reserved2:46;
 267        };
 268};
 269
 270/* Define the format of the SIMP register */
 271union hv_synic_simp {
 272        u64 as_uint64;
 273        struct {
 274                u64 simp_enabled:1;
 275                u64 preserved:11;
 276                u64 base_simp_gpa:52;
 277        };
 278};
 279
 280/* Define the format of the SIEFP register */
 281union hv_synic_siefp {
 282        u64 as_uint64;
 283        struct {
 284                u64 siefp_enabled:1;
 285                u64 preserved:11;
 286                u64 base_siefp_gpa:52;
 287        };
 288};
 289
 290/* Definitions for the monitored notification facility */
 291union hv_monitor_trigger_group {
 292        u64 as_uint64;
 293        struct {
 294                u32 pending;
 295                u32 armed;
 296        };
 297};
 298
 299struct hv_monitor_parameter {
 300        union hv_connection_id connectionid;
 301        u16 flagnumber;
 302        u16 rsvdz;
 303};
 304
 305union hv_monitor_trigger_state {
 306        u32 asu32;
 307
 308        struct {
 309                u32 group_enable:4;
 310                u32 rsvdz:28;
 311        };
 312};
 313
 314/* struct hv_monitor_page Layout */
 315/* ------------------------------------------------------ */
 316/* | 0   | TriggerState (4 bytes) | Rsvd1 (4 bytes)     | */
 317/* | 8   | TriggerGroup[0]                              | */
 318/* | 10  | TriggerGroup[1]                              | */
 319/* | 18  | TriggerGroup[2]                              | */
 320/* | 20  | TriggerGroup[3]                              | */
 321/* | 28  | Rsvd2[0]                                     | */
 322/* | 30  | Rsvd2[1]                                     | */
 323/* | 38  | Rsvd2[2]                                     | */
 324/* | 40  | NextCheckTime[0][0]    | NextCheckTime[0][1] | */
 325/* | ...                                                | */
 326/* | 240 | Latency[0][0..3]                             | */
 327/* | 340 | Rsvz3[0]                                     | */
 328/* | 440 | Parameter[0][0]                              | */
 329/* | 448 | Parameter[0][1]                              | */
 330/* | ...                                                | */
 331/* | 840 | Rsvd4[0]                                     | */
 332/* ------------------------------------------------------ */
 333struct hv_monitor_page {
 334        union hv_monitor_trigger_state trigger_state;
 335        u32 rsvdz1;
 336
 337        union hv_monitor_trigger_group trigger_group[4];
 338        u64 rsvdz2[3];
 339
 340        s32 next_checktime[4][32];
 341
 342        u16 latency[4][32];
 343        u64 rsvdz3[32];
 344
 345        struct hv_monitor_parameter parameter[4][32];
 346
 347        u8 rsvdz4[1984];
 348};
 349
 350/* Declare the various hypercall operations. */
 351enum hv_call_code {
 352        HVCALL_POST_MESSAGE     = 0x005c,
 353        HVCALL_SIGNAL_EVENT     = 0x005d,
 354};
 355
 356/* Definition of the hv_post_message hypercall input structure. */
 357struct hv_input_post_message {
 358        union hv_connection_id connectionid;
 359        u32 reserved;
 360        u32 message_type;
 361        u32 payload_size;
 362        u64 payload[HV_MESSAGE_PAYLOAD_QWORD_COUNT];
 363};
 364
 365/*
 366 * Versioning definitions used for guests reporting themselves to the
 367 * hypervisor, and visa versa.
 368 */
 369
 370/* Version info reported by guest OS's */
 371enum hv_guest_os_vendor {
 372        HVGUESTOS_VENDOR_MICROSOFT      = 0x0001
 373};
 374
 375enum hv_guest_os_microsoft_ids {
 376        HVGUESTOS_MICROSOFT_UNDEFINED   = 0x00,
 377        HVGUESTOS_MICROSOFT_MSDOS               = 0x01,
 378        HVGUESTOS_MICROSOFT_WINDOWS3X   = 0x02,
 379        HVGUESTOS_MICROSOFT_WINDOWS9X   = 0x03,
 380        HVGUESTOS_MICROSOFT_WINDOWSNT   = 0x04,
 381        HVGUESTOS_MICROSOFT_WINDOWSCE   = 0x05
 382};
 383
 384/*
 385 * Declare the MSR used to identify the guest OS.
 386 */
 387#define HV_X64_MSR_GUEST_OS_ID  0x40000000
 388
 389union hv_x64_msr_guest_os_id_contents {
 390        u64 as_uint64;
 391        struct {
 392                u64 build_number:16;
 393                u64 service_version:8; /* Service Pack, etc. */
 394                u64 minor_version:8;
 395                u64 major_version:8;
 396                u64 os_id:8; /* enum hv_guest_os_microsoft_ids (if Vendor=MS) */
 397                u64 vendor_id:16; /* enum hv_guest_os_vendor */
 398        };
 399};
 400
 401/*
 402 * Declare the MSR used to setup pages used to communicate with the hypervisor.
 403 */
 404#define HV_X64_MSR_HYPERCALL    0x40000001
 405
 406union hv_x64_msr_hypercall_contents {
 407        u64 as_uint64;
 408        struct {
 409                u64 enable:1;
 410                u64 reserved:11;
 411                u64 guest_physical_address:52;
 412        };
 413};
 414
 415
 416enum {
 417        VMBUS_MESSAGE_CONNECTION_ID     = 1,
 418        VMBUS_MESSAGE_PORT_ID           = 1,
 419        VMBUS_EVENT_CONNECTION_ID       = 2,
 420        VMBUS_EVENT_PORT_ID             = 2,
 421        VMBUS_MONITOR_CONNECTION_ID     = 3,
 422        VMBUS_MONITOR_PORT_ID           = 3,
 423        VMBUS_MESSAGE_SINT              = 2,
 424};
 425
 426/* #defines */
 427
 428#define HV_PRESENT_BIT                  0x80000000
 429
 430/*
 431 * The guest OS needs to register the guest ID with the hypervisor.
 432 * The guest ID is a 64 bit entity and the structure of this ID is
 433 * specified in the Hyper-V specification:
 434 *
 435 * http://msdn.microsoft.com/en-us/library/windows/hardware/ff542653%28v=vs.85%29.aspx
 436 *
 437 * While the current guideline does not specify how Linux guest ID(s)
 438 * need to be generated, our plan is to publish the guidelines for
 439 * Linux and other guest operating systems that currently are hosted
 440 * on Hyper-V. The implementation here conforms to this yet
 441 * unpublished guidelines.
 442 *
 443 *
 444 * Bit(s)
 445 * 63 - Indicates if the OS is Open Source or not; 1 is Open Source
 446 * 62:56 - Os Type; Linux is 0x100
 447 * 55:48 - Distro specific identification
 448 * 47:16 - Linux kernel version number
 449 * 15:0  - Distro specific identification
 450 *
 451 *
 452 */
 453
 454#define HV_LINUX_VENDOR_ID              0x8100
 455
 456/*
 457 * Generate the guest ID based on the guideline described above.
 458 */
 459
 460static inline  __u64 generate_guest_id(__u8 d_info1, __u32 kernel_version,
 461                                        __u16 d_info2)
 462{
 463        __u64 guest_id = 0;
 464
 465        guest_id = (((__u64)HV_LINUX_VENDOR_ID) << 48);
 466        guest_id |= (((__u64)(d_info1)) << 48);
 467        guest_id |= (((__u64)(kernel_version)) << 16);
 468        guest_id |= ((__u64)(d_info2));
 469
 470        return guest_id;
 471}
 472
 473
 474#define HV_CPU_POWER_MANAGEMENT         (1 << 0)
 475#define HV_RECOMMENDATIONS_MAX          4
 476
 477#define HV_X64_MAX                      5
 478#define HV_CAPS_MAX                     8
 479
 480
 481#define HV_HYPERCALL_PARAM_ALIGN        sizeof(u64)
 482
 483
 484/* Service definitions */
 485
 486#define HV_SERVICE_PARENT_PORT                          (0)
 487#define HV_SERVICE_PARENT_CONNECTION                    (0)
 488
 489#define HV_SERVICE_CONNECT_RESPONSE_SUCCESS             (0)
 490#define HV_SERVICE_CONNECT_RESPONSE_INVALID_PARAMETER   (1)
 491#define HV_SERVICE_CONNECT_RESPONSE_UNKNOWN_SERVICE     (2)
 492#define HV_SERVICE_CONNECT_RESPONSE_CONNECTION_REJECTED (3)
 493
 494#define HV_SERVICE_CONNECT_REQUEST_MESSAGE_ID           (1)
 495#define HV_SERVICE_CONNECT_RESPONSE_MESSAGE_ID          (2)
 496#define HV_SERVICE_DISCONNECT_REQUEST_MESSAGE_ID        (3)
 497#define HV_SERVICE_DISCONNECT_RESPONSE_MESSAGE_ID       (4)
 498#define HV_SERVICE_MAX_MESSAGE_ID                               (4)
 499
 500#define HV_SERVICE_PROTOCOL_VERSION (0x0010)
 501#define HV_CONNECT_PAYLOAD_BYTE_COUNT 64
 502
 503/* #define VMBUS_REVISION_NUMBER        6 */
 504
 505/* Our local vmbus's port and connection id. Anything >0 is fine */
 506/* #define VMBUS_PORT_ID                11 */
 507
 508/* 628180B8-308D-4c5e-B7DB-1BEB62E62EF4 */
 509static const uuid_le VMBUS_SERVICE_ID = {
 510        .b = {
 511                0xb8, 0x80, 0x81, 0x62, 0x8d, 0x30, 0x5e, 0x4c,
 512                0xb7, 0xdb, 0x1b, 0xeb, 0x62, 0xe6, 0x2e, 0xf4
 513        },
 514};
 515
 516
 517
 518struct hv_context {
 519        /* We only support running on top of Hyper-V
 520        * So at this point this really can only contain the Hyper-V ID
 521        */
 522        u64 guestid;
 523
 524        void *hypercall_page;
 525        void *tsc_page;
 526
 527        bool synic_initialized;
 528
 529        void *synic_message_page[NR_CPUS];
 530        void *synic_event_page[NR_CPUS];
 531        /*
 532         * Hypervisor's notion of virtual processor ID is different from
 533         * Linux' notion of CPU ID. This information can only be retrieved
 534         * in the context of the calling CPU. Setup a map for easy access
 535         * to this information:
 536         *
 537         * vp_index[a] is the Hyper-V's processor ID corresponding to
 538         * Linux cpuid 'a'.
 539         */
 540        u32 vp_index[NR_CPUS];
 541        /*
 542         * Starting with win8, we can take channel interrupts on any CPU;
 543         * we will manage the tasklet that handles events messages on a per CPU
 544         * basis.
 545         */
 546        struct tasklet_struct *event_dpc[NR_CPUS];
 547        struct tasklet_struct *msg_dpc[NR_CPUS];
 548        /*
 549         * To optimize the mapping of relid to channel, maintain
 550         * per-cpu list of the channels based on their CPU affinity.
 551         */
 552        struct list_head percpu_list[NR_CPUS];
 553        /*
 554         * buffer to post messages to the host.
 555         */
 556        void *post_msg_page[NR_CPUS];
 557        /*
 558         * Support PV clockevent device.
 559         */
 560        struct clock_event_device *clk_evt[NR_CPUS];
 561        /*
 562         * To manage allocations in a NUMA node.
 563         * Array indexed by numa node ID.
 564         */
 565        struct cpumask *hv_numa_map;
 566};
 567
 568extern struct hv_context hv_context;
 569
 570struct ms_hyperv_tsc_page {
 571        volatile u32 tsc_sequence;
 572        u32 reserved1;
 573        volatile u64 tsc_scale;
 574        volatile s64 tsc_offset;
 575        u64 reserved2[509];
 576};
 577
 578struct hv_ring_buffer_debug_info {
 579        u32 current_interrupt_mask;
 580        u32 current_read_index;
 581        u32 current_write_index;
 582        u32 bytes_avail_toread;
 583        u32 bytes_avail_towrite;
 584};
 585
 586/* Hv Interface */
 587
 588extern int hv_init(void);
 589
 590extern void hv_cleanup(bool crash);
 591
 592extern int hv_post_message(union hv_connection_id connection_id,
 593                         enum hv_message_type message_type,
 594                         void *payload, size_t payload_size);
 595
 596extern int hv_synic_alloc(void);
 597
 598extern void hv_synic_free(void);
 599
 600extern int hv_synic_init(unsigned int cpu);
 601
 602extern int hv_synic_cleanup(unsigned int cpu);
 603
 604extern void hv_synic_clockevents_cleanup(void);
 605
 606extern void hv_clockevents_bind(int cpu);
 607
 608extern void hv_clockevents_unbind(int cpu);
 609
 610extern int hv_synic_cpu_used(unsigned int cpu);
 611
 612/*
 613 * Host version information.
 614 */
 615extern unsigned int host_info_eax;
 616extern unsigned int host_info_ebx;
 617extern unsigned int host_info_ecx;
 618extern unsigned int host_info_edx;
 619
 620/* Interface */
 621
 622
 623int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info,
 624                       struct page *pages, u32 pagecnt);
 625
 626void hv_ringbuffer_cleanup(struct hv_ring_buffer_info *ring_info);
 627
 628int hv_ringbuffer_write(struct vmbus_channel *channel,
 629                    struct kvec *kv_list,
 630                    u32 kv_count, bool lock,
 631                    bool kick_q);
 632
 633int hv_ringbuffer_read(struct vmbus_channel *channel,
 634                       void *buffer, u32 buflen, u32 *buffer_actual_len,
 635                       u64 *requestid, bool raw);
 636
 637void hv_ringbuffer_get_debuginfo(struct hv_ring_buffer_info *ring_info,
 638                            struct hv_ring_buffer_debug_info *debug_info);
 639
 640void hv_begin_read(struct hv_ring_buffer_info *rbi);
 641
 642u32 hv_end_read(struct hv_ring_buffer_info *rbi);
 643
 644/*
 645 * Maximum channels is determined by the size of the interrupt page
 646 * which is PAGE_SIZE. 1/2 of PAGE_SIZE is for send endpoint interrupt
 647 * and the other is receive endpoint interrupt
 648 */
 649#define MAX_NUM_CHANNELS        ((PAGE_SIZE >> 1) << 3) /* 16348 channels */
 650
 651/* The value here must be in multiple of 32 */
 652/* TODO: Need to make this configurable */
 653#define MAX_NUM_CHANNELS_SUPPORTED      256
 654
 655
 656enum vmbus_connect_state {
 657        DISCONNECTED,
 658        CONNECTING,
 659        CONNECTED,
 660        DISCONNECTING
 661};
 662
 663#define MAX_SIZE_CHANNEL_MESSAGE        HV_MESSAGE_PAYLOAD_BYTE_COUNT
 664
 665struct vmbus_connection {
 666        enum vmbus_connect_state conn_state;
 667
 668        atomic_t next_gpadl_handle;
 669
 670        struct completion  unload_event;
 671        /*
 672         * Represents channel interrupts. Each bit position represents a
 673         * channel.  When a channel sends an interrupt via VMBUS, it finds its
 674         * bit in the sendInterruptPage, set it and calls Hv to generate a port
 675         * event. The other end receives the port event and parse the
 676         * recvInterruptPage to see which bit is set
 677         */
 678        void *int_page;
 679        void *send_int_page;
 680        void *recv_int_page;
 681
 682        /*
 683         * 2 pages - 1st page for parent->child notification and 2nd
 684         * is child->parent notification
 685         */
 686        struct hv_monitor_page *monitor_pages[2];
 687        struct list_head chn_msg_list;
 688        spinlock_t channelmsg_lock;
 689
 690        /* List of channels */
 691        struct list_head chn_list;
 692        struct mutex channel_mutex;
 693
 694        struct workqueue_struct *work_queue;
 695};
 696
 697
 698struct vmbus_msginfo {
 699        /* Bookkeeping stuff */
 700        struct list_head msglist_entry;
 701
 702        /* The message itself */
 703        unsigned char msg[0];
 704};
 705
 706
 707extern struct vmbus_connection vmbus_connection;
 708
 709enum vmbus_message_handler_type {
 710        /* The related handler can sleep. */
 711        VMHT_BLOCKING = 0,
 712
 713        /* The related handler must NOT sleep. */
 714        VMHT_NON_BLOCKING = 1,
 715};
 716
 717struct vmbus_channel_message_table_entry {
 718        enum vmbus_channel_message_type message_type;
 719        enum vmbus_message_handler_type handler_type;
 720        void (*message_handler)(struct vmbus_channel_message_header *msg);
 721};
 722
 723extern struct vmbus_channel_message_table_entry
 724        channel_message_table[CHANNELMSG_COUNT];
 725
 726/* Free the message slot and signal end-of-message if required */
 727static inline void vmbus_signal_eom(struct hv_message *msg, u32 old_msg_type)
 728{
 729        /*
 730         * On crash we're reading some other CPU's message page and we need
 731         * to be careful: this other CPU may already had cleared the header
 732         * and the host may already had delivered some other message there.
 733         * In case we blindly write msg->header.message_type we're going
 734         * to lose it. We can still lose a message of the same type but
 735         * we count on the fact that there can only be one
 736         * CHANNELMSG_UNLOAD_RESPONSE and we don't care about other messages
 737         * on crash.
 738         */
 739        if (cmpxchg(&msg->header.message_type, old_msg_type,
 740                    HVMSG_NONE) != old_msg_type)
 741                return;
 742
 743        /*
 744         * Make sure the write to MessageType (ie set to
 745         * HVMSG_NONE) happens before we read the
 746         * MessagePending and EOMing. Otherwise, the EOMing
 747         * will not deliver any more messages since there is
 748         * no empty slot
 749         */
 750        mb();
 751
 752        if (msg->header.message_flags.msg_pending) {
 753                /*
 754                 * This will cause message queue rescan to
 755                 * possibly deliver another msg from the
 756                 * hypervisor
 757                 */
 758                wrmsrl(HV_X64_MSR_EOM, 0);
 759        }
 760}
 761
 762/* General vmbus interface */
 763
 764struct hv_device *vmbus_device_create(const uuid_le *type,
 765                                      const uuid_le *instance,
 766                                      struct vmbus_channel *channel);
 767
 768int vmbus_device_register(struct hv_device *child_device_obj);
 769void vmbus_device_unregister(struct hv_device *device_obj);
 770
 771/* static void */
 772/* VmbusChildDeviceDestroy( */
 773/* struct hv_device *); */
 774
 775struct vmbus_channel *relid2channel(u32 relid);
 776
 777void vmbus_free_channels(void);
 778
 779/* Connection interface */
 780
 781int vmbus_connect(void);
 782void vmbus_disconnect(void);
 783
 784int vmbus_post_msg(void *buffer, size_t buflen, bool can_sleep);
 785
 786void vmbus_on_event(unsigned long data);
 787void vmbus_on_msg_dpc(unsigned long data);
 788
 789int hv_kvp_init(struct hv_util_service *);
 790void hv_kvp_deinit(void);
 791void hv_kvp_onchannelcallback(void *);
 792
 793int hv_vss_init(struct hv_util_service *);
 794void hv_vss_deinit(void);
 795void hv_vss_onchannelcallback(void *);
 796
 797int hv_fcopy_init(struct hv_util_service *);
 798void hv_fcopy_deinit(void);
 799void hv_fcopy_onchannelcallback(void *);
 800void vmbus_initiate_unload(bool crash);
 801
 802static inline void hv_poll_channel(struct vmbus_channel *channel,
 803                                   void (*cb)(void *))
 804{
 805        if (!channel)
 806                return;
 807
 808        smp_call_function_single(channel->target_cpu, cb, channel, true);
 809}
 810
 811enum hvutil_device_state {
 812        HVUTIL_DEVICE_INIT = 0,  /* driver is loaded, waiting for userspace */
 813        HVUTIL_READY,            /* userspace is registered */
 814        HVUTIL_HOSTMSG_RECEIVED, /* message from the host was received */
 815        HVUTIL_USERSPACE_REQ,    /* request to userspace was sent */
 816        HVUTIL_USERSPACE_RECV,   /* reply from userspace was received */
 817        HVUTIL_DEVICE_DYING,     /* driver unload is in progress */
 818};
 819
 820#endif /* _HYPERV_VMBUS_H */
 821