Lines Matching +full:iommu +full:- +full:parent

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2019-2020 Ruslan Bukin <br@bsdpad.com>
8 * Technology) under DARPA contract HR0011-18-C-0016 ("ECATS"), as part of the
51 #include <dev/iommu/iommu.h>
53 #include <arm64/iommu/iommu.h>
65 device_t parent; member
79 i = iort_data->count; in iort_handler()
81 switch(entry->Type) { in iort_handler()
88 if (iort_data->smmu[i] != NULL) { in iort_handler()
90 device_printf(iort_data->parent, in iort_handler()
95 iort_data->smmu[i] = (ACPI_IORT_SMMU_V3 *)node->NodeData; in iort_handler()
96 iort_data->count++; in iort_handler()
104 smmu_acpi_identify(driver_t *driver, device_t parent) in smmu_acpi_identify() argument
119 device_printf(parent, "smmu: Unable to map the IORT\n"); in smmu_acpi_identify()
123 iort_data.parent = parent; in smmu_acpi_identify()
128 acpi_walk_subtables(iort + 1, (char *)iort + iort->Header.Length, in smmu_acpi_identify()
131 device_printf(parent, "No SMMU found.\n"); in smmu_acpi_identify()
136 dev = BUS_ADD_CHILD(parent, in smmu_acpi_identify()
137 BUS_PASS_INTERRUPT + BUS_PASS_ORDER_MIDDLE, "smmu", -1); in smmu_acpi_identify()
139 device_printf(parent, "add smmu child failed\n"); in smmu_acpi_identify()
144 BUS_SET_RESOURCE(parent, dev, SYS_RES_IRQ, 0, in smmu_acpi_identify()
145 iort_data.smmu[i]->EventGsiv, 1); in smmu_acpi_identify()
146 BUS_SET_RESOURCE(parent, dev, SYS_RES_IRQ, 1, in smmu_acpi_identify()
147 iort_data.smmu[i]->PriGsiv, 1); in smmu_acpi_identify()
148 BUS_SET_RESOURCE(parent, dev, SYS_RES_IRQ, 2, in smmu_acpi_identify()
149 iort_data.smmu[i]->SyncGsiv, 1); in smmu_acpi_identify()
150 BUS_SET_RESOURCE(parent, dev, SYS_RES_IRQ, 3, in smmu_acpi_identify()
151 iort_data.smmu[i]->GerrGsiv, 1); in smmu_acpi_identify()
152 BUS_SET_RESOURCE(parent, dev, SYS_RES_MEMORY, 0, in smmu_acpi_identify()
153 iort_data.smmu[i]->BaseAddress, MEMORY_RESOURCE_SIZE); in smmu_acpi_identify()
155 priv = iort_data.smmu[i]->Flags; in smmu_acpi_identify()
157 priv |= iort_data.smmu[i]->Model; in smmu_acpi_identify()
190 struct iommu_unit *iommu; in smmu_acpi_attach() local
196 sc->dev = dev; in smmu_acpi_attach()
200 sc->features |= SMMU_FEATURE_COHERENCY; in smmu_acpi_attach()
203 device_printf(sc->dev, "%s: features %x\n", in smmu_acpi_attach()
204 __func__, sc->features); in smmu_acpi_attach()
207 sc->res[0] = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in smmu_acpi_attach()
209 if (sc->res[0] == NULL) { in smmu_acpi_attach()
216 * Interrupt lines are "eventq", "priq", "cmdq-sync", "gerror". in smmu_acpi_attach()
220 sc->res[1] = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); in smmu_acpi_attach()
221 if (sc->res[1] == NULL) { in smmu_acpi_attach()
228 sc->res[3] = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); in smmu_acpi_attach()
229 if (sc->res[3] == NULL) { in smmu_acpi_attach()
230 device_printf(dev, "Can't allocate cmdq-sync IRQ resource.\n"); in smmu_acpi_attach()
236 sc->res[4] = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); in smmu_acpi_attach()
237 if (sc->res[4] == NULL) { in smmu_acpi_attach()
247 unit = &sc->unit; in smmu_acpi_attach()
248 unit->dev = dev; in smmu_acpi_attach()
250 iommu = &unit->iommu; in smmu_acpi_attach()
251 iommu->dev = dev; in smmu_acpi_attach()
253 LIST_INIT(&unit->domain_list); in smmu_acpi_attach()
256 sc->xref = bus_get_resource_start(dev, SYS_RES_MEMORY, 0); in smmu_acpi_attach()
258 err = iommu_register(iommu); in smmu_acpi_attach()