blob: e631f3854c6cc4c77b11da3846815849b1531bd1 [file] [log] [blame] [view]
# zx_interrupt_create
## NAME
<!-- Updated by update-docs-from-fidl, do not edit. -->
Create an interrupt object.
## SYNOPSIS
<!-- Updated by update-docs-from-fidl, do not edit. -->
```c
#include <zircon/syscalls.h>
zx_status_t zx_interrupt_create(zx_handle_t src_obj,
uint32_t src_num,
uint32_t options,
zx_handle_t* out_handle);
```
## DESCRIPTION
`zx_interrupt_create()` creates an interrupt object that represents a physical
or virtual interrupt.
If *options* is **ZX_INTERRUPT_VIRTUAL**, *src_obj* and *src_num* are ignored and
a virtual interrupt is returned.
Otherwise *src_obj* must be a suitable resource for creating platform interrupts
or a PCI object, and *src_num* is the associated interrupt number. This restricts
the creation of interrupts to the internals of the DDK (driver development kit).
Physical interrupts are obtained by drivers through various DDK APIs.
Physical interrupts honor the options **ZX_INTERRUPT_EDGE_LOW**, **ZX_INTERRUPT_EDGE_HIGH**,
**ZX_INTERRUPT_LEVEL_LOW**, **ZX_INTERRUPT_LEVEL_HIGH**, and **ZX_INTERRUPT_REMAP_IRQ**.
The handles will have **ZX_RIGHT_INSPECT**, **ZX_RIGHT_DUPLICATE**, **ZX_RIGHT_TRANSFER**
(allowing them to be sent to another process via [`zx_channel_write()`]), **ZX_RIGHT_READ**,
**ZX_RIGHT_WRITE** (required for [`zx_interrupt_ack()`]), **ZX_RIGHT_WAIT** (required for
[`zx_interrupt_wait()`], and **ZX_RIGHT_SIGNAL** (required for [`zx_interrupt_trigger()`]).
Interrupts are said to be "triggered" when the underlying physical interrupt occurs
or when [`zx_interrupt_trigger()`] is called on a virtual interrupt. A triggered interrupt,
when bound to a port with [`zx_interrupt_bind()`], causes a packet to be delivered to the port.
If not bound to a port, an interrupt object may be waited on with [`zx_interrupt_wait()`].
Interrupts cannot be waited on with the `zx_object_wait_` family of calls.
## RIGHTS
<!-- Updated by update-docs-from-fidl, do not edit. -->
*src_obj* must have resource kind **ZX_RSRC_KIND_IRQ**.
## RETURN VALUE
`zx_interrupt_create()` returns **ZX_OK** on success. In the event
of failure, a negative error value is returned.
## ERRORS
**ZX_ERR_BAD_HANDLE** the *src_obj* handle is invalid (if this is not a virtual interrupt)
**ZX_ERR_WRONG_TYPE** the *src_obj* handle is not of an appropriate type to create an interrupt.
**ZX_ERR_ACCESS_DENIED** the *src_obj* handle does not allow this operation.
**ZX_ERR_INVALID_ARGS** *options* contains invalid flags or the *out_handle*
parameter is an invalid pointer.
**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_handle_close()`]
- [`zx_interrupt_ack()`]
- [`zx_interrupt_bind()`]
- [`zx_interrupt_destroy()`]
- [`zx_interrupt_wait()`]
- [`zx_port_wait()`]
<!-- References updated by update-docs-from-fidl, do not edit. -->
[`zx_channel_write()`]: channel_write.md
[`zx_handle_close()`]: handle_close.md
[`zx_interrupt_ack()`]: interrupt_ack.md
[`zx_interrupt_bind()`]: interrupt_bind.md
[`zx_interrupt_destroy()`]: interrupt_destroy.md
[`zx_interrupt_trigger()`]: interrupt_trigger.md
[`zx_interrupt_wait()`]: interrupt_wait.md
[`zx_port_wait()`]: port_wait.md