xref: /freebsd/sys/arm64/iommu/iommu_if.m (revision 8ddb146abcdf061be9f2c0db7e391697dafad85c)
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 <sys/types.h>
36#include <sys/taskqueue.h>
37#include <sys/bus.h>
38#include <sys/sysctl.h>
39#include <sys/tree.h>
40#include <vm/vm.h>
41#include <dev/pci/pcireg.h>
42#include <dev/pci/pcivar.h>
43#include <dev/iommu/iommu.h>
44
45#ifdef FDT
46#include <dev/fdt/fdt_common.h>
47#include <dev/ofw/ofw_bus.h>
48#include <dev/ofw/ofw_bus_subr.h>
49#endif
50
51INTERFACE iommu;
52
53#
54# Check if the iommu controller dev is responsible to serve traffic
55# for a given child.
56#
57METHOD int find {
58	device_t		dev;
59	device_t		child;
60};
61
62#
63# Map a virtual address VA to a physical address PA.
64#
65METHOD int map {
66	device_t		dev;
67	struct iommu_domain	*iodom;
68	vm_offset_t		va;
69	vm_page_t		*ma;
70	bus_size_t		size;
71	vm_prot_t		prot;
72};
73
74#
75# Unmap a virtual address VA.
76#
77METHOD int unmap {
78	device_t		dev;
79	struct iommu_domain	*iodom;
80	vm_offset_t		va;
81	bus_size_t		size;
82};
83
84#
85# Allocate an IOMMU domain.
86#
87METHOD struct iommu_domain * domain_alloc {
88	device_t		dev;
89	struct iommu_unit	*iommu;
90};
91
92#
93# Release all the resources held by IOMMU domain.
94#
95METHOD void domain_free {
96	device_t		dev;
97	struct iommu_domain	*iodom;
98};
99
100#
101# Find a domain allocated for a dev.
102#
103METHOD struct iommu_domain * domain_lookup {
104	device_t		dev;
105};
106
107#
108# Find an allocated context for a device.
109#
110METHOD struct iommu_ctx * ctx_lookup {
111	device_t		dev;
112	device_t		child;
113};
114
115#
116# Allocate a new iommu context.
117#
118METHOD struct iommu_ctx * ctx_alloc {
119	device_t		dev;
120	struct iommu_domain	*iodom;
121	device_t		child;
122	bool			disabled;
123};
124
125#
126# Initialize the new iommu context.
127#
128METHOD int ctx_init {
129	device_t		dev;
130	struct iommu_ctx	*ioctx;
131};
132
133#
134# Free the iommu context.
135#
136METHOD void ctx_free {
137	device_t		dev;
138	struct iommu_ctx	*ioctx;
139};
140
141#
142# Notify controller we have machine-dependent data.
143#
144METHOD int ofw_md_data {
145	device_t dev;
146	struct iommu_ctx *ioctx;
147	pcell_t *cells;
148	int ncells;
149};
150