Files
nvsci_samples/rawstream/rawstream_ipc_linux.c
svcmobrel-release 5482324389 Updating prebuilts and/or headers
8193be73ce0a488f62034cb87083cdf09f52cd5d - event_sample_app/block_pool.c
a0bd135d707994a41ed3a4234b5f875a268fed4d - event_sample_app/Makefile
44f6de348f8bdd5cb584b3e8cc4b05e9482dddd2 - event_sample_app/event_loop.h
6ff0f1c2d7ef2e2fa9ece6fdc850b58b87207526 - event_sample_app/block_returnsync.c
1158201e78094e9e866fa99095c9ffc2ec9f5a27 - event_sample_app/block_limiter.c
f5e2aea98ba9264ee1068a700222dff8d5d5c7a4 - event_sample_app/block_c2c.c
ef057870dade9af70656b37340e9bcad35d49380 - event_sample_app/block_multicast.c
641e3634da873970b574b23a1024b2e7155b88ff - event_sample_app/block_consumer_uc1.c
ced622a41d1a48dcb23e6a1a02ae9640ef9b837c - event_sample_app/util.h
3a1013021a572887303fb6db245b5b01fe07e9a0 - event_sample_app/block_producer_uc1.c
dac99c442185b020fbdae07bfc1e7df78343eb83 - event_sample_app/block_info.h
b5dd68bec3ae6f9049aad1cb5a86c3db4af02e17 - event_sample_app/block_presentsync.c
e0861e9fe5d160d47d758464146d7192f9c70a5f - event_sample_app/util.c
d7e42e2b6088ff4596abc7256eb018d757a4021e - event_sample_app/usecase1.h
65ffe5af6ae6bc0418f348167c473849d4697e47 - event_sample_app/block_ipc.c
b52e34443ac441a9df48029de944aa0a50d1b101 - event_sample_app/event_loop_service.c
5001f036389a4f7952cb4974dd3323908208ca30 - event_sample_app/event_loop_threads.c
a71ed037f9d77d0944f40f54cf25db8180d007e2 - event_sample_app/block_queue.c
d6bbd17599543f1760d87851150a12a2a842a24d - event_sample_app/block_common.c
40f949c4c37ab4aa4a84182b345f3de6fceab39b - event_sample_app/main.c
458833ab233a725c067bf9b1fc60ef39872eee80 - rawstream/Makefile
1fbb82e2281bb2e168c87fd20903bbed898ca160 - rawstream/rawstream_cuda.c
e26c09f1ad1a3a7d2c29dae1b38d3fd90c23af6e - rawstream/rawstream_consumer.c
2bed038ca070aa5dccd6b672a98f093340e829bb - rawstream/rawstream_producer.c
3df4e5c00a3dc002ee9877e282bd28ffa87fa6f0 - rawstream/rawstream.h
d5ffeef3c7ad2af6f6f31385db7917b5ef9a7438 - rawstream/rawstream_ipc_linux.c
f28c1cd5fe26b6dc5930d5556b54364c9b91767c - rawstream/rawstream_main.c

Change-Id: Icdf4312706c30fbcfa1533fba5277879e8d77aec
2025-01-21 05:25:22 -08:00

173 lines
5.1 KiB
C

/*
* Copyright (c) 2020-2022 NVIDIA Corporation. All Rights Reserved.
*
* NVIDIA Corporation and its licensors retain all intellectual property and
* proprietary rights in and to this software and related documentation. Any
* use, reproduction, disclosure or distribution of this software and related
* documentation without an express license agreement from NVIDIA Corporation
* is strictly prohibited.
*/
#include "rawstream.h"
// Initialize one end of named communcation channel
NvSciError ipcInit(const char* endpointName, IpcWrapper* ipcWrapper)
{
NvSciError err = NvSciError_Success;
// Open named endpoint
err = NvSciIpcOpenEndpoint(endpointName, &ipcWrapper->endpoint);
if (err != NvSciError_Success) {
fprintf(stderr, "Unable to open endpoint %s (%x)\n",
endpointName, err);
goto fail;
}
// initialize IPC event notifier
err = NvSciIpcGetLinuxEventFd(ipcWrapper->endpoint, &ipcWrapper->ipcEventFd);
if (err != NvSciError_Success) {
fprintf(stderr, "Unable to get Linux event fd (%x)\n", err);
goto fail;
}
// Retrieve endpoint info
err = NvSciIpcGetEndpointInfo(ipcWrapper->endpoint, &ipcWrapper->info);
if (NvSciError_Success != err) {
fprintf(stderr, "Unable to retrieve IPC endpoint info (%x)", err);
goto fail;
}
err = NvSciIpcResetEndpointSafe(ipcWrapper->endpoint);
if (NvSciError_Success != err) {
fprintf(stderr, "Unable to reset IPC endpoint (%x)", err);
}
fail:
return err;
}
// Clean up IPC when done
void ipcDeinit(IpcWrapper* ipcWrapper)
{
NvSciError err = NvSciIpcCloseEndpointSafe(ipcWrapper->endpoint, false);
if (NvSciError_Success != err) {
fprintf(stderr, "NvSciIpcCloseEndpointSafe failed (%x)\n", err);
}
}
// Wait for an event on IPC channel
static NvSciError waitEvent(IpcWrapper* ipcWrapper, uint32_t value)
{
fd_set rfds;
uint32_t event = 0;
NvSciError err;
while (true) {
// Get pending IPC events
err = NvSciIpcGetEventSafe(ipcWrapper->endpoint, &event);
if (NvSciError_Success != err) {
fprintf(stderr, "NvSciIpcGetEventSafe failed (%x)\n", err);
return err;
}
// Return if event is the kind we're looking for
if (0U != (event & value)) {
break;
}
FD_ZERO(&rfds);
FD_SET(ipcWrapper->ipcEventFd, &rfds);
// Wait for signalling indicating new event
if (select(ipcWrapper->ipcEventFd + 1, &rfds, NULL, NULL, NULL) < 0) {
// select failed
return NvSciError_ResourceError;
}
if(!FD_ISSET(ipcWrapper->ipcEventFd, &rfds)) {
return NvSciError_NvSciIpcUnknown;
}
}
return NvSciError_Success;
}
// Send a message over IPC
NvSciError ipcSend(IpcWrapper* ipcWrapper, const void* buf, const size_t size)
{
NvSciError err = NvSciError_Success;
bool done = false;
uint32_t bytes;
// Loop until entire message sent
while (done == false) {
// Wait for room in channel to send a message
err = waitEvent(ipcWrapper, NV_SCI_IPC_EVENT_WRITE);
if (NvSciError_Success != err) {
goto fail;
}
assert(size <= UINT32_MAX);
// Send as much of the message as we can
err = NvSciIpcWriteSafe(ipcWrapper->endpoint, buf, (uint32_t)size,
&bytes);
if (NvSciError_Success != err) {
fprintf(stderr, "IPC write failed (%x)\n", err);
goto fail;
}
// For this simple sample, we just fail if the entire message wasn't
// sent. Could instead retry to send the rest.
if (size != (size_t)bytes) {
fprintf(stderr, "Failed to send entire message (%u < %zu)\n",
bytes, size);
err = NvSciError_NvSciIpcUnknown;
goto fail;
}
done = true;
}
fail:
return err;
}
// Receive a message over IPC
NvSciError ipcRecvFill(IpcWrapper* ipcWrapper, void* buf, const size_t size)
{
NvSciError err = NvSciError_Success;
bool done = false;
uint32_t bytes;
// Loop until entire message received
while (done == false) {
// Wait for incoming data
err = waitEvent(ipcWrapper, NV_SCI_IPC_EVENT_READ);
if (NvSciError_Success != err) {
goto fail;
}
assert(size <= UINT32_MAX);
// Read as much of the message as we can
err = NvSciIpcReadSafe(ipcWrapper->endpoint, buf, (uint32_t)size,
&bytes);
if (NvSciError_Success != err) {
fprintf(stderr, "IPC read failed (%x)\n", err);
goto fail;
}
// For this simple sample, we just fail if the entire message wasn't
// read. Could instead retry to receive the rest.
if (size != (size_t)bytes) {
fprintf(stderr, "Failed to read entire message (%u < %zu)\n",
bytes, size);
err = NvSciError_NvSciIpcUnknown;
goto fail;
}
done = true;
}
fail:
return err;
}