xref: /illumos-gate/usr/src/uts/intel/io/vmm/vmm_ioport.h (revision fdad6fbf87b201fdb96a704fc41fa8be1e4efbc8)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2014 Tycho Nightingale <tycho.nightingale@pluribusnetworks.com>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 /*
29  * This file and its contents are supplied under the terms of the
30  * Common Development and Distribution License ("CDDL"), version 1.0.
31  * You may only use this file in accordance with the terms of version
32  * 1.0 of the CDDL.
33  *
34  * A full copy of the text of the CDDL should have accompanied this
35  * source.  A copy of the CDDL is also available via the Internet at
36  * http://www.illumos.org/license/CDDL.
37  */
38 /* This file is dual-licensed; see usr/src/contrib/bhyve/LICENSE */
39 
40 /*
41  * Copyright 2020 Oxide Computer Company
42  */
43 
44 #ifndef	_VMM_IOPORT_H_
45 #define	_VMM_IOPORT_H_
46 
47 #include <sys/vmm_kernel.h>
48 
49 struct ioport_entry {
50 	ioport_handler_t	iope_func;
51 	void			*iope_arg;
52 	uint16_t		iope_port;
53 	uint16_t		iope_flags;
54 	uint32_t		iope_pad;
55 };
56 typedef struct ioport_entry ioport_entry_t;
57 
58 struct ioport_config {
59 	struct ioport_entry	*iop_entries;
60 	uint_t			iop_count;
61 };
62 
63 #define	IOPF_DEFAULT	0
64 #define	IOPF_FIXED	(1 << 0)	/* system device fixed in position */
65 #define	IOPF_DRV_HOOK	(1 << 1)	/* external driver hook */
66 
67 void vm_inout_init(struct vm *vm, struct ioport_config *ports);
68 void vm_inout_cleanup(struct vm *vm, struct ioport_config *ports);
69 
70 int vm_inout_attach(struct ioport_config *ports, uint16_t port, uint16_t flags,
71     ioport_handler_t func, void *arg);
72 int vm_inout_detach(struct ioport_config *ports, uint16_t port, bool drv_hook,
73     ioport_handler_t *old_func, void **old_arg);
74 
75 int vm_inout_access(struct ioport_config *ports, bool in, uint16_t port,
76     uint8_t bytes, uint32_t *val);
77 
78 /*
79  * Arbitrary cookie for io port hook:
80  * - top 48 bits: func address + arg
81  * - lower 16 bits: port
82  */
83 #define	IOP_GEN_COOKIE(func, arg, port)					\
84 	((uintptr_t)((((uintptr_t)(func) + (uintptr_t)(arg)) << 16)	\
85 	    | (uint16_t)(port)))
86 #define	IOP_PORT_FROM_COOKIE(cookie)	(uint16_t)(cookie)
87 
88 #endif	/* _VMM_IOPORT_H_ */
89