xref: /freebsd/sys/arm64/iommu/iommu_if.m (revision 7ef62cebc2f965b0f640263e179276928885e33d)
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
53INTERFACE iommu;
54
55#
56# Check if the iommu controller dev is responsible to serve traffic
57# for a given child.
58#
59METHOD 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#
67METHOD 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#
79METHOD 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#
89METHOD 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#
97METHOD void domain_free {
98	device_t		dev;
99	struct iommu_domain	*iodom;
100};
101
102#
103# Find a domain allocated for a dev.
104#
105METHOD struct iommu_domain * domain_lookup {
106	device_t		dev;
107};
108
109#
110# Find an allocated context for a device.
111#
112METHOD struct iommu_ctx * ctx_lookup {
113	device_t		dev;
114	device_t		child;
115};
116
117#
118# Allocate a new iommu context.
119#
120METHOD 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#
130METHOD int ctx_init {
131	device_t		dev;
132	struct iommu_ctx	*ioctx;
133};
134
135#
136# Free the iommu context.
137#
138METHOD 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#
147METHOD int ofw_md_data {
148	device_t dev;
149	struct iommu_ctx *ioctx;
150	pcell_t *cells;
151	int ncells;
152};
153#endif
154