Deleted Added
full compact
intel_drv.c (257251) intel_drv.c (259512)
1/*-
2 * Copyright (c) 2013 The FreeBSD Foundation
3 * All rights reserved.
4 *
5 * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
6 * under sponsorship from the FreeBSD Foundation.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 14 unchanged lines hidden (view full) ---

23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2013 The FreeBSD Foundation
3 * All rights reserved.
4 *
5 * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
6 * under sponsorship from the FreeBSD Foundation.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 14 unchanged lines hidden (view full) ---

23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/x86/iommu/intel_drv.c 257251 2013-10-28 13:33:29Z kib $");
31__FBSDID("$FreeBSD: stable/10/sys/x86/iommu/intel_drv.c 259512 2013-12-17 13:49:35Z kib $");
32
33#include "opt_acpi.h"
34#if defined(__amd64__) /* || defined(__ia64__) */
35#define DEV_APIC
36#else
37#include "opt_apic.h"
38#endif
39#include "opt_ddb.h"

--- 26 unchanged lines hidden (view full) ---

66#include <x86/iommu/busdma_dmar.h>
67#include <x86/iommu/intel_dmar.h>
68#include <dev/pci/pcivar.h>
69
70#ifdef DEV_APIC
71#include "pcib_if.h"
72#endif
73
32
33#include "opt_acpi.h"
34#if defined(__amd64__) /* || defined(__ia64__) */
35#define DEV_APIC
36#else
37#include "opt_apic.h"
38#endif
39#include "opt_ddb.h"

--- 26 unchanged lines hidden (view full) ---

66#include <x86/iommu/busdma_dmar.h>
67#include <x86/iommu/intel_dmar.h>
68#include <dev/pci/pcivar.h>
69
70#ifdef DEV_APIC
71#include "pcib_if.h"
72#endif
73
74#define DMAR_REG_RID 1
75#define DMAR_IRQ_RID 0
74#define DMAR_FAULT_IRQ_RID 0
75#define DMAR_QI_IRQ_RID 1
76#define DMAR_REG_RID 2
76
77static devclass_t dmar_devclass;
78static device_t *dmar_devs;
79static int dmar_devcnt;
80
81typedef int (*dmar_iter_t)(ACPI_DMAR_HEADER *, void *);
82
83static void

--- 128 unchanged lines hidden (view full) ---

212
213static int
214dmar_probe(device_t dev)
215{
216
217 if (acpi_get_handle(dev) != NULL)
218 return (ENXIO);
219 device_set_desc(dev, "DMA remap");
77
78static devclass_t dmar_devclass;
79static device_t *dmar_devs;
80static int dmar_devcnt;
81
82typedef int (*dmar_iter_t)(ACPI_DMAR_HEADER *, void *);
83
84static void

--- 128 unchanged lines hidden (view full) ---

213
214static int
215dmar_probe(device_t dev)
216{
217
218 if (acpi_get_handle(dev) != NULL)
219 return (ENXIO);
220 device_set_desc(dev, "DMA remap");
220 return (0);
221 return (BUS_PROBE_NOWILDCARD);
221}
222
223static void
222}
223
224static void
225dmar_release_intr(device_t dev, struct dmar_unit *unit, int idx)
226{
227 struct dmar_msi_data *dmd;
228
229 dmd = &unit->intrs[idx];
230 if (dmd->irq == -1)
231 return;
232 bus_teardown_intr(dev, dmd->irq_res, dmd->intr_handle);
233 bus_release_resource(dev, SYS_RES_IRQ, dmd->irq_rid, dmd->irq_res);
234 bus_delete_resource(dev, SYS_RES_IRQ, dmd->irq_rid);
235 PCIB_RELEASE_MSIX(device_get_parent(device_get_parent(dev)),
236 dev, dmd->irq);
237 dmd->irq = -1;
238}
239
240static void
224dmar_release_resources(device_t dev, struct dmar_unit *unit)
225{
241dmar_release_resources(device_t dev, struct dmar_unit *unit)
242{
243 int i;
226
227 dmar_fini_busdma(unit);
244
245 dmar_fini_busdma(unit);
246 dmar_fini_qi(unit);
228 dmar_fini_fault_log(unit);
247 dmar_fini_fault_log(unit);
229 if (unit->irq != -1) {
230 bus_teardown_intr(dev, unit->irq_res, unit->intr_handle);
231 bus_release_resource(dev, SYS_RES_IRQ, unit->irq_rid,
232 unit->irq_res);
233 bus_delete_resource(dev, SYS_RES_IRQ, unit->irq_rid);
234 PCIB_RELEASE_MSIX(device_get_parent(device_get_parent(dev)),
235 dev, unit->irq);
236 unit->irq = -1;
237 }
248 for (i = 0; i < DMAR_INTR_TOTAL; i++)
249 dmar_release_intr(dev, unit, i);
238 if (unit->regs != NULL) {
239 bus_deactivate_resource(dev, SYS_RES_MEMORY, unit->reg_rid,
240 unit->regs);
241 bus_release_resource(dev, SYS_RES_MEMORY, unit->reg_rid,
242 unit->regs);
243 unit->regs = NULL;
244 }
245 if (unit->domids != NULL) {
246 delete_unrhdr(unit->domids);
247 unit->domids = NULL;
248 }
249 if (unit->ctx_obj != NULL) {
250 vm_object_deallocate(unit->ctx_obj);
251 unit->ctx_obj = NULL;
252 }
253}
254
255static int
250 if (unit->regs != NULL) {
251 bus_deactivate_resource(dev, SYS_RES_MEMORY, unit->reg_rid,
252 unit->regs);
253 bus_release_resource(dev, SYS_RES_MEMORY, unit->reg_rid,
254 unit->regs);
255 unit->regs = NULL;
256 }
257 if (unit->domids != NULL) {
258 delete_unrhdr(unit->domids);
259 unit->domids = NULL;
260 }
261 if (unit->ctx_obj != NULL) {
262 vm_object_deallocate(unit->ctx_obj);
263 unit->ctx_obj = NULL;
264 }
265}
266
267static int
256dmar_alloc_irq(device_t dev, struct dmar_unit *unit)
268dmar_alloc_irq(device_t dev, struct dmar_unit *unit, int idx)
257{
258 device_t pcib;
269{
270 device_t pcib;
271 struct dmar_msi_data *dmd;
259 uint64_t msi_addr;
260 uint32_t msi_data;
261 int error;
262
272 uint64_t msi_addr;
273 uint32_t msi_data;
274 int error;
275
276 dmd = &unit->intrs[idx];
263 pcib = device_get_parent(device_get_parent(dev)); /* Really not pcib */
277 pcib = device_get_parent(device_get_parent(dev)); /* Really not pcib */
264 error = PCIB_ALLOC_MSIX(pcib, dev, &unit->irq);
278 error = PCIB_ALLOC_MSIX(pcib, dev, &dmd->irq);
265 if (error != 0) {
279 if (error != 0) {
266 device_printf(dev, "cannot allocate fault interrupt, %d\n",
267 error);
280 device_printf(dev, "cannot allocate %s interrupt, %d\n",
281 dmd->name, error);
268 goto err1;
269 }
282 goto err1;
283 }
270 unit->irq_rid = DMAR_IRQ_RID;
271 error = bus_set_resource(dev, SYS_RES_IRQ, unit->irq_rid, unit->irq,
272 1);
284 error = bus_set_resource(dev, SYS_RES_IRQ, dmd->irq_rid,
285 dmd->irq, 1);
273 if (error != 0) {
286 if (error != 0) {
274 device_printf(dev, "cannot set interrupt resource, %d\n",
275 error);
287 device_printf(dev, "cannot set %s interrupt resource, %d\n",
288 dmd->name, error);
276 goto err2;
277 }
289 goto err2;
290 }
278 unit->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
279 &unit->irq_rid, RF_ACTIVE);
280 if (unit->irq_res == NULL) {
281 device_printf(dev, "cannot map fault interrupt\n");
291 dmd->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
292 &dmd->irq_rid, RF_ACTIVE);
293 if (dmd->irq_res == NULL) {
294 device_printf(dev,
295 "cannot allocate resource for %s interrupt\n", dmd->name);
282 error = ENXIO;
283 goto err3;
284 }
296 error = ENXIO;
297 goto err3;
298 }
285 error = bus_setup_intr(dev, unit->irq_res, INTR_TYPE_MISC,
286 dmar_intr, NULL, unit, &unit->intr_handle);
299 error = bus_setup_intr(dev, dmd->irq_res, INTR_TYPE_MISC,
300 dmd->handler, NULL, unit, &dmd->intr_handle);
287 if (error != 0) {
301 if (error != 0) {
288 device_printf(dev, "cannot setup fault interrupt, %d\n", error);
302 device_printf(dev, "cannot setup %s interrupt, %d\n",
303 dmd->name, error);
289 goto err4;
290 }
304 goto err4;
305 }
291 bus_describe_intr(dev, unit->irq_res, unit->intr_handle, "fault");
292 error = PCIB_MAP_MSI(pcib, dev, unit->irq, &msi_addr, &msi_data);
306 bus_describe_intr(dev, dmd->irq_res, dmd->intr_handle, dmd->name);
307 error = PCIB_MAP_MSI(pcib, dev, dmd->irq, &msi_addr, &msi_data);
293 if (error != 0) {
308 if (error != 0) {
294 device_printf(dev, "cannot map interrupt, %d\n", error);
309 device_printf(dev, "cannot map %s interrupt, %d\n",
310 dmd->name, error);
295 goto err5;
296 }
311 goto err5;
312 }
297 dmar_write4(unit, DMAR_FEDATA_REG, msi_data);
298 dmar_write4(unit, DMAR_FEADDR_REG, msi_addr);
313 dmar_write4(unit, dmd->msi_data_reg, msi_data);
314 dmar_write4(unit, dmd->msi_addr_reg, msi_addr);
299 /* Only for xAPIC mode */
315 /* Only for xAPIC mode */
300 dmar_write4(unit, DMAR_FEUADDR_REG, msi_addr >> 32);
316 dmar_write4(unit, dmd->msi_uaddr_reg, msi_addr >> 32);
301 return (0);
302
303err5:
317 return (0);
318
319err5:
304 bus_teardown_intr(dev, unit->irq_res, unit->intr_handle);
320 bus_teardown_intr(dev, dmd->irq_res, dmd->intr_handle);
305err4:
321err4:
306 bus_release_resource(dev, SYS_RES_IRQ, unit->irq_rid, unit->irq_res);
322 bus_release_resource(dev, SYS_RES_IRQ, dmd->irq_rid, dmd->irq_res);
307err3:
323err3:
308 bus_delete_resource(dev, SYS_RES_IRQ, unit->irq_rid);
324 bus_delete_resource(dev, SYS_RES_IRQ, dmd->irq_rid);
309err2:
325err2:
310 PCIB_RELEASE_MSIX(pcib, dev, unit->irq);
311 unit->irq = -1;
326 PCIB_RELEASE_MSIX(pcib, dev, dmd->irq);
327 dmd->irq = -1;
312err1:
313 return (error);
314}
315
316#ifdef DEV_APIC
317static int
318dmar_remap_intr(device_t dev, device_t child, u_int irq)
319{
320 struct dmar_unit *unit;
328err1:
329 return (error);
330}
331
332#ifdef DEV_APIC
333static int
334dmar_remap_intr(device_t dev, device_t child, u_int irq)
335{
336 struct dmar_unit *unit;
337 struct dmar_msi_data *dmd;
321 uint64_t msi_addr;
322 uint32_t msi_data;
338 uint64_t msi_addr;
339 uint32_t msi_data;
323 int error;
340 int i, error;
324
325 unit = device_get_softc(dev);
341
342 unit = device_get_softc(dev);
326 if (irq != unit->irq)
327 return (ENOENT);
328 error = PCIB_MAP_MSI(device_get_parent(device_get_parent(dev)), dev,
329 irq, &msi_addr, &msi_data);
330 if (error != 0)
331 return (error);
332 dmar_disable_intr(unit);
333 dmar_write4(unit, DMAR_FEDATA_REG, msi_data);
334 dmar_write4(unit, DMAR_FEADDR_REG, msi_addr);
335 dmar_write4(unit, DMAR_FEUADDR_REG, msi_addr >> 32);
336 dmar_enable_intr(unit);
337 return (0);
343 for (i = 0; i < DMAR_INTR_TOTAL; i++) {
344 dmd = &unit->intrs[i];
345 if (irq == dmd->irq) {
346 error = PCIB_MAP_MSI(device_get_parent(
347 device_get_parent(dev)),
348 dev, irq, &msi_addr, &msi_data);
349 if (error != 0)
350 return (error);
351 DMAR_LOCK(unit);
352 (dmd->disable_intr)(unit);
353 dmar_write4(unit, dmd->msi_data_reg, msi_data);
354 dmar_write4(unit, dmd->msi_addr_reg, msi_addr);
355 dmar_write4(unit, dmd->msi_uaddr_reg, msi_addr >> 32);
356 (dmd->enable_intr)(unit);
357 DMAR_UNLOCK(unit);
358 return (0);
359 }
360 }
361 return (ENOENT);
338}
339#endif
340
341static void
342dmar_print_caps(device_t dev, struct dmar_unit *unit,
343 ACPI_DMAR_HARDWARE_UNIT *dmaru)
344{
345 uint32_t caphi, ecaphi;

--- 21 unchanged lines hidden (view full) ---

367 DMAR_ECAP_IRO(unit->hw_ecap));
368}
369
370static int
371dmar_attach(device_t dev)
372{
373 struct dmar_unit *unit;
374 ACPI_DMAR_HARDWARE_UNIT *dmaru;
362}
363#endif
364
365static void
366dmar_print_caps(device_t dev, struct dmar_unit *unit,
367 ACPI_DMAR_HARDWARE_UNIT *dmaru)
368{
369 uint32_t caphi, ecaphi;

--- 21 unchanged lines hidden (view full) ---

391 DMAR_ECAP_IRO(unit->hw_ecap));
392}
393
394static int
395dmar_attach(device_t dev)
396{
397 struct dmar_unit *unit;
398 ACPI_DMAR_HARDWARE_UNIT *dmaru;
375 int error;
399 int i, error;
376
377 unit = device_get_softc(dev);
378 unit->dev = dev;
379 unit->unit = device_get_unit(dev);
380 dmaru = dmar_find_by_index(unit->unit);
381 if (dmaru == NULL)
382 return (EINVAL);
400
401 unit = device_get_softc(dev);
402 unit->dev = dev;
403 unit->unit = device_get_unit(dev);
404 dmaru = dmar_find_by_index(unit->unit);
405 if (dmaru == NULL)
406 return (EINVAL);
383 unit->irq = -1;
384 unit->segment = dmaru->Segment;
385 unit->base = dmaru->Address;
386 unit->reg_rid = DMAR_REG_RID;
387 unit->regs = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
388 &unit->reg_rid, RF_ACTIVE);
389 if (unit->regs == NULL) {
390 device_printf(dev, "cannot allocate register window\n");
391 return (ENOMEM);
392 }
393 unit->hw_ver = dmar_read4(unit, DMAR_VER_REG);
394 unit->hw_cap = dmar_read8(unit, DMAR_CAP_REG);
395 unit->hw_ecap = dmar_read8(unit, DMAR_ECAP_REG);
396 if (bootverbose)
397 dmar_print_caps(dev, unit, dmaru);
398 dmar_quirks_post_ident(unit);
399
407 unit->segment = dmaru->Segment;
408 unit->base = dmaru->Address;
409 unit->reg_rid = DMAR_REG_RID;
410 unit->regs = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
411 &unit->reg_rid, RF_ACTIVE);
412 if (unit->regs == NULL) {
413 device_printf(dev, "cannot allocate register window\n");
414 return (ENOMEM);
415 }
416 unit->hw_ver = dmar_read4(unit, DMAR_VER_REG);
417 unit->hw_cap = dmar_read8(unit, DMAR_CAP_REG);
418 unit->hw_ecap = dmar_read8(unit, DMAR_ECAP_REG);
419 if (bootverbose)
420 dmar_print_caps(dev, unit, dmaru);
421 dmar_quirks_post_ident(unit);
422
400 error = dmar_alloc_irq(dev, unit);
423 for (i = 0; i < DMAR_INTR_TOTAL; i++)
424 unit->intrs[i].irq = -1;
425
426 unit->intrs[DMAR_INTR_FAULT].name = "fault";
427 unit->intrs[DMAR_INTR_FAULT].irq_rid = DMAR_FAULT_IRQ_RID;
428 unit->intrs[DMAR_INTR_FAULT].handler = dmar_fault_intr;
429 unit->intrs[DMAR_INTR_FAULT].msi_data_reg = DMAR_FEDATA_REG;
430 unit->intrs[DMAR_INTR_FAULT].msi_addr_reg = DMAR_FEADDR_REG;
431 unit->intrs[DMAR_INTR_FAULT].msi_uaddr_reg = DMAR_FEUADDR_REG;
432 unit->intrs[DMAR_INTR_FAULT].enable_intr = dmar_enable_fault_intr;
433 unit->intrs[DMAR_INTR_FAULT].disable_intr = dmar_disable_fault_intr;
434 error = dmar_alloc_irq(dev, unit, DMAR_INTR_FAULT);
401 if (error != 0) {
402 dmar_release_resources(dev, unit);
403 return (error);
404 }
435 if (error != 0) {
436 dmar_release_resources(dev, unit);
437 return (error);
438 }
439 if (DMAR_HAS_QI(unit)) {
440 unit->intrs[DMAR_INTR_QI].name = "qi";
441 unit->intrs[DMAR_INTR_QI].irq_rid = DMAR_QI_IRQ_RID;
442 unit->intrs[DMAR_INTR_QI].handler = dmar_qi_intr;
443 unit->intrs[DMAR_INTR_QI].msi_data_reg = DMAR_IEDATA_REG;
444 unit->intrs[DMAR_INTR_QI].msi_addr_reg = DMAR_IEADDR_REG;
445 unit->intrs[DMAR_INTR_QI].msi_uaddr_reg = DMAR_IEUADDR_REG;
446 unit->intrs[DMAR_INTR_QI].enable_intr = dmar_enable_qi_intr;
447 unit->intrs[DMAR_INTR_QI].disable_intr = dmar_disable_qi_intr;
448 error = dmar_alloc_irq(dev, unit, DMAR_INTR_QI);
449 if (error != 0) {
450 dmar_release_resources(dev, unit);
451 return (error);
452 }
453 }
454
405 mtx_init(&unit->lock, "dmarhw", NULL, MTX_DEF);
406 unit->domids = new_unrhdr(0, dmar_nd2mask(DMAR_CAP_ND(unit->hw_cap)),
407 &unit->lock);
408
409 /*
410 * 9.2 "Context Entry":
411 * When Caching Mode (CM) field is reported as Set, the
412 * domain-id value of zero is architecturally reserved.

--- 35 unchanged lines hidden (view full) ---

448 }
449
450 DMAR_UNLOCK(unit);
451 error = dmar_init_fault_log(unit);
452 if (error != 0) {
453 dmar_release_resources(dev, unit);
454 return (error);
455 }
455 mtx_init(&unit->lock, "dmarhw", NULL, MTX_DEF);
456 unit->domids = new_unrhdr(0, dmar_nd2mask(DMAR_CAP_ND(unit->hw_cap)),
457 &unit->lock);
458
459 /*
460 * 9.2 "Context Entry":
461 * When Caching Mode (CM) field is reported as Set, the
462 * domain-id value of zero is architecturally reserved.

--- 35 unchanged lines hidden (view full) ---

498 }
499
500 DMAR_UNLOCK(unit);
501 error = dmar_init_fault_log(unit);
502 if (error != 0) {
503 dmar_release_resources(dev, unit);
504 return (error);
505 }
506 error = dmar_init_qi(unit);
507 if (error != 0) {
508 dmar_release_resources(dev, unit);
509 return (error);
510 }
456 error = dmar_init_busdma(unit);
457 if (error != 0) {
458 dmar_release_resources(dev, unit);
459 return (error);
460 }
461
462#ifdef NOTYET
463 DMAR_LOCK(unit);

--- 376 unchanged lines hidden (view full) ---

840 if (resmem->Segment != iria->dmar->segment)
841 return (1);
842 if (dmar_match_verbose) {
843 printf("dmar%d: RMRR [%jx,%jx]\n", iria->dmar->unit,
844 (uintmax_t)resmem->BaseAddress,
845 (uintmax_t)resmem->EndAddress);
846 }
847
511 error = dmar_init_busdma(unit);
512 if (error != 0) {
513 dmar_release_resources(dev, unit);
514 return (error);
515 }
516
517#ifdef NOTYET
518 DMAR_LOCK(unit);

--- 376 unchanged lines hidden (view full) ---

895 if (resmem->Segment != iria->dmar->segment)
896 return (1);
897 if (dmar_match_verbose) {
898 printf("dmar%d: RMRR [%jx,%jx]\n", iria->dmar->unit,
899 (uintmax_t)resmem->BaseAddress,
900 (uintmax_t)resmem->EndAddress);
901 }
902
848 ptr = (char *)resmem + sizeof(*resmem);
849 ptrend = (char *)resmem + resmem->Header.Length;
903 ptr = (const char *)resmem + sizeof(*resmem);
904 ptrend = (const char *)resmem + resmem->Header.Length;
850 for (;;) {
851 if (ptr >= ptrend)
852 break;
905 for (;;) {
906 if (ptr >= ptrend)
907 break;
853 devscope = (ACPI_DMAR_DEVICE_SCOPE *)ptr;
908 devscope = (const ACPI_DMAR_DEVICE_SCOPE *)ptr;
854 ptr += devscope->Length;
855 /* XXXKIB bridge */
856 if (devscope->EntryType != ACPI_DMAR_SCOPE_TYPE_ENDPOINT)
857 continue;
858 if (dmar_match_verbose) {
859 dmar_print_path(iria->dmar->dev, "RMRR scope",
860 devscope->Bus, (devscope->Length -
861 sizeof(ACPI_DMAR_DEVICE_SCOPE)) / 2,
909 ptr += devscope->Length;
910 /* XXXKIB bridge */
911 if (devscope->EntryType != ACPI_DMAR_SCOPE_TYPE_ENDPOINT)
912 continue;
913 if (dmar_match_verbose) {
914 dmar_print_path(iria->dmar->dev, "RMRR scope",
915 devscope->Bus, (devscope->Length -
916 sizeof(ACPI_DMAR_DEVICE_SCOPE)) / 2,
862 (ACPI_DMAR_PCI_PATH *)(devscope + 1));
917 (const ACPI_DMAR_PCI_PATH *)(devscope + 1));
863 }
864 dev = dmar_path_dev(resmem->Segment, (devscope->Length -
865 sizeof(ACPI_DMAR_DEVICE_SCOPE)) / 2, devscope->Bus,
918 }
919 dev = dmar_path_dev(resmem->Segment, (devscope->Length -
920 sizeof(ACPI_DMAR_DEVICE_SCOPE)) / 2, devscope->Bus,
866 (ACPI_DMAR_PCI_PATH *)(devscope + 1));
921 (const ACPI_DMAR_PCI_PATH *)(devscope + 1));
867 if (dev == NULL) {
868 if (dmar_match_verbose)
869 printf("null dev\n");
870 continue;
871 }
872 dev_dmar = dmar_find(dev);
873 if (dev_dmar != iria->dmar) {
874 if (dmar_match_verbose) {

--- 114 unchanged lines hidden (view full) ---

989 if (t != tIDENT) {
990 db_printf("Bad modifier\n");
991 db_radix = radix;
992 db_skip_to_eol();
993 return;
994 }
995 show_mappings = strchr(db_tok_string, 'm') != NULL;
996 t = db_read_token();
922 if (dev == NULL) {
923 if (dmar_match_verbose)
924 printf("null dev\n");
925 continue;
926 }
927 dev_dmar = dmar_find(dev);
928 if (dev_dmar != iria->dmar) {
929 if (dmar_match_verbose) {

--- 114 unchanged lines hidden (view full) ---

1044 if (t != tIDENT) {
1045 db_printf("Bad modifier\n");
1046 db_radix = radix;
1047 db_skip_to_eol();
1048 return;
1049 }
1050 show_mappings = strchr(db_tok_string, 'm') != NULL;
1051 t = db_read_token();
1052 } else {
1053 show_mappings = false;
997 }
998 if (t == tNUMBER) {
999 domain = db_tok_number;
1000 t = db_read_token();
1001 if (t == tNUMBER) {
1002 bus = db_tok_number;
1003 t = db_read_token();
1004 if (t == tNUMBER) {

--- 48 unchanged lines hidden (view full) ---

1053 dmar_read4(unit, DMAR_FEUADDR_REG));
1054 db_printf("primary fault log:\n");
1055 for (i = 0; i < DMAR_CAP_NFR(unit->hw_cap); i++) {
1056 frir = (DMAR_CAP_FRO(unit->hw_cap) + i) * 16;
1057 db_printf(" %d at 0x%x: %jx %jx\n", i, frir,
1058 (uintmax_t)dmar_read8(unit, frir),
1059 (uintmax_t)dmar_read8(unit, frir + 8));
1060 }
1054 }
1055 if (t == tNUMBER) {
1056 domain = db_tok_number;
1057 t = db_read_token();
1058 if (t == tNUMBER) {
1059 bus = db_tok_number;
1060 t = db_read_token();
1061 if (t == tNUMBER) {

--- 48 unchanged lines hidden (view full) ---

1110 dmar_read4(unit, DMAR_FEUADDR_REG));
1111 db_printf("primary fault log:\n");
1112 for (i = 0; i < DMAR_CAP_NFR(unit->hw_cap); i++) {
1113 frir = (DMAR_CAP_FRO(unit->hw_cap) + i) * 16;
1114 db_printf(" %d at 0x%x: %jx %jx\n", i, frir,
1115 (uintmax_t)dmar_read8(unit, frir),
1116 (uintmax_t)dmar_read8(unit, frir + 8));
1117 }
1118 if (DMAR_HAS_QI(unit)) {
1119 db_printf("ied 0x%x iea 0x%x ieua 0x%x\n",
1120 dmar_read4(unit, DMAR_IEDATA_REG),
1121 dmar_read4(unit, DMAR_IEADDR_REG),
1122 dmar_read4(unit, DMAR_IEUADDR_REG));
1123 if (unit->qi_enabled) {
1124 db_printf("qi is enabled: queue @0x%jx (IQA 0x%jx) "
1125 "size 0x%jx\n"
1126 " head 0x%x tail 0x%x avail 0x%x status 0x%x ctrl 0x%x\n"
1127 " hw compl 0x%x@%p/phys@%jx next seq 0x%x gen 0x%x\n",
1128 (uintmax_t)unit->inv_queue,
1129 (uintmax_t)dmar_read8(unit, DMAR_IQA_REG),
1130 (uintmax_t)unit->inv_queue_size,
1131 dmar_read4(unit, DMAR_IQH_REG),
1132 dmar_read4(unit, DMAR_IQT_REG),
1133 unit->inv_queue_avail,
1134 dmar_read4(unit, DMAR_ICS_REG),
1135 dmar_read4(unit, DMAR_IECTL_REG),
1136 unit->inv_waitd_seq_hw,
1137 &unit->inv_waitd_seq_hw,
1138 (uintmax_t)unit->inv_waitd_seq_hw_phys,
1139 unit->inv_waitd_seq,
1140 unit->inv_waitd_gen);
1141 } else {
1142 db_printf("qi is disabled\n");
1143 }
1144 }
1061 if (show_ctxs) {
1062 db_printf("contexts:\n");
1063 LIST_FOREACH(ctx, &unit->contexts, link) {
1064 dmar_print_ctx(ctx, show_mappings);
1065 if (db_pager_quit)
1066 break;
1067 }
1068 }

--- 30 unchanged lines hidden ---
1145 if (show_ctxs) {
1146 db_printf("contexts:\n");
1147 LIST_FOREACH(ctx, &unit->contexts, link) {
1148 dmar_print_ctx(ctx, show_mappings);
1149 if (db_pager_quit)
1150 break;
1151 }
1152 }

--- 30 unchanged lines hidden ---