| # zx_iommu_create | 
 |  | 
 | ## NAME | 
 |  | 
 | <!-- Updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | Create a new IOMMU object in the kernel. | 
 |  | 
 | ## SYNOPSIS | 
 |  | 
 | <!-- Updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | ```c | 
 | #include <zircon/syscalls.h> | 
 |  | 
 | zx_status_t zx_iommu_create(zx_handle_t resource, | 
 |                             uint32_t type, | 
 |                             const void* desc, | 
 |                             size_t desc_size, | 
 |                             zx_handle_t* out); | 
 | ``` | 
 |  | 
 | ## DESCRIPTION | 
 |  | 
 | `zx_iommu_create()` creates a new object in the kernel representing an IOMMU device. | 
 |  | 
 | The value of *type* determines the interpretation of *desc*.  See below for | 
 | details about the values of *type*. | 
 |  | 
 | Upon success, a handle for the new IOMMU is returned.  This handle will have rights | 
 | **ZX_RIGHT_DUPLICATE** and **ZX_RIGHT_TRANSFER**. | 
 |  | 
 | ### *type* = **ZX_IOMMU_TYPE_DUMMY** | 
 |  | 
 | This type represents a no-op IOMMU.  It provides no hardware-level protections | 
 | against unauthorized access to memory.  It does allow pinning of physical memory | 
 | pages, to prevent the reuse of a page until the driver using the page says it is | 
 | done with it. | 
 |  | 
 | *desc* must be a valid pointer to a value of type `zx_iommu_desc_dummy_t`. | 
 | *desc_size* must be `sizeof(zx_iommu_desc_dummy_t)`. | 
 |  | 
 | ## RIGHTS | 
 |  | 
 | <!-- Updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | *resource* must have resource kind **ZX_RSRC_KIND_ROOT**. | 
 |  | 
 | ## RETURN VALUE | 
 |  | 
 | `zx_iommu_create()` returns **ZX_OK** and a handle to the new IOMMU | 
 | (via *out*) on success.  In the event of failure, a negative error value | 
 | is returned. | 
 |  | 
 | ## ERRORS | 
 |  | 
 | **ZX_ERR_BAD_HANDLE**  *resource* is not a valid handle. | 
 |  | 
 | **ZX_ERR_WRONG_TYPE**  *resource* is not a resource handle. | 
 |  | 
 | **ZX_ERR_ACCESS_DENIED**  *resource* handle does not have sufficient privileges. | 
 |  | 
 | **ZX_ERR_NOT_SUPPORTED** *type* is not a defined value or is not | 
 | supported on this system. | 
 |  | 
 | **ZX_ERR_INVALID_ARGS**  *desc_size* is larger than **ZX_IOMMU_MAX_DESC_LEN**, | 
 | *desc* is an invalid pointer, *out* is an invalid pointer, or the contents of | 
 | *desc* are not valid for the given *type*. | 
 |  | 
 | **ZX_ERR_NO_MEMORY**  Failure due to lack of memory. | 
 | There is no good way for userspace to handle this (unlikely) error. | 
 | In a future build this error will no longer occur. | 
 |  | 
 | ## SEE ALSO | 
 |  | 
 |  - [`zx_bti_create()`] | 
 |  - [`zx_bti_pin()`] | 
 |  - [`zx_pmt_unpin()`] | 
 |  | 
 | <!-- References updated by update-docs-from-fidl, do not edit. --> | 
 |  | 
 | [`zx_bti_create()`]: bti_create.md | 
 | [`zx_bti_pin()`]: bti_pin.md | 
 | [`zx_pmt_unpin()`]: pmt_unpin.md |