| /* |
| * |
| * Copyright (c) 2009, Microsoft Corporation. |
| * |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms and conditions of the GNU General Public License, |
| * version 2, as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
| * more details. |
| * |
| * You should have received a copy of the GNU General Public License along with |
| * this program; if not, write to the Free Software Foundation, Inc., 59 Temple |
| * Place - Suite 330, Boston, MA 02111-1307 USA. |
| * |
| * Authors: |
| * Haiyang Zhang <haiyangz@microsoft.com> |
| * Hank Janssen <hjanssen@microsoft.com> |
| * |
| */ |
| |
| |
| #ifndef __HV_H__ |
| #define __HV_H__ |
| |
| #include "hv_api.h" |
| |
| enum { |
| VMBUS_MESSAGE_CONNECTION_ID = 1, |
| VMBUS_MESSAGE_PORT_ID = 1, |
| VMBUS_EVENT_CONNECTION_ID = 2, |
| VMBUS_EVENT_PORT_ID = 2, |
| VMBUS_MONITOR_CONNECTION_ID = 3, |
| VMBUS_MONITOR_PORT_ID = 3, |
| VMBUS_MESSAGE_SINT = 2, |
| }; |
| |
| /* #defines */ |
| |
| #define HV_PRESENT_BIT 0x80000000 |
| |
| #define HV_LINUX_GUEST_ID_LO 0x00000000 |
| #define HV_LINUX_GUEST_ID_HI 0xB16B00B5 |
| #define HV_LINUX_GUEST_ID (((u64)HV_LINUX_GUEST_ID_HI << 32) | \ |
| HV_LINUX_GUEST_ID_LO) |
| |
| #define HV_CPU_POWER_MANAGEMENT (1 << 0) |
| #define HV_RECOMMENDATIONS_MAX 4 |
| |
| #define HV_X64_MAX 5 |
| #define HV_CAPS_MAX 8 |
| |
| |
| #define HV_HYPERCALL_PARAM_ALIGN sizeof(u64) |
| |
| |
| /* Service definitions */ |
| |
| #define HV_SERVICE_PARENT_PORT (0) |
| #define HV_SERVICE_PARENT_CONNECTION (0) |
| |
| #define HV_SERVICE_CONNECT_RESPONSE_SUCCESS (0) |
| #define HV_SERVICE_CONNECT_RESPONSE_INVALID_PARAMETER (1) |
| #define HV_SERVICE_CONNECT_RESPONSE_UNKNOWN_SERVICE (2) |
| #define HV_SERVICE_CONNECT_RESPONSE_CONNECTION_REJECTED (3) |
| |
| #define HV_SERVICE_CONNECT_REQUEST_MESSAGE_ID (1) |
| #define HV_SERVICE_CONNECT_RESPONSE_MESSAGE_ID (2) |
| #define HV_SERVICE_DISCONNECT_REQUEST_MESSAGE_ID (3) |
| #define HV_SERVICE_DISCONNECT_RESPONSE_MESSAGE_ID (4) |
| #define HV_SERVICE_MAX_MESSAGE_ID (4) |
| |
| #define HV_SERVICE_PROTOCOL_VERSION (0x0010) |
| #define HV_CONNECT_PAYLOAD_BYTE_COUNT 64 |
| |
| /* #define VMBUS_REVISION_NUMBER 6 */ |
| |
| /* Our local vmbus's port and connection id. Anything >0 is fine */ |
| /* #define VMBUS_PORT_ID 11 */ |
| |
| /* 628180B8-308D-4c5e-B7DB-1BEB62E62EF4 */ |
| static const struct hv_guid VMBUS_SERVICE_ID = { |
| .data = { |
| 0xb8, 0x80, 0x81, 0x62, 0x8d, 0x30, 0x5e, 0x4c, |
| 0xb7, 0xdb, 0x1b, 0xeb, 0x62, 0xe6, 0x2e, 0xf4 |
| }, |
| }; |
| |
| #define MAX_NUM_CPUS 32 |
| |
| |
| struct hv_input_signal_event_buffer { |
| u64 align8; |
| struct hv_input_signal_event event; |
| }; |
| |
| struct hv_context { |
| /* We only support running on top of Hyper-V |
| * So at this point this really can only contain the Hyper-V ID |
| */ |
| u64 guestid; |
| |
| void *hypercall_page; |
| |
| bool synic_initialized; |
| |
| /* |
| * This is used as an input param to HvCallSignalEvent hypercall. The |
| * input param is immutable in our usage and must be dynamic mem (vs |
| * stack or global). */ |
| struct hv_input_signal_event_buffer *signal_event_buffer; |
| /* 8-bytes aligned of the buffer above */ |
| struct hv_input_signal_event *signal_event_param; |
| |
| void *synic_message_page[MAX_NUM_CPUS]; |
| void *synic_event_page[MAX_NUM_CPUS]; |
| }; |
| |
| extern struct hv_context hv_context; |
| |
| |
| /* Hv Interface */ |
| |
| extern int hv_init(void); |
| |
| extern void hv_cleanup(void); |
| |
| extern u16 hv_post_message(union hv_connection_id connection_id, |
| enum hv_message_type message_type, |
| void *payload, size_t payload_size); |
| |
| extern u16 hv_signal_event(void); |
| |
| extern void hv_synic_init(void *irqarg); |
| |
| extern void hv_synic_cleanup(void *arg); |
| |
| #endif /* __HV_H__ */ |