NvSciIpc Changes#

This topic describes the customer-visible changes to the NvSciIpc and NvSciEvent public headers between DRIVE OS 6.5.4.2 and DriveOS 7.2.5.0. The release exposes the configuration-blob / endpoint-access query API declarations outside the QNX-only guard (per-function descriptions remain QNX-specific in 7.2.5.0), and deprecates the OS-specific legacy event entry points in favor of the unified NvSciEventService library.

NvSciIpcEndpointAccessInfo Promoted to Cross-OS API#

Target Changes

Backward Compatible

Platform

OS

  • The gid field of NvSciIpcEndpointAccessInfo was changed from gid_t to uint32_t, and a new uid field of type uint32_t was appended at the end of the struct.

  • The NvSciIpcEndpointAccessInfo struct and the NvSciIpcOpenCfgBlob / NvSciIpcGetEndpointAccessInfo / NvSciIpcCloseCfgBlob declarations are no longer gated by #if defined(__QNX__); the symbols are now visible and exported on Linux as well. Note that the per-function @brief text on these three APIs still reads “This API is specific to QNX OS”. The declarations are exposed, but the documented behavioral contract continues to describe the QNX-only implementation in 7.2.5.0.

  • NvSciIpcMinorVersion is bumped from 4U to 5U to advertise the broader public surface to NvSciIpcCheckVersionCompatibility().

No. Source changes are required.

SR

QNX

Migration Path

  • Orin to Thor

Migration Release Path

  • 6.5.4.2 to 7.2.5.0

Migration Rationale

The cfg-blob declarations were exposed outside the __QNX__ guard so the public surface is visible on Linux (advertised by the @version 1.5 minor-version bump). The per-function descriptions still call out a QNX-only implementation in 7.2.5.0. Linux behavioral support is tracked separately. The gid field was switched to a fixed-width type to avoid dependence on system gid_t width, and a uid field is added to unify the auth model with the uid / gid pair used elsewhere in DriveOS.

Steps to Migrate

  1. Update NvSciIpcEndpointAccessInfo consumers to use the new fixed-width fields:

    NvSciIpcEndpointAccessInfo info;
    gid_t g = info.gid; /* gid_t */
    

    becomes:

    NvSciIpcEndpointAccessInfo info;
    uint32_t g = info.gid; /* now uint32_t */
    uint32_t u = info.uid; /* new field */
    

    Audit item rather than a compile-time hook: gid_tuint32_t may surface a compiler warning at sites that take &info.gid and pass it where gid_t * is expected, but the appended uid field will not consistently fire a diagnostic — designated initializers leave trailing aggregate members zero-initialized without warning. Treat this as a struct-layout / initializer audit item: review every site that initializes, copies, memcpys, or type-puns NvSciIpcEndpointAccessInfo and populate uid explicitly when the value is meaningful.

  2. Drop the __QNX__ guard around references to the cfg-blob APIs:

    #if defined(__QNX__)
    NvSciError e = NvSciIpcOpenCfgBlob();
    #endif
    

    becomes:

    NvSciError e = NvSciIpcOpenCfgBlob();
    
  3. Callers that gate behavior on the NvSciIpc API minor version should raise the requested minor:

    NvSciIpcCheckVersionCompatibility(1U, 4U, &compat);
    

    becomes:

    NvSciIpcCheckVersionCompatibility(1U, 5U, &compat);
    

New Endpoint Sentinel Macros#

Target Changes

Backward Compatible

Platform

OS

New sentinel macros NVSCIIPC_INVALID_IRQ (0xFFFFFFFFU) and NVSCIIPC_INVALID_IID (-1) were added for use with the IRQ / IID fields of NvSciIpcEndpointAccessInfo and related queries.

Yes

SR

QNX

Migration Path

  • Orin to Thor

Migration Release Path

  • 6.5.4.2 to 7.2.5.0

Migration Rationale

Provides explicit “no IRQ” / “no IID” sentinel values so callers can detect endpoints that do not expose an interrupt or interrupt id.

Steps to Migrate

Replace any hand-rolled invalid-IRQ / invalid-IID checks with the new sentinels. NvSciIpcEndpointAccessInfo exposes the IRQ and IID under the irq and id fields:

if (info.irq == NVSCIIPC_INVALID_IRQ) {
    /* endpoint has no interrupt */
}
if (info.id == NVSCIIPC_INVALID_IID) {
    /* endpoint has no interrupt id */
}

NvSciIpcGetEndpointAccessInfo Precondition Simplification#

Target Changes

Backward Compatible

Platform

OS

The documented precondition of NvSciIpcGetEndpointAccessInfo changed from @pre Invocation of NvSciIpcOpenCfgBlob() must be successful. to @pre Invocation of NvSciIpcInit() must be successful.. The function no longer requires the cfg-blob to be opened first; it now requires only that NvSciIpcInit() has been called.

No. The source rebuilds, but runtime behavior changed.

SR

QNX

Migration Path

  • Orin to Thor

Migration Release Path

  • 6.5.4.2 to 7.2.5.0

Migration Rationale

NvSciIpcInit() now opens and initialises the configuration on the caller’s behalf. NvSciIpcGetEndpointAccessInfo() only checks that init completed and then queries access information. The explicit caller-side NvSciIpcOpenCfgBlob() / NvSciIpcCloseCfgBlob() pair around NvSciIpcGetEndpointAccessInfo() is no longer required.

Steps to Migrate

  1. The explicit cfg-blob open / close pair around NvSciIpcGetEndpointAccessInfo becomes optional:

    NvSciIpcInit();
    NvSciIpcOpenCfgBlob();
    NvSciIpcGetEndpointAccessInfo(name, &info);
    NvSciIpcCloseCfgBlob();
    

    can be simplified to:

    NvSciIpcInit();
    NvSciIpcGetEndpointAccessInfo(name, &info);
    

Legacy OS-Specific Event APIs Deprecation#

Target Changes

Backward Compatible

Platform

OS

  • Four legacy OS-specific event-handling APIs gained an explicit @warning This API will be deprecated in future notice in their Doxygen header: NvSciIpcGetLinuxEventFd, NvSciIpcWaitEventQnx, NvSciIpcSetQnxPulseParamSafe and NvSciIpcInspectEventQnx. The recommended replacement is NvSciIpcGetEventNotifier() paired with the NvSciEventService library (or NvSciEventInspect() in place of NvSciIpcInspectEventQnx).

  • The file-level start-up sequence section additionally tags the legacy “Call flow with NvSciIpc” path as (will be deprecated) and the NvSciEventService-based path as (recommended).

Yes

SR

QNX

Migration Path

  • Orin to Thor

Migration Release Path

  • 6.5.4.2 to 7.2.5.0

Migration Rationale

DriveOS is consolidating event handling onto NvSciEventService for future safety qualification. The OS-specific legacy entry points remain functional in 7.2.5.0 but will be removed in a later release.

Steps to Migrate

Migrate event handling from the legacy OS-specific entry points to the NvSciEventService library:

NvSciIpcSetQnxPulseParamSafe(handle, coid, prio, code);
NvSciIpcWaitEventQnx(chid, timeoutUs, sizeof(pulse), &pulse);

becomes:

NvSciEventNotifier *notifier = NULL;
NvSciIpcGetEventNotifier(handle, &notifier);
eventLoopService->WaitForEvent(notifier, timeoutUs);

Wait API Threading and Polling Semantics#

Target Changes

Backward Compatible

Platform

OS

  • The “claimed by some thread” wording in the Doxygen blocks of NvSciEventLoopService::WaitForEvent, NvSciEventLoopService::WaitForMultipleEvents, NvSciEventLoopService::WaitForMultipleEventsExt and NvSciEventLoopService::WaitForAnyEvent changed to “claimed by the current thread”, stating that pending asynchronous notifiers are now always handled on the calling thread (rather than potentially being picked up by “some” thread).

  • NvSciEventLoopService::WaitForMultipleEventsExt now documents a third timeout case: microseconds == 0 — non-blocking poll that immediately services any pending events and returns. Previously only microseconds > 0 (block with timeout) and microseconds == -1 (NV_SCI_EVENT_INFINITE_WAIT) were documented.

No. Source rebuilds, but runtime behavior changed.

SR

QNX

Migration Path

  • Orin to Thor

Migration Release Path

  • 6.5.4.2 to 7.2.5.0

Migration Rationale

Documentation correction reflecting the actual implementation: the calling thread itself drains pending notifiers before the blocking call returns. The microseconds == 0 poll mode was already supported by the implementation. The documentation is updated to publish this contract.

Steps to Migrate

  1. Customers who relied on the previous “some thread” wording to infer cross-thread notifier delivery should re-validate their threading model.

  2. Use the documented zero-timeout poll mode for non-blocking event servicing in a poll loop:

    // Non-blocking poll: drains pending events and returns immediately.
    eventLoopService->WaitForMultipleEventsExt(eventService,
                                               notifierArray, count, 0,
                                               newEventArray);