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