Lines Matching +full:iommu +full:- +full:ctx
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
71 #include <dev/iommu/busdma_iommu.h>
72 #include <x86/iommu/amd_reg.h>
73 #include <x86/iommu/x86_iommu.h>
74 #include <x86/iommu/amd_iommu.h>
78 static void amdiommu_ir_free_irte(struct amdiommu_ctx *ctx, device_t src,
84 struct amdiommu_ctx *ctx; in amdiommu_alloc_msi_intr() local
89 ctx = amdiommu_ir_find(src, NULL, NULL); in amdiommu_alloc_msi_intr()
90 if (ctx == NULL || !CTX2AMD(ctx)->irte_enabled) { in amdiommu_alloc_msi_intr()
92 cookies[i] = -1; in amdiommu_alloc_msi_intr()
96 error = vmem_alloc(ctx->irtids, count, M_FIRSTFIT | M_NOWAIT, in amdiommu_alloc_msi_intr()
113 struct amdiommu_ctx *ctx; in amdiommu_map_msi_intr() local
118 ctx = amdiommu_ir_find(src, &rid, &is_iommu); in amdiommu_map_msi_intr()
132 if (ctx == NULL) in amdiommu_map_msi_intr()
134 unit = CTX2AMD(ctx); in amdiommu_map_msi_intr()
135 if (!unit->irte_enabled || cookie == -1) in amdiommu_map_msi_intr()
137 if (cookie >= unit->irte_nentries) { in amdiommu_map_msi_intr()
139 unit->iommu.unit, cookie, unit->irte_nentries); in amdiommu_map_msi_intr()
143 if (unit->irte_x2apic) { in amdiommu_map_msi_intr()
146 irte = &ctx->irtx2[cookie]; in amdiommu_map_msi_intr()
147 irte->supiopf = 0; in amdiommu_map_msi_intr()
148 irte->inttype = 0; in amdiommu_map_msi_intr()
149 irte->rqeoi = 0; in amdiommu_map_msi_intr()
150 irte->dm = 0; in amdiommu_map_msi_intr()
151 irte->guestmode = 0; in amdiommu_map_msi_intr()
152 irte->dest0 = cpu; in amdiommu_map_msi_intr()
153 irte->rsrv0 = 0; in amdiommu_map_msi_intr()
154 irte->vector = vector; in amdiommu_map_msi_intr()
155 irte->rsrv1 = 0; in amdiommu_map_msi_intr()
156 irte->rsrv2 = 0; in amdiommu_map_msi_intr()
157 irte->dest1 = cpu >> 24; in amdiommu_map_msi_intr()
159 irte->remapen = 1; in amdiommu_map_msi_intr()
163 irte = &ctx->irtb[cookie]; in amdiommu_map_msi_intr()
164 irte->supiopf = 0; in amdiommu_map_msi_intr()
165 irte->inttype = 0; /* fixed */ in amdiommu_map_msi_intr()
166 irte->rqeoi = 0; in amdiommu_map_msi_intr()
167 irte->dm = 0; /* phys */ in amdiommu_map_msi_intr()
168 irte->guestmode = 0; in amdiommu_map_msi_intr()
169 irte->dest = cpu; in amdiommu_map_msi_intr()
170 irte->vector = vector; in amdiommu_map_msi_intr()
171 irte->rsrv = 0; in amdiommu_map_msi_intr()
173 irte->remapen = 1; in amdiommu_map_msi_intr()
179 if (unit->irte_x2apic) in amdiommu_map_msi_intr()
194 struct amdiommu_ctx *ctx; in amdiommu_unmap_msi_intr() local
196 if (cookie == -1) in amdiommu_unmap_msi_intr()
198 ctx = amdiommu_ir_find(src, NULL, NULL); in amdiommu_unmap_msi_intr()
199 amdiommu_ir_free_irte(ctx, src, cookie); in amdiommu_unmap_msi_intr()
224 struct amdiommu_ctx *ctx; in amdiommu_ir_find() local
232 * interrupts. If yes, it is either IOMMU, in which case in amdiommu_ir_find()
240 ctx = NULL; in amdiommu_ir_find()
249 ctx = NULL; // XXXKIB allocate ctx in amdiommu_ir_find()
255 ctx = amdiommu_get_ctx_for_dev(unit, src, in amdiommu_ir_find()
261 return (ctx); in amdiommu_ir_find()
265 amdiommu_ir_free_irte(struct amdiommu_ctx *ctx, device_t src, in amdiommu_ir_free_irte() argument
271 MPASS(ctx != NULL); in amdiommu_ir_free_irte()
272 unit = CTX2AMD(ctx); in amdiommu_ir_free_irte()
274 KASSERT(unit->irte_enabled, in amdiommu_ir_free_irte()
275 ("unmap: cookie %d ctx %p unit %p", cookie, ctx, unit)); in amdiommu_ir_free_irte()
276 KASSERT(cookie < unit->irte_nentries, in amdiommu_ir_free_irte()
277 ("bad cookie %u %u", cookie, unit->irte_nentries)); in amdiommu_ir_free_irte()
279 if (unit->irte_x2apic) { in amdiommu_ir_free_irte()
282 irte = &ctx->irtx2[cookie]; in amdiommu_ir_free_irte()
283 irte->remapen = 0; in amdiommu_ir_free_irte()
289 irte = &ctx->irtb[cookie]; in amdiommu_ir_free_irte()
290 irte->remapen = 0; in amdiommu_ir_free_irte()
301 amdiommu_ctx_init_irte(struct amdiommu_ctx *ctx) in amdiommu_ctx_init_irte() argument
308 unit = CTX2AMD(ctx); in amdiommu_ctx_init_irte()
309 if (!unit->irte_enabled) in amdiommu_ctx_init_irte()
312 KASSERT(unit->irte_nentries > 0 && in amdiommu_ctx_init_irte()
313 unit->irte_nentries <= 2048 && in amdiommu_ctx_init_irte()
314 powerof2(unit->irte_nentries), in amdiommu_ctx_init_irte()
315 ("amdiommu%d: unit %p irte_nentries %u", unit->iommu.unit, in amdiommu_ctx_init_irte()
316 unit, unit->irte_nentries)); in amdiommu_ctx_init_irte()
318 if (bus_get_domain(unit->iommu.dev, &dom) != 0) in amdiommu_ctx_init_irte()
319 dom = -1; in amdiommu_ctx_init_irte()
320 sz = unit->irte_nentries; in amdiommu_ctx_init_irte()
321 sz *= unit->irte_x2apic ? sizeof(struct amdiommu_irte_basic_vapic_x2) : in amdiommu_ctx_init_irte()
324 if (dom != -1) { in amdiommu_ctx_init_irte()
331 if (unit->irte_x2apic) in amdiommu_ctx_init_irte()
332 ctx->irtx2 = ptr; in amdiommu_ctx_init_irte()
334 ctx->irtb = ptr; in amdiommu_ctx_init_irte()
335 ctx->irtids = vmem_create("amdirt", 0, unit->irte_nentries, 1, 0, in amdiommu_ctx_init_irte()
344 amdiommu_ctx_fini_irte(struct amdiommu_ctx *ctx) in amdiommu_ctx_fini_irte() argument
348 unit = CTX2AMD(ctx); in amdiommu_ctx_fini_irte()
349 if (!unit->irte_enabled) in amdiommu_ctx_fini_irte()
351 if (unit->irte_x2apic) in amdiommu_ctx_fini_irte()
352 free(ctx->irtx2, M_DEVBUF); in amdiommu_ctx_fini_irte()
354 free(ctx->irtb, M_DEVBUF); in amdiommu_ctx_fini_irte()
355 vmem_destroy(ctx->irtids); in amdiommu_ctx_fini_irte()
363 SYSCTL_ADD_INT(&unit->iommu.sysctl_ctx, in amdiommu_init_irt()
364 SYSCTL_CHILDREN(device_get_sysctl_tree(unit->iommu.dev)), in amdiommu_init_irt()
365 OID_AUTO, "ir", CTLFLAG_RD, &unit->irte_enabled, 0, in amdiommu_init_irt()
369 TUNABLE_INT_FETCH("hw.iommu.ir", &enabled); in amdiommu_init_irt()
371 unit->irte_enabled = enabled != 0; in amdiommu_init_irt()
372 if (!unit->irte_enabled) in amdiommu_init_irt()
376 TUNABLE_INT_FETCH("hw.iommu.amd.ir_num", &nentries); in amdiommu_init_irt()
382 unit->irte_nentries = nentries; in amdiommu_init_irt()
384 unit->irte_x2apic = x2apic_mode; in amdiommu_init_irt()