blob: efce1cc74611a557034bc17576804595a93b269d [file] [log] [blame]
// Copyright 2019 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.
library zx;
const IOMMU_MAX_DESC_LEN usize64 = 4096;
@transport("Syscall")
closed protocol Iommu {
/// ## 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_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
///
/// *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
strict Create(resource struct {
resource Handle:RESOURCE;
type uint32;
@voidptr
desc vector<byte>:IOMMU_MAX_DESC_LEN;
}) -> (resource struct {
out Handle:IOMMU;
}) error Status;
};