1#- 2# Copyright (c) 2016 The FreeBSD Foundation 3# 4# This software was developed by Andrew Turner under 5# sponsorship from the FreeBSD Foundation. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28# $FreeBSD$ 29# 30 31INTERFACE msi; 32 33HEADER { 34 #include <machine/bus.h> 35 #include <dev/iommu/iommu_msi.h> 36 37 struct intr_irqsrc; 38}; 39 40# 41# Default implementations of some methods. 42# 43CODE { 44 static int 45 iommu_init(device_t dev, device_t child, struct iommu_domain **domain) 46 { 47 *domain = NULL; 48 return (0); 49 } 50 static void 51 iommu_deinit(device_t dev, device_t child) 52 { 53 } 54}; 55 56METHOD int alloc_msi { 57 device_t dev; 58 device_t child; 59 int count; 60 int maxcount; 61 device_t *pic; 62 struct intr_irqsrc **srcs; 63}; 64 65METHOD int release_msi { 66 device_t dev; 67 device_t child; 68 int count; 69 struct intr_irqsrc **srcs; 70}; 71 72METHOD int alloc_msix { 73 device_t dev; 74 device_t child; 75 device_t *pic; 76 struct intr_irqsrc **src; 77}; 78 79METHOD int release_msix { 80 device_t dev; 81 device_t child; 82 struct intr_irqsrc *src; 83}; 84 85METHOD int map_msi { 86 device_t dev; 87 device_t child; 88 struct intr_irqsrc *src; 89 uint64_t *addr; 90 uint32_t *data; 91}; 92 93METHOD int iommu_init { 94 device_t dev; 95 device_t child; 96 struct iommu_domain **domain; 97} DEFAULT iommu_init; 98 99METHOD void iommu_deinit { 100 device_t dev; 101 device_t child; 102} DEFAULT iommu_deinit; 103