| 517 | } |
| 518 | |
| 519 | int |
| 520 | dmar_load_irt_ptr(struct dmar_unit *unit) |
| 521 | { |
| 522 | uint64_t irta, s; |
| 523 | int error; |
| 524 | |
| 525 | DMAR_ASSERT_LOCKED(unit); |
| 526 | irta = unit->irt_phys; |
| 527 | if (DMAR_X2APIC(unit)) |
| 528 | irta |= DMAR_IRTA_EIME; |
| 529 | s = fls(unit->irte_cnt) - 2; |
| 530 | KASSERT(unit->irte_cnt >= 2 && s <= DMAR_IRTA_S_MASK && |
| 531 | powerof2(unit->irte_cnt), |
| 532 | ("IRTA_REG_S overflow %x", unit->irte_cnt)); |
| 533 | irta |= s; |
| 534 | dmar_write8(unit, DMAR_IRTA_REG, irta); |
| 535 | dmar_write4(unit, DMAR_GCMD_REG, unit->hw_gcmd | DMAR_GCMD_SIRTP); |
| 536 | DMAR_WAIT_UNTIL(((dmar_read4(unit, DMAR_GSTS_REG) & DMAR_GSTS_IRTPS) |
| 537 | != 0)); |
| 538 | return (error); |
| 539 | } |
| 540 | |
| 541 | int |
| 542 | dmar_enable_ir(struct dmar_unit *unit) |
no test coverage detected