blob: 30641bee37285f0c062caf27ac04924b1a15ef37 [file] [view]
<!--
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