xref: /freebsd/sys/arm64/iommu/iommu_if.m (revision 031beb4e239bfce798af17f5fe8dba8bcaf13d99)
14cc87010SRuslan Bukin#-
24cc87010SRuslan Bukin# SPDX-License-Identifier: BSD-2-Clause
34cc87010SRuslan Bukin#:
44cc87010SRuslan Bukin# Copyright (c) 2020 Ruslan Bukin <br@bsdpad.com>
54cc87010SRuslan Bukin#
64cc87010SRuslan Bukin# This software was developed by SRI International and the University of
74cc87010SRuslan Bukin# Cambridge Computer Laboratory (Department of Computer Science and
84cc87010SRuslan Bukin# Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
94cc87010SRuslan Bukin# DARPA SSITH research programme.
104cc87010SRuslan Bukin#
114cc87010SRuslan Bukin# Redistribution and use in source and binary forms, with or without
124cc87010SRuslan Bukin# modification, are permitted provided that the following conditions
134cc87010SRuslan Bukin# are met:
144cc87010SRuslan Bukin# 1. Redistributions of source code must retain the above copyright
154cc87010SRuslan Bukin#    notice, this list of conditions and the following disclaimer.
164cc87010SRuslan Bukin# 2. Redistributions in binary form must reproduce the above copyright
174cc87010SRuslan Bukin#    notice, this list of conditions and the following disclaimer in the
184cc87010SRuslan Bukin#    documentation and/or other materials provided with the distribution.
194cc87010SRuslan Bukin#
204cc87010SRuslan Bukin# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
214cc87010SRuslan Bukin# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
224cc87010SRuslan Bukin# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
234cc87010SRuslan Bukin# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
244cc87010SRuslan Bukin# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
254cc87010SRuslan Bukin# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
264cc87010SRuslan Bukin# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
274cc87010SRuslan Bukin# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
284cc87010SRuslan Bukin# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
294cc87010SRuslan Bukin# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
304cc87010SRuslan Bukin# SUCH DAMAGE.
314cc87010SRuslan Bukin#
324cc87010SRuslan Bukin#
334cc87010SRuslan Bukin
34*dc08d52dSRuslan Bukin#include "opt_platform.h"
35*dc08d52dSRuslan Bukin
364cc87010SRuslan Bukin#include <sys/types.h>
374cc87010SRuslan Bukin#include <sys/taskqueue.h>
384cc87010SRuslan Bukin#include <sys/bus.h>
394cc87010SRuslan Bukin#include <sys/sysctl.h>
404cc87010SRuslan Bukin#include <sys/tree.h>
414cc87010SRuslan Bukin#include <vm/vm.h>
424cc87010SRuslan Bukin#include <dev/pci/pcireg.h>
434cc87010SRuslan Bukin#include <dev/pci/pcivar.h>
444cc87010SRuslan Bukin#include <dev/iommu/iommu.h>
454cc87010SRuslan Bukin
4641ce5498SRuslan Bukin#ifdef FDT
4741ce5498SRuslan Bukin#include <dev/fdt/fdt_common.h>
4841ce5498SRuslan Bukin#include <dev/ofw/ofw_bus.h>
4941ce5498SRuslan Bukin#include <dev/ofw/ofw_bus_subr.h>
5041ce5498SRuslan Bukin#endif
5141ce5498SRuslan Bukin
524cc87010SRuslan BukinINTERFACE iommu;
534cc87010SRuslan Bukin
544cc87010SRuslan Bukin#
554cc87010SRuslan Bukin# Check if the iommu controller dev is responsible to serve traffic
564cc87010SRuslan Bukin# for a given child.
574cc87010SRuslan Bukin#
584cc87010SRuslan BukinMETHOD int find {
594cc87010SRuslan Bukin	device_t		dev;
604cc87010SRuslan Bukin	device_t		child;
614cc87010SRuslan Bukin};
624cc87010SRuslan Bukin
634cc87010SRuslan Bukin#
644cc87010SRuslan Bukin# Map a virtual address VA to a physical address PA.
654cc87010SRuslan Bukin#
664cc87010SRuslan BukinMETHOD int map {
674cc87010SRuslan Bukin	device_t		dev;
684cc87010SRuslan Bukin	struct iommu_domain	*iodom;
694cc87010SRuslan Bukin	vm_offset_t		va;
704cc87010SRuslan Bukin	vm_page_t		*ma;
714cc87010SRuslan Bukin	bus_size_t		size;
724cc87010SRuslan Bukin	vm_prot_t		prot;
734cc87010SRuslan Bukin};
744cc87010SRuslan Bukin
754cc87010SRuslan Bukin#
764cc87010SRuslan Bukin# Unmap a virtual address VA.
774cc87010SRuslan Bukin#
784cc87010SRuslan BukinMETHOD int unmap {
794cc87010SRuslan Bukin	device_t		dev;
804cc87010SRuslan Bukin	struct iommu_domain	*iodom;
814cc87010SRuslan Bukin	vm_offset_t		va;
824cc87010SRuslan Bukin	bus_size_t		size;
834cc87010SRuslan Bukin};
844cc87010SRuslan Bukin
854cc87010SRuslan Bukin#
864cc87010SRuslan Bukin# Allocate an IOMMU domain.
874cc87010SRuslan Bukin#
884cc87010SRuslan BukinMETHOD struct iommu_domain * domain_alloc {
894cc87010SRuslan Bukin	device_t		dev;
904cc87010SRuslan Bukin	struct iommu_unit	*iommu;
914cc87010SRuslan Bukin};
924cc87010SRuslan Bukin
934cc87010SRuslan Bukin#
944cc87010SRuslan Bukin# Release all the resources held by IOMMU domain.
954cc87010SRuslan Bukin#
964cc87010SRuslan BukinMETHOD void domain_free {
974cc87010SRuslan Bukin	device_t		dev;
984cc87010SRuslan Bukin	struct iommu_domain	*iodom;
994cc87010SRuslan Bukin};
1004cc87010SRuslan Bukin
1014cc87010SRuslan Bukin#
1024cc87010SRuslan Bukin# Find a domain allocated for a dev.
1034cc87010SRuslan Bukin#
1044cc87010SRuslan BukinMETHOD struct iommu_domain * domain_lookup {
1054cc87010SRuslan Bukin	device_t		dev;
1064cc87010SRuslan Bukin};
1074cc87010SRuslan Bukin
1084cc87010SRuslan Bukin#
1094cc87010SRuslan Bukin# Find an allocated context for a device.
1104cc87010SRuslan Bukin#
1114cc87010SRuslan BukinMETHOD struct iommu_ctx * ctx_lookup {
1124cc87010SRuslan Bukin	device_t		dev;
1134cc87010SRuslan Bukin	device_t		child;
1144cc87010SRuslan Bukin};
1154cc87010SRuslan Bukin
1164cc87010SRuslan Bukin#
1174cc87010SRuslan Bukin# Allocate a new iommu context.
1184cc87010SRuslan Bukin#
1194cc87010SRuslan BukinMETHOD struct iommu_ctx * ctx_alloc {
1204cc87010SRuslan Bukin	device_t		dev;
1214cc87010SRuslan Bukin	struct iommu_domain	*iodom;
1224cc87010SRuslan Bukin	device_t		child;
1234cc87010SRuslan Bukin	bool			disabled;
1244cc87010SRuslan Bukin};
1254cc87010SRuslan Bukin
1264cc87010SRuslan Bukin#
12741ce5498SRuslan Bukin# Initialize the new iommu context.
12841ce5498SRuslan Bukin#
12941ce5498SRuslan BukinMETHOD int ctx_init {
13041ce5498SRuslan Bukin	device_t		dev;
13141ce5498SRuslan Bukin	struct iommu_ctx	*ioctx;
13241ce5498SRuslan Bukin};
13341ce5498SRuslan Bukin
13441ce5498SRuslan Bukin#
1354cc87010SRuslan Bukin# Free the iommu context.
1364cc87010SRuslan Bukin#
1374cc87010SRuslan BukinMETHOD void ctx_free {
1384cc87010SRuslan Bukin	device_t		dev;
1394cc87010SRuslan Bukin	struct iommu_ctx	*ioctx;
1404cc87010SRuslan Bukin};
14141ce5498SRuslan Bukin
142*dc08d52dSRuslan Bukin#ifdef FDT
14341ce5498SRuslan Bukin#
14441ce5498SRuslan Bukin# Notify controller we have machine-dependent data.
14541ce5498SRuslan Bukin#
14641ce5498SRuslan BukinMETHOD int ofw_md_data {
14741ce5498SRuslan Bukin	device_t dev;
14841ce5498SRuslan Bukin	struct iommu_ctx *ioctx;
14941ce5498SRuslan Bukin	pcell_t *cells;
15041ce5498SRuslan Bukin	int ncells;
15141ce5498SRuslan Bukin};
152*dc08d52dSRuslan Bukin#endif
153