1 #ifndef _G_USERMODE_API_NVOC_H_ 2 #define _G_USERMODE_API_NVOC_H_ 3 #include "nvoc/runtime.h" 4 5 #ifdef __cplusplus 6 extern "C" { 7 #endif 8 9 /* 10 * SPDX-FileCopyrightText: Copyright (c) 2015-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 11 * SPDX-License-Identifier: MIT 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining a 14 * copy of this software and associated documentation files (the "Software"), 15 * to deal in the Software without restriction, including without limitation 16 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 17 * and/or sell copies of the Software, and to permit persons to whom the 18 * Software is furnished to do so, subject to the following conditions: 19 * 20 * The above copyright notice and this permission notice shall be included in 21 * all copies or substantial portions of the Software. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 26 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 28 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 29 * DEALINGS IN THE SOFTWARE. 30 */ 31 32 #include "g_usermode_api_nvoc.h" 33 34 #ifndef _USERMODE_API_H_ 35 #define _USERMODE_API_H_ 36 37 #include "core/core.h" 38 #include "mem_mgr/mem.h" 39 #include "gpu/gpu.h" 40 #include "nvoc/utility.h" 41 42 /*! 43 * RM internal class representing USERMODE_A classes. We inherit Memory here instead of GpuResource 44 * because GpuResource can only map regmem, whereas for HOPPER+, we will need to map sysmem with an 45 * effective address space of fbmem if the user requests the GMMU/BAR1 mapping for the VF pages. 46 */ 47 #ifdef NVOC_USERMODE_API_H_PRIVATE_ACCESS_ALLOWED 48 #define PRIVATE_FIELD(x) x 49 #else 50 #define PRIVATE_FIELD(x) NVOC_PRIVATE_FIELD(x) 51 #endif 52 struct UserModeApi { 53 const struct NVOC_RTTI *__nvoc_rtti; 54 struct Memory __nvoc_base_Memory; 55 struct Object *__nvoc_pbase_Object; 56 struct RsResource *__nvoc_pbase_RsResource; 57 struct RmResourceCommon *__nvoc_pbase_RmResourceCommon; 58 struct RmResource *__nvoc_pbase_RmResource; 59 struct Memory *__nvoc_pbase_Memory; 60 struct UserModeApi *__nvoc_pbase_UserModeApi; 61 NvBool (*__usrmodeCanCopy__)(struct UserModeApi *); 62 NV_STATUS (*__usrmodeCheckMemInterUnmap__)(struct UserModeApi *, NvBool); 63 NvBool (*__usrmodeShareCallback__)(struct UserModeApi *, struct RsClient *, struct RsResourceRef *, RS_SHARE_POLICY *); 64 NV_STATUS (*__usrmodeMapTo__)(struct UserModeApi *, RS_RES_MAP_TO_PARAMS *); 65 NV_STATUS (*__usrmodeGetMapAddrSpace__)(struct UserModeApi *, CALL_CONTEXT *, NvU32, NV_ADDRESS_SPACE *); 66 NvU32 (*__usrmodeGetRefCount__)(struct UserModeApi *); 67 void (*__usrmodeAddAdditionalDependants__)(struct RsClient *, struct UserModeApi *, RsResourceRef *); 68 NV_STATUS (*__usrmodeControl_Prologue__)(struct UserModeApi *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 69 NvBool (*__usrmodeIsGpuMapAllowed__)(struct UserModeApi *, struct OBJGPU *); 70 NV_STATUS (*__usrmodeUnmapFrom__)(struct UserModeApi *, RS_RES_UNMAP_FROM_PARAMS *); 71 void (*__usrmodeControl_Epilogue__)(struct UserModeApi *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 72 NV_STATUS (*__usrmodeControlLookup__)(struct UserModeApi *, struct RS_RES_CONTROL_PARAMS_INTERNAL *, const struct NVOC_EXPORTED_METHOD_DEF **); 73 NV_STATUS (*__usrmodeControl__)(struct UserModeApi *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 74 NV_STATUS (*__usrmodeUnmap__)(struct UserModeApi *, CALL_CONTEXT *, RsCpuMapping *); 75 NV_STATUS (*__usrmodeGetMemInterMapParams__)(struct UserModeApi *, RMRES_MEM_INTER_MAP_PARAMS *); 76 NV_STATUS (*__usrmodeGetMemoryMappingDescriptor__)(struct UserModeApi *, MEMORY_DESCRIPTOR **); 77 NV_STATUS (*__usrmodeControlFilter__)(struct UserModeApi *, struct CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 78 NV_STATUS (*__usrmodeControlSerialization_Prologue__)(struct UserModeApi *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 79 NV_STATUS (*__usrmodeIsReady__)(struct UserModeApi *, NvBool); 80 NV_STATUS (*__usrmodeCheckCopyPermissions__)(struct UserModeApi *, struct OBJGPU *, struct Device *); 81 void (*__usrmodePreDestruct__)(struct UserModeApi *); 82 NV_STATUS (*__usrmodeIsDuplicate__)(struct UserModeApi *, NvHandle, NvBool *); 83 void (*__usrmodeControlSerialization_Epilogue__)(struct UserModeApi *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 84 NV_STATUS (*__usrmodeMap__)(struct UserModeApi *, CALL_CONTEXT *, struct RS_CPU_MAP_PARAMS *, RsCpuMapping *); 85 NvBool (*__usrmodeAccessCallback__)(struct UserModeApi *, struct RsClient *, void *, RsAccessRight); 86 }; 87 88 #ifndef __NVOC_CLASS_UserModeApi_TYPEDEF__ 89 #define __NVOC_CLASS_UserModeApi_TYPEDEF__ 90 typedef struct UserModeApi UserModeApi; 91 #endif /* __NVOC_CLASS_UserModeApi_TYPEDEF__ */ 92 93 #ifndef __nvoc_class_id_UserModeApi 94 #define __nvoc_class_id_UserModeApi 0x6f57ec 95 #endif /* __nvoc_class_id_UserModeApi */ 96 97 extern const struct NVOC_CLASS_DEF __nvoc_class_def_UserModeApi; 98 99 #define __staticCast_UserModeApi(pThis) \ 100 ((pThis)->__nvoc_pbase_UserModeApi) 101 102 #ifdef __nvoc_usermode_api_h_disabled 103 #define __dynamicCast_UserModeApi(pThis) ((UserModeApi*)NULL) 104 #else //__nvoc_usermode_api_h_disabled 105 #define __dynamicCast_UserModeApi(pThis) \ 106 ((UserModeApi*)__nvoc_dynamicCast(staticCast((pThis), Dynamic), classInfo(UserModeApi))) 107 #endif //__nvoc_usermode_api_h_disabled 108 109 110 NV_STATUS __nvoc_objCreateDynamic_UserModeApi(UserModeApi**, Dynamic*, NvU32, va_list); 111 112 NV_STATUS __nvoc_objCreate_UserModeApi(UserModeApi**, Dynamic*, NvU32, CALL_CONTEXT * arg_pCallContext, struct RS_RES_ALLOC_PARAMS_INTERNAL * arg_pParams); 113 #define __objCreate_UserModeApi(ppNewObj, pParent, createFlags, arg_pCallContext, arg_pParams) \ 114 __nvoc_objCreate_UserModeApi((ppNewObj), staticCast((pParent), Dynamic), (createFlags), arg_pCallContext, arg_pParams) 115 116 #define usrmodeCanCopy(pUserModeApi) usrmodeCanCopy_DISPATCH(pUserModeApi) 117 #define usrmodeCheckMemInterUnmap(pMemory, bSubdeviceHandleProvided) usrmodeCheckMemInterUnmap_DISPATCH(pMemory, bSubdeviceHandleProvided) 118 #define usrmodeShareCallback(pResource, pInvokingClient, pParentRef, pSharePolicy) usrmodeShareCallback_DISPATCH(pResource, pInvokingClient, pParentRef, pSharePolicy) 119 #define usrmodeMapTo(pResource, pParams) usrmodeMapTo_DISPATCH(pResource, pParams) 120 #define usrmodeGetMapAddrSpace(pMemory, pCallContext, mapFlags, pAddrSpace) usrmodeGetMapAddrSpace_DISPATCH(pMemory, pCallContext, mapFlags, pAddrSpace) 121 #define usrmodeGetRefCount(pResource) usrmodeGetRefCount_DISPATCH(pResource) 122 #define usrmodeAddAdditionalDependants(pClient, pResource, pReference) usrmodeAddAdditionalDependants_DISPATCH(pClient, pResource, pReference) 123 #define usrmodeControl_Prologue(pResource, pCallContext, pParams) usrmodeControl_Prologue_DISPATCH(pResource, pCallContext, pParams) 124 #define usrmodeIsGpuMapAllowed(pMemory, pGpu) usrmodeIsGpuMapAllowed_DISPATCH(pMemory, pGpu) 125 #define usrmodeUnmapFrom(pResource, pParams) usrmodeUnmapFrom_DISPATCH(pResource, pParams) 126 #define usrmodeControl_Epilogue(pResource, pCallContext, pParams) usrmodeControl_Epilogue_DISPATCH(pResource, pCallContext, pParams) 127 #define usrmodeControlLookup(pResource, pParams, ppEntry) usrmodeControlLookup_DISPATCH(pResource, pParams, ppEntry) 128 #define usrmodeControl(pMemory, pCallContext, pParams) usrmodeControl_DISPATCH(pMemory, pCallContext, pParams) 129 #define usrmodeUnmap(pMemory, pCallContext, pCpuMapping) usrmodeUnmap_DISPATCH(pMemory, pCallContext, pCpuMapping) 130 #define usrmodeGetMemInterMapParams(pMemory, pParams) usrmodeGetMemInterMapParams_DISPATCH(pMemory, pParams) 131 #define usrmodeGetMemoryMappingDescriptor(pMemory, ppMemDesc) usrmodeGetMemoryMappingDescriptor_DISPATCH(pMemory, ppMemDesc) 132 #define usrmodeControlFilter(pResource, pCallContext, pParams) usrmodeControlFilter_DISPATCH(pResource, pCallContext, pParams) 133 #define usrmodeControlSerialization_Prologue(pResource, pCallContext, pParams) usrmodeControlSerialization_Prologue_DISPATCH(pResource, pCallContext, pParams) 134 #define usrmodeIsReady(pMemory, bCopyConstructorContext) usrmodeIsReady_DISPATCH(pMemory, bCopyConstructorContext) 135 #define usrmodeCheckCopyPermissions(pMemory, pDstGpu, pDstDevice) usrmodeCheckCopyPermissions_DISPATCH(pMemory, pDstGpu, pDstDevice) 136 #define usrmodePreDestruct(pResource) usrmodePreDestruct_DISPATCH(pResource) 137 #define usrmodeIsDuplicate(pMemory, hMemory, pDuplicate) usrmodeIsDuplicate_DISPATCH(pMemory, hMemory, pDuplicate) 138 #define usrmodeControlSerialization_Epilogue(pResource, pCallContext, pParams) usrmodeControlSerialization_Epilogue_DISPATCH(pResource, pCallContext, pParams) 139 #define usrmodeMap(pMemory, pCallContext, pParams, pCpuMapping) usrmodeMap_DISPATCH(pMemory, pCallContext, pParams, pCpuMapping) 140 #define usrmodeAccessCallback(pResource, pInvokingClient, pAllocParams, accessRight) usrmodeAccessCallback_DISPATCH(pResource, pInvokingClient, pAllocParams, accessRight) 141 NvBool usrmodeCanCopy_IMPL(struct UserModeApi *pUserModeApi); 142 143 static inline NvBool usrmodeCanCopy_DISPATCH(struct UserModeApi *pUserModeApi) { 144 return pUserModeApi->__usrmodeCanCopy__(pUserModeApi); 145 } 146 147 static inline NV_STATUS usrmodeCheckMemInterUnmap_DISPATCH(struct UserModeApi *pMemory, NvBool bSubdeviceHandleProvided) { 148 return pMemory->__usrmodeCheckMemInterUnmap__(pMemory, bSubdeviceHandleProvided); 149 } 150 151 static inline NvBool usrmodeShareCallback_DISPATCH(struct UserModeApi *pResource, struct RsClient *pInvokingClient, struct RsResourceRef *pParentRef, RS_SHARE_POLICY *pSharePolicy) { 152 return pResource->__usrmodeShareCallback__(pResource, pInvokingClient, pParentRef, pSharePolicy); 153 } 154 155 static inline NV_STATUS usrmodeMapTo_DISPATCH(struct UserModeApi *pResource, RS_RES_MAP_TO_PARAMS *pParams) { 156 return pResource->__usrmodeMapTo__(pResource, pParams); 157 } 158 159 static inline NV_STATUS usrmodeGetMapAddrSpace_DISPATCH(struct UserModeApi *pMemory, CALL_CONTEXT *pCallContext, NvU32 mapFlags, NV_ADDRESS_SPACE *pAddrSpace) { 160 return pMemory->__usrmodeGetMapAddrSpace__(pMemory, pCallContext, mapFlags, pAddrSpace); 161 } 162 163 static inline NvU32 usrmodeGetRefCount_DISPATCH(struct UserModeApi *pResource) { 164 return pResource->__usrmodeGetRefCount__(pResource); 165 } 166 167 static inline void usrmodeAddAdditionalDependants_DISPATCH(struct RsClient *pClient, struct UserModeApi *pResource, RsResourceRef *pReference) { 168 pResource->__usrmodeAddAdditionalDependants__(pClient, pResource, pReference); 169 } 170 171 static inline NV_STATUS usrmodeControl_Prologue_DISPATCH(struct UserModeApi *pResource, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 172 return pResource->__usrmodeControl_Prologue__(pResource, pCallContext, pParams); 173 } 174 175 static inline NvBool usrmodeIsGpuMapAllowed_DISPATCH(struct UserModeApi *pMemory, struct OBJGPU *pGpu) { 176 return pMemory->__usrmodeIsGpuMapAllowed__(pMemory, pGpu); 177 } 178 179 static inline NV_STATUS usrmodeUnmapFrom_DISPATCH(struct UserModeApi *pResource, RS_RES_UNMAP_FROM_PARAMS *pParams) { 180 return pResource->__usrmodeUnmapFrom__(pResource, pParams); 181 } 182 183 static inline void usrmodeControl_Epilogue_DISPATCH(struct UserModeApi *pResource, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 184 pResource->__usrmodeControl_Epilogue__(pResource, pCallContext, pParams); 185 } 186 187 static inline NV_STATUS usrmodeControlLookup_DISPATCH(struct UserModeApi *pResource, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams, const struct NVOC_EXPORTED_METHOD_DEF **ppEntry) { 188 return pResource->__usrmodeControlLookup__(pResource, pParams, ppEntry); 189 } 190 191 static inline NV_STATUS usrmodeControl_DISPATCH(struct UserModeApi *pMemory, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 192 return pMemory->__usrmodeControl__(pMemory, pCallContext, pParams); 193 } 194 195 static inline NV_STATUS usrmodeUnmap_DISPATCH(struct UserModeApi *pMemory, CALL_CONTEXT *pCallContext, RsCpuMapping *pCpuMapping) { 196 return pMemory->__usrmodeUnmap__(pMemory, pCallContext, pCpuMapping); 197 } 198 199 static inline NV_STATUS usrmodeGetMemInterMapParams_DISPATCH(struct UserModeApi *pMemory, RMRES_MEM_INTER_MAP_PARAMS *pParams) { 200 return pMemory->__usrmodeGetMemInterMapParams__(pMemory, pParams); 201 } 202 203 static inline NV_STATUS usrmodeGetMemoryMappingDescriptor_DISPATCH(struct UserModeApi *pMemory, MEMORY_DESCRIPTOR **ppMemDesc) { 204 return pMemory->__usrmodeGetMemoryMappingDescriptor__(pMemory, ppMemDesc); 205 } 206 207 static inline NV_STATUS usrmodeControlFilter_DISPATCH(struct UserModeApi *pResource, struct CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 208 return pResource->__usrmodeControlFilter__(pResource, pCallContext, pParams); 209 } 210 211 static inline NV_STATUS usrmodeControlSerialization_Prologue_DISPATCH(struct UserModeApi *pResource, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 212 return pResource->__usrmodeControlSerialization_Prologue__(pResource, pCallContext, pParams); 213 } 214 215 static inline NV_STATUS usrmodeIsReady_DISPATCH(struct UserModeApi *pMemory, NvBool bCopyConstructorContext) { 216 return pMemory->__usrmodeIsReady__(pMemory, bCopyConstructorContext); 217 } 218 219 static inline NV_STATUS usrmodeCheckCopyPermissions_DISPATCH(struct UserModeApi *pMemory, struct OBJGPU *pDstGpu, struct Device *pDstDevice) { 220 return pMemory->__usrmodeCheckCopyPermissions__(pMemory, pDstGpu, pDstDevice); 221 } 222 223 static inline void usrmodePreDestruct_DISPATCH(struct UserModeApi *pResource) { 224 pResource->__usrmodePreDestruct__(pResource); 225 } 226 227 static inline NV_STATUS usrmodeIsDuplicate_DISPATCH(struct UserModeApi *pMemory, NvHandle hMemory, NvBool *pDuplicate) { 228 return pMemory->__usrmodeIsDuplicate__(pMemory, hMemory, pDuplicate); 229 } 230 231 static inline void usrmodeControlSerialization_Epilogue_DISPATCH(struct UserModeApi *pResource, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 232 pResource->__usrmodeControlSerialization_Epilogue__(pResource, pCallContext, pParams); 233 } 234 235 static inline NV_STATUS usrmodeMap_DISPATCH(struct UserModeApi *pMemory, CALL_CONTEXT *pCallContext, struct RS_CPU_MAP_PARAMS *pParams, RsCpuMapping *pCpuMapping) { 236 return pMemory->__usrmodeMap__(pMemory, pCallContext, pParams, pCpuMapping); 237 } 238 239 static inline NvBool usrmodeAccessCallback_DISPATCH(struct UserModeApi *pResource, struct RsClient *pInvokingClient, void *pAllocParams, RsAccessRight accessRight) { 240 return pResource->__usrmodeAccessCallback__(pResource, pInvokingClient, pAllocParams, accessRight); 241 } 242 243 NV_STATUS usrmodeConstruct_IMPL(struct UserModeApi *arg_pUserModeApi, CALL_CONTEXT *arg_pCallContext, struct RS_RES_ALLOC_PARAMS_INTERNAL *arg_pParams); 244 245 #define __nvoc_usrmodeConstruct(arg_pUserModeApi, arg_pCallContext, arg_pParams) usrmodeConstruct_IMPL(arg_pUserModeApi, arg_pCallContext, arg_pParams) 246 #undef PRIVATE_FIELD 247 248 249 #endif // _USERMODE_API_H_ 250 251 #ifdef __cplusplus 252 } // extern "C" 253 #endif 254 #endif // _G_USERMODE_API_NVOC_H_ 255