xref: /freebsd/sys/kern/msi_if.m (revision 031beb4e239bfce798af17f5fe8dba8bcaf13d99)
13fc155dcSAndrew Turner#-
23fc155dcSAndrew Turner# Copyright (c) 2016 The FreeBSD Foundation
33fc155dcSAndrew Turner#
43fc155dcSAndrew Turner# This software was developed by Andrew Turner under
53fc155dcSAndrew Turner# sponsorship from the FreeBSD Foundation.
63fc155dcSAndrew Turner#
73fc155dcSAndrew Turner# Redistribution and use in source and binary forms, with or without
83fc155dcSAndrew Turner# modification, are permitted provided that the following conditions
93fc155dcSAndrew Turner# are met:
103fc155dcSAndrew Turner# 1. Redistributions of source code must retain the above copyright
113fc155dcSAndrew Turner#    notice, this list of conditions and the following disclaimer.
123fc155dcSAndrew Turner# 2. Redistributions in binary form must reproduce the above copyright
133fc155dcSAndrew Turner#    notice, this list of conditions and the following disclaimer in the
143fc155dcSAndrew Turner#    documentation and/or other materials provided with the distribution.
153fc155dcSAndrew Turner#
163fc155dcSAndrew Turner# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
173fc155dcSAndrew Turner# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
183fc155dcSAndrew Turner# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
193fc155dcSAndrew Turner# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
203fc155dcSAndrew Turner# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
213fc155dcSAndrew Turner# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
223fc155dcSAndrew Turner# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
233fc155dcSAndrew Turner# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
243fc155dcSAndrew Turner# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
253fc155dcSAndrew Turner# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
263fc155dcSAndrew Turner# SUCH DAMAGE.
273fc155dcSAndrew Turner#
283fc155dcSAndrew Turner#
293fc155dcSAndrew Turner
303fc155dcSAndrew TurnerINTERFACE msi;
313fc155dcSAndrew Turner
323fc155dcSAndrew TurnerHEADER {
33e707c8beSRuslan Bukin	#include <machine/bus.h>
34e707c8beSRuslan Bukin	#include <dev/iommu/iommu_msi.h>
35e707c8beSRuslan Bukin
363fc155dcSAndrew Turner	struct intr_irqsrc;
373fc155dcSAndrew Turner};
383fc155dcSAndrew Turner
39*f32f0095SRuslan Bukin#
40*f32f0095SRuslan Bukin# Default implementations of some methods.
41*f32f0095SRuslan Bukin#
42*f32f0095SRuslan BukinCODE {
43*f32f0095SRuslan Bukin	static int
44*f32f0095SRuslan Bukin	iommu_init(device_t dev, device_t child, struct iommu_domain **domain)
45*f32f0095SRuslan Bukin	{
46*f32f0095SRuslan Bukin		*domain = NULL;
47*f32f0095SRuslan Bukin		return (0);
48*f32f0095SRuslan Bukin	}
49*f32f0095SRuslan Bukin	static void
50*f32f0095SRuslan Bukin	iommu_deinit(device_t dev, device_t child)
51*f32f0095SRuslan Bukin	{
52*f32f0095SRuslan Bukin	}
53*f32f0095SRuslan Bukin};
54*f32f0095SRuslan Bukin
553fc155dcSAndrew TurnerMETHOD int alloc_msi {
563fc155dcSAndrew Turner	device_t	dev;
573fc155dcSAndrew Turner	device_t	child;
583fc155dcSAndrew Turner	int		count;
593fc155dcSAndrew Turner	int		maxcount;
603fc155dcSAndrew Turner	device_t	*pic;
613fc155dcSAndrew Turner	struct intr_irqsrc **srcs;
623fc155dcSAndrew Turner};
633fc155dcSAndrew Turner
643fc155dcSAndrew TurnerMETHOD int release_msi {
653fc155dcSAndrew Turner	device_t	dev;
663fc155dcSAndrew Turner	device_t	child;
673fc155dcSAndrew Turner	int		count;
683fc155dcSAndrew Turner	struct intr_irqsrc **srcs;
693fc155dcSAndrew Turner};
703fc155dcSAndrew Turner
713fc155dcSAndrew TurnerMETHOD int alloc_msix {
723fc155dcSAndrew Turner	device_t	dev;
733fc155dcSAndrew Turner	device_t	child;
743fc155dcSAndrew Turner	device_t	*pic;
753fc155dcSAndrew Turner	struct intr_irqsrc **src;
763fc155dcSAndrew Turner};
773fc155dcSAndrew Turner
783fc155dcSAndrew TurnerMETHOD int release_msix {
793fc155dcSAndrew Turner	device_t	dev;
803fc155dcSAndrew Turner	device_t	child;
813fc155dcSAndrew Turner	struct intr_irqsrc *src;
823fc155dcSAndrew Turner};
833fc155dcSAndrew Turner
843fc155dcSAndrew TurnerMETHOD int map_msi {
853fc155dcSAndrew Turner	device_t	dev;
863fc155dcSAndrew Turner	device_t	child;
873fc155dcSAndrew Turner	struct intr_irqsrc *src;
883fc155dcSAndrew Turner	uint64_t	*addr;
893fc155dcSAndrew Turner	uint32_t	*data;
903fc155dcSAndrew Turner};
913fc155dcSAndrew Turner
92e707c8beSRuslan BukinMETHOD int iommu_init {
93e707c8beSRuslan Bukin	device_t	dev;
94e707c8beSRuslan Bukin	device_t	child;
95e707c8beSRuslan Bukin	struct iommu_domain **domain;
96*f32f0095SRuslan Bukin} DEFAULT iommu_init;
97*f32f0095SRuslan Bukin
98*f32f0095SRuslan BukinMETHOD void iommu_deinit {
99*f32f0095SRuslan Bukin	device_t	dev;
100*f32f0095SRuslan Bukin	device_t	child;
101*f32f0095SRuslan Bukin} DEFAULT iommu_deinit;
102