xref: /illumos-gate/usr/src/uts/intel/io/vmm/vmm_ioport.h (revision 32640292)
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  * Copyright 2020 Oxide Computer Company
39  */
40 
41 #ifndef	_VMM_IOPORT_H_
42 #define	_VMM_IOPORT_H_
43 
44 #include <sys/vmm_kernel.h>
45 
46 struct ioport_entry {
47 	ioport_handler_t	iope_func;
48 	void			*iope_arg;
49 	uint16_t		iope_port;
50 	uint16_t		iope_flags;
51 	uint32_t		iope_pad;
52 };
53 typedef struct ioport_entry ioport_entry_t;
54 
55 struct ioport_config {
56 	struct ioport_entry	*iop_entries;
57 	uint_t			iop_count;
58 };
59 
60 #define	IOPF_DEFAULT	0
61 #define	IOPF_FIXED	(1 << 0)	/* system device fixed in position */
62 #define	IOPF_DRV_HOOK	(1 << 1)	/* external driver hook */
63 
64 void vm_inout_init(struct vm *vm, struct ioport_config *ports);
65 void vm_inout_cleanup(struct vm *vm, struct ioport_config *ports);
66 
67 int vm_inout_attach(struct ioport_config *ports, uint16_t port, uint16_t flags,
68     ioport_handler_t func, void *arg);
69 int vm_inout_detach(struct ioport_config *ports, uint16_t port, bool drv_hook,
70     ioport_handler_t *old_func, void **old_arg);
71 
72 int vm_inout_access(struct ioport_config *ports, bool in, uint16_t port,
73     uint8_t bytes, uint32_t *val);
74 
75 /*
76  * Arbitrary cookie for io port hook:
77  * - top 48 bits: func address + arg
78  * - lower 16 bits: port
79  */
80 #define	IOP_GEN_COOKIE(func, arg, port)					\
81 	((uintptr_t)((((uintptr_t)(func) + (uintptr_t)(arg)) << 16)	\
82 	    | (uint16_t)(port)))
83 #define	IOP_PORT_FROM_COOKIE(cookie)	(uint16_t)(cookie)
84 
85 #endif	/* _VMM_IOPORT_H_ */
86