| <!-- |
| Copyright 2023 The Fuchsia Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| |
| DO NOT EDIT. Generated from FIDL library zx by zither, a Fuchsia platform tool. |
| |
| See //docs/reference/syscalls/README.md#documentation-generation for |
| regeneration instructions. |
| --> |
| |
| # zx_iommu_create |
| |
| ## Summary |
| |
| Create a new IOMMU object in the kernel. |
| |
| ## Declaration |
| |
| ```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_STUB` |
| |
| 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_stub_t`. |
| *desc_size* must be `sizeof(zx_iommu_desc_stub_t)`. |
| |
| ## Rights |
| |
| *resource* must have resource kind `ZX_RSRC_KIND_SYSTEM` and resource base |
| `ZX_RSRC_SYSTEM_IOMMU_BASE`. |
| |
| ## 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()`] |
| |
| [`zx_bti_create()`]: bti_create.md |
| [`zx_bti_pin()`]: bti_pin.md |
| [`zx_pmt_unpin()`]: pmt_unpin.md |