xref: /illumos-gate/usr/src/uts/intel/io/vmm/vmm_ioport.h (revision 55fea89dcaa64928bed4327112404dcb3e07b79f)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
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  * $FreeBSD$
29  */
30 /*
31  * This file and its contents are supplied under the terms of the
32  * Common Development and Distribution License ("CDDL"), version 1.0.
33  * You may only use this file in accordance with the terms of version
34  * 1.0 of the CDDL.
35  *
36  * A full copy of the text of the CDDL should have accompanied this
37  * source.  A copy of the CDDL is also available via the Internet at
38  * http://www.illumos.org/license/CDDL.
39  *
40  * Copyright 2020 Oxide Computer Company
41  */
42 
43 #ifndef	_VMM_IOPORT_H_
44 #define	_VMM_IOPORT_H_
45 
46 #include <sys/vmm_kernel.h>
47 
48 struct ioport_entry {
49 	ioport_handler_t	iope_func;
50 	void			*iope_arg;
51 	uint16_t		iope_port;
52 	uint16_t		iope_flags;
53 	uint32_t		iope_pad;
54 };
55 typedef struct ioport_entry ioport_entry_t;
56 
57 struct ioport_config {
58 	struct ioport_entry	*iop_entries;
59 	uint_t			iop_count;
60 };
61 
62 #define	IOPF_DEFAULT	0
63 #define	IOPF_FIXED	(1 << 0)	/* system device fixed in position */
64 #define	IOPF_DRV_HOOK	(1 << 1)	/* external driver hook */
65 
66 void vm_inout_init(struct vm *vm, struct ioport_config *ports);
67 void vm_inout_cleanup(struct vm *vm, struct ioport_config *ports);
68 
69 int vm_inout_attach(struct ioport_config *ports, uint16_t port, uint16_t flags,
70     ioport_handler_t func, void *arg);
71 int vm_inout_detach(struct ioport_config *ports, uint16_t port, bool drv_hook,
72     ioport_handler_t *old_func, void **old_arg);
73 
74 int vm_inout_access(struct ioport_config *ports, bool in, uint16_t port,
75     uint8_t bytes, uint32_t *val);
76 
77 /*
78  * Arbitrary cookie for io port hook:
79  * - top 48 bits: func address + arg
80  * - lower 16 bits: port
81  */
82 #define	IOP_GEN_COOKIE(func, arg, port)					\
83 	((uintptr_t)((((uintptr_t)(func) + (uintptr_t)(arg)) << 16)	\
84 	    | (uint16_t)(port)))
85 #define	IOP_PORT_FROM_COOKIE(cookie)	(uint16_t)(cookie)
86 
87 #endif	/* _VMM_IOPORT_H_ */
88