The NvSciIpc library provides interfaces for any two entities in a system to communicate with each other irrespective of where they are placed. Entities can be in:
Each of these different boundaries will be abstracted by a library providing unified communication (Read/Write) APIs to entities. The communication consists of two bi-directional send/receive queues.
Programming model in using NvSciIpc library is explained in SDK developer guide with examples.
Data Structures | |
struct | NvSciIpcEndpointInfo |
Defines information about the NvSciIpc endpoint. More... | |
Macros | |
#define | NVSCIIPC_MAX_ENDPOINT_NAME 64U |
Specifies maximum Endpoint name length including null terminator. More... | |
#define | NV_SCI_IPC_EVENT_READ 0x01U |
Specifies the IPC read event. More... | |
#define | NV_SCI_IPC_EVENT_WRITE 0x02U |
Specifies the IPC write event. More... | |
#define | NV_SCI_IPC_EVENT_CONN_EST 0x04U |
Specifies the IPC connection established event. More... | |
#define | NV_SCI_IPC_EVENT_CONN_RESET 0x08U |
Specifies the IPC connection reset event. More... | |
#define | NV_SCI_IPC_EVENT_WRITE_EMPTY 0x10U |
Specifies the IPC write fifo empty event. More... | |
#define | NV_SCI_IPC_EVENT_ASYNC_ERROR 0x20U |
Specifies the IPC asynchronous error event. More... | |
#define | NV_SCI_IPC_EVENT_CONN_EST_ALL |
Specifies single event mask to check IPC connection establishment. More... | |
#define | NVSCIIPC_INFINITE_WAIT -1LL |
infinite timeout for NvSciIpcWaitEventQnx() More... | |
#define | NV_SCI_ASYNC_PCIE_EDMA_XFER_ERROR 0x1U |
Indicates there is eDMA error during PCIE operation. More... | |
#define | NV_SCI_ASYNC_PCIE_AER_UNCORRECTABLE_FATAL 0x2U |
Indicates there is uncorrectable fatal error during PCIE operation. More... | |
#define | NV_SCI_ASYNC_PCIE_AER_UNCORRECTABLE_NONFATAL 0x4U |
Indicates there is uncorrectable non fatal error during PCIE operation. More... | |
#define | NV_SCI_ASYNC_PCIE_VALIDATION_ERROR 0x8U |
Indicates there is validation error. More... | |
Typedefs | |
typedef uint64_t | NvSciIpcEndpoint |
Handle to the NvSciIpc endpoint. More... | |
typedef struct NvSciIpcEndpointInfo | NvSciIpcEndpointInfo |
Functions | |
NvSciError | NvSciIpcInit (void) |
Initializes the NvSciIpc library. More... | |
void | NvSciIpcDeinit (void) |
De-initializes the NvSciIpc library. More... | |
NvSciError | NvSciIpcOpenEndpoint (const char *endpoint, NvSciIpcEndpoint *handle) |
Opens an endpoint with the given name. More... | |
NvSciError | NvSciIpcOpenEndpointWithEventService (const char *endpoint, NvSciIpcEndpoint *handle, NvSciEventService *eventService) |
Opens an endpoint with the given name and event service. More... | |
NvSciError | NvSciIpcGetEventNotifier (NvSciIpcEndpoint handle, NvSciEventNotifier **eventNotifier) |
Get NvSciIpc event notifier. More... | |
void | NvSciIpcCloseEndpoint (NvSciIpcEndpoint handle) |
Closes an endpoint with the given handle. More... | |
NvSciError | NvSciIpcCloseEndpointSafe (NvSciIpcEndpoint handle, bool clear) |
Closes an endpoint with the given handle (safety version) More... | |
void | NvSciIpcResetEndpoint (NvSciIpcEndpoint handle) |
Resets an endpoint. More... | |
NvSciError | NvSciIpcResetEndpointSafe (NvSciIpcEndpoint handle) |
Resets an endpoint. More... | |
NvSciError | NvSciIpcRead (NvSciIpcEndpoint handle, void *buf, size_t size, int32_t *bytes) |
Reads a frame from the endpoint. More... | |
NvSciError | NvSciIpcReadSafe (NvSciIpcEndpoint handle, void *buf, uint32_t size, uint32_t *bytes) |
Reads a frame from the endpoint (safety version) More... | |
NvSciError | NvSciIpcReadGetNextFrame (NvSciIpcEndpoint handle, const volatile void **buf) |
Get a pointer to the read frame from the endpoint. More... | |
NvSciError | NvSciIpcReadAdvance (NvSciIpcEndpoint handle) |
Advance to the next read frame of the endpoint. More... | |
NvSciError | NvSciIpcWrite (NvSciIpcEndpoint handle, const void *buf, size_t size, int32_t *bytes) |
Writes a frame to the endpoint. More... | |
NvSciError | NvSciIpcWriteSafe (NvSciIpcEndpoint handle, const void *buf, uint32_t size, uint32_t *bytes) |
Writes a frame to the endpoint. More... | |
NvSciError | NvSciIpcWriteGetNextFrame (NvSciIpcEndpoint handle, volatile void **buf) |
Get a pointer to the write frame from the endpoint. More... | |
NvSciError | NvSciIpcWriteAdvance (NvSciIpcEndpoint handle) |
Advance to the next write frame of the endpoint. More... | |
NvSciError | NvSciIpcGetEndpointInfo (NvSciIpcEndpoint handle, NvSciIpcEndpointInfo *info) |
Returns endpoint information. More... | |
NvSciError | NvSciIpcGetLinuxEventFd (NvSciIpcEndpoint handle, int32_t *fd) |
Returns the NvSciIpc file descriptor for a given endpoint. More... | |
NvSciError | NvSciIpcGetEvent (NvSciIpcEndpoint handle, uint32_t *events) |
Get Events. More... | |
NvSciError | NvSciIpcGetEventSafe (NvSciIpcEndpoint handle, uint32_t *events) |
Get Events (safety version) More... | |
NvSciError | NvSciIpcGetAsyncErrors (NvSciIpcEndpoint handle, uint32_t *errors) |
Get asynchronouse errors. More... | |
NvSciError | NvSciIpcEnableNotification (NvSciIpcEndpoint handle, bool flag) |
Enable event notification (or polling) More... | |
NvSciError | NvSciIpcCheckVersionCompatibility (uint32_t majorVer, uint32_t minorVer, bool *isCompatible) |
Check NvSciIpc library version compatibility. More... | |
Description of QNX custom abilites
1) NvSciIpcEndpoint:{List of VUIDs}
2) NvSciC2cPcieEndpoint:{List of SGIDs}
Common QNX privileges required for all NvSciIpc APIs
1) Intra-VM and Inter-VM
2) Inter-Chip PCIE
Common QNX privileges required for all NvSciEventService APIs
#define NV_SCI_ASYNC_PCIE_AER_UNCORRECTABLE_FATAL 0x2U |
Indicates there is uncorrectable fatal error during PCIE operation.
Definition at line 347 of file nvsciipc.h.
#define NV_SCI_ASYNC_PCIE_AER_UNCORRECTABLE_NONFATAL 0x4U |
Indicates there is uncorrectable non fatal error during PCIE operation.
Definition at line 349 of file nvsciipc.h.
#define NV_SCI_ASYNC_PCIE_EDMA_XFER_ERROR 0x1U |
Indicates there is eDMA error during PCIE operation.
Definition at line 345 of file nvsciipc.h.
#define NV_SCI_ASYNC_PCIE_VALIDATION_ERROR 0x8U |
Indicates there is validation error.
Definition at line 351 of file nvsciipc.h.
#define NV_SCI_IPC_EVENT_ASYNC_ERROR 0x20U |
Specifies the IPC asynchronous error event.
Definition at line 334 of file nvsciipc.h.
#define NV_SCI_IPC_EVENT_CONN_EST 0x04U |
Specifies the IPC connection established event.
Definition at line 328 of file nvsciipc.h.
#define NV_SCI_IPC_EVENT_CONN_EST_ALL |
Specifies single event mask to check IPC connection establishment.
Definition at line 336 of file nvsciipc.h.
#define NV_SCI_IPC_EVENT_CONN_RESET 0x08U |
Specifies the IPC connection reset event.
Definition at line 330 of file nvsciipc.h.
#define NV_SCI_IPC_EVENT_READ 0x01U |
Specifies the IPC read event.
Definition at line 324 of file nvsciipc.h.
#define NV_SCI_IPC_EVENT_WRITE 0x02U |
Specifies the IPC write event.
Definition at line 326 of file nvsciipc.h.
#define NV_SCI_IPC_EVENT_WRITE_EMPTY 0x10U |
Specifies the IPC write fifo empty event.
Definition at line 332 of file nvsciipc.h.
#define NVSCIIPC_INFINITE_WAIT -1LL |
infinite timeout for NvSciIpcWaitEventQnx()
Definition at line 341 of file nvsciipc.h.
#define NVSCIIPC_MAX_ENDPOINT_NAME 64U |
Specifies maximum Endpoint name length including null terminator.
Definition at line 320 of file nvsciipc.h.
typedef uint64_t NvSciIpcEndpoint |
Handle to the NvSciIpc endpoint.
Definition at line 302 of file nvsciipc.h.
typedef struct NvSciIpcEndpointInfo NvSciIpcEndpointInfo |
Definition at line 304 of file nvsciipc.h.
NvSciError NvSciIpcCheckVersionCompatibility | ( | uint32_t | majorVer, |
uint32_t | minorVer, | ||
bool * | isCompatible | ||
) |
Check NvSciIpc library version compatibility.
Checks if loaded NvSciIpc library version is compatible with the version the application was compiled against. This function checks loaded NvSciIpc library version with input NvSciIpc library version and sets output variable true provided major version of the loaded library is same as majorVer and minor version of the loaded library is not less than minorVer, else sets output to false
[in] | majorVer | build major version. |
[in] | minorVer | build minor version. |
[out] | isCompatible | boolean value stating if loaded NvSciIpc library is compatible or not. |
Usage considerations
void NvSciIpcCloseEndpoint | ( | NvSciIpcEndpoint | handle | ) |
Closes an endpoint with the given handle.
NvSciError NvSciIpcCloseEndpointSafe | ( | NvSciIpcEndpoint | handle, |
bool | clear | ||
) |
Closes an endpoint with the given handle (safety version)
The function frees the NvSciIpc endpoint associated with the given handle.
[in] | handle | A handle to the endpoint to close. |
[in] | clear | Reserved for future use and any value has no change to the function behavior. |
Usage considerations
void NvSciIpcDeinit | ( | void | ) |
De-initializes the NvSciIpc library.
This function cleans up the NvSciIpc endpoint internal database created by NvSciIpcInit().
void
Usage considerations
NvSciError NvSciIpcEnableNotification | ( | NvSciIpcEndpoint | handle, |
bool | flag | ||
) |
Enable event notification (or polling)
Control notification when connection or FIFO status is changed. If notification is disabled, NvSciIpc doesn't send notification to remote endpoint. notification is enabled by default unless user disables it using this API explicitly. User can use this API to choose asynchronous event notification mode or polling mode. Once notification is disabled in both endpoints, user shall not call event blocking API (e.g. poll, NvSciIpcWaitEventQnx, WaitForEvent, WaitForMultipleEvents etc.).
[in] | handle | NvSciIpc endpoint handle. |
[in] | flag | flag to enable IPC notification. |
Usage considerations
NvSciError NvSciIpcGetAsyncErrors | ( | NvSciIpcEndpoint | handle, |
uint32_t * | errors | ||
) |
Get asynchronouse errors.
Returns error codes that can happen asynchronousely in the backend component. It could be errors from eDMA or PCIE in case of C2C backend.
There are four errors reported in mask and this API returns bitwise OR operaton on new errors that has occurred since the last call to it.
NV_SCI_ASYNC_PCIE_AER_UNCORRECTABLE_FATAL
NV_SCI_ASYNC_PCIE_AER_UNCORRECTABLE_NONFATAL
NV_SCI_ASYNC_PCIE_EDMA_XFER_ERROR
NV_SCI_ASYNC_PCIE_VALIDATION_ERROR
[in] | handle | NvSciIpc endpoint handle. |
[out] | mask | place holder to store bitwise OR errors |
Usage considerations
NvSciError NvSciIpcGetEndpointInfo | ( | NvSciIpcEndpoint | handle, |
NvSciIpcEndpointInfo * | info | ||
) |
Returns endpoint information.
[in] | handle | NvSciIpc endpoint handle. |
[out] | info | A pointer to NvSciIpcEndpointInfo object that this function copies the info to on success. |
Usage considerations
NvSciError NvSciIpcGetEvent | ( | NvSciIpcEndpoint | handle, |
uint32_t * | events | ||
) |
Get Events.
NvSciError NvSciIpcGetEventNotifier | ( | NvSciIpcEndpoint | handle, |
NvSciEventNotifier ** | eventNotifier | ||
) |
Get NvSciIpc event notifier.
This API is used to connect NvSciIpc event handling with OS-provided event interface. It also utilizes NvSciEventService infrastructure.
[in] | handle | NvSciIpc endpoint handle. |
[out] | eventNotifier | A pointer to NvSciEventNotifier object on success. |
Usage considerations
NvSciError NvSciIpcGetEventSafe | ( | NvSciIpcEndpoint | handle, |
uint32_t * | events | ||
) |
Get Events (safety version)
Returns a bitwise OR operation on new events that occurred since the last call to this function.
This function sets events to the result of a bitwise OR operation of zero or more NV_SCI_IPC_EVENT_*
constants corresponding to all new events that have occurred on the endpoint since:
The parameter events is set to zero if no new events have occurred.
There are 6 types of events:
NV_SCI_IPC_EVENT_CONN_EST
: IPC connection establishedNV_SCI_IPC_EVENT_WRITE
: IPC writeNV_SCI_IPC_EVENT_READ
: IPC readNV_SCI_IPC_EVENT_CONN_RESET
: IPC connection resetNV_SCI_IPC_EVENT_WRITE_EMPTY
: IPC write FIFO emptyNV_SCI_IPC_EVENT_ASYNC_ERROR
: Asynchronous errorNV_SCI_IPC_EVENT_CONN_EST
and NV_SCI_IPC_EVENT_CONN_RESET
events are connection event. They're edge-triggered events and once they're read by user, events are cleared.
NV_SCI_IPC_EVENT_WRITE
, NV_SCI_IPC_EVENT_READ
and NV_SCI_IPC_EVENT_WRITE_EMPTY
events are FIFO status event. As long as free buffer is available on write FIFO or data are available in read FIFO, API keeps reporting same events. All these events also mean that connection is established.
An NV_SCI_IPC_EVENT_CONN_EST
event occurs on an endpoint each time a connection is established through the endpoint (between the endpoint and the other end of the corresponding channel).
An NV_SCI_IPC_EVENT_WRITE
event occurs on an endpoint:
NV_SCI_IPC_CONN_EST
event.An NV_SCI_IPC_EVENT_READ
event occurs on an endpoint:
NV_SCI_IPC_EVENT_CONN_EST
event, if frames can already be read as of delivery.An NV_SCI_IPC_EVENT_CONN_RESET
event occurs on an endpoint when the user calls NvSciIpcResetEndpoint.
An NV_SCI_IPC_EVENT_WRITE_EMPTY
event occurs on an endpoint when write FIFO is empty. user can utilize this event to check if remote endpoint reads all data which local endpoint sent.
An NV_SCI_IPC_EVENT_ASYNC_ERROR
event occurs on an endpoint when there is a asynchronouse error, e.g. failure on eDMA or PCIE. To get detailed error information, the user can call NvSciIpcGetAsyncError()
.
If this function doesn't return desired events, user must call OS-provided blocking API to wait for notification from remote endpoint.
The following are blocking API examples:
In case of QNX OS, in order to authenticate user client process, NvSciIpc uses custom ability "NvSciIpcEndpoint". Use procmgr_ability_lookup() QNX OS API to get ability ID.
[in] | handle | NvSciIpc endpoint handle. |
[out] | events | A pointer to the variable into which to store the bitwise OR result of new events on success. |
Usage considerations
NvSciError NvSciIpcGetLinuxEventFd | ( | NvSciIpcEndpoint | handle, |
int32_t * | fd | ||
) |
Returns the NvSciIpc file descriptor for a given endpoint.
This API is specific to Linux OS. Event handle will be used to plug OS event notification (can be read, can be written, established, reset etc.)
handle | NvSciIpc endpoint handle |
fd | A pointer to the endpoint file descriptor. |
Usage considerations
NvSciError NvSciIpcInit | ( | void | ) |
Initializes the NvSciIpc library.
This function parses the NvSciIpc configuration file and creates an internal database of NvSciIpc endpoints that exist in a system.
Usage considerations
NvSciError NvSciIpcOpenEndpoint | ( | const char * | endpoint, |
NvSciIpcEndpoint * | handle | ||
) |
Opens an endpoint with the given name.
The function locates the NvSciIpc endpoint with the given name in the NvSciIpc configuration table in the internal database, and returns a handle to the endpoint if found. When the operation is successful, endpoint can utilize the allocated shared data area and the corresponding signaling mechanism setup. If the operation fails, the state of the NvSciIpc endpoint is undefined. In case of QNX OS, in order to authenticate user client process, NvSciIpc uses custom ability "NvSciIpcEndpoint". Use procmgr_ability_lookup() QNX OS API to get ability ID.
[in] | endpoint | The name of the NvSciIpc endpoint to open. |
[out] | handle | A handle to the endpoint on success. |
Usage considerations
NvSciError NvSciIpcOpenEndpointWithEventService | ( | const char * | endpoint, |
NvSciIpcEndpoint * | handle, | ||
NvSciEventService * | eventService | ||
) |
Opens an endpoint with the given name and event service.
This API provides same functionality as NvSciIpcOpenEndpoint(). But, it requires additional event service abstract object as an input parameter to utilize NvSciEventService infrastructure. NvSciEventService can be created through NvSciEventLoopServiceCreateSafe(). NvSciIpcGetEventNotifier() can be used only when this API is invoked successfully. In case of QNX OS, in order to authenticate user client process, NvSciIpc uses custom ability "NvSciIpcEndpoint". Use procmgr_ability_lookup() QNX OS API to get ability ID.
[in] | endpoint | The name of the NvSciIpc endpoint to open. |
[out] | handle | A handle to the endpoint on success. |
[in] | eventService | An abstract object to use NvSciEventService infrastructure. |
Usage considerations
NvSciError NvSciIpcRead | ( | NvSciIpcEndpoint | handle, |
void * | buf, | ||
size_t | size, | ||
int32_t * | bytes | ||
) |
Reads a frame from the endpoint.
NvSciError NvSciIpcReadAdvance | ( | NvSciIpcEndpoint | handle | ) |
Advance to the next read frame of the endpoint.
This is a non-blocking call. Read channel of the endpoint must not be empty. If a read channel of the endpoint was previously full, then this function notifies the remote endpoint.
This operation cannot proceed if the endpoint is being reset. However, if the remote endpoint has called NvSciIpcResetEndpointSafe(), calls to this function can still succeed until the next event notification on the local endpoint.
[in] | handle | The handle to the endpoint to read from. |
Usage considerations
NvSciError NvSciIpcReadGetNextFrame | ( | NvSciIpcEndpoint | handle, |
const volatile void ** | buf | ||
) |
Get a pointer to the read frame from the endpoint.
This is a non-blocking call. This operation cannot proceed if the endpoint is being reset. However, if the remote endpoint has called NvSciIpcResetEndpointSafe(), calls to this function can still succeed until the next event notification on the local endpoint.
[in] | handle | The handle to the endpoint to read from. |
[out] | buf | A pointer to a destination buffer to receive the contents of the next frame on success. |
Usage considerations
NvSciError NvSciIpcReadSafe | ( | NvSciIpcEndpoint | handle, |
void * | buf, | ||
uint32_t | size, | ||
uint32_t * | bytes | ||
) |
Reads a frame from the endpoint (safety version)
This function copies a new frame contents into a buffer and advances to the next frame. If the destination buffer is smaller than the configured frame size of the endpoint, the trailing bytes are discarded.
This is a non-blocking call. Read channel of the endpoint must not be empty. If read channel of the endpoint was previously full, then the function notifies the remote endpoint.
This operation cannot proceed if the endpoint is being reset. However, if the remote endpoint has called NvSciIpcResetEndpointSafe(), calls to this function can still succeed until the next event notification on the local endpoint.
[in] | handle | The handle to the endpoint to read from. |
[out] | buf | A pointer to a destination buffer to receive the contents of the next frame. |
[in] | size | The number of bytes to copy from the frame, not to exceed the length of the destination buffer and configured frame size of the endpoint. |
[out] | bytes | The number of bytes read on success. |
Usage considerations
void NvSciIpcResetEndpoint | ( | NvSciIpcEndpoint | handle | ) |
Resets an endpoint.
NvSciError NvSciIpcResetEndpointSafe | ( | NvSciIpcEndpoint | handle | ) |
Resets an endpoint.
(safety version)
Initiates a reset on the endpoint and notifies the remote endpoint. Once this API is called, all existing data in channel will be discarded. After invoking this function, client user shall call NvSciIpcGetEventSafe() to get specific event type (READ, WRITE etc.).
[in] | handle | A handle to the endpoint to reset. |
Usage considerations
NvSciError NvSciIpcWrite | ( | NvSciIpcEndpoint | handle, |
const void * | buf, | ||
size_t | size, | ||
int32_t * | bytes | ||
) |
Writes a frame to the endpoint.
NvSciError NvSciIpcWriteAdvance | ( | NvSciIpcEndpoint | handle | ) |
Advance to the next write frame of the endpoint.
This is a non-blocking call. If write channel of the endpoint is not full, then post the next frame. If write channel of the endpoint was previously empty, then this function notifies the remote endpoint.
This operation cannot proceed if the endpoint is being reset. However, if the remote endpoint has called NvSciIpcResetEndpointSafe(), calls to this function can still succeed until the next event notification on the local endpoint.
[in] | handle | The handle to the endpoint to write to. |
Usage considerations
NvSciError NvSciIpcWriteGetNextFrame | ( | NvSciIpcEndpoint | handle, |
volatile void ** | buf | ||
) |
Get a pointer to the write frame from the endpoint.
This is a non-blocking call. write channel of the endpoint must not be full.
This operation cannot proceed if the endpoint is being reset. However, if the remote endpoint has called NvSciIpcResetEndpointSafe(), calls to this function can still succeed until the next event notification on the local endpoint.
[in] | handle | The handle to the endpoint to write to. |
[out] | buf | A pointer to a destination buffer to hold the contents of the next frame on success. |
Usage considerations
NvSciError NvSciIpcWriteSafe | ( | NvSciIpcEndpoint | handle, |
const void * | buf, | ||
uint32_t | size, | ||
uint32_t * | bytes | ||
) |
Writes a frame to the endpoint.
(safety version)
If space is available in the endpoint, this function posts a new frame, copying the contents from the provided data buffer. If size is less than the frame size, then the remaining bytes of the frame are filled with zero.
This is a non-blocking call. If write channel of the endpoint was previously empty, then the function notifies the remote endpoint.
This operation cannot proceed if the endpoint is being reset.
The user shall make sure if actual input buffer size is equal or bigger than requested size before using this API.
[in] | handle | The handle to the endpoint to write to. |
[in] | buf | A pointer to a source buffer for the contents of the next frame. |
[in] | size | The number of bytes to be copied to the frame, not to exceed the length of the destination buffer and configured frame size of the endpoint. |
[out] | bytes | The number of bytes written on success. |
Usage considerations