Merge branch 'x86-cleanups-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / arch / x86 / include / asm / hyperv-tlfs.h
index bb9a3f1a3f886b61e7787daeda116bb8ded49867..705dafc2d11ab5bb9ddf3b249e0a69dae31a966e 100644 (file)
@@ -10,6 +10,7 @@
 #define _ASM_X86_HYPERV_TLFS_H
 
 #include <linux/types.h>
+#include <asm/page.h>
 
 /*
  * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent
@@ -93,7 +94,6 @@
 #define HV_X64_ACCESS_STATS                    BIT(8)
 #define HV_X64_DEBUGGING                       BIT(11)
 #define HV_X64_CPU_POWER_MANAGEMENT            BIT(12)
-#define HV_X64_CONFIGURE_PROFILER              BIT(13)
 
 /*
  * Feature identification. EDX indicates which miscellaneous features
@@ -354,6 +354,7 @@ struct hv_tsc_emulation_status {
 #define HVCALL_POST_MESSAGE                    0x005c
 #define HVCALL_SIGNAL_EVENT                    0x005d
 #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE 0x00af
+#define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_LIST 0x00b0
 
 #define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE       0x00000001
 #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT        12
@@ -724,11 +725,74 @@ struct hv_enlightened_vmcs {
 
 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL                     0xFFFF
 
-#define HV_STIMER_ENABLE               (1ULL << 0)
-#define HV_STIMER_PERIODIC             (1ULL << 1)
-#define HV_STIMER_LAZY                 (1ULL << 2)
-#define HV_STIMER_AUTOENABLE           (1ULL << 3)
-#define HV_STIMER_SINT(config)         (__u8)(((config) >> 16) & 0x0F)
+/* Define synthetic interrupt controller flag constants. */
+#define HV_EVENT_FLAGS_COUNT           (256 * 8)
+#define HV_EVENT_FLAGS_LONG_COUNT      (256 / sizeof(unsigned long))
+
+/*
+ * Synthetic timer configuration.
+ */
+union hv_stimer_config {
+       u64 as_uint64;
+       struct {
+               u64 enable:1;
+               u64 periodic:1;
+               u64 lazy:1;
+               u64 auto_enable:1;
+               u64 apic_vector:8;
+               u64 direct_mode:1;
+               u64 reserved_z0:3;
+               u64 sintx:4;
+               u64 reserved_z1:44;
+       } __packed;
+};
+
+
+/* Define the synthetic interrupt controller event flags format. */
+union hv_synic_event_flags {
+       unsigned long flags[HV_EVENT_FLAGS_LONG_COUNT];
+};
+
+/* Define SynIC control register. */
+union hv_synic_scontrol {
+       u64 as_uint64;
+       struct {
+               u64 enable:1;
+               u64 reserved:63;
+       } __packed;
+};
+
+/* Define synthetic interrupt source. */
+union hv_synic_sint {
+       u64 as_uint64;
+       struct {
+               u64 vector:8;
+               u64 reserved1:8;
+               u64 masked:1;
+               u64 auto_eoi:1;
+               u64 reserved2:46;
+       } __packed;
+};
+
+/* Define the format of the SIMP register */
+union hv_synic_simp {
+       u64 as_uint64;
+       struct {
+               u64 simp_enabled:1;
+               u64 preserved:11;
+               u64 base_simp_gpa:52;
+       } __packed;
+};
+
+/* Define the format of the SIEFP register */
+union hv_synic_siefp {
+       u64 as_uint64;
+       struct {
+               u64 siefp_enabled:1;
+               u64 preserved:11;
+               u64 base_siefp_gpa:52;
+       } __packed;
+};
 
 struct hv_vpset {
        u64 format;
@@ -756,6 +820,36 @@ struct hv_guest_mapping_flush {
        u64 flags;
 } __packed;
 
+/*
+ *  HV_MAX_FLUSH_PAGES = "additional_pages" + 1. It's limited
+ *  by the bitwidth of "additional_pages" in union hv_gpa_page_range.
+ */
+#define HV_MAX_FLUSH_PAGES (2048)
+
+/* HvFlushGuestPhysicalAddressList hypercall */
+union hv_gpa_page_range {
+       u64 address_space;
+       struct {
+               u64 additional_pages:11;
+               u64 largepage:1;
+               u64 basepfn:52;
+       } page;
+};
+
+/*
+ * All input flush parameters should be in single page. The max flush
+ * count is equal with how many entries of union hv_gpa_page_range can
+ * be populated into the input parameter page.
+ */
+#define HV_MAX_FLUSH_REP_COUNT (PAGE_SIZE - 2 * sizeof(u64) /  \
+                               sizeof(union hv_gpa_page_range))
+
+struct hv_guest_mapping_flush_list {
+       u64 address_space;
+       u64 flags;
+       union hv_gpa_page_range gpa_list[HV_MAX_FLUSH_REP_COUNT];
+};
+
 /* HvFlushVirtualAddressSpace, HvFlushVirtualAddressList hypercalls */
 struct hv_tlb_flush {
        u64 address_space;