| # Bus Transaction Initiator | 
 |  | 
 | ## NAME | 
 |  | 
 | bus_transaction_initiator - DMA configuration capability | 
 |  | 
 | ## SYNOPSIS | 
 |  | 
 | Bus Transaction Initiators (BTIs) represent the bus mastering/DMA capability | 
 | of a device, and can be used for granting a device access to memory. | 
 |  | 
 | ## DESCRIPTION | 
 |  | 
 | Device drivers are provided one BTI for each bus transaction ID each of its | 
 | devices can use.  A bus transaction ID in this context is a hardware transaction | 
 | identifier that may be used by an IOMMU (e.g. PCI addresses on Intel's IOMMU | 
 | and StreamIDs on ARM's SMMU). | 
 |  | 
 | A BTI can be used to pin memory used in a Virtual Memory Object (VMO). | 
 | If a caller pins memory from a VMO, they are given device-physical addresses | 
 | that can be used to issue memory transactions to the VMO (provided the | 
 | transaction has the correct bus transaction ID).  If transactions affecting | 
 | these addresses are issued with a different transaction ID, the transaction | 
 | may fail and the issuing device may need a reset in order to continue functioning. | 
 |  | 
 | A BTI manages a list of quarantined PMTs.  If a PMT was created from a BTI using | 
 | [`zx_bti_pin()`], and the PMT's handle is released without [`zx_pmt_unpin()`] being | 
 | called, the PMT will be quarantined.  Quarantined PMTs will prevent their | 
 | underlying physical memory from being released to the system for reuse, in order | 
 | to prevent DMA to memory that has since been reallocated.  The quarantine may be | 
 | cleared by invoking [`zx_bti_release_quarantine()`]. | 
 |  | 
 | TODO(teisenbe): Add details about failed transaction notification. | 
 |  | 
 | ## SEE ALSO | 
 |  | 
 |  - [pmt](pinned_memory_token.md) - Pinned Memory Tokens | 
 |  - [vm_object](vm_object.md) - Virtual Memory Objects | 
 |  | 
 | ## SYSCALLS | 
 |  | 
 |  - [`zx_bti_create()`] - create a new bus transaction initiator | 
 |  - [`zx_bti_pin()`] - pin memory and grant access to it to the BTI | 
 |  - [`zx_bti_release_quarantine()`] - release quarantined PMTs | 
 |  - [`zx_pmt_unpin()`] - revoke access and unpin memory | 
 |  | 
 | [`zx_bti_create()`]: /docs/reference/syscalls/bti_create.md | 
 |  | 
 | [`zx_bti_pin()`]: /docs/reference/syscalls/bti_pin.md | 
 | [`zx_bti_release_quarantine()`]: /docs/reference/syscalls/bti_release_quarantine.md | 
 | [`zx_pmt_unpin()`]: /docs/reference/syscalls/pmt_unpin.md | 
 |  |