xref: /freebsd/sys/arm64/iommu/smmu.c (revision a0b9e2e854027e6ff61fb075a1309dbc71c42b54)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2019-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 
33 /*
34  * Hardware overview.
35  *
36  * An incoming transaction from a peripheral device has an address, size,
37  * attributes and StreamID.
38  *
39  * In case of PCI-based devices, StreamID is a PCI rid.
40  *
41  * The StreamID is used to select a Stream Table Entry (STE) in a Stream table,
42  * which contains per-device configuration.
43  *
44  * Stream table is a linear or 2-level walk table (this driver supports both).
45  * Note that a linear table could occupy 1GB or more of memory depending on
46  * sid_bits value.
47  *
48  * STE is used to locate a Context Descriptor, which is a struct in memory
49  * that describes stages of translation, translation table type, pointer to
50  * level 0 of page tables, ASID, etc.
51  *
52  * Hardware supports two stages of translation: Stage1 (S1) and Stage2 (S2):
53  *  o S1 is used for the host machine traffic translation
54  *  o S2 is for a hypervisor
55  *
56  * This driver enables S1 stage with standard AArch64 page tables.
57  *
58  * Note that SMMU does not share TLB with a main CPU.
59  * Command queue is used by this driver to Invalidate SMMU TLB, STE cache.
60  *
61  * An arm64 SoC could have more than one SMMU instance.
62  * ACPI IORT table describes which SMMU unit is assigned for a particular
63  * peripheral device.
64  *
65  * Queues.
66  *
67  * Register interface and Memory-based circular buffer queues are used
68  * to inferface SMMU.
69  *
70  * These are a Command queue for commands to send to the SMMU and an Event
71  * queue for event/fault reports from the SMMU. Optionally PRI queue is
72  * designed for PCIe page requests reception.
73  *
74  * Note that not every hardware supports PRI services. For instance they were
75  * not found in Neoverse N1 SDP machine.
76  * (This drivers does not implement PRI queue.)
77  *
78  * All SMMU queues are arranged as circular buffers in memory. They are used
79  * in a producer-consumer fashion so that an output queue contains data
80  * produced by the SMMU and consumed by software.
81  * An input queue contains data produced by software, consumed by the SMMU.
82  *
83  * Interrupts.
84  *
85  * Interrupts are not required by this driver for normal operation.
86  * The standard wired interrupt is only triggered when an event comes from
87  * the SMMU, which is only in a case of errors (e.g. translation fault).
88  */
89 
90 #include "opt_platform.h"
91 #include "opt_acpi.h"
92 
93 #include <sys/cdefs.h>
94 __FBSDID("$FreeBSD$");
95 
96 #include <sys/param.h>
97 #include <sys/bitstring.h>
98 #include <sys/bus.h>
99 #include <sys/kernel.h>
100 #include <sys/malloc.h>
101 #include <sys/rman.h>
102 #include <sys/lock.h>
103 #include <sys/tree.h>
104 #include <sys/taskqueue.h>
105 #include <vm/vm.h>
106 #include <vm/vm_page.h>
107 #if DEV_ACPI
108 #include <contrib/dev/acpica/include/acpi.h>
109 #include <dev/acpica/acpivar.h>
110 #endif
111 #include <dev/pci/pcireg.h>
112 #include <dev/pci/pcivar.h>
113 #include <dev/iommu/iommu.h>
114 
115 #include "iommu.h"
116 #include "iommu_if.h"
117 
118 #include "smmureg.h"
119 #include "smmuvar.h"
120 
121 #define	STRTAB_L1_SZ_SHIFT	20
122 #define	STRTAB_SPLIT		8
123 
124 #define	STRTAB_L1_DESC_L2PTR_M	(0x3fffffffffff << 6)
125 #define	STRTAB_L1_DESC_DWORDS	1
126 
127 #define	STRTAB_STE_DWORDS	8
128 
129 #define	CMDQ_ENTRY_DWORDS	2
130 #define	EVTQ_ENTRY_DWORDS	4
131 #define	PRIQ_ENTRY_DWORDS	2
132 
133 #define	CD_DWORDS		8
134 
135 #define	Q_WRP(q, p)		((p) & (1 << (q)->size_log2))
136 #define	Q_IDX(q, p)		((p) & ((1 << (q)->size_log2) - 1))
137 #define	Q_OVF(p)		((p) & (1 << 31)) /* Event queue overflowed */
138 
139 #define	SMMU_Q_ALIGN		(64 * 1024)
140 
141 static struct resource_spec smmu_spec[] = {
142 	{ SYS_RES_MEMORY, 0, RF_ACTIVE },
143 	{ SYS_RES_IRQ, 0, RF_ACTIVE },
144 	{ SYS_RES_IRQ, 1, RF_ACTIVE },
145 	{ SYS_RES_IRQ, 2, RF_ACTIVE },
146 	RESOURCE_SPEC_END
147 };
148 
149 MALLOC_DEFINE(M_SMMU, "SMMU", SMMU_DEVSTR);
150 
151 #define	dprintf(fmt, ...)
152 
153 struct smmu_event {
154 	int ident;
155 	char *str;
156 	char *msg;
157 };
158 
159 static struct smmu_event events[] = {
160 	{ 0x01, "F_UUT",
161 		"Unsupported Upstream Transaction."},
162 	{ 0x02, "C_BAD_STREAMID",
163 		"Transaction StreamID out of range."},
164 	{ 0x03, "F_STE_FETCH",
165 		"Fetch of STE caused external abort."},
166 	{ 0x04, "C_BAD_STE",
167 		"Used STE invalid."},
168 	{ 0x05, "F_BAD_ATS_TREQ",
169 		"Address Translation Request disallowed for a StreamID "
170 		"and a PCIe ATS Translation Request received."},
171 	{ 0x06, "F_STREAM_DISABLED",
172 		"The STE of a transaction marks non-substream transactions "
173 		"disabled."},
174 	{ 0x07, "F_TRANSL_FORBIDDEN",
175 		"An incoming PCIe transaction is marked Translated but "
176 		"SMMU bypass is disallowed for this StreamID."},
177 	{ 0x08, "C_BAD_SUBSTREAMID",
178 		"Incoming SubstreamID present, but configuration is invalid."},
179 	{ 0x09, "F_CD_FETCH",
180 		"Fetch of CD caused external abort."},
181 	{ 0x0a, "C_BAD_CD",
182 		"Fetched CD invalid."},
183 	{ 0x0b, "F_WALK_EABT",
184 		"An external abort occurred fetching (or updating) "
185 		"a translation table descriptor."},
186 	{ 0x10, "F_TRANSLATION",
187 		"Translation fault."},
188 	{ 0x11, "F_ADDR_SIZE",
189 		"Address Size fault."},
190 	{ 0x12, "F_ACCESS",
191 		"Access flag fault due to AF == 0 in a page or block TTD."},
192 	{ 0x13, "F_PERMISSION",
193 		"Permission fault occurred on page access."},
194 	{ 0x20, "F_TLB_CONFLICT",
195 		"A TLB conflict occurred because of the transaction."},
196 	{ 0x21, "F_CFG_CONFLICT",
197 		"A configuration cache conflict occurred due to "
198 		"the transaction."},
199 	{ 0x24, "E_PAGE_REQUEST",
200 		"Speculative page request hint."},
201 	{ 0x25, "F_VMS_FETCH",
202 		"Fetch of VMS caused external abort."},
203 	{ 0, NULL, NULL },
204 };
205 
206 static int
207 smmu_q_has_space(struct smmu_queue *q)
208 {
209 
210 	/*
211 	 * See 6.3.27 SMMU_CMDQ_PROD
212 	 *
213 	 * There is space in the queue for additional commands if:
214 	 *  SMMU_CMDQ_CONS.RD != SMMU_CMDQ_PROD.WR ||
215 	 *  SMMU_CMDQ_CONS.RD_WRAP == SMMU_CMDQ_PROD.WR_WRAP
216 	 */
217 
218 	if (Q_IDX(q, q->lc.cons) != Q_IDX(q, q->lc.prod) ||
219 	    Q_WRP(q, q->lc.cons) == Q_WRP(q, q->lc.prod))
220 		return (1);
221 
222 	return (0);
223 }
224 
225 static int
226 smmu_q_empty(struct smmu_queue *q)
227 {
228 
229 	if (Q_IDX(q, q->lc.cons) == Q_IDX(q, q->lc.prod) &&
230 	    Q_WRP(q, q->lc.cons) == Q_WRP(q, q->lc.prod))
231 		return (1);
232 
233 	return (0);
234 }
235 
236 static int __unused
237 smmu_q_consumed(struct smmu_queue *q, uint32_t prod)
238 {
239 
240 	if ((Q_WRP(q, q->lc.cons) == Q_WRP(q, prod)) &&
241 	    (Q_IDX(q, q->lc.cons) >= Q_IDX(q, prod)))
242 		return (1);
243 
244 	if ((Q_WRP(q, q->lc.cons) != Q_WRP(q, prod)) &&
245 	    (Q_IDX(q, q->lc.cons) <= Q_IDX(q, prod)))
246 		return (1);
247 
248 	return (0);
249 }
250 
251 static uint32_t
252 smmu_q_inc_cons(struct smmu_queue *q)
253 {
254 	uint32_t cons;
255 	uint32_t val;
256 
257 	cons = (Q_WRP(q, q->lc.cons) | Q_IDX(q, q->lc.cons)) + 1;
258 	val = (Q_OVF(q->lc.cons) | Q_WRP(q, cons) | Q_IDX(q, cons));
259 
260 	return (val);
261 }
262 
263 static uint32_t
264 smmu_q_inc_prod(struct smmu_queue *q)
265 {
266 	uint32_t prod;
267 	uint32_t val;
268 
269 	prod = (Q_WRP(q, q->lc.prod) | Q_IDX(q, q->lc.prod)) + 1;
270 	val = (Q_OVF(q->lc.prod) | Q_WRP(q, prod) | Q_IDX(q, prod));
271 
272 	return (val);
273 }
274 
275 static int
276 smmu_write_ack(struct smmu_softc *sc, uint32_t reg,
277     uint32_t reg_ack, uint32_t val)
278 {
279 	uint32_t v;
280 	int timeout;
281 
282 	timeout = 100000;
283 
284 	bus_write_4(sc->res[0], reg, val);
285 
286 	do {
287 		v = bus_read_4(sc->res[0], reg_ack);
288 		if (v == val)
289 			break;
290 	} while (timeout--);
291 
292 	if (timeout <= 0) {
293 		device_printf(sc->dev, "Failed to write reg.\n");
294 		return (-1);
295 	}
296 
297 	return (0);
298 }
299 
300 static inline int
301 ilog2(long x)
302 {
303 
304 	KASSERT(x > 0 && powerof2(x), ("%s: invalid arg %ld", __func__, x));
305 
306 	return (flsl(x) - 1);
307 }
308 
309 static int
310 smmu_init_queue(struct smmu_softc *sc, struct smmu_queue *q,
311     uint32_t prod_off, uint32_t cons_off, uint32_t dwords)
312 {
313 	int sz;
314 
315 	sz = (1 << q->size_log2) * dwords * 8;
316 
317 	/* Set up the command circular buffer */
318 	q->vaddr = contigmalloc(sz, M_SMMU,
319 	    M_WAITOK | M_ZERO, 0, (1ul << 48) - 1, SMMU_Q_ALIGN, 0);
320 	if (q->vaddr == NULL) {
321 		device_printf(sc->dev, "failed to allocate %d bytes\n", sz);
322 		return (-1);
323 	}
324 
325 	q->prod_off = prod_off;
326 	q->cons_off = cons_off;
327 	q->paddr = vtophys(q->vaddr);
328 
329 	q->base = CMDQ_BASE_RA | EVENTQ_BASE_WA | PRIQ_BASE_WA;
330 	q->base |= q->paddr & Q_BASE_ADDR_M;
331 	q->base |= q->size_log2 << Q_LOG2SIZE_S;
332 
333 	return (0);
334 }
335 
336 static int
337 smmu_init_queues(struct smmu_softc *sc)
338 {
339 	int err;
340 
341 	/* Command queue. */
342 	err = smmu_init_queue(sc, &sc->cmdq,
343 	    SMMU_CMDQ_PROD, SMMU_CMDQ_CONS, CMDQ_ENTRY_DWORDS);
344 	if (err)
345 		return (ENXIO);
346 
347 	/* Event queue. */
348 	err = smmu_init_queue(sc, &sc->evtq,
349 	    SMMU_EVENTQ_PROD, SMMU_EVENTQ_CONS, EVTQ_ENTRY_DWORDS);
350 	if (err)
351 		return (ENXIO);
352 
353 	if (!(sc->features & SMMU_FEATURE_PRI))
354 		return (0);
355 
356 	/* PRI queue. */
357 	err = smmu_init_queue(sc, &sc->priq,
358 	    SMMU_PRIQ_PROD, SMMU_PRIQ_CONS, PRIQ_ENTRY_DWORDS);
359 	if (err)
360 		return (ENXIO);
361 
362 	return (0);
363 }
364 
365 /*
366  * Dump 2LVL or linear STE.
367  */
368 static void
369 smmu_dump_ste(struct smmu_softc *sc, int sid)
370 {
371 	struct smmu_strtab *strtab;
372 	struct l1_desc *l1_desc;
373 	uint64_t *ste, *l1;
374 	int i;
375 
376 	strtab = &sc->strtab;
377 
378 	if (sc->features & SMMU_FEATURE_2_LVL_STREAM_TABLE) {
379 		i = sid >> STRTAB_SPLIT;
380 		l1 = (void *)((uint64_t)strtab->vaddr +
381 		    STRTAB_L1_DESC_DWORDS * 8 * i);
382 		device_printf(sc->dev, "L1 ste == %lx\n", l1[0]);
383 
384 		l1_desc = &strtab->l1[i];
385 		ste = l1_desc->va;
386 		if (ste == NULL) /* L2 is not initialized */
387 			return;
388 	} else {
389 		ste = (void *)((uint64_t)strtab->vaddr +
390 		    sid * (STRTAB_STE_DWORDS << 3));
391 	}
392 
393 	/* Dump L2 or linear STE. */
394 	for (i = 0; i < STRTAB_STE_DWORDS; i++)
395 		device_printf(sc->dev, "ste[%d] == %lx\n", i, ste[i]);
396 }
397 
398 static void __unused
399 smmu_dump_cd(struct smmu_softc *sc, struct smmu_cd *cd)
400 {
401 	uint64_t *vaddr;
402 	int i;
403 
404 	device_printf(sc->dev, "%s\n", __func__);
405 
406 	vaddr = cd->vaddr;
407 	for (i = 0; i < CD_DWORDS; i++)
408 		device_printf(sc->dev, "cd[%d] == %lx\n", i, vaddr[i]);
409 }
410 
411 static void
412 smmu_evtq_dequeue(struct smmu_softc *sc, uint32_t *evt)
413 {
414 	struct smmu_queue *evtq;
415 	void *entry_addr;
416 
417 	evtq = &sc->evtq;
418 
419 	evtq->lc.val = bus_read_8(sc->res[0], evtq->prod_off);
420 	entry_addr = (void *)((uint64_t)evtq->vaddr +
421 	    evtq->lc.cons * EVTQ_ENTRY_DWORDS * 8);
422 	memcpy(evt, entry_addr, EVTQ_ENTRY_DWORDS * 8);
423 	evtq->lc.cons = smmu_q_inc_cons(evtq);
424 	bus_write_4(sc->res[0], evtq->cons_off, evtq->lc.cons);
425 }
426 
427 static void
428 smmu_print_event(struct smmu_softc *sc, uint32_t *evt)
429 {
430 	struct smmu_event *ev;
431 	uintptr_t input_addr;
432 	uint8_t event_id;
433 	device_t dev;
434 	int sid;
435 	int i;
436 
437 	dev = sc->dev;
438 
439 	ev = NULL;
440 	event_id = evt[0] & 0xff;
441 	for (i = 0; events[i].ident != 0; i++) {
442 		if (events[i].ident == event_id) {
443 			ev = &events[i];
444 			break;
445 		}
446 	}
447 
448 	sid = evt[1];
449 	input_addr = evt[5];
450 	input_addr <<= 32;
451 	input_addr |= evt[4];
452 
453 	if (smmu_quirks_check(dev, sid, event_id, input_addr)) {
454 		/* The event is known. Don't print anything. */
455 		return;
456 	}
457 
458 	if (ev) {
459 		device_printf(sc->dev,
460 		    "Event %s (%s) received.\n", ev->str, ev->msg);
461 	} else
462 		device_printf(sc->dev, "Event 0x%x received\n", event_id);
463 
464 	device_printf(sc->dev, "SID %x, Input Address: %jx\n",
465 	    sid, input_addr);
466 
467 	for (i = 0; i < 8; i++)
468 		device_printf(sc->dev, "evt[%d] %x\n", i, evt[i]);
469 
470 	smmu_dump_ste(sc, sid);
471 }
472 
473 static void
474 make_cmd(struct smmu_softc *sc, uint64_t *cmd,
475     struct smmu_cmdq_entry *entry)
476 {
477 
478 	memset(cmd, 0, CMDQ_ENTRY_DWORDS * 8);
479 	cmd[0] = entry->opcode << CMD_QUEUE_OPCODE_S;
480 
481 	switch (entry->opcode) {
482 	case CMD_TLBI_NH_VA:
483 		cmd[0] |= (uint64_t)entry->tlbi.asid << TLBI_0_ASID_S;
484 		cmd[1] = entry->tlbi.addr & TLBI_1_ADDR_M;
485 		if (entry->tlbi.leaf) {
486 			/*
487 			 * Leaf flag means that only cached entries
488 			 * for the last level of translation table walk
489 			 * are required to be invalidated.
490 			 */
491 			cmd[1] |= TLBI_1_LEAF;
492 		}
493 		break;
494 	case CMD_TLBI_NH_ASID:
495 		cmd[0] |= (uint64_t)entry->tlbi.asid << TLBI_0_ASID_S;
496 		break;
497 	case CMD_TLBI_NSNH_ALL:
498 	case CMD_TLBI_NH_ALL:
499 	case CMD_TLBI_EL2_ALL:
500 		break;
501 	case CMD_CFGI_CD:
502 		cmd[0] |= ((uint64_t)entry->cfgi.ssid << CFGI_0_SSID_S);
503 		/* FALLTROUGH */
504 	case CMD_CFGI_STE:
505 		cmd[0] |= ((uint64_t)entry->cfgi.sid << CFGI_0_STE_SID_S);
506 		cmd[1] |= ((uint64_t)entry->cfgi.leaf << CFGI_1_LEAF_S);
507 		break;
508 	case CMD_CFGI_STE_RANGE:
509 		cmd[1] = (31 << CFGI_1_STE_RANGE_S);
510 		break;
511 	case CMD_SYNC:
512 		cmd[0] |= SYNC_0_MSH_IS | SYNC_0_MSIATTR_OIWB;
513 		if (entry->sync.msiaddr) {
514 			cmd[0] |= SYNC_0_CS_SIG_IRQ;
515 			cmd[1] |= (entry->sync.msiaddr & SYNC_1_MSIADDRESS_M);
516 		} else
517 			cmd[0] |= SYNC_0_CS_SIG_SEV;
518 		break;
519 	case CMD_PREFETCH_CONFIG:
520 		cmd[0] |= ((uint64_t)entry->prefetch.sid << PREFETCH_0_SID_S);
521 		break;
522 	};
523 }
524 
525 static void
526 smmu_cmdq_enqueue_cmd(struct smmu_softc *sc, struct smmu_cmdq_entry *entry)
527 {
528 	uint64_t cmd[CMDQ_ENTRY_DWORDS];
529 	struct smmu_queue *cmdq;
530 	void *entry_addr;
531 
532 	cmdq = &sc->cmdq;
533 
534 	make_cmd(sc, cmd, entry);
535 
536 	SMMU_LOCK(sc);
537 
538 	/* Ensure that a space is available. */
539 	do {
540 		cmdq->lc.cons = bus_read_4(sc->res[0], cmdq->cons_off);
541 	} while (smmu_q_has_space(cmdq) == 0);
542 
543 	/* Write the command to the current prod entry. */
544 	entry_addr = (void *)((uint64_t)cmdq->vaddr +
545 	    Q_IDX(cmdq, cmdq->lc.prod) * CMDQ_ENTRY_DWORDS * 8);
546 	memcpy(entry_addr, cmd, CMDQ_ENTRY_DWORDS * 8);
547 
548 	/* Increment prod index. */
549 	cmdq->lc.prod = smmu_q_inc_prod(cmdq);
550 	bus_write_4(sc->res[0], cmdq->prod_off, cmdq->lc.prod);
551 
552 	SMMU_UNLOCK(sc);
553 }
554 
555 static void __unused
556 smmu_poll_until_consumed(struct smmu_softc *sc, struct smmu_queue *q)
557 {
558 
559 	while (1) {
560 		q->lc.val = bus_read_8(sc->res[0], q->prod_off);
561 		if (smmu_q_empty(q))
562 			break;
563 		cpu_spinwait();
564 	}
565 }
566 
567 static int
568 smmu_sync(struct smmu_softc *sc)
569 {
570 	struct smmu_cmdq_entry cmd;
571 	struct smmu_queue *q;
572 	uint32_t *base;
573 	int timeout;
574 	int prod;
575 
576 	q = &sc->cmdq;
577 	prod = q->lc.prod;
578 
579 	/* Enqueue sync command. */
580 	cmd.opcode = CMD_SYNC;
581 	cmd.sync.msiaddr = q->paddr + Q_IDX(q, prod) * CMDQ_ENTRY_DWORDS * 8;
582 	smmu_cmdq_enqueue_cmd(sc, &cmd);
583 
584 	/* Wait for the sync completion. */
585 	base = (void *)((uint64_t)q->vaddr +
586 	    Q_IDX(q, prod) * CMDQ_ENTRY_DWORDS * 8);
587 
588 	/*
589 	 * It takes around 200 loops (6 instructions each)
590 	 * on Neoverse N1 to complete the sync.
591 	 */
592 	timeout = 10000;
593 
594 	do {
595 		if (*base == 0) {
596 			/* MSI write completed. */
597 			break;
598 		}
599 		cpu_spinwait();
600 	} while (timeout--);
601 
602 	if (timeout < 0)
603 		device_printf(sc->dev, "Failed to sync\n");
604 
605 	return (0);
606 }
607 
608 static int
609 smmu_sync_cd(struct smmu_softc *sc, int sid, int ssid, bool leaf)
610 {
611 	struct smmu_cmdq_entry cmd;
612 
613 	cmd.opcode = CMD_CFGI_CD;
614 	cmd.cfgi.sid = sid;
615 	cmd.cfgi.ssid = ssid;
616 	cmd.cfgi.leaf = leaf;
617 	smmu_cmdq_enqueue_cmd(sc, &cmd);
618 
619 	return (0);
620 }
621 
622 static void
623 smmu_invalidate_all_sid(struct smmu_softc *sc)
624 {
625 	struct smmu_cmdq_entry cmd;
626 
627 	/* Invalidate cached config */
628 	cmd.opcode = CMD_CFGI_STE_RANGE;
629 	smmu_cmdq_enqueue_cmd(sc, &cmd);
630 	smmu_sync(sc);
631 }
632 
633 static void
634 smmu_tlbi_all(struct smmu_softc *sc)
635 {
636 	struct smmu_cmdq_entry cmd;
637 
638 	/* Invalidate entire TLB */
639 	cmd.opcode = CMD_TLBI_NSNH_ALL;
640 	smmu_cmdq_enqueue_cmd(sc, &cmd);
641 	smmu_sync(sc);
642 }
643 
644 static void
645 smmu_tlbi_asid(struct smmu_softc *sc, uint16_t asid)
646 {
647 	struct smmu_cmdq_entry cmd;
648 
649 	/* Invalidate TLB for an ASID. */
650 	cmd.opcode = CMD_TLBI_NH_ASID;
651 	cmd.tlbi.asid = asid;
652 	smmu_cmdq_enqueue_cmd(sc, &cmd);
653 	smmu_sync(sc);
654 }
655 
656 static void
657 smmu_tlbi_va(struct smmu_softc *sc, vm_offset_t va, uint16_t asid)
658 {
659 	struct smmu_cmdq_entry cmd;
660 
661 	/* Invalidate specific range */
662 	cmd.opcode = CMD_TLBI_NH_VA;
663 	cmd.tlbi.asid = asid;
664 	cmd.tlbi.vmid = 0;
665 	cmd.tlbi.leaf = true; /* We change only L3. */
666 	cmd.tlbi.addr = va;
667 	smmu_cmdq_enqueue_cmd(sc, &cmd);
668 }
669 
670 static void
671 smmu_invalidate_sid(struct smmu_softc *sc, uint32_t sid)
672 {
673 	struct smmu_cmdq_entry cmd;
674 
675 	/* Invalidate cached config */
676 	cmd.opcode = CMD_CFGI_STE;
677 	cmd.cfgi.sid = sid;
678 	smmu_cmdq_enqueue_cmd(sc, &cmd);
679 	smmu_sync(sc);
680 }
681 
682 static void
683 smmu_prefetch_sid(struct smmu_softc *sc, uint32_t sid)
684 {
685 	struct smmu_cmdq_entry cmd;
686 
687 	cmd.opcode = CMD_PREFETCH_CONFIG;
688 	cmd.prefetch.sid = sid;
689 	smmu_cmdq_enqueue_cmd(sc, &cmd);
690 	smmu_sync(sc);
691 }
692 
693 /*
694  * Init STE in bypass mode. Traffic is not translated for the sid.
695  */
696 static void
697 smmu_init_ste_bypass(struct smmu_softc *sc, uint32_t sid, uint64_t *ste)
698 {
699 	uint64_t val;
700 
701 	val = STE0_VALID | STE0_CONFIG_BYPASS;
702 
703 	ste[1] = STE1_SHCFG_INCOMING | STE1_EATS_FULLATS;
704 	ste[2] = 0;
705 	ste[3] = 0;
706 	ste[4] = 0;
707 	ste[5] = 0;
708 	ste[6] = 0;
709 	ste[7] = 0;
710 
711 	smmu_invalidate_sid(sc, sid);
712 	ste[0] = val;
713 	dsb(sy);
714 	smmu_invalidate_sid(sc, sid);
715 
716 	smmu_prefetch_sid(sc, sid);
717 }
718 
719 /*
720  * Enable Stage1 (S1) translation for the sid.
721  */
722 static int
723 smmu_init_ste_s1(struct smmu_softc *sc, struct smmu_cd *cd,
724     uint32_t sid, uint64_t *ste)
725 {
726 	uint64_t val;
727 
728 	val = STE0_VALID;
729 
730 	/* S1 */
731 	ste[1] = STE1_EATS_FULLATS	|
732 		 STE1_S1CSH_IS		|
733 		 STE1_S1CIR_WBRA	|
734 		 STE1_S1COR_WBRA	|
735 		 STE1_STRW_NS_EL1;
736 	ste[2] = 0;
737 	ste[3] = 0;
738 	ste[4] = 0;
739 	ste[5] = 0;
740 	ste[6] = 0;
741 	ste[7] = 0;
742 
743 	if (sc->features & SMMU_FEATURE_STALL &&
744 	    ((sc->features & SMMU_FEATURE_STALL_FORCE) == 0))
745 		ste[1] |= STE1_S1STALLD;
746 
747 	/* Configure STE */
748 	val |= (cd->paddr & STE0_S1CONTEXTPTR_M);
749 	val |= STE0_CONFIG_S1_TRANS;
750 
751 	smmu_invalidate_sid(sc, sid);
752 
753 	/* The STE[0] has to be written in a single blast, last of all. */
754 	ste[0] = val;
755 	dsb(sy);
756 
757 	smmu_invalidate_sid(sc, sid);
758 	smmu_sync_cd(sc, sid, 0, true);
759 	smmu_invalidate_sid(sc, sid);
760 
761 	/* The sid will be used soon most likely. */
762 	smmu_prefetch_sid(sc, sid);
763 
764 	return (0);
765 }
766 
767 static int
768 smmu_init_ste(struct smmu_softc *sc, struct smmu_cd *cd, int sid, bool bypass)
769 {
770 	struct smmu_strtab *strtab;
771 	struct l1_desc *l1_desc;
772 	uint64_t *addr;
773 
774 	strtab = &sc->strtab;
775 
776 	if (sc->features & SMMU_FEATURE_2_LVL_STREAM_TABLE) {
777 		l1_desc = &strtab->l1[sid >> STRTAB_SPLIT];
778 		addr = l1_desc->va;
779 		addr += (sid & ((1 << STRTAB_SPLIT) - 1)) * STRTAB_STE_DWORDS;
780 	} else {
781 		addr = (void *)((uint64_t)strtab->vaddr +
782 		    STRTAB_STE_DWORDS * 8 * sid);
783 	};
784 
785 	if (bypass)
786 		smmu_init_ste_bypass(sc, sid, addr);
787 	else
788 		smmu_init_ste_s1(sc, cd, sid, addr);
789 
790 	smmu_sync(sc);
791 
792 	return (0);
793 }
794 
795 static int
796 smmu_init_cd(struct smmu_softc *sc, struct smmu_domain *domain)
797 {
798 	vm_paddr_t paddr;
799 	uint64_t *ptr;
800 	uint64_t val;
801 	vm_size_t size;
802 	struct smmu_cd *cd;
803 	pmap_t p;
804 
805 	size = 1 * (CD_DWORDS << 3);
806 
807 	p = &domain->p;
808 	cd = domain->cd = malloc(sizeof(struct smmu_cd),
809 	    M_SMMU, M_WAITOK | M_ZERO);
810 
811 	cd->vaddr = contigmalloc(size, M_SMMU,
812 	    M_WAITOK | M_ZERO,	/* flags */
813 	    0,			/* low */
814 	    (1ul << 40) - 1,	/* high */
815 	    size,		/* alignment */
816 	    0);			/* boundary */
817 	if (cd->vaddr == NULL) {
818 		device_printf(sc->dev, "Failed to allocate CD\n");
819 		return (ENXIO);
820 	}
821 
822 	cd->size = size;
823 	cd->paddr = vtophys(cd->vaddr);
824 
825 	ptr = cd->vaddr;
826 
827 	val = CD0_VALID;
828 	val |= CD0_AA64;
829 	val |= CD0_R;
830 	val |= CD0_A;
831 	val |= CD0_ASET;
832 	val |= (uint64_t)domain->asid << CD0_ASID_S;
833 	val |= CD0_TG0_4KB;
834 	val |= CD0_EPD1; /* Disable TT1 */
835 	val |= ((64 - sc->ias) << CD0_T0SZ_S);
836 	val |= CD0_IPS_48BITS;
837 
838 	paddr = p->pm_l0_paddr & CD1_TTB0_M;
839 	KASSERT(paddr == p->pm_l0_paddr, ("bad allocation 1"));
840 
841 	ptr[1] = paddr;
842 	ptr[2] = 0;
843 	ptr[3] = MAIR_ATTR(MAIR_DEVICE_nGnRnE, VM_MEMATTR_DEVICE)	|
844 		 MAIR_ATTR(MAIR_NORMAL_NC, VM_MEMATTR_UNCACHEABLE)	|
845 		 MAIR_ATTR(MAIR_NORMAL_WB, VM_MEMATTR_WRITE_BACK)	|
846 		 MAIR_ATTR(MAIR_NORMAL_WT, VM_MEMATTR_WRITE_THROUGH);
847 
848 	/* Install the CD. */
849 	ptr[0] = val;
850 
851 	return (0);
852 }
853 
854 static int
855 smmu_init_strtab_linear(struct smmu_softc *sc)
856 {
857 	struct smmu_strtab *strtab;
858 	vm_paddr_t base;
859 	uint32_t size;
860 	uint64_t reg;
861 
862 	strtab = &sc->strtab;
863 	strtab->num_l1_entries = (1 << sc->sid_bits);
864 
865 	size = strtab->num_l1_entries * (STRTAB_STE_DWORDS << 3);
866 
867 	if (bootverbose)
868 		device_printf(sc->dev,
869 		    "%s: linear strtab size %d, num_l1_entries %d\n",
870 		    __func__, size, strtab->num_l1_entries);
871 
872 	strtab->vaddr = contigmalloc(size, M_SMMU,
873 	    M_WAITOK | M_ZERO,	/* flags */
874 	    0,			/* low */
875 	    (1ul << 48) - 1,	/* high */
876 	    size,		/* alignment */
877 	    0);			/* boundary */
878 	if (strtab->vaddr == NULL) {
879 		device_printf(sc->dev, "failed to allocate strtab\n");
880 		return (ENXIO);
881 	}
882 
883 	reg = STRTAB_BASE_CFG_FMT_LINEAR;
884 	reg |= sc->sid_bits << STRTAB_BASE_CFG_LOG2SIZE_S;
885 	strtab->base_cfg = (uint32_t)reg;
886 
887 	base = vtophys(strtab->vaddr);
888 
889 	reg = base & STRTAB_BASE_ADDR_M;
890 	KASSERT(reg == base, ("bad allocation 2"));
891 	reg |= STRTAB_BASE_RA;
892 	strtab->base = reg;
893 
894 	return (0);
895 }
896 
897 static int
898 smmu_init_strtab_2lvl(struct smmu_softc *sc)
899 {
900 	struct smmu_strtab *strtab;
901 	vm_paddr_t base;
902 	uint64_t reg_base;
903 	uint32_t l1size;
904 	uint32_t size;
905 	uint32_t reg;
906 	int sz;
907 
908 	strtab = &sc->strtab;
909 
910 	size = STRTAB_L1_SZ_SHIFT - (ilog2(STRTAB_L1_DESC_DWORDS) + 3);
911 	size = min(size, sc->sid_bits - STRTAB_SPLIT);
912 	strtab->num_l1_entries = (1 << size);
913 	size += STRTAB_SPLIT;
914 
915 	l1size = strtab->num_l1_entries * (STRTAB_L1_DESC_DWORDS << 3);
916 
917 	if (bootverbose)
918 		device_printf(sc->dev,
919 		    "%s: size %d, l1 entries %d, l1size %d\n",
920 		    __func__, size, strtab->num_l1_entries, l1size);
921 
922 	strtab->vaddr = contigmalloc(l1size, M_SMMU,
923 	    M_WAITOK | M_ZERO,	/* flags */
924 	    0,			/* low */
925 	    (1ul << 48) - 1,	/* high */
926 	    l1size,		/* alignment */
927 	    0);			/* boundary */
928 	if (strtab->vaddr == NULL) {
929 		device_printf(sc->dev, "Failed to allocate 2lvl strtab.\n");
930 		return (ENOMEM);
931 	}
932 
933 	sz = strtab->num_l1_entries * sizeof(struct l1_desc);
934 
935 	strtab->l1 = malloc(sz, M_SMMU, M_WAITOK | M_ZERO);
936 	if (strtab->l1 == NULL) {
937 		contigfree(strtab->vaddr, l1size, M_SMMU);
938 		return (ENOMEM);
939 	}
940 
941 	reg = STRTAB_BASE_CFG_FMT_2LVL;
942 	reg |= size << STRTAB_BASE_CFG_LOG2SIZE_S;
943 	reg |= STRTAB_SPLIT << STRTAB_BASE_CFG_SPLIT_S;
944 	strtab->base_cfg = (uint32_t)reg;
945 
946 	base = vtophys(strtab->vaddr);
947 
948 	reg_base = base & STRTAB_BASE_ADDR_M;
949 	KASSERT(reg_base == base, ("bad allocation 3"));
950 	reg_base |= STRTAB_BASE_RA;
951 	strtab->base = reg_base;
952 
953 	return (0);
954 }
955 
956 static int
957 smmu_init_strtab(struct smmu_softc *sc)
958 {
959 	int error;
960 
961 	if (sc->features & SMMU_FEATURE_2_LVL_STREAM_TABLE)
962 		error = smmu_init_strtab_2lvl(sc);
963 	else
964 		error = smmu_init_strtab_linear(sc);
965 
966 	return (error);
967 }
968 
969 static int
970 smmu_init_l1_entry(struct smmu_softc *sc, int sid)
971 {
972 	struct smmu_strtab *strtab;
973 	struct l1_desc *l1_desc;
974 	uint64_t *addr;
975 	uint64_t val;
976 	size_t size;
977 	int i;
978 
979 	strtab = &sc->strtab;
980 	l1_desc = &strtab->l1[sid >> STRTAB_SPLIT];
981 
982 	size = 1 << (STRTAB_SPLIT + ilog2(STRTAB_STE_DWORDS) + 3);
983 
984 	l1_desc->span = STRTAB_SPLIT + 1;
985 	l1_desc->size = size;
986 	l1_desc->va = contigmalloc(size, M_SMMU,
987 	    M_WAITOK | M_ZERO,	/* flags */
988 	    0,			/* low */
989 	    (1ul << 48) - 1,	/* high */
990 	    size,		/* alignment */
991 	    0);			/* boundary */
992 	if (l1_desc->va == NULL) {
993 		device_printf(sc->dev, "failed to allocate l2 entry\n");
994 		return (ENXIO);
995 	}
996 
997 	l1_desc->pa = vtophys(l1_desc->va);
998 
999 	i = sid >> STRTAB_SPLIT;
1000 	addr = (void *)((uint64_t)strtab->vaddr +
1001 	    STRTAB_L1_DESC_DWORDS * 8 * i);
1002 
1003 	/* Install the L1 entry. */
1004 	val = l1_desc->pa & STRTAB_L1_DESC_L2PTR_M;
1005 	KASSERT(val == l1_desc->pa, ("bad allocation 4"));
1006 	val |= l1_desc->span;
1007 	*addr = val;
1008 
1009 	return (0);
1010 }
1011 
1012 static void
1013 smmu_deinit_l1_entry(struct smmu_softc *sc, int sid)
1014 {
1015 	struct smmu_strtab *strtab;
1016 	struct l1_desc *l1_desc;
1017 	uint64_t *addr;
1018 	int i;
1019 
1020 	strtab = &sc->strtab;
1021 
1022 	i = sid >> STRTAB_SPLIT;
1023 	addr = (void *)((uint64_t)strtab->vaddr +
1024 	    STRTAB_L1_DESC_DWORDS * 8 * i);
1025 	*addr = 0;
1026 
1027 	if (sc->features & SMMU_FEATURE_2_LVL_STREAM_TABLE) {
1028 		l1_desc = &strtab->l1[sid >> STRTAB_SPLIT];
1029 		contigfree(l1_desc->va, l1_desc->size, M_SMMU);
1030 	}
1031 }
1032 
1033 static int
1034 smmu_disable(struct smmu_softc *sc)
1035 {
1036 	uint32_t reg;
1037 	int error;
1038 
1039 	/* Disable SMMU */
1040 	reg = bus_read_4(sc->res[0], SMMU_CR0);
1041 	reg &= ~CR0_SMMUEN;
1042 	error = smmu_write_ack(sc, SMMU_CR0, SMMU_CR0ACK, reg);
1043 	if (error)
1044 		device_printf(sc->dev, "Could not disable SMMU.\n");
1045 
1046 	return (0);
1047 }
1048 
1049 static int
1050 smmu_event_intr(void *arg)
1051 {
1052 	uint32_t evt[EVTQ_ENTRY_DWORDS * 2];
1053 	struct smmu_softc *sc;
1054 
1055 	sc = arg;
1056 
1057 	do {
1058 		smmu_evtq_dequeue(sc, evt);
1059 		smmu_print_event(sc, evt);
1060 	} while (!smmu_q_empty(&sc->evtq));
1061 
1062 	return (FILTER_HANDLED);
1063 }
1064 
1065 static int __unused
1066 smmu_sync_intr(void *arg)
1067 {
1068 	struct smmu_softc *sc;
1069 
1070 	sc = arg;
1071 
1072 	device_printf(sc->dev, "%s\n", __func__);
1073 
1074 	return (FILTER_HANDLED);
1075 }
1076 
1077 static int
1078 smmu_gerr_intr(void *arg)
1079 {
1080 	struct smmu_softc *sc;
1081 
1082 	sc = arg;
1083 
1084 	device_printf(sc->dev, "SMMU Global Error\n");
1085 
1086 	return (FILTER_HANDLED);
1087 }
1088 
1089 static int
1090 smmu_enable_interrupts(struct smmu_softc *sc)
1091 {
1092 	uint32_t reg;
1093 	int error;
1094 
1095 	/* Disable MSI. */
1096 	bus_write_8(sc->res[0], SMMU_GERROR_IRQ_CFG0, 0);
1097 	bus_write_4(sc->res[0], SMMU_GERROR_IRQ_CFG1, 0);
1098 	bus_write_4(sc->res[0], SMMU_GERROR_IRQ_CFG2, 0);
1099 
1100 	bus_write_8(sc->res[0], SMMU_EVENTQ_IRQ_CFG0, 0);
1101 	bus_write_4(sc->res[0], SMMU_EVENTQ_IRQ_CFG1, 0);
1102 	bus_write_4(sc->res[0], SMMU_EVENTQ_IRQ_CFG2, 0);
1103 
1104 	if (sc->features & CR0_PRIQEN) {
1105 		bus_write_8(sc->res[0], SMMU_PRIQ_IRQ_CFG0, 0);
1106 		bus_write_4(sc->res[0], SMMU_PRIQ_IRQ_CFG1, 0);
1107 		bus_write_4(sc->res[0], SMMU_PRIQ_IRQ_CFG2, 0);
1108 	}
1109 
1110 	/* Disable any interrupts. */
1111 	error = smmu_write_ack(sc, SMMU_IRQ_CTRL, SMMU_IRQ_CTRLACK, 0);
1112 	if (error) {
1113 		device_printf(sc->dev, "Could not disable interrupts.\n");
1114 		return (ENXIO);
1115 	}
1116 
1117 	/* Enable interrupts. */
1118 	reg = IRQ_CTRL_EVENTQ_IRQEN | IRQ_CTRL_GERROR_IRQEN;
1119 	if (sc->features & SMMU_FEATURE_PRI)
1120 		reg |= IRQ_CTRL_PRIQ_IRQEN;
1121 
1122 	error = smmu_write_ack(sc, SMMU_IRQ_CTRL, SMMU_IRQ_CTRLACK, reg);
1123 	if (error) {
1124 		device_printf(sc->dev, "Could not enable interrupts.\n");
1125 		return (ENXIO);
1126 	}
1127 
1128 	return (0);
1129 }
1130 
1131 #if DEV_ACPI
1132 static void
1133 smmu_configure_intr(struct smmu_softc *sc, struct resource *res)
1134 {
1135 	struct intr_map_data_acpi *ad;
1136 	struct intr_map_data *data;
1137 
1138 	data = rman_get_virtual(res);
1139 	KASSERT(data != NULL, ("data is NULL"));
1140 
1141 	if (data->type == INTR_MAP_DATA_ACPI) {
1142 		ad = (struct intr_map_data_acpi *)data;
1143 		ad->trig = INTR_TRIGGER_EDGE;
1144 		ad->pol = INTR_POLARITY_HIGH;
1145 	}
1146 }
1147 #endif
1148 
1149 static int
1150 smmu_setup_interrupts(struct smmu_softc *sc)
1151 {
1152 	device_t dev;
1153 	int error;
1154 
1155 	dev = sc->dev;
1156 
1157 #if DEV_ACPI
1158 	/*
1159 	 * Configure SMMU interrupts as EDGE triggered manually
1160 	 * as ACPI tables carries no information for that.
1161 	 */
1162 	smmu_configure_intr(sc, sc->res[1]);
1163 	smmu_configure_intr(sc, sc->res[2]);
1164 	smmu_configure_intr(sc, sc->res[3]);
1165 #endif
1166 
1167 	error = bus_setup_intr(dev, sc->res[1], INTR_TYPE_MISC,
1168 	    smmu_event_intr, NULL, sc, &sc->intr_cookie[0]);
1169 	if (error) {
1170 		device_printf(dev, "Couldn't setup Event interrupt handler\n");
1171 		return (ENXIO);
1172 	}
1173 
1174 	error = bus_setup_intr(dev, sc->res[3], INTR_TYPE_MISC,
1175 	    smmu_gerr_intr, NULL, sc, &sc->intr_cookie[2]);
1176 	if (error) {
1177 		device_printf(dev, "Couldn't setup Gerr interrupt handler\n");
1178 		return (ENXIO);
1179 	}
1180 
1181 	return (0);
1182 }
1183 
1184 static int
1185 smmu_reset(struct smmu_softc *sc)
1186 {
1187 	struct smmu_cmdq_entry cmd;
1188 	struct smmu_strtab *strtab;
1189 	int error;
1190 	int reg;
1191 
1192 	reg = bus_read_4(sc->res[0], SMMU_CR0);
1193 
1194 	if (reg & CR0_SMMUEN)
1195 		device_printf(sc->dev,
1196 		    "%s: Warning: SMMU is enabled\n", __func__);
1197 
1198 	error = smmu_disable(sc);
1199 	if (error)
1200 		device_printf(sc->dev,
1201 		    "%s: Could not disable SMMU.\n", __func__);
1202 
1203 	if (smmu_enable_interrupts(sc) != 0) {
1204 		device_printf(sc->dev, "Could not enable interrupts.\n");
1205 		return (ENXIO);
1206 	}
1207 
1208 	reg = CR1_TABLE_SH_IS	|
1209 	      CR1_TABLE_OC_WBC	|
1210 	      CR1_TABLE_IC_WBC	|
1211 	      CR1_QUEUE_SH_IS	|
1212 	      CR1_QUEUE_OC_WBC	|
1213 	      CR1_QUEUE_IC_WBC;
1214 	bus_write_4(sc->res[0], SMMU_CR1, reg);
1215 
1216 	reg = CR2_PTM | CR2_RECINVSID | CR2_E2H;
1217 	bus_write_4(sc->res[0], SMMU_CR2, reg);
1218 
1219 	/* Stream table. */
1220 	strtab = &sc->strtab;
1221 	bus_write_8(sc->res[0], SMMU_STRTAB_BASE, strtab->base);
1222 	bus_write_4(sc->res[0], SMMU_STRTAB_BASE_CFG, strtab->base_cfg);
1223 
1224 	/* Command queue. */
1225 	bus_write_8(sc->res[0], SMMU_CMDQ_BASE, sc->cmdq.base);
1226 	bus_write_4(sc->res[0], SMMU_CMDQ_PROD, sc->cmdq.lc.prod);
1227 	bus_write_4(sc->res[0], SMMU_CMDQ_CONS, sc->cmdq.lc.cons);
1228 
1229 	reg = CR0_CMDQEN;
1230 	error = smmu_write_ack(sc, SMMU_CR0, SMMU_CR0ACK, reg);
1231 	if (error) {
1232 		device_printf(sc->dev, "Could not enable command queue\n");
1233 		return (ENXIO);
1234 	}
1235 
1236 	/* Invalidate cached configuration. */
1237 	smmu_invalidate_all_sid(sc);
1238 
1239 	if (sc->features & SMMU_FEATURE_HYP) {
1240 		cmd.opcode = CMD_TLBI_EL2_ALL;
1241 		smmu_cmdq_enqueue_cmd(sc, &cmd);
1242 	};
1243 
1244 	/* Invalidate TLB. */
1245 	smmu_tlbi_all(sc);
1246 
1247 	/* Event queue */
1248 	bus_write_8(sc->res[0], SMMU_EVENTQ_BASE, sc->evtq.base);
1249 	bus_write_4(sc->res[0], SMMU_EVENTQ_PROD, sc->evtq.lc.prod);
1250 	bus_write_4(sc->res[0], SMMU_EVENTQ_CONS, sc->evtq.lc.cons);
1251 
1252 	reg |= CR0_EVENTQEN;
1253 	error = smmu_write_ack(sc, SMMU_CR0, SMMU_CR0ACK, reg);
1254 	if (error) {
1255 		device_printf(sc->dev, "Could not enable event queue\n");
1256 		return (ENXIO);
1257 	}
1258 
1259 	if (sc->features & SMMU_FEATURE_PRI) {
1260 		/* PRI queue */
1261 		bus_write_8(sc->res[0], SMMU_PRIQ_BASE, sc->priq.base);
1262 		bus_write_4(sc->res[0], SMMU_PRIQ_PROD, sc->priq.lc.prod);
1263 		bus_write_4(sc->res[0], SMMU_PRIQ_CONS, sc->priq.lc.cons);
1264 
1265 		reg |= CR0_PRIQEN;
1266 		error = smmu_write_ack(sc, SMMU_CR0, SMMU_CR0ACK, reg);
1267 		if (error) {
1268 			device_printf(sc->dev, "Could not enable PRI queue\n");
1269 			return (ENXIO);
1270 		}
1271 	}
1272 
1273 	if (sc->features & SMMU_FEATURE_ATS) {
1274 		reg |= CR0_ATSCHK;
1275 		error = smmu_write_ack(sc, SMMU_CR0, SMMU_CR0ACK, reg);
1276 		if (error) {
1277 			device_printf(sc->dev, "Could not enable ATS check.\n");
1278 			return (ENXIO);
1279 		}
1280 	}
1281 
1282 	reg |= CR0_SMMUEN;
1283 	error = smmu_write_ack(sc, SMMU_CR0, SMMU_CR0ACK, reg);
1284 	if (error) {
1285 		device_printf(sc->dev, "Could not enable SMMU.\n");
1286 		return (ENXIO);
1287 	}
1288 
1289 	return (0);
1290 }
1291 
1292 static int
1293 smmu_check_features(struct smmu_softc *sc)
1294 {
1295 	uint32_t reg;
1296 	uint32_t val;
1297 
1298 	sc->features = 0;
1299 
1300 	reg = bus_read_4(sc->res[0], SMMU_IDR0);
1301 
1302 	if (reg & IDR0_ST_LVL_2) {
1303 		if (bootverbose)
1304 			device_printf(sc->dev,
1305 			    "2-level stream table supported.\n");
1306 		sc->features |= SMMU_FEATURE_2_LVL_STREAM_TABLE;
1307 	}
1308 
1309 	if (reg & IDR0_CD2L) {
1310 		if (bootverbose)
1311 			device_printf(sc->dev,
1312 			    "2-level CD table supported.\n");
1313 		sc->features |= SMMU_FEATURE_2_LVL_CD;
1314 	}
1315 
1316 	switch (reg & IDR0_TTENDIAN_M) {
1317 	case IDR0_TTENDIAN_MIXED:
1318 		if (bootverbose)
1319 			device_printf(sc->dev, "Mixed endianess supported.\n");
1320 		sc->features |= SMMU_FEATURE_TT_LE;
1321 		sc->features |= SMMU_FEATURE_TT_BE;
1322 		break;
1323 	case IDR0_TTENDIAN_LITTLE:
1324 		if (bootverbose)
1325 			device_printf(sc->dev,
1326 			    "Little endian supported only.\n");
1327 		sc->features |= SMMU_FEATURE_TT_LE;
1328 		break;
1329 	case IDR0_TTENDIAN_BIG:
1330 		if (bootverbose)
1331 			device_printf(sc->dev, "Big endian supported only.\n");
1332 		sc->features |= SMMU_FEATURE_TT_BE;
1333 		break;
1334 	default:
1335 		device_printf(sc->dev, "Unsupported endianness.\n");
1336 		return (ENXIO);
1337 	}
1338 
1339 	if (reg & IDR0_SEV)
1340 		sc->features |= SMMU_FEATURE_SEV;
1341 
1342 	if (reg & IDR0_MSI) {
1343 		if (bootverbose)
1344 			device_printf(sc->dev, "MSI feature present.\n");
1345 		sc->features |= SMMU_FEATURE_MSI;
1346 	}
1347 
1348 	if (reg & IDR0_HYP) {
1349 		if (bootverbose)
1350 			device_printf(sc->dev, "HYP feature present.\n");
1351 		sc->features |= SMMU_FEATURE_HYP;
1352 	}
1353 
1354 	if (reg & IDR0_ATS)
1355 		sc->features |= SMMU_FEATURE_ATS;
1356 
1357 	if (reg & IDR0_PRI)
1358 		sc->features |= SMMU_FEATURE_PRI;
1359 
1360 	switch (reg & IDR0_STALL_MODEL_M) {
1361 	case IDR0_STALL_MODEL_FORCE:
1362 		/* Stall is forced. */
1363 		sc->features |= SMMU_FEATURE_STALL_FORCE;
1364 		/* FALLTHROUGH */
1365 	case IDR0_STALL_MODEL_STALL:
1366 		sc->features |= SMMU_FEATURE_STALL;
1367 		break;
1368 	}
1369 
1370 	/* Grab translation stages supported. */
1371 	if (reg & IDR0_S1P) {
1372 		if (bootverbose)
1373 			device_printf(sc->dev,
1374 			    "Stage 1 translation supported.\n");
1375 		sc->features |= SMMU_FEATURE_S1P;
1376 	}
1377 	if (reg & IDR0_S2P) {
1378 		if (bootverbose)
1379 			device_printf(sc->dev,
1380 			    "Stage 2 translation supported.\n");
1381 		sc->features |= SMMU_FEATURE_S2P;
1382 	}
1383 
1384 	switch (reg & IDR0_TTF_M) {
1385 	case IDR0_TTF_ALL:
1386 	case IDR0_TTF_AA64:
1387 		sc->ias = 40;
1388 		break;
1389 	default:
1390 		device_printf(sc->dev, "No AArch64 table format support.\n");
1391 		return (ENXIO);
1392 	}
1393 
1394 	if (reg & IDR0_ASID16)
1395 		sc->asid_bits = 16;
1396 	else
1397 		sc->asid_bits = 8;
1398 
1399 	if (bootverbose)
1400 		device_printf(sc->dev, "ASID bits %d\n", sc->asid_bits);
1401 
1402 	if (reg & IDR0_VMID16)
1403 		sc->vmid_bits = 16;
1404 	else
1405 		sc->vmid_bits = 8;
1406 
1407 	reg = bus_read_4(sc->res[0], SMMU_IDR1);
1408 
1409 	if (reg & (IDR1_TABLES_PRESET | IDR1_QUEUES_PRESET | IDR1_REL)) {
1410 		device_printf(sc->dev,
1411 		    "Embedded implementations not supported by this driver.\n");
1412 		return (ENXIO);
1413 	}
1414 
1415 	val = (reg & IDR1_CMDQS_M) >> IDR1_CMDQS_S;
1416 	sc->cmdq.size_log2 = val;
1417 	if (bootverbose)
1418 		device_printf(sc->dev, "CMD queue bits %d\n", val);
1419 
1420 	val = (reg & IDR1_EVENTQS_M) >> IDR1_EVENTQS_S;
1421 	sc->evtq.size_log2 = val;
1422 	if (bootverbose)
1423 		device_printf(sc->dev, "EVENT queue bits %d\n", val);
1424 
1425 	if (sc->features & SMMU_FEATURE_PRI) {
1426 		val = (reg & IDR1_PRIQS_M) >> IDR1_PRIQS_S;
1427 		sc->priq.size_log2 = val;
1428 		if (bootverbose)
1429 			device_printf(sc->dev, "PRI queue bits %d\n", val);
1430 	}
1431 
1432 	sc->ssid_bits = (reg & IDR1_SSIDSIZE_M) >> IDR1_SSIDSIZE_S;
1433 	sc->sid_bits = (reg & IDR1_SIDSIZE_M) >> IDR1_SIDSIZE_S;
1434 
1435 	if (sc->sid_bits <= STRTAB_SPLIT)
1436 		sc->features &= ~SMMU_FEATURE_2_LVL_STREAM_TABLE;
1437 
1438 	if (bootverbose) {
1439 		device_printf(sc->dev, "SSID bits %d\n", sc->ssid_bits);
1440 		device_printf(sc->dev, "SID bits %d\n", sc->sid_bits);
1441 	}
1442 
1443 	/* IDR3 */
1444 	reg = bus_read_4(sc->res[0], SMMU_IDR3);
1445 	if (reg & IDR3_RIL)
1446 		sc->features |= SMMU_FEATURE_RANGE_INV;
1447 
1448 	/* IDR5 */
1449 	reg = bus_read_4(sc->res[0], SMMU_IDR5);
1450 
1451 	switch (reg & IDR5_OAS_M) {
1452 	case IDR5_OAS_32:
1453 		sc->oas = 32;
1454 		break;
1455 	case IDR5_OAS_36:
1456 		sc->oas = 36;
1457 		break;
1458 	case IDR5_OAS_40:
1459 		sc->oas = 40;
1460 		break;
1461 	case IDR5_OAS_42:
1462 		sc->oas = 42;
1463 		break;
1464 	case IDR5_OAS_44:
1465 		sc->oas = 44;
1466 		break;
1467 	case IDR5_OAS_48:
1468 		sc->oas = 48;
1469 		break;
1470 	case IDR5_OAS_52:
1471 		sc->oas = 52;
1472 		break;
1473 	}
1474 
1475 	sc->pgsizes = 0;
1476 	if (reg & IDR5_GRAN64K)
1477 		sc->pgsizes |= 64 * 1024;
1478 	if (reg & IDR5_GRAN16K)
1479 		sc->pgsizes |= 16 * 1024;
1480 	if (reg & IDR5_GRAN4K)
1481 		sc->pgsizes |= 4 * 1024;
1482 
1483 	if ((reg & IDR5_VAX_M) == IDR5_VAX_52)
1484 		sc->features |= SMMU_FEATURE_VAX;
1485 
1486 	return (0);
1487 }
1488 
1489 static void
1490 smmu_init_asids(struct smmu_softc *sc)
1491 {
1492 
1493 	sc->asid_set_size = (1 << sc->asid_bits);
1494 	sc->asid_set = bit_alloc(sc->asid_set_size, M_SMMU, M_WAITOK);
1495 	mtx_init(&sc->asid_set_mutex, "asid set", NULL, MTX_SPIN);
1496 }
1497 
1498 static int
1499 smmu_asid_alloc(struct smmu_softc *sc, int *new_asid)
1500 {
1501 
1502 	mtx_lock_spin(&sc->asid_set_mutex);
1503 	bit_ffc(sc->asid_set, sc->asid_set_size, new_asid);
1504 	if (*new_asid == -1) {
1505 		mtx_unlock_spin(&sc->asid_set_mutex);
1506 		return (ENOMEM);
1507 	}
1508 	bit_set(sc->asid_set, *new_asid);
1509 	mtx_unlock_spin(&sc->asid_set_mutex);
1510 
1511 	return (0);
1512 }
1513 
1514 static void
1515 smmu_asid_free(struct smmu_softc *sc, int asid)
1516 {
1517 
1518 	mtx_lock_spin(&sc->asid_set_mutex);
1519 	bit_clear(sc->asid_set, asid);
1520 	mtx_unlock_spin(&sc->asid_set_mutex);
1521 }
1522 
1523 /*
1524  * Device interface.
1525  */
1526 int
1527 smmu_attach(device_t dev)
1528 {
1529 	struct smmu_softc *sc;
1530 	int error;
1531 
1532 	sc = device_get_softc(dev);
1533 	sc->dev = dev;
1534 
1535 	mtx_init(&sc->sc_mtx, device_get_nameunit(sc->dev), "smmu", MTX_DEF);
1536 
1537 	error = bus_alloc_resources(dev, smmu_spec, sc->res);
1538 	if (error) {
1539 		device_printf(dev, "Couldn't allocate resources.\n");
1540 		return (ENXIO);
1541 	}
1542 
1543 	error = smmu_setup_interrupts(sc);
1544 	if (error) {
1545 		bus_release_resources(dev, smmu_spec, sc->res);
1546 		return (ENXIO);
1547 	}
1548 
1549 	error = smmu_check_features(sc);
1550 	if (error) {
1551 		device_printf(dev, "Some features are required "
1552 		    "but not supported by hardware.\n");
1553 		return (ENXIO);
1554 	}
1555 
1556 	smmu_init_asids(sc);
1557 
1558 	error = smmu_init_queues(sc);
1559 	if (error) {
1560 		device_printf(dev, "Couldn't allocate queues.\n");
1561 		return (ENXIO);
1562 	}
1563 
1564 	error = smmu_init_strtab(sc);
1565 	if (error) {
1566 		device_printf(dev, "Couldn't allocate strtab.\n");
1567 		return (ENXIO);
1568 	}
1569 
1570 	error = smmu_reset(sc);
1571 	if (error) {
1572 		device_printf(dev, "Couldn't reset SMMU.\n");
1573 		return (ENXIO);
1574 	}
1575 
1576 	return (0);
1577 }
1578 
1579 int
1580 smmu_detach(device_t dev)
1581 {
1582 	struct smmu_softc *sc;
1583 
1584 	sc = device_get_softc(dev);
1585 
1586 	bus_release_resources(dev, smmu_spec, sc->res);
1587 
1588 	return (0);
1589 }
1590 
1591 static int
1592 smmu_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
1593 {
1594 	struct smmu_softc *sc;
1595 
1596 	sc = device_get_softc(dev);
1597 
1598 	device_printf(sc->dev, "%s\n", __func__);
1599 
1600 	return (ENOENT);
1601 }
1602 
1603 static int
1604 smmu_unmap(device_t dev, struct iommu_domain *iodom,
1605     vm_offset_t va, bus_size_t size)
1606 {
1607 	struct smmu_domain *domain;
1608 	struct smmu_softc *sc;
1609 	int err;
1610 	int i;
1611 
1612 	sc = device_get_softc(dev);
1613 
1614 	domain = (struct smmu_domain *)iodom;
1615 
1616 	err = 0;
1617 
1618 	dprintf("%s: %lx, %ld, domain %d\n", __func__, va, size, domain->asid);
1619 
1620 	for (i = 0; i < size; i += PAGE_SIZE) {
1621 		if (pmap_sremove(&domain->p, va) == 0) {
1622 			/* pmap entry removed, invalidate TLB. */
1623 			smmu_tlbi_va(sc, va, domain->asid);
1624 		} else {
1625 			err = ENOENT;
1626 			break;
1627 		}
1628 		va += PAGE_SIZE;
1629 	}
1630 
1631 	smmu_sync(sc);
1632 
1633 	return (err);
1634 }
1635 
1636 static int
1637 smmu_map(device_t dev, struct iommu_domain *iodom,
1638     vm_offset_t va, vm_page_t *ma, vm_size_t size,
1639     vm_prot_t prot)
1640 {
1641 	struct smmu_domain *domain;
1642 	struct smmu_softc *sc;
1643 	vm_paddr_t pa;
1644 	int error;
1645 	int i;
1646 
1647 	sc = device_get_softc(dev);
1648 
1649 	domain = (struct smmu_domain *)iodom;
1650 
1651 	dprintf("%s: %lx -> %lx, %ld, domain %d\n", __func__, va, pa, size,
1652 	    domain->asid);
1653 
1654 	for (i = 0; size > 0; size -= PAGE_SIZE) {
1655 		pa = VM_PAGE_TO_PHYS(ma[i++]);
1656 		error = pmap_senter(&domain->p, va, pa, prot, 0);
1657 		if (error)
1658 			return (error);
1659 		smmu_tlbi_va(sc, va, domain->asid);
1660 		va += PAGE_SIZE;
1661 	}
1662 
1663 	smmu_sync(sc);
1664 
1665 	return (0);
1666 }
1667 
1668 static struct iommu_domain *
1669 smmu_domain_alloc(device_t dev, struct iommu_unit *iommu)
1670 {
1671 	struct smmu_domain *domain;
1672 	struct smmu_unit *unit;
1673 	struct smmu_softc *sc;
1674 	int error;
1675 	int new_asid;
1676 
1677 	sc = device_get_softc(dev);
1678 
1679 	unit = (struct smmu_unit *)iommu;
1680 
1681 	domain = malloc(sizeof(*domain), M_SMMU, M_WAITOK | M_ZERO);
1682 
1683 	error = smmu_asid_alloc(sc, &new_asid);
1684 	if (error) {
1685 		free(domain, M_SMMU);
1686 		device_printf(sc->dev,
1687 		    "Could not allocate ASID for a new domain.\n");
1688 		return (NULL);
1689 	}
1690 
1691 	domain->asid = (uint16_t)new_asid;
1692 
1693 	pmap_pinit(&domain->p);
1694 	PMAP_LOCK_INIT(&domain->p);
1695 
1696 	error = smmu_init_cd(sc, domain);
1697 	if (error) {
1698 		free(domain, M_SMMU);
1699 		device_printf(sc->dev, "Could not initialize CD\n");
1700 		return (NULL);
1701 	}
1702 
1703 	smmu_tlbi_asid(sc, domain->asid);
1704 
1705 	LIST_INIT(&domain->ctx_list);
1706 
1707 	IOMMU_LOCK(iommu);
1708 	LIST_INSERT_HEAD(&unit->domain_list, domain, next);
1709 	IOMMU_UNLOCK(iommu);
1710 
1711 	return (&domain->iodom);
1712 }
1713 
1714 static void
1715 smmu_domain_free(device_t dev, struct iommu_domain *iodom)
1716 {
1717 	struct smmu_domain *domain;
1718 	struct smmu_softc *sc;
1719 	struct smmu_cd *cd;
1720 
1721 	sc = device_get_softc(dev);
1722 
1723 	domain = (struct smmu_domain *)iodom;
1724 
1725 	LIST_REMOVE(domain, next);
1726 
1727 	cd = domain->cd;
1728 
1729 	pmap_sremove_pages(&domain->p);
1730 	pmap_release(&domain->p);
1731 
1732 	smmu_tlbi_asid(sc, domain->asid);
1733 	smmu_asid_free(sc, domain->asid);
1734 
1735 	contigfree(cd->vaddr, cd->size, M_SMMU);
1736 	free(cd, M_SMMU);
1737 
1738 	free(domain, M_SMMU);
1739 }
1740 
1741 static int
1742 smmu_set_buswide(device_t dev, struct smmu_domain *domain,
1743     struct smmu_ctx *ctx)
1744 {
1745 	struct smmu_softc *sc;
1746 	int i;
1747 
1748 	sc = device_get_softc(dev);
1749 
1750 	for (i = 0; i < PCI_SLOTMAX; i++)
1751 		smmu_init_ste(sc, domain->cd, (ctx->sid | i), ctx->bypass);
1752 
1753 	return (0);
1754 }
1755 
1756 static struct iommu_ctx *
1757 smmu_ctx_alloc(device_t dev, struct iommu_domain *iodom, device_t child,
1758     bool disabled)
1759 {
1760 	struct smmu_domain *domain;
1761 	struct smmu_softc *sc;
1762 	struct smmu_ctx *ctx;
1763 	uint16_t rid;
1764 	u_int xref, sid;
1765 	int seg;
1766 	int err;
1767 
1768 	sc = device_get_softc(dev);
1769 	domain = (struct smmu_domain *)iodom;
1770 
1771 	seg = pci_get_domain(child);
1772 	rid = pci_get_rid(child);
1773 	err = acpi_iort_map_pci_smmuv3(seg, rid, &xref, &sid);
1774 	if (err)
1775 		return (NULL);
1776 
1777 	if (sc->features & SMMU_FEATURE_2_LVL_STREAM_TABLE) {
1778 		err = smmu_init_l1_entry(sc, sid);
1779 		if (err)
1780 			return (NULL);
1781 	}
1782 
1783 	ctx = malloc(sizeof(struct smmu_ctx), M_SMMU, M_WAITOK | M_ZERO);
1784 	ctx->vendor = pci_get_vendor(child);
1785 	ctx->device = pci_get_device(child);
1786 	ctx->dev = child;
1787 	ctx->sid = sid;
1788 	ctx->domain = domain;
1789 	if (disabled)
1790 		ctx->bypass = true;
1791 
1792 	/*
1793 	 * Neoverse N1 SDP:
1794 	 * 0x800 xhci
1795 	 * 0x700 re
1796 	 * 0x600 sata
1797 	 */
1798 
1799 	smmu_init_ste(sc, domain->cd, ctx->sid, ctx->bypass);
1800 
1801 	if (iommu_is_buswide_ctx(iodom->iommu, pci_get_bus(ctx->dev)))
1802 		smmu_set_buswide(dev, domain, ctx);
1803 
1804 	IOMMU_DOMAIN_LOCK(iodom);
1805 	LIST_INSERT_HEAD(&domain->ctx_list, ctx, next);
1806 	IOMMU_DOMAIN_UNLOCK(iodom);
1807 
1808 	return (&ctx->ioctx);
1809 }
1810 
1811 static void
1812 smmu_ctx_free(device_t dev, struct iommu_ctx *ioctx)
1813 {
1814 	struct smmu_softc *sc;
1815 	struct smmu_ctx *ctx;
1816 
1817 	IOMMU_ASSERT_LOCKED(ioctx->domain->iommu);
1818 
1819 	sc = device_get_softc(dev);
1820 	ctx = (struct smmu_ctx *)ioctx;
1821 
1822 	smmu_deinit_l1_entry(sc, ctx->sid);
1823 
1824 	LIST_REMOVE(ctx, next);
1825 
1826 	free(ctx, M_SMMU);
1827 }
1828 
1829 struct smmu_ctx *
1830 smmu_ctx_lookup_by_sid(device_t dev, u_int sid)
1831 {
1832 	struct smmu_softc *sc;
1833 	struct smmu_domain *domain;
1834 	struct smmu_unit *unit;
1835 	struct smmu_ctx *ctx;
1836 
1837 	sc = device_get_softc(dev);
1838 
1839 	unit = &sc->unit;
1840 
1841 	LIST_FOREACH(domain, &unit->domain_list, next) {
1842 		LIST_FOREACH(ctx, &domain->ctx_list, next) {
1843 			if (ctx->sid == sid)
1844 				return (ctx);
1845 		}
1846 	}
1847 
1848 	return (NULL);
1849 }
1850 
1851 static struct iommu_ctx *
1852 smmu_ctx_lookup(device_t dev, device_t child)
1853 {
1854 	struct iommu_unit *iommu;
1855 	struct smmu_softc *sc;
1856 	struct smmu_domain *domain;
1857 	struct smmu_unit *unit;
1858 	struct smmu_ctx *ctx;
1859 
1860 	sc = device_get_softc(dev);
1861 
1862 	unit = &sc->unit;
1863 	iommu = &unit->iommu;
1864 
1865 	IOMMU_ASSERT_LOCKED(iommu);
1866 
1867 	LIST_FOREACH(domain, &unit->domain_list, next) {
1868 		IOMMU_DOMAIN_LOCK(&domain->iodom);
1869 		LIST_FOREACH(ctx, &domain->ctx_list, next) {
1870 			if (ctx->dev == child) {
1871 				IOMMU_DOMAIN_UNLOCK(&domain->iodom);
1872 				return (&ctx->ioctx);
1873 			}
1874 		}
1875 		IOMMU_DOMAIN_UNLOCK(&domain->iodom);
1876 	}
1877 
1878 	return (NULL);
1879 }
1880 
1881 static int
1882 smmu_find(device_t dev, device_t child)
1883 {
1884 	struct smmu_softc *sc;
1885 	u_int xref, sid;
1886 	uint16_t rid;
1887 	int error;
1888 	int seg;
1889 
1890 	sc = device_get_softc(dev);
1891 
1892 	rid = pci_get_rid(child);
1893 	seg = pci_get_domain(child);
1894 
1895 	/*
1896 	 * Find an xref of an IOMMU controller that serves traffic for dev.
1897 	 */
1898 #ifdef DEV_ACPI
1899 	error = acpi_iort_map_pci_smmuv3(seg, rid, &xref, &sid);
1900 	if (error) {
1901 		/* Could not find reference to an SMMU device. */
1902 		return (ENOENT);
1903 	}
1904 #else
1905 	/* TODO: add FDT support. */
1906 	return (ENXIO);
1907 #endif
1908 
1909 	/* Check if xref is ours. */
1910 	if (xref != sc->xref)
1911 		return (EFAULT);
1912 
1913 	return (0);
1914 }
1915 
1916 static device_method_t smmu_methods[] = {
1917 	/* Device interface */
1918 	DEVMETHOD(device_detach,	smmu_detach),
1919 
1920 	/* SMMU interface */
1921 	DEVMETHOD(iommu_find,		smmu_find),
1922 	DEVMETHOD(iommu_map,		smmu_map),
1923 	DEVMETHOD(iommu_unmap,		smmu_unmap),
1924 	DEVMETHOD(iommu_domain_alloc,	smmu_domain_alloc),
1925 	DEVMETHOD(iommu_domain_free,	smmu_domain_free),
1926 	DEVMETHOD(iommu_ctx_alloc,	smmu_ctx_alloc),
1927 	DEVMETHOD(iommu_ctx_free,	smmu_ctx_free),
1928 	DEVMETHOD(iommu_ctx_lookup,	smmu_ctx_lookup),
1929 
1930 	/* Bus interface */
1931 	DEVMETHOD(bus_read_ivar,	smmu_read_ivar),
1932 
1933 	/* End */
1934 	DEVMETHOD_END
1935 };
1936 
1937 DEFINE_CLASS_0(smmu, smmu_driver, smmu_methods, sizeof(struct smmu_softc));
1938