hypervvar.h revision 1.1.2.3 1 1.1.2.3 martin /* $NetBSD: hypervvar.h,v 1.1.2.3 2019/06/12 10:17:32 martin Exp $ */
2 1.1.2.2 martin
3 1.1.2.2 martin /*-
4 1.1.2.2 martin * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
5 1.1.2.2 martin *
6 1.1.2.2 martin * Copyright (c) 2009-2012,2016-2017 Microsoft Corp.
7 1.1.2.2 martin * Copyright (c) 2012 NetApp Inc.
8 1.1.2.2 martin * Copyright (c) 2012 Citrix Inc.
9 1.1.2.2 martin * All rights reserved.
10 1.1.2.2 martin *
11 1.1.2.2 martin * Redistribution and use in source and binary forms, with or without
12 1.1.2.2 martin * modification, are permitted provided that the following conditions
13 1.1.2.2 martin * are met:
14 1.1.2.2 martin * 1. Redistributions of source code must retain the above copyright
15 1.1.2.2 martin * notice unmodified, this list of conditions, and the following
16 1.1.2.2 martin * disclaimer.
17 1.1.2.2 martin * 2. Redistributions in binary form must reproduce the above copyright
18 1.1.2.2 martin * notice, this list of conditions and the following disclaimer in the
19 1.1.2.2 martin * documentation and/or other materials provided with the distribution.
20 1.1.2.2 martin *
21 1.1.2.2 martin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 1.1.2.2 martin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 1.1.2.2 martin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 1.1.2.2 martin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 1.1.2.2 martin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 1.1.2.2 martin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 1.1.2.2 martin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 1.1.2.2 martin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 1.1.2.2 martin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30 1.1.2.2 martin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 1.1.2.2 martin *
32 1.1.2.2 martin * $FreeBSD: head/sys/dev/hyperv/include/hyperv.h 326255 2017-11-27 14:52:40Z pfg $
33 1.1.2.2 martin */
34 1.1.2.2 martin
35 1.1.2.2 martin #ifndef _HYPERVVAR_H_
36 1.1.2.2 martin #define _HYPERVVAR_H_
37 1.1.2.2 martin
38 1.1.2.2 martin #if defined(_KERNEL)
39 1.1.2.2 martin
40 1.1.2.2 martin #include <sys/bus.h>
41 1.1.2.2 martin #include <sys/timex.h>
42 1.1.2.2 martin
43 1.1.2.2 martin #define HYPERV_TIMER_NS_FACTOR 100ULL
44 1.1.2.2 martin #define HYPERV_TIMER_FREQ (NANOSECOND / HYPERV_TIMER_NS_FACTOR)
45 1.1.2.2 martin
46 1.1.2.2 martin #endif /* _KERNEL */
47 1.1.2.2 martin
48 1.1.2.2 martin /*
49 1.1.2.2 martin * Hyper-V Reference TSC
50 1.1.2.2 martin */
51 1.1.2.2 martin struct hyperv_reftsc {
52 1.1.2.2 martin volatile uint32_t tsc_seq;
53 1.1.2.2 martin volatile uint32_t tsc_rsvd1;
54 1.1.2.2 martin volatile uint64_t tsc_scale;
55 1.1.2.2 martin volatile int64_t tsc_ofs;
56 1.1.2.2 martin } __packed __aligned(PAGE_SIZE);
57 1.1.2.2 martin #ifdef __CTASSERT
58 1.1.2.2 martin __CTASSERT(sizeof(struct hyperv_reftsc) == PAGE_SIZE);
59 1.1.2.2 martin #endif
60 1.1.2.2 martin
61 1.1.2.2 martin #if defined(_KERNEL)
62 1.1.2.2 martin
63 1.1.2.2 martin int hyperv_hypercall_enabled(void);
64 1.1.2.2 martin int hyperv_synic_supported(void);
65 1.1.2.3 martin int hyperv_is_gen1(void);
66 1.1.2.2 martin void hyperv_send_eom(void);
67 1.1.2.2 martin void hyperv_intr(void);
68 1.1.2.2 martin
69 1.1.2.2 martin struct vmbus_softc;
70 1.1.2.2 martin void vmbus_init_interrupts_md(struct vmbus_softc *);
71 1.1.2.2 martin void vmbus_deinit_interrupts_md(struct vmbus_softc *);
72 1.1.2.2 martin void vmbus_init_synic_md(struct vmbus_softc *, cpuid_t);
73 1.1.2.2 martin void vmbus_deinit_synic_md(struct vmbus_softc *, cpuid_t);
74 1.1.2.2 martin
75 1.1.2.2 martin #define HYPERV_GUID_STRLEN 40
76 1.1.2.2 martin struct hyperv_guid;
77 1.1.2.2 martin int hyperv_guid2str(const struct hyperv_guid *, char *, size_t);
78 1.1.2.2 martin
79 1.1.2.2 martin /*
80 1.1.2.2 martin * hyperv_tc64 could be NULL, if there were no suitable Hyper-V
81 1.1.2.2 martin * specific timecounter.
82 1.1.2.2 martin */
83 1.1.2.2 martin typedef uint64_t (*hyperv_tc64_t)(void);
84 1.1.2.2 martin extern hyperv_tc64_t hyperv_tc64;
85 1.1.2.2 martin
86 1.1.2.2 martin uint64_t hyperv_hypercall(uint64_t, paddr_t, paddr_t);
87 1.1.2.2 martin uint64_t hyperv_hypercall_post_message(paddr_t);
88 1.1.2.2 martin uint64_t hyperv_hypercall_signal_event(paddr_t);
89 1.1.2.2 martin
90 1.1.2.2 martin typedef void (*hyperv_proc_t)(void *, struct cpu_info *);
91 1.1.2.2 martin void hyperv_set_event_proc(hyperv_proc_t, void *);
92 1.1.2.2 martin void hyperv_set_message_proc(hyperv_proc_t, void *);
93 1.1.2.2 martin
94 1.1.2.2 martin /*
95 1.1.2.2 martin * Hyper-V bus_dma utilities.
96 1.1.2.2 martin */
97 1.1.2.2 martin struct hyperv_dma {
98 1.1.2.2 martin bus_dmamap_t map;
99 1.1.2.2 martin bus_dma_segment_t *segs;
100 1.1.2.2 martin void *addr;
101 1.1.2.2 martin int nsegs;
102 1.1.2.2 martin };
103 1.1.2.2 martin
104 1.1.2.2 martin static __inline bus_addr_t
105 1.1.2.2 martin hyperv_dma_get_paddr(struct hyperv_dma *dma)
106 1.1.2.2 martin {
107 1.1.2.2 martin return dma->map->dm_segs[0].ds_addr;
108 1.1.2.2 martin }
109 1.1.2.2 martin
110 1.1.2.2 martin void *hyperv_dma_alloc(bus_dma_tag_t, struct hyperv_dma *, bus_size_t,
111 1.1.2.2 martin bus_size_t, bus_size_t, int);
112 1.1.2.2 martin void hyperv_dma_free(bus_dma_tag_t, struct hyperv_dma *);
113 1.1.2.2 martin
114 1.1.2.2 martin #endif /* _KERNEL */
115 1.1.2.2 martin
116 1.1.2.2 martin #endif /* _HYPERVVAR_H_ */
117