xref: /openbmc/linux/arch/x86/include/asm/mshyperv.h (revision 8730046c1498e8fb8c9a124789893944e8ce8220)
1e08cae41SH. Peter Anvin #ifndef _ASM_X86_MSHYPER_H
2e08cae41SH. Peter Anvin #define _ASM_X86_MSHYPER_H
3a2a47c6cSKy Srinivasan 
4e08cae41SH. Peter Anvin #include <linux/types.h>
51aec1696SThomas Gleixner #include <linux/interrupt.h>
6e08cae41SH. Peter Anvin #include <asm/hyperv.h>
7e08cae41SH. Peter Anvin 
8e08cae41SH. Peter Anvin struct ms_hyperv_info {
9e08cae41SH. Peter Anvin 	u32 features;
10cc2dd402SDenis V. Lunev 	u32 misc_features;
11e08cae41SH. Peter Anvin 	u32 hints;
12e08cae41SH. Peter Anvin };
13e08cae41SH. Peter Anvin 
14e08cae41SH. Peter Anvin extern struct ms_hyperv_info ms_hyperv;
15a2a47c6cSKy Srinivasan 
163f646ed7SK. Y. Srinivasan /*
173f646ed7SK. Y. Srinivasan  * Declare the MSR used to setup pages used to communicate with the hypervisor.
183f646ed7SK. Y. Srinivasan  */
193f646ed7SK. Y. Srinivasan union hv_x64_msr_hypercall_contents {
203f646ed7SK. Y. Srinivasan 	u64 as_uint64;
213f646ed7SK. Y. Srinivasan 	struct {
223f646ed7SK. Y. Srinivasan 		u64 enable:1;
233f646ed7SK. Y. Srinivasan 		u64 reserved:11;
243f646ed7SK. Y. Srinivasan 		u64 guest_physical_address:52;
253f646ed7SK. Y. Srinivasan 	};
263f646ed7SK. Y. Srinivasan };
273f646ed7SK. Y. Srinivasan 
28352c9624SK. Y. Srinivasan /*
29352c9624SK. Y. Srinivasan  * The guest OS needs to register the guest ID with the hypervisor.
30352c9624SK. Y. Srinivasan  * The guest ID is a 64 bit entity and the structure of this ID is
31352c9624SK. Y. Srinivasan  * specified in the Hyper-V specification:
32352c9624SK. Y. Srinivasan  *
33352c9624SK. Y. Srinivasan  * msdn.microsoft.com/en-us/library/windows/hardware/ff542653%28v=vs.85%29.aspx
34352c9624SK. Y. Srinivasan  *
35352c9624SK. Y. Srinivasan  * While the current guideline does not specify how Linux guest ID(s)
36352c9624SK. Y. Srinivasan  * need to be generated, our plan is to publish the guidelines for
37352c9624SK. Y. Srinivasan  * Linux and other guest operating systems that currently are hosted
38352c9624SK. Y. Srinivasan  * on Hyper-V. The implementation here conforms to this yet
39352c9624SK. Y. Srinivasan  * unpublished guidelines.
40352c9624SK. Y. Srinivasan  *
41352c9624SK. Y. Srinivasan  *
42352c9624SK. Y. Srinivasan  * Bit(s)
43352c9624SK. Y. Srinivasan  * 63 - Indicates if the OS is Open Source or not; 1 is Open Source
44352c9624SK. Y. Srinivasan  * 62:56 - Os Type; Linux is 0x100
45352c9624SK. Y. Srinivasan  * 55:48 - Distro specific identification
46352c9624SK. Y. Srinivasan  * 47:16 - Linux kernel version number
47352c9624SK. Y. Srinivasan  * 15:0  - Distro specific identification
48352c9624SK. Y. Srinivasan  *
49352c9624SK. Y. Srinivasan  *
50352c9624SK. Y. Srinivasan  */
51352c9624SK. Y. Srinivasan 
52352c9624SK. Y. Srinivasan #define HV_LINUX_VENDOR_ID              0x8800
53352c9624SK. Y. Srinivasan 
54352c9624SK. Y. Srinivasan /*
55352c9624SK. Y. Srinivasan  * Generate the guest ID based on the guideline described above.
56352c9624SK. Y. Srinivasan  */
57352c9624SK. Y. Srinivasan 
58352c9624SK. Y. Srinivasan static inline  __u64 generate_guest_id(__u64 d_info1, __u64 kernel_version,
59352c9624SK. Y. Srinivasan 				       __u64 d_info2)
60352c9624SK. Y. Srinivasan {
61352c9624SK. Y. Srinivasan 	__u64 guest_id = 0;
62352c9624SK. Y. Srinivasan 
63352c9624SK. Y. Srinivasan 	guest_id = (((__u64)HV_LINUX_VENDOR_ID) << 56);
64352c9624SK. Y. Srinivasan 	guest_id |= (d_info1 << 48);
65352c9624SK. Y. Srinivasan 	guest_id |= (kernel_version << 16);
66352c9624SK. Y. Srinivasan 	guest_id |= d_info2;
67352c9624SK. Y. Srinivasan 
68352c9624SK. Y. Srinivasan 	return guest_id;
69352c9624SK. Y. Srinivasan }
70352c9624SK. Y. Srinivasan 
71bc2b0331SK. Y. Srinivasan void hyperv_callback_vector(void);
72cf910e83SSeiji Aguchi #ifdef CONFIG_TRACING
73cf910e83SSeiji Aguchi #define trace_hyperv_callback_vector hyperv_callback_vector
74cf910e83SSeiji Aguchi #endif
75bc2b0331SK. Y. Srinivasan void hyperv_vector_handler(struct pt_regs *regs);
7676d388cdSThomas Gleixner void hv_setup_vmbus_irq(void (*handler)(void));
7776d388cdSThomas Gleixner void hv_remove_vmbus_irq(void);
78bc2b0331SK. Y. Srinivasan 
792517281dSVitaly Kuznetsov void hv_setup_kexec_handler(void (*handler)(void));
802517281dSVitaly Kuznetsov void hv_remove_kexec_handler(void);
81b4370df2SVitaly Kuznetsov void hv_setup_crash_handler(void (*handler)(struct pt_regs *regs));
82b4370df2SVitaly Kuznetsov void hv_remove_crash_handler(void);
83*8730046cSK. Y. Srinivasan 
84*8730046cSK. Y. Srinivasan #if IS_ENABLED(CONFIG_HYPERV)
85*8730046cSK. Y. Srinivasan void hyperv_init(void);
86*8730046cSK. Y. Srinivasan extern void *hv_hypercall_pg;
87*8730046cSK. Y. Srinivasan #endif
88a2a47c6cSKy Srinivasan #endif
89