| Index: arch/arm/mach-tegra/nv/nvrm/dispatch/nvrm_transport_dispatch.c
|
| diff --git a/arch/arm/mach-tegra/nv/nvrm/dispatch/nvrm_transport_dispatch.c b/arch/arm/mach-tegra/nv/nvrm/dispatch/nvrm_transport_dispatch.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0ab58edd8f17cd6b5673fcd753b237d47a35f6ee
|
| --- /dev/null
|
| +++ b/arch/arm/mach-tegra/nv/nvrm/dispatch/nvrm_transport_dispatch.c
|
| @@ -0,0 +1,678 @@
|
| +
|
| +#define NV_IDL_IS_DISPATCH
|
| +
|
| +/*
|
| + * Copyright (c) 2010 NVIDIA Corporation.
|
| + * All rights reserved.
|
| + *
|
| + * Redistribution and use in source and binary forms, with or without
|
| + * modification, are permitted provided that the following conditions are met:
|
| + *
|
| + * Redistributions of source code must retain the above copyright notice,
|
| + * this list of conditions and the following disclaimer.
|
| + *
|
| + * Redistributions in binary form must reproduce the above copyright notice,
|
| + * this list of conditions and the following disclaimer in the documentation
|
| + * and/or other materials provided with the distribution.
|
| + *
|
| + * Neither the name of the NVIDIA Corporation nor the names of its contributors
|
| + * may be used to endorse or promote products derived from this software
|
| + * without specific prior written permission.
|
| + *
|
| + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
| + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
| + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
| + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
| + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
| + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
| + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
| + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
| + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
| + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
| + * POSSIBILITY OF SUCH DAMAGE.
|
| + *
|
| + */
|
| +
|
| +#include "nvcommon.h"
|
| +#include "nvos.h"
|
| +#include "nvassert.h"
|
| +#include "nvreftrack.h"
|
| +#include "nvidlcmd.h"
|
| +#include "nvrm_transport.h"
|
| +
|
| +#define OFFSET( s, e ) (NvU32)(void *)(&(((s*)0)->e))
|
| +#define MAX_MESSAGE_LENGTH 256
|
| +#define MAX_PORT_NAME_LENGTH 20
|
| +
|
| +typedef struct NvRmTransportRecvMsg_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmTransportHandle hTransport;
|
| + void* pMessageBuffer;
|
| + NvU32 MaxSize;
|
| +} NV_ALIGN(4) NvRmTransportRecvMsg_in;
|
| +
|
| +typedef struct NvRmTransportRecvMsg_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportRecvMsg_inout;
|
| +
|
| +typedef struct NvRmTransportRecvMsg_out_t
|
| +{
|
| + NvError ret_;
|
| + NvU32 pMessageSize;
|
| +} NV_ALIGN(4) NvRmTransportRecvMsg_out;
|
| +
|
| +typedef struct NvRmTransportRecvMsg_params_t
|
| +{
|
| + NvRmTransportRecvMsg_in in;
|
| + NvRmTransportRecvMsg_inout inout;
|
| + NvRmTransportRecvMsg_out out;
|
| +} NvRmTransportRecvMsg_params;
|
| +
|
| +typedef struct NvRmTransportSendMsgInLP0_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmTransportHandle hPort;
|
| + void* message;
|
| + NvU32 MessageSize;
|
| +} NV_ALIGN(4) NvRmTransportSendMsgInLP0_in;
|
| +
|
| +typedef struct NvRmTransportSendMsgInLP0_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportSendMsgInLP0_inout;
|
| +
|
| +typedef struct NvRmTransportSendMsgInLP0_out_t
|
| +{
|
| + NvError ret_;
|
| +} NV_ALIGN(4) NvRmTransportSendMsgInLP0_out;
|
| +
|
| +typedef struct NvRmTransportSendMsgInLP0_params_t
|
| +{
|
| + NvRmTransportSendMsgInLP0_in in;
|
| + NvRmTransportSendMsgInLP0_inout inout;
|
| + NvRmTransportSendMsgInLP0_out out;
|
| +} NvRmTransportSendMsgInLP0_params;
|
| +
|
| +typedef struct NvRmTransportSendMsg_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmTransportHandle hTransport;
|
| + void* pMessageBuffer;
|
| + NvU32 MessageSize;
|
| + NvU32 TimeoutMS;
|
| +} NV_ALIGN(4) NvRmTransportSendMsg_in;
|
| +
|
| +typedef struct NvRmTransportSendMsg_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportSendMsg_inout;
|
| +
|
| +typedef struct NvRmTransportSendMsg_out_t
|
| +{
|
| + NvError ret_;
|
| +} NV_ALIGN(4) NvRmTransportSendMsg_out;
|
| +
|
| +typedef struct NvRmTransportSendMsg_params_t
|
| +{
|
| + NvRmTransportSendMsg_in in;
|
| + NvRmTransportSendMsg_inout inout;
|
| + NvRmTransportSendMsg_out out;
|
| +} NvRmTransportSendMsg_params;
|
| +
|
| +typedef struct NvRmTransportSetQueueDepth_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmTransportHandle hTransport;
|
| + NvU32 MaxQueueDepth;
|
| + NvU32 MaxMessageSize;
|
| +} NV_ALIGN(4) NvRmTransportSetQueueDepth_in;
|
| +
|
| +typedef struct NvRmTransportSetQueueDepth_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportSetQueueDepth_inout;
|
| +
|
| +typedef struct NvRmTransportSetQueueDepth_out_t
|
| +{
|
| + NvError ret_;
|
| +} NV_ALIGN(4) NvRmTransportSetQueueDepth_out;
|
| +
|
| +typedef struct NvRmTransportSetQueueDepth_params_t
|
| +{
|
| + NvRmTransportSetQueueDepth_in in;
|
| + NvRmTransportSetQueueDepth_inout inout;
|
| + NvRmTransportSetQueueDepth_out out;
|
| +} NvRmTransportSetQueueDepth_params;
|
| +
|
| +typedef struct NvRmTransportConnect_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmTransportHandle hTransport;
|
| + NvU32 TimeoutMS;
|
| +} NV_ALIGN(4) NvRmTransportConnect_in;
|
| +
|
| +typedef struct NvRmTransportConnect_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportConnect_inout;
|
| +
|
| +typedef struct NvRmTransportConnect_out_t
|
| +{
|
| + NvError ret_;
|
| +} NV_ALIGN(4) NvRmTransportConnect_out;
|
| +
|
| +typedef struct NvRmTransportConnect_params_t
|
| +{
|
| + NvRmTransportConnect_in in;
|
| + NvRmTransportConnect_inout inout;
|
| + NvRmTransportConnect_out out;
|
| +} NvRmTransportConnect_params;
|
| +
|
| +typedef struct NvRmTransportWaitForConnect_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmTransportHandle hTransport;
|
| + NvU32 TimeoutMS;
|
| +} NV_ALIGN(4) NvRmTransportWaitForConnect_in;
|
| +
|
| +typedef struct NvRmTransportWaitForConnect_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportWaitForConnect_inout;
|
| +
|
| +typedef struct NvRmTransportWaitForConnect_out_t
|
| +{
|
| + NvError ret_;
|
| +} NV_ALIGN(4) NvRmTransportWaitForConnect_out;
|
| +
|
| +typedef struct NvRmTransportWaitForConnect_params_t
|
| +{
|
| + NvRmTransportWaitForConnect_in in;
|
| + NvRmTransportWaitForConnect_inout inout;
|
| + NvRmTransportWaitForConnect_out out;
|
| +} NvRmTransportWaitForConnect_params;
|
| +
|
| +typedef struct NvRmTransportDeInit_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmDeviceHandle hRmDevice;
|
| +} NV_ALIGN(4) NvRmTransportDeInit_in;
|
| +
|
| +typedef struct NvRmTransportDeInit_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportDeInit_inout;
|
| +
|
| +typedef struct NvRmTransportDeInit_out_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportDeInit_out;
|
| +
|
| +typedef struct NvRmTransportDeInit_params_t
|
| +{
|
| + NvRmTransportDeInit_in in;
|
| + NvRmTransportDeInit_inout inout;
|
| + NvRmTransportDeInit_out out;
|
| +} NvRmTransportDeInit_params;
|
| +
|
| +typedef struct NvRmTransportInit_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmDeviceHandle hRmDevice;
|
| +} NV_ALIGN(4) NvRmTransportInit_in;
|
| +
|
| +typedef struct NvRmTransportInit_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportInit_inout;
|
| +
|
| +typedef struct NvRmTransportInit_out_t
|
| +{
|
| + NvError ret_;
|
| +} NV_ALIGN(4) NvRmTransportInit_out;
|
| +
|
| +typedef struct NvRmTransportInit_params_t
|
| +{
|
| + NvRmTransportInit_in in;
|
| + NvRmTransportInit_inout inout;
|
| + NvRmTransportInit_out out;
|
| +} NvRmTransportInit_params;
|
| +
|
| +typedef struct NvRmTransportClose_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmTransportHandle hTransport;
|
| +} NV_ALIGN(4) NvRmTransportClose_in;
|
| +
|
| +typedef struct NvRmTransportClose_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportClose_inout;
|
| +
|
| +typedef struct NvRmTransportClose_out_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportClose_out;
|
| +
|
| +typedef struct NvRmTransportClose_params_t
|
| +{
|
| + NvRmTransportClose_in in;
|
| + NvRmTransportClose_inout inout;
|
| + NvRmTransportClose_out out;
|
| +} NvRmTransportClose_params;
|
| +
|
| +typedef struct NvRmTransportGetPortName_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmTransportHandle hTransport;
|
| + NvU8 * PortName;
|
| + NvU32 PortNameSize;
|
| +} NV_ALIGN(4) NvRmTransportGetPortName_in;
|
| +
|
| +typedef struct NvRmTransportGetPortName_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportGetPortName_inout;
|
| +
|
| +typedef struct NvRmTransportGetPortName_out_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportGetPortName_out;
|
| +
|
| +typedef struct NvRmTransportGetPortName_params_t
|
| +{
|
| + NvRmTransportGetPortName_in in;
|
| + NvRmTransportGetPortName_inout inout;
|
| + NvRmTransportGetPortName_out out;
|
| +} NvRmTransportGetPortName_params;
|
| +
|
| +typedef struct NvRmTransportOpen_in_t
|
| +{
|
| + NvU32 package_;
|
| + NvU32 function_;
|
| + NvRmDeviceHandle hRmDevice;
|
| + char * pPortName_data;
|
| + NvU32 pPortName_len;
|
| + NvOsSemaphoreHandle RecvMessageSemaphore;
|
| +} NV_ALIGN(4) NvRmTransportOpen_in;
|
| +
|
| +typedef struct NvRmTransportOpen_inout_t
|
| +{
|
| + NvU32 dummy_;
|
| +} NV_ALIGN(4) NvRmTransportOpen_inout;
|
| +
|
| +typedef struct NvRmTransportOpen_out_t
|
| +{
|
| + NvError ret_;
|
| + NvRmTransportHandle phTransport;
|
| +} NV_ALIGN(4) NvRmTransportOpen_out;
|
| +
|
| +typedef struct NvRmTransportOpen_params_t
|
| +{
|
| + NvRmTransportOpen_in in;
|
| + NvRmTransportOpen_inout inout;
|
| + NvRmTransportOpen_out out;
|
| +} NvRmTransportOpen_params;
|
| +
|
| +static NvError NvRmTransportRecvMsg_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportRecvMsg_in *p_in;
|
| + NvRmTransportRecvMsg_out *p_out;
|
| + void* pMessageBuffer = NULL;
|
| + NvU32 MsgBuff[MAX_MESSAGE_LENGTH/sizeof(NvU32)];
|
| +
|
| + p_in = (NvRmTransportRecvMsg_in *)InBuffer;
|
| + p_out = (NvRmTransportRecvMsg_out *)((NvU8 *)OutBuffer + OFFSET(NvRmTransportRecvMsg_params, out) - OFFSET(NvRmTransportRecvMsg_params, inout));
|
| +
|
| + if( p_in->MaxSize && p_in->pMessageBuffer )
|
| + {
|
| + pMessageBuffer = (void* )MsgBuff;
|
| + if( p_in->MaxSize > MAX_MESSAGE_LENGTH )
|
| + pMessageBuffer = (void* )NvOsAlloc( p_in->MaxSize );
|
| + if( !pMessageBuffer )
|
| + {
|
| + err_ = NvError_InsufficientMemory;
|
| + goto clean;
|
| + }
|
| + }
|
| +
|
| + p_out->ret_ = NvRmTransportRecvMsg( p_in->hTransport, pMessageBuffer, p_in->MaxSize, &p_out->pMessageSize );
|
| +
|
| + if(p_in->pMessageBuffer && pMessageBuffer)
|
| + {
|
| + err_ = NvOsCopyOut( p_in->pMessageBuffer, pMessageBuffer, p_in->MaxSize );
|
| + if( err_ != NvSuccess )
|
| + {
|
| + err_ = NvError_BadParameter;
|
| + }
|
| + }
|
| +clean:
|
| + if (pMessageBuffer != MsgBuff)
|
| + NvOsFree( pMessageBuffer );
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportSendMsgInLP0_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportSendMsgInLP0_in *p_in;
|
| + NvRmTransportSendMsgInLP0_out *p_out;
|
| + void* message = NULL;
|
| + NvU32 MsgBuff[MAX_MESSAGE_LENGTH/sizeof(NvU32)];
|
| +
|
| + p_in = (NvRmTransportSendMsgInLP0_in *)InBuffer;
|
| + p_out = (NvRmTransportSendMsgInLP0_out *)((NvU8 *)OutBuffer + OFFSET(NvRmTransportSendMsgInLP0_params, out) - OFFSET(NvRmTransportSendMsgInLP0_params, inout));
|
| +
|
| + if( p_in->MessageSize && p_in->message )
|
| + {
|
| + message = (void* )MsgBuff;
|
| + if( p_in->MessageSize > MAX_MESSAGE_LENGTH )
|
| + message = (void* )NvOsAlloc( p_in->MessageSize );
|
| + if( !message )
|
| + {
|
| + err_ = NvError_InsufficientMemory;
|
| + goto clean;
|
| + }
|
| + if( p_in->message )
|
| + {
|
| + err_ = NvOsCopyIn( message, p_in->message, p_in->MessageSize );
|
| + if( err_ != NvSuccess )
|
| + {
|
| + err_ = NvError_BadParameter;
|
| + goto clean;
|
| + }
|
| + }
|
| + }
|
| +
|
| + p_out->ret_ = NvRmTransportSendMsgInLP0( p_in->hPort, message, p_in->MessageSize );
|
| +
|
| +clean:
|
| + if( message != MsgBuff )
|
| + NvOsFree( message );
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportSendMsg_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportSendMsg_in *p_in;
|
| + NvRmTransportSendMsg_out *p_out;
|
| + void* pMessageBuffer = NULL;
|
| + NvU32 MsgBuff[MAX_MESSAGE_LENGTH/sizeof(NvU32)];
|
| +
|
| + p_in = (NvRmTransportSendMsg_in *)InBuffer;
|
| + p_out = (NvRmTransportSendMsg_out *)((NvU8 *)OutBuffer + OFFSET(NvRmTransportSendMsg_params, out) - OFFSET(NvRmTransportSendMsg_params, inout));
|
| +
|
| + if( p_in->MessageSize && p_in->pMessageBuffer )
|
| + {
|
| + pMessageBuffer = (void* )&MsgBuff[0];
|
| + if( p_in->MessageSize > MAX_MESSAGE_LENGTH )
|
| + pMessageBuffer = (void* )NvOsAlloc( p_in->MessageSize );
|
| + if( !pMessageBuffer )
|
| + {
|
| + err_ = NvError_InsufficientMemory;
|
| + goto clean;
|
| + }
|
| + if( p_in->pMessageBuffer )
|
| + {
|
| + err_ = NvOsCopyIn( pMessageBuffer, p_in->pMessageBuffer, p_in->MessageSize );
|
| + if( err_ != NvSuccess )
|
| + {
|
| + err_ = NvError_BadParameter;
|
| + goto clean;
|
| + }
|
| + }
|
| + }
|
| +
|
| + p_out->ret_ = NvRmTransportSendMsg( p_in->hTransport, pMessageBuffer, p_in->MessageSize, p_in->TimeoutMS );
|
| +
|
| +clean:
|
| + if( pMessageBuffer != MsgBuff )
|
| + NvOsFree( pMessageBuffer );
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportSetQueueDepth_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportSetQueueDepth_in *p_in;
|
| + NvRmTransportSetQueueDepth_out *p_out;
|
| +
|
| + p_in = (NvRmTransportSetQueueDepth_in *)InBuffer;
|
| + p_out = (NvRmTransportSetQueueDepth_out *)((NvU8 *)OutBuffer + OFFSET(NvRmTransportSetQueueDepth_params, out) - OFFSET(NvRmTransportSetQueueDepth_params, inout));
|
| +
|
| +
|
| + p_out->ret_ = NvRmTransportSetQueueDepth( p_in->hTransport, p_in->MaxQueueDepth, p_in->MaxMessageSize );
|
| +
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportConnect_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportConnect_in *p_in;
|
| + NvRmTransportConnect_out *p_out;
|
| +
|
| + p_in = (NvRmTransportConnect_in *)InBuffer;
|
| + p_out = (NvRmTransportConnect_out *)((NvU8 *)OutBuffer + OFFSET(NvRmTransportConnect_params, out) - OFFSET(NvRmTransportConnect_params, inout));
|
| +
|
| +
|
| + p_out->ret_ = NvRmTransportConnect( p_in->hTransport, p_in->TimeoutMS );
|
| +
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportWaitForConnect_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportWaitForConnect_in *p_in;
|
| + NvRmTransportWaitForConnect_out *p_out;
|
| +
|
| + p_in = (NvRmTransportWaitForConnect_in *)InBuffer;
|
| + p_out = (NvRmTransportWaitForConnect_out *)((NvU8 *)OutBuffer + OFFSET(NvRmTransportWaitForConnect_params, out) - OFFSET(NvRmTransportWaitForConnect_params, inout));
|
| +
|
| +
|
| + p_out->ret_ = NvRmTransportWaitForConnect( p_in->hTransport, p_in->TimeoutMS );
|
| +
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportDeInit_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportDeInit_in *p_in;
|
| +
|
| + p_in = (NvRmTransportDeInit_in *)InBuffer;
|
| +
|
| +
|
| + NvRmTransportDeInit( p_in->hRmDevice );
|
| +
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportInit_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportInit_in *p_in;
|
| + NvRmTransportInit_out *p_out;
|
| +
|
| + p_in = (NvRmTransportInit_in *)InBuffer;
|
| + p_out = (NvRmTransportInit_out *)((NvU8 *)OutBuffer + OFFSET(NvRmTransportInit_params, out) - OFFSET(NvRmTransportInit_params, inout));
|
| +
|
| +
|
| + p_out->ret_ = NvRmTransportInit( p_in->hRmDevice );
|
| +
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportClose_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportClose_in *p_in;
|
| +
|
| + p_in = (NvRmTransportClose_in *)InBuffer;
|
| +
|
| +
|
| + NvRmTransportClose( p_in->hTransport );
|
| +
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportGetPortName_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportGetPortName_in *p_in;
|
| + NvU8 *PortName = NULL;
|
| + NvU32 PortNameBuff[MAX_PORT_NAME_LENGTH/sizeof(NvU32)];
|
| +
|
| + p_in = (NvRmTransportGetPortName_in *)InBuffer;
|
| +
|
| + if( p_in->PortNameSize && p_in->PortName )
|
| + {
|
| + PortName = (NvU8 *)PortNameBuff;
|
| + if( (p_in->PortNameSize * sizeof(NvU8)) > MAX_PORT_NAME_LENGTH )
|
| + PortName = (NvU8 *)NvOsAlloc( p_in->PortNameSize * sizeof( NvU8 ) );
|
| + if( !PortName )
|
| + {
|
| + err_ = NvError_InsufficientMemory;
|
| + goto clean;
|
| + }
|
| + if( p_in->PortName )
|
| + {
|
| + err_ = NvOsCopyIn( PortName, p_in->PortName, p_in->PortNameSize * sizeof( NvU8 ) );
|
| + if( err_ != NvSuccess )
|
| + {
|
| + err_ = NvError_BadParameter;
|
| + goto clean;
|
| + }
|
| + }
|
| + }
|
| +
|
| + NvRmTransportGetPortName( p_in->hTransport, PortName, p_in->PortNameSize );
|
| +
|
| + if(p_in->PortName && PortName)
|
| + {
|
| + err_ = NvOsCopyOut( p_in->PortName, PortName, p_in->PortNameSize * sizeof( NvU8 ) );
|
| + if( err_ != NvSuccess )
|
| + {
|
| + err_ = NvError_BadParameter;
|
| + }
|
| + }
|
| +clean:
|
| + if ( PortName != PortNameBuff )
|
| + NvOsFree( PortName );
|
| + return err_;
|
| +}
|
| +
|
| +static NvError NvRmTransportOpen_dispatch_( void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| + NvRmTransportOpen_in *p_in;
|
| + NvRmTransportOpen_out *p_out;
|
| + char *pPortName = NULL;
|
| + NvOsSemaphoreHandle RecvMessageSemaphore = NULL;
|
| + NvU32 PortNameBuff[MAX_PORT_NAME_LENGTH/sizeof(NvU32)];
|
| +
|
| + p_in = (NvRmTransportOpen_in *)InBuffer;
|
| + p_out = (NvRmTransportOpen_out *)((NvU8 *)OutBuffer + OFFSET(NvRmTransportOpen_params, out) - OFFSET(NvRmTransportOpen_params, inout));
|
| +
|
| + if( p_in->pPortName_len )
|
| + {
|
| + pPortName = (char *)PortNameBuff;
|
| + if( p_in->pPortName_len > MAX_PORT_NAME_LENGTH )
|
| + pPortName = NvOsAlloc( p_in->pPortName_len );
|
| + if( !pPortName )
|
| + {
|
| + err_ = NvError_InsufficientMemory;
|
| + goto clean;
|
| + }
|
| + err_ = NvOsCopyIn( pPortName, p_in->pPortName_data, p_in->pPortName_len );
|
| + if( err_ != NvSuccess )
|
| + {
|
| + err_ = NvError_BadParameter;
|
| + goto clean;
|
| + }
|
| + if( pPortName[p_in->pPortName_len - 1] != 0 )
|
| + {
|
| + err_ = NvError_BadParameter;
|
| + goto clean;
|
| + }
|
| + }
|
| + if( p_in->RecvMessageSemaphore )
|
| + {
|
| + err_ = NvOsSemaphoreUnmarshal( p_in->RecvMessageSemaphore, &RecvMessageSemaphore );
|
| + if( err_ != NvSuccess )
|
| + {
|
| + err_ = NvError_BadParameter;
|
| + goto clean;
|
| + }
|
| + }
|
| +
|
| + p_out->ret_ = NvRmTransportOpen( p_in->hRmDevice, pPortName, RecvMessageSemaphore, &p_out->phTransport );
|
| +
|
| +clean:
|
| + if( pPortName != PortNameBuff )
|
| + NvOsFree( pPortName );
|
| + NvOsSemaphoreDestroy( RecvMessageSemaphore );
|
| + return err_;
|
| +}
|
| +
|
| +NvError nvrm_transport_Dispatch( NvU32 function, void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx );
|
| +NvError nvrm_transport_Dispatch( NvU32 function, void *InBuffer, NvU32 InSize, void *OutBuffer, NvU32 OutSize, NvDispatchCtx* Ctx )
|
| +{
|
| + NvError err_ = NvSuccess;
|
| +
|
| + switch( function ) {
|
| + case 10:
|
| + err_ = NvRmTransportRecvMsg_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 9:
|
| + err_ = NvRmTransportSendMsgInLP0_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 8:
|
| + err_ = NvRmTransportSendMsg_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 7:
|
| + err_ = NvRmTransportSetQueueDepth_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 6:
|
| + err_ = NvRmTransportConnect_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 5:
|
| + err_ = NvRmTransportWaitForConnect_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 4:
|
| + err_ = NvRmTransportDeInit_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 3:
|
| + err_ = NvRmTransportInit_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 2:
|
| + err_ = NvRmTransportClose_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 1:
|
| + err_ = NvRmTransportGetPortName_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + case 0:
|
| + err_ = NvRmTransportOpen_dispatch_( InBuffer, InSize, OutBuffer, OutSize, Ctx );
|
| + break;
|
| + default:
|
| + err_ = NvError_BadParameter;
|
| + break;
|
| + }
|
| +
|
| + return err_;
|
| +}
|
|
|