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