1 #-
2 # SPDX-License-Identifier: BSD-2-Clause
3 #:
4 # Copyright (c) 2020 Ruslan Bukin <br@bsdpad.com>
5 #
6 # This software was developed by SRI International and the University of
7 # Cambridge Computer Laboratory (Department of Computer Science and
8 # Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
9 # DARPA SSITH research programme.
10 #
11 # Redistribution and use in source and binary forms, with or without
12 # modification, are permitted provided that the following conditions
13 # are met:
14 # 1. Redistributions of source code must retain the above copyright
15 # notice, this list of conditions and the following disclaimer.
16 # 2. Redistributions in binary form must reproduce the above copyright
17 # notice, this list of conditions and the following disclaimer in the
18 # documentation and/or other materials provided with the distribution.
19 #
20 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 # SUCH DAMAGE.
31 #
32 # $FreeBSD$
33 #
34
35 #include "opt_platform.h"
36
37 #include <sys/types.h>
38 #include <sys/taskqueue.h>
39 #include <sys/bus.h>
40 #include <sys/sysctl.h>
41 #include <sys/tree.h>
42 #include <vm/vm.h>
43 #include <dev/pci/pcireg.h>
44 #include <dev/pci/pcivar.h>
45 #include <dev/iommu/iommu.h>
46
47 #ifdef FDT
48 #include <dev/fdt/fdt_common.h>
49 #include <dev/ofw/ofw_bus.h>
50 #include <dev/ofw/ofw_bus_subr.h>
51 #endif
52
53 INTERFACE iommu;
54
55 #
56 # Check if the iommu controller dev is responsible to serve traffic
57 # for a given child.
58 #
59 METHOD int find {
60 device_t dev;
61 device_t child;
62 };
63
64 #
65 # Map a virtual address VA to a physical address PA.
66 #
67 METHOD int map {
68 device_t dev;
69 struct iommu_domain *iodom;
70 vm_offset_t va;
71 vm_page_t *ma;
72 bus_size_t size;
73 vm_prot_t prot;
74 };
75
76 #
77 # Unmap a virtual address VA.
78 #
79 METHOD int unmap {
80 device_t dev;
81 struct iommu_domain *iodom;
82 vm_offset_t va;
83 bus_size_t size;
84 };
85
86 #
87 # Allocate an IOMMU domain.
88 #
89 METHOD struct iommu_domain * domain_alloc {
90 device_t dev;
91 struct iommu_unit *iommu;
92 };
93
94 #
95 # Release all the resources held by IOMMU domain.
96 #
97 METHOD void domain_free {
98 device_t dev;
99 struct iommu_domain *iodom;
100 };
101
102 #
103 # Find a domain allocated for a dev.
104 #
105 METHOD struct iommu_domain * domain_lookup {
106 device_t dev;
107 };
108
109 #
110 # Find an allocated context for a device.
111 #
112 METHOD struct iommu_ctx * ctx_lookup {
113 device_t dev;
114 device_t child;
115 };
116
117 #
118 # Allocate a new iommu context.
119 #
120 METHOD struct iommu_ctx * ctx_alloc {
121 device_t dev;
122 struct iommu_domain *iodom;
123 device_t child;
124 bool disabled;
125 };
126
127 #
128 # Initialize the new iommu context.
129 #
130 METHOD int ctx_init {
131 device_t dev;
132 struct iommu_ctx *ioctx;
133 };
134
135 #
136 # Free the iommu context.
137 #
138 METHOD void ctx_free {
139 device_t dev;
140 struct iommu_ctx *ioctx;
141 };
142
143 #ifdef FDT
144 #
145 # Notify controller we have machine-dependent data.
146 #
147 METHOD int ofw_md_data {
148 device_t dev;
149 struct iommu_ctx *ioctx;
150 pcell_t *cells;
151 int ncells;
152 };
153 #endif
Cache object: d600cf3855091985c6dfafa526228491
|