1251767Sgibbs/*
2251767Sgibbs * Permission is hereby granted, free of charge, to any person obtaining a copy
3251767Sgibbs * of this software and associated documentation files (the "Software"), to
4251767Sgibbs * deal in the Software without restriction, including without limitation the
5251767Sgibbs * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6251767Sgibbs * sell copies of the Software, and to permit persons to whom the Software is
7251767Sgibbs * furnished to do so, subject to the following conditions:
8251767Sgibbs *
9251767Sgibbs * The above copyright notice and this permission notice shall be included in
10251767Sgibbs * all copies or substantial portions of the Software.
11251767Sgibbs *
12251767Sgibbs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13251767Sgibbs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14251767Sgibbs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15251767Sgibbs * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16251767Sgibbs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17251767Sgibbs * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18251767Sgibbs * DEALINGS IN THE SOFTWARE.
19251767Sgibbs *
20251767Sgibbs * $FreeBSD$
21251767Sgibbs */
22251767Sgibbs
23251767Sgibbs#ifndef	__XEN_HVM_H__
24251767Sgibbs#define	__XEN_HVM_H__
25251767Sgibbs
26255040Sgibbs#include <xen/xen-os.h>
27255040Sgibbs#include <xen/hypervisor.h>
28255040Sgibbs
29251767Sgibbs#include <xen/interface/hvm/params.h>
30251767Sgibbs
31251767Sgibbs/**
32251767Sgibbs * \brief Wrapper function to obtain a HVM parameter value.
33251767Sgibbs *
34251767Sgibbs * \param index	HVM parameter index; see <xen/interface/hvm/params.h>.
35251767Sgibbs *
36251767Sgibbs * \returns	0 on failure; the value of the parameter otherwise.
37251767Sgibbs */
38251767Sgibbsstatic inline unsigned long
39251767Sgibbshvm_get_parameter(int index)
40251767Sgibbs{
41251767Sgibbs	struct xen_hvm_param xhv;
42251767Sgibbs	int error;
43251767Sgibbs
44251767Sgibbs	xhv.domid = DOMID_SELF;
45251767Sgibbs	xhv.index = index;
46251767Sgibbs	error = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv);
47251767Sgibbs	if (error) {
48251767Sgibbs		printf("%s: error %d trying to get %d\n", __func__,
49251767Sgibbs		    error, index);
50251767Sgibbs		return (0);
51251767Sgibbs	}
52251767Sgibbs	return (xhv.value);
53251767Sgibbs}
54251767Sgibbs
55251767Sgibbs/** The callback method types for Hypervisor event delivery to our domain. */
56251767Sgibbsenum {
57251767Sgibbs	HVM_CB_TYPE_GSI,
58251767Sgibbs	HVM_CB_TYPE_PCI_INTX,
59251767Sgibbs	HVM_CB_TYPE_VECTOR,
60251767Sgibbs	HVM_CB_TYPE_MASK  = 0xFF,
61251767Sgibbs	HVM_CB_TYPE_SHIFT = 56
62251767Sgibbs};
63251767Sgibbs
64251767Sgibbs/** Format for specifying a GSI type callback. */
65251767Sgibbsenum {
66251767Sgibbs	HVM_CB_GSI_GSI_MASK  = 0xFFFFFFFF,
67251767Sgibbs	HVM_CB_GSI_GSI_SHIFT = 0
68251767Sgibbs};
69251767Sgibbs#define HVM_CALLBACK_GSI(gsi) \
70251767Sgibbs    (((uint64_t)HVM_CB_TYPE_GSI << HVM_CB_TYPE_SHIFT) \
71251767Sgibbs   | ((gsi) & HVM_CB_GSI_GSI_MASK) << HVM_CB_GSI_GSI_SHIFT)
72251767Sgibbs
73251767Sgibbs/** Format for specifying a virtual PCI interrupt line GSI style callback. */
74251767Sgibbsenum {
75251767Sgibbs	HVM_CB_PCI_INTX_INTPIN_MASK  = 0x3,
76251767Sgibbs	HVM_CB_PCI_INTX_INTPIN_SHIFT = 0,
77251767Sgibbs	HVM_CB_PCI_INTX_SLOT_MASK    = 0x1F,
78251767Sgibbs	HVM_CB_PCI_INTX_SLOT_SHIFT   = 11,
79251767Sgibbs};
80251767Sgibbs#define HVM_CALLBACK_PCI_INTX(slot, pin) \
81251767Sgibbs    (((uint64_t)HVM_CB_TYPE_PCI_INTX << HVM_CB_TYPE_SHIFT) \
82251767Sgibbs   | (((slot) & HVM_CB_PCI_INTX_SLOT_MASK) << HVM_CB_PCI_INTX_SLOT_SHIFT) \
83251767Sgibbs   | (((pin) & HVM_CB_PCI_INTX_INTPIN_MASK) << HVM_CB_PCI_INTX_INTPIN_SHIFT))
84251767Sgibbs
85251767Sgibbs/** Format for specifying a direct IDT vector injection style callback. */
86251767Sgibbsenum {
87251767Sgibbs	HVM_CB_VECTOR_VECTOR_MASK  = 0xFFFFFFFF,
88251767Sgibbs	HVM_CB_VECTOR_VECTOR_SHIFT = 0
89251767Sgibbs};
90251767Sgibbs#define HVM_CALLBACK_VECTOR(vector) \
91251767Sgibbs    (((uint64_t)HVM_CB_TYPE_VECTOR << HVM_CB_TYPE_SHIFT) \
92251767Sgibbs   | (((vector) & HVM_CB_GSI_GSI_MASK) << HVM_CB_GSI_GSI_SHIFT))
93251767Sgibbs
94251767Sgibbsvoid xen_hvm_set_callback(device_t);
95251767Sgibbsvoid xen_hvm_suspend(void);
96255726Sgibbsvoid xen_hvm_resume(bool suspend_cancelled);
97251767Sgibbs#endif	/* __XEN_HVM_H__ */
98