1255040Sgibbs/******************************************************************************
2255040Sgibbs * evtchn.h
3255040Sgibbs *
4255040Sgibbs * Data structures and definitions private to the FreeBSD implementation
5255040Sgibbs * of the Xen event channel API.
6255040Sgibbs *
7255040Sgibbs * Copyright (c) 2004, K A Fraser
8255040Sgibbs * Copyright (c) 2012, Spectra Logic Corporation
9255040Sgibbs *
10255040Sgibbs * This file may be distributed separately from the Linux kernel, or
11255040Sgibbs * incorporated into other software packages, subject to the following license:
12255040Sgibbs *
13255040Sgibbs * Permission is hereby granted, free of charge, to any person obtaining a copy
14255040Sgibbs * of this source file (the "Software"), to deal in the Software without
15255040Sgibbs * restriction, including without limitation the rights to use, copy, modify,
16255040Sgibbs * merge, publish, distribute, sublicense, and/or sell copies of the Software,
17255040Sgibbs * and to permit persons to whom the Software is furnished to do so, subject to
18255040Sgibbs * the following conditions:
19255040Sgibbs *
20255040Sgibbs * The above copyright notice and this permission notice shall be included in
21255040Sgibbs * all copies or substantial portions of the Software.
22255040Sgibbs *
23255040Sgibbs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24255040Sgibbs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25255040Sgibbs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26255040Sgibbs * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27255040Sgibbs * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28255040Sgibbs * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29255040Sgibbs * IN THE SOFTWARE.
30255040Sgibbs *
31255040Sgibbs * $FreeBSD$
32255040Sgibbs */
33255040Sgibbs
34255040Sgibbs#ifndef __XEN_EVTCHN_EVTCHNVAR_H__
35255040Sgibbs#define __XEN_EVTCHN_EVTCHNVAR_H__
36255040Sgibbs
37255040Sgibbs#include <xen/hypervisor.h>
38255040Sgibbs#include <xen/interface/event_channel.h>
39255040Sgibbs
40255040Sgibbsenum evtchn_type {
41255040Sgibbs	EVTCHN_TYPE_UNBOUND,
42255040Sgibbs	EVTCHN_TYPE_PIRQ,
43255040Sgibbs	EVTCHN_TYPE_VIRQ,
44255040Sgibbs	EVTCHN_TYPE_IPI,
45255040Sgibbs	EVTCHN_TYPE_PORT,
46255040Sgibbs	EVTCHN_TYPE_COUNT
47255040Sgibbs};
48255040Sgibbs
49255040Sgibbs/** Submit a port notification for delivery to a userland evtchn consumer */
50255040Sgibbsvoid evtchn_device_upcall(evtchn_port_t port);
51255040Sgibbs
52255040Sgibbs/**
53255040Sgibbs * Disable signal delivery for an event channel port, returning its
54255040Sgibbs * previous mask state.
55255040Sgibbs *
56255040Sgibbs * \param port  The event channel port to query and mask.
57255040Sgibbs *
58255040Sgibbs * \returns  1 if event delivery was previously disabled.  Otherwise 0.
59255040Sgibbs */
60255040Sgibbsstatic inline int
61255040Sgibbsevtchn_test_and_set_mask(evtchn_port_t port)
62255040Sgibbs{
63255040Sgibbs	shared_info_t *s = HYPERVISOR_shared_info;
64255040Sgibbs	return synch_test_and_set_bit(port, s->evtchn_mask);
65255040Sgibbs}
66255040Sgibbs
67255040Sgibbs/**
68255040Sgibbs * Clear any pending event for the given event channel port.
69255040Sgibbs *
70255040Sgibbs * \param port  The event channel port to clear.
71255040Sgibbs */
72255040Sgibbsstatic inline void
73255040Sgibbsevtchn_clear_port(evtchn_port_t port)
74255040Sgibbs{
75255040Sgibbs	shared_info_t *s = HYPERVISOR_shared_info;
76255040Sgibbs	synch_clear_bit(port, &s->evtchn_pending[0]);
77255040Sgibbs}
78255040Sgibbs
79255040Sgibbs/**
80255040Sgibbs * Disable signal delivery for an event channel port.
81255040Sgibbs *
82255040Sgibbs * \param port  The event channel port to mask.
83255040Sgibbs */
84255040Sgibbsstatic inline void
85255040Sgibbsevtchn_mask_port(evtchn_port_t port)
86255040Sgibbs{
87255040Sgibbs	shared_info_t *s = HYPERVISOR_shared_info;
88255040Sgibbs
89255040Sgibbs	synch_set_bit(port, &s->evtchn_mask[0]);
90255040Sgibbs}
91255040Sgibbs
92255040Sgibbs/**
93255040Sgibbs * Enable signal delivery for an event channel port.
94255040Sgibbs *
95255040Sgibbs * \param port  The event channel port to enable.
96255040Sgibbs */
97255040Sgibbsstatic inline void
98255040Sgibbsevtchn_unmask_port(evtchn_port_t port)
99255040Sgibbs{
100255040Sgibbs	evtchn_unmask_t op = { .port = port };
101255040Sgibbs
102255040Sgibbs	HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &op);
103255040Sgibbs}
104255040Sgibbs
105255040Sgibbs#endif /* __XEN_EVTCHN_EVTCHNVAR_H__ */
106