Lines Matching full:unit
64 static void dmar_ir_program_irte(struct dmar_unit *unit, u_int idx,
66 static int dmar_ir_free_irte(struct dmar_unit *unit, u_int cookie);
71 struct dmar_unit *unit;
76 unit = dmar_ir_find(src, NULL, NULL);
77 if (unit == NULL || !unit->ir_enabled) {
83 error = vmem_alloc(unit->irtids, count, M_FIRSTFIT | M_NOWAIT,
100 struct dmar_unit *unit;
105 unit = dmar_ir_find(src, &rid, &is_dmar);
107 KASSERT(unit == NULL, ("DMAR cannot translate itself"));
121 if (unit == NULL || !unit->ir_enabled || cookie == -1)
124 low = (DMAR_X2APIC(unit) ? DMAR_IRTE1_DST_x2APIC(cpu) :
128 dmar_ir_program_irte(unit, cookie, low, rid);
145 struct dmar_unit *unit;
149 unit = dmar_ir_find(src, NULL, NULL);
150 return (dmar_ir_free_irte(unit, cookie));
157 struct dmar_unit *unit;
164 unit = dmar_find_ioapic(ioapic_id, &rid);
165 if (unit == NULL || !unit->ir_enabled) {
170 error = vmem_alloc(unit->irtids, 1, M_FIRSTFIT | M_NOWAIT, &vmem_res);
193 low |= (DMAR_X2APIC(unit) ? DMAR_IRTE1_DST_x2APIC(cpu) :
197 dmar_ir_program_irte(unit, idx, low, rid);
219 struct dmar_unit *unit;
226 unit = dmar_find_ioapic(ioapic_id, NULL);
227 KASSERT(unit != NULL && unit->ir_enabled,
228 ("unmap: cookie %d unit %p", idx, unit));
229 return (dmar_ir_free_irte(unit, idx));
236 struct dmar_unit *unit;
249 unit = NULL;
253 unit = dmar_find_hpet(src, rid);
255 unit = dmar_find(src, bootverbose);
256 if (unit != NULL && rid != NULL)
259 return (unit);
263 dmar_ir_program_irte(struct dmar_unit *unit, u_int idx, uint64_t low,
269 KASSERT(idx < unit->irte_cnt,
270 ("bad cookie %d %d", idx, unit->irte_cnt));
271 irte = &(unit->irt[idx]);
275 device_printf(unit->iommu.dev,
279 DMAR_LOCK(unit);
295 dmar_qi_invalidate_iec(unit, idx, 1);
296 DMAR_UNLOCK(unit);
301 dmar_ir_free_irte(struct dmar_unit *unit, u_int cookie)
305 KASSERT(unit != NULL && unit->ir_enabled,
306 ("unmap: cookie %d unit %p", cookie, unit));
307 KASSERT(cookie < unit->irte_cnt,
308 ("bad cookie %u %u", cookie, unit->irte_cnt));
309 irte = &(unit->irt[cookie]);
312 DMAR_LOCK(unit);
313 dmar_qi_invalidate_iec(unit, cookie, 1);
314 DMAR_UNLOCK(unit);
315 vmem_free(unit->irtids, cookie, 1);
320 dmar_init_irt(struct dmar_unit *unit)
322 SYSCTL_ADD_INT(&unit->iommu.sysctl_ctx,
323 SYSCTL_CHILDREN(device_get_sysctl_tree(unit->iommu.dev)),
324 OID_AUTO, "ir", CTLFLAG_RD, &unit->ir_enabled, 0,
326 if ((unit->hw_ecap & DMAR_ECAP_IR) == 0)
328 unit->ir_enabled = 1;
329 TUNABLE_INT_FETCH("hw.dmar.ir", &unit->ir_enabled);
330 TUNABLE_INT_FETCH("hw.iommu.ir", &unit->ir_enabled);
331 if (!unit->ir_enabled)
333 if (!unit->qi_enabled) {
334 unit->ir_enabled = 0;
336 device_printf(unit->iommu.dev,
340 unit->irte_cnt = roundup_pow_of_two(num_io_irqs);
341 if (unit->memdomain == -1) {
342 unit->irt = kmem_alloc_contig(
343 unit->irte_cnt * sizeof(dmar_irte_t),
345 DMAR_IS_COHERENT(unit) ?
348 unit->irt = kmem_alloc_contig_domainset(
349 DOMAINSET_PREF(unit->memdomain),
350 unit->irte_cnt * sizeof(dmar_irte_t),
352 DMAR_IS_COHERENT(unit) ?
355 if (unit->irt == NULL)
357 unit->irt_phys = pmap_kextract((vm_offset_t)unit->irt);
358 unit->irtids = vmem_create("dmarirt", 0, unit->irte_cnt, 1, 0,
360 DMAR_LOCK(unit);
361 dmar_load_irt_ptr(unit);
362 dmar_qi_invalidate_iec_glob(unit);
363 DMAR_UNLOCK(unit);
372 DMAR_LOCK(unit);
373 dmar_enable_ir(unit);
374 DMAR_UNLOCK(unit);
379 dmar_fini_irt(struct dmar_unit *unit)
382 unit->ir_enabled = 0;
383 if (unit->irt != NULL) {
384 dmar_disable_ir(unit);
385 dmar_qi_invalidate_iec_glob(unit);
386 vmem_destroy(unit->irtids);
387 kmem_free(unit->irt, unit->irte_cnt * sizeof(dmar_irte_t));