1 #ifndef _G_SYSTEM_MEM_NVOC_H_ 2 #define _G_SYSTEM_MEM_NVOC_H_ 3 #include "nvoc/runtime.h" 4 5 #ifdef __cplusplus 6 extern "C" { 7 #endif 8 9 /* 10 * SPDX-FileCopyrightText: Copyright (c) 2020-2021 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_system_mem_nvoc.h" 33 34 #ifndef _SYSTEM_MEMORY_H_ 35 #define _SYSTEM_MEMORY_H_ 36 37 #include "mem_mgr/standard_mem.h" 38 #include "gpu/mem_mgr/heap_base.h" 39 40 #ifdef NVOC_SYSTEM_MEM_H_PRIVATE_ACCESS_ALLOWED 41 #define PRIVATE_FIELD(x) x 42 #else 43 #define PRIVATE_FIELD(x) NVOC_PRIVATE_FIELD(x) 44 #endif 45 struct SystemMemory { 46 const struct NVOC_RTTI *__nvoc_rtti; 47 struct StandardMemory __nvoc_base_StandardMemory; 48 struct Object *__nvoc_pbase_Object; 49 struct RsResource *__nvoc_pbase_RsResource; 50 struct RmResourceCommon *__nvoc_pbase_RmResourceCommon; 51 struct RmResource *__nvoc_pbase_RmResource; 52 struct Memory *__nvoc_pbase_Memory; 53 struct StandardMemory *__nvoc_pbase_StandardMemory; 54 struct SystemMemory *__nvoc_pbase_SystemMemory; 55 NV_STATUS (*__sysmemCtrlCmdGetSurfaceNumPhysPages__)(struct SystemMemory *, NV003E_CTRL_GET_SURFACE_NUM_PHYS_PAGES_PARAMS *); 56 NV_STATUS (*__sysmemCtrlCmdGetSurfacePhysPages__)(struct SystemMemory *, NV003E_CTRL_GET_SURFACE_PHYS_PAGES_PARAMS *); 57 NV_STATUS (*__sysmemCheckMemInterUnmap__)(struct SystemMemory *, NvBool); 58 NvBool (*__sysmemShareCallback__)(struct SystemMemory *, struct RsClient *, struct RsResourceRef *, RS_SHARE_POLICY *); 59 NV_STATUS (*__sysmemMapTo__)(struct SystemMemory *, RS_RES_MAP_TO_PARAMS *); 60 NV_STATUS (*__sysmemGetMapAddrSpace__)(struct SystemMemory *, CALL_CONTEXT *, NvU32, NV_ADDRESS_SPACE *); 61 NvBool (*__sysmemIsExportAllowed__)(struct SystemMemory *); 62 NvU32 (*__sysmemGetRefCount__)(struct SystemMemory *); 63 void (*__sysmemAddAdditionalDependants__)(struct RsClient *, struct SystemMemory *, RsResourceRef *); 64 NV_STATUS (*__sysmemControl_Prologue__)(struct SystemMemory *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 65 NvBool (*__sysmemIsGpuMapAllowed__)(struct SystemMemory *, struct OBJGPU *); 66 NV_STATUS (*__sysmemUnmapFrom__)(struct SystemMemory *, RS_RES_UNMAP_FROM_PARAMS *); 67 void (*__sysmemControl_Epilogue__)(struct SystemMemory *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 68 NV_STATUS (*__sysmemControlLookup__)(struct SystemMemory *, struct RS_RES_CONTROL_PARAMS_INTERNAL *, const struct NVOC_EXPORTED_METHOD_DEF **); 69 NV_STATUS (*__sysmemControl__)(struct SystemMemory *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 70 NV_STATUS (*__sysmemUnmap__)(struct SystemMemory *, CALL_CONTEXT *, RsCpuMapping *); 71 NV_STATUS (*__sysmemGetMemInterMapParams__)(struct SystemMemory *, RMRES_MEM_INTER_MAP_PARAMS *); 72 NV_STATUS (*__sysmemGetMemoryMappingDescriptor__)(struct SystemMemory *, MEMORY_DESCRIPTOR **); 73 NV_STATUS (*__sysmemControlFilter__)(struct SystemMemory *, struct CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 74 NV_STATUS (*__sysmemControlSerialization_Prologue__)(struct SystemMemory *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 75 NvBool (*__sysmemCanCopy__)(struct SystemMemory *); 76 NV_STATUS (*__sysmemIsReady__)(struct SystemMemory *, NvBool); 77 NV_STATUS (*__sysmemCheckCopyPermissions__)(struct SystemMemory *, struct OBJGPU *, struct Device *); 78 void (*__sysmemPreDestruct__)(struct SystemMemory *); 79 NV_STATUS (*__sysmemIsDuplicate__)(struct SystemMemory *, NvHandle, NvBool *); 80 void (*__sysmemControlSerialization_Epilogue__)(struct SystemMemory *, CALL_CONTEXT *, struct RS_RES_CONTROL_PARAMS_INTERNAL *); 81 NV_STATUS (*__sysmemMap__)(struct SystemMemory *, CALL_CONTEXT *, struct RS_CPU_MAP_PARAMS *, RsCpuMapping *); 82 NvBool (*__sysmemAccessCallback__)(struct SystemMemory *, struct RsClient *, void *, RsAccessRight); 83 }; 84 85 #ifndef __NVOC_CLASS_SystemMemory_TYPEDEF__ 86 #define __NVOC_CLASS_SystemMemory_TYPEDEF__ 87 typedef struct SystemMemory SystemMemory; 88 #endif /* __NVOC_CLASS_SystemMemory_TYPEDEF__ */ 89 90 #ifndef __nvoc_class_id_SystemMemory 91 #define __nvoc_class_id_SystemMemory 0x007a98 92 #endif /* __nvoc_class_id_SystemMemory */ 93 94 extern const struct NVOC_CLASS_DEF __nvoc_class_def_SystemMemory; 95 96 #define __staticCast_SystemMemory(pThis) \ 97 ((pThis)->__nvoc_pbase_SystemMemory) 98 99 #ifdef __nvoc_system_mem_h_disabled 100 #define __dynamicCast_SystemMemory(pThis) ((SystemMemory*)NULL) 101 #else //__nvoc_system_mem_h_disabled 102 #define __dynamicCast_SystemMemory(pThis) \ 103 ((SystemMemory*)__nvoc_dynamicCast(staticCast((pThis), Dynamic), classInfo(SystemMemory))) 104 #endif //__nvoc_system_mem_h_disabled 105 106 107 NV_STATUS __nvoc_objCreateDynamic_SystemMemory(SystemMemory**, Dynamic*, NvU32, va_list); 108 109 NV_STATUS __nvoc_objCreate_SystemMemory(SystemMemory**, Dynamic*, NvU32, CALL_CONTEXT * arg_pCallContext, struct RS_RES_ALLOC_PARAMS_INTERNAL * arg_pParams); 110 #define __objCreate_SystemMemory(ppNewObj, pParent, createFlags, arg_pCallContext, arg_pParams) \ 111 __nvoc_objCreate_SystemMemory((ppNewObj), staticCast((pParent), Dynamic), (createFlags), arg_pCallContext, arg_pParams) 112 113 #define sysmemCtrlCmdGetSurfaceNumPhysPages(pStandardMemory, pParams) sysmemCtrlCmdGetSurfaceNumPhysPages_DISPATCH(pStandardMemory, pParams) 114 #define sysmemCtrlCmdGetSurfacePhysPages(pStandardMemory, pParams) sysmemCtrlCmdGetSurfacePhysPages_DISPATCH(pStandardMemory, pParams) 115 #define sysmemCheckMemInterUnmap(pMemory, bSubdeviceHandleProvided) sysmemCheckMemInterUnmap_DISPATCH(pMemory, bSubdeviceHandleProvided) 116 #define sysmemShareCallback(pResource, pInvokingClient, pParentRef, pSharePolicy) sysmemShareCallback_DISPATCH(pResource, pInvokingClient, pParentRef, pSharePolicy) 117 #define sysmemMapTo(pResource, pParams) sysmemMapTo_DISPATCH(pResource, pParams) 118 #define sysmemGetMapAddrSpace(pMemory, pCallContext, mapFlags, pAddrSpace) sysmemGetMapAddrSpace_DISPATCH(pMemory, pCallContext, mapFlags, pAddrSpace) 119 #define sysmemIsExportAllowed(pMemory) sysmemIsExportAllowed_DISPATCH(pMemory) 120 #define sysmemGetRefCount(pResource) sysmemGetRefCount_DISPATCH(pResource) 121 #define sysmemAddAdditionalDependants(pClient, pResource, pReference) sysmemAddAdditionalDependants_DISPATCH(pClient, pResource, pReference) 122 #define sysmemControl_Prologue(pResource, pCallContext, pParams) sysmemControl_Prologue_DISPATCH(pResource, pCallContext, pParams) 123 #define sysmemIsGpuMapAllowed(pMemory, pGpu) sysmemIsGpuMapAllowed_DISPATCH(pMemory, pGpu) 124 #define sysmemUnmapFrom(pResource, pParams) sysmemUnmapFrom_DISPATCH(pResource, pParams) 125 #define sysmemControl_Epilogue(pResource, pCallContext, pParams) sysmemControl_Epilogue_DISPATCH(pResource, pCallContext, pParams) 126 #define sysmemControlLookup(pResource, pParams, ppEntry) sysmemControlLookup_DISPATCH(pResource, pParams, ppEntry) 127 #define sysmemControl(pMemory, pCallContext, pParams) sysmemControl_DISPATCH(pMemory, pCallContext, pParams) 128 #define sysmemUnmap(pMemory, pCallContext, pCpuMapping) sysmemUnmap_DISPATCH(pMemory, pCallContext, pCpuMapping) 129 #define sysmemGetMemInterMapParams(pMemory, pParams) sysmemGetMemInterMapParams_DISPATCH(pMemory, pParams) 130 #define sysmemGetMemoryMappingDescriptor(pMemory, ppMemDesc) sysmemGetMemoryMappingDescriptor_DISPATCH(pMemory, ppMemDesc) 131 #define sysmemControlFilter(pResource, pCallContext, pParams) sysmemControlFilter_DISPATCH(pResource, pCallContext, pParams) 132 #define sysmemControlSerialization_Prologue(pResource, pCallContext, pParams) sysmemControlSerialization_Prologue_DISPATCH(pResource, pCallContext, pParams) 133 #define sysmemCanCopy(pStandardMemory) sysmemCanCopy_DISPATCH(pStandardMemory) 134 #define sysmemIsReady(pMemory, bCopyConstructorContext) sysmemIsReady_DISPATCH(pMemory, bCopyConstructorContext) 135 #define sysmemCheckCopyPermissions(pMemory, pDstGpu, pDstDevice) sysmemCheckCopyPermissions_DISPATCH(pMemory, pDstGpu, pDstDevice) 136 #define sysmemPreDestruct(pResource) sysmemPreDestruct_DISPATCH(pResource) 137 #define sysmemIsDuplicate(pMemory, hMemory, pDuplicate) sysmemIsDuplicate_DISPATCH(pMemory, hMemory, pDuplicate) 138 #define sysmemControlSerialization_Epilogue(pResource, pCallContext, pParams) sysmemControlSerialization_Epilogue_DISPATCH(pResource, pCallContext, pParams) 139 #define sysmemMap(pMemory, pCallContext, pParams, pCpuMapping) sysmemMap_DISPATCH(pMemory, pCallContext, pParams, pCpuMapping) 140 #define sysmemAccessCallback(pResource, pInvokingClient, pAllocParams, accessRight) sysmemAccessCallback_DISPATCH(pResource, pInvokingClient, pAllocParams, accessRight) 141 NV_STATUS sysmemInitAllocRequest_HMM(struct OBJGPU *pGpu, struct SystemMemory *pSystemMemory, MEMORY_ALLOCATION_REQUEST *pAllocRequest); 142 143 144 #ifdef __nvoc_system_mem_h_disabled 145 static inline NV_STATUS sysmemInitAllocRequest(struct OBJGPU *pGpu, struct SystemMemory *pSystemMemory, MEMORY_ALLOCATION_REQUEST *pAllocRequest) { 146 NV_ASSERT_FAILED_PRECOMP("SystemMemory was disabled!"); 147 return NV_ERR_NOT_SUPPORTED; 148 } 149 #else //__nvoc_system_mem_h_disabled 150 #define sysmemInitAllocRequest(pGpu, pSystemMemory, pAllocRequest) sysmemInitAllocRequest_HMM(pGpu, pSystemMemory, pAllocRequest) 151 #endif //__nvoc_system_mem_h_disabled 152 153 #define sysmemInitAllocRequest_HAL(pGpu, pSystemMemory, pAllocRequest) sysmemInitAllocRequest(pGpu, pSystemMemory, pAllocRequest) 154 155 NV_STATUS sysmemCtrlCmdGetSurfaceNumPhysPages_IMPL(struct SystemMemory *pStandardMemory, NV003E_CTRL_GET_SURFACE_NUM_PHYS_PAGES_PARAMS *pParams); 156 157 static inline NV_STATUS sysmemCtrlCmdGetSurfaceNumPhysPages_DISPATCH(struct SystemMemory *pStandardMemory, NV003E_CTRL_GET_SURFACE_NUM_PHYS_PAGES_PARAMS *pParams) { 158 return pStandardMemory->__sysmemCtrlCmdGetSurfaceNumPhysPages__(pStandardMemory, pParams); 159 } 160 161 NV_STATUS sysmemCtrlCmdGetSurfacePhysPages_IMPL(struct SystemMemory *pStandardMemory, NV003E_CTRL_GET_SURFACE_PHYS_PAGES_PARAMS *pParams); 162 163 static inline NV_STATUS sysmemCtrlCmdGetSurfacePhysPages_DISPATCH(struct SystemMemory *pStandardMemory, NV003E_CTRL_GET_SURFACE_PHYS_PAGES_PARAMS *pParams) { 164 return pStandardMemory->__sysmemCtrlCmdGetSurfacePhysPages__(pStandardMemory, pParams); 165 } 166 167 static inline NV_STATUS sysmemCheckMemInterUnmap_DISPATCH(struct SystemMemory *pMemory, NvBool bSubdeviceHandleProvided) { 168 return pMemory->__sysmemCheckMemInterUnmap__(pMemory, bSubdeviceHandleProvided); 169 } 170 171 static inline NvBool sysmemShareCallback_DISPATCH(struct SystemMemory *pResource, struct RsClient *pInvokingClient, struct RsResourceRef *pParentRef, RS_SHARE_POLICY *pSharePolicy) { 172 return pResource->__sysmemShareCallback__(pResource, pInvokingClient, pParentRef, pSharePolicy); 173 } 174 175 static inline NV_STATUS sysmemMapTo_DISPATCH(struct SystemMemory *pResource, RS_RES_MAP_TO_PARAMS *pParams) { 176 return pResource->__sysmemMapTo__(pResource, pParams); 177 } 178 179 static inline NV_STATUS sysmemGetMapAddrSpace_DISPATCH(struct SystemMemory *pMemory, CALL_CONTEXT *pCallContext, NvU32 mapFlags, NV_ADDRESS_SPACE *pAddrSpace) { 180 return pMemory->__sysmemGetMapAddrSpace__(pMemory, pCallContext, mapFlags, pAddrSpace); 181 } 182 183 static inline NvBool sysmemIsExportAllowed_DISPATCH(struct SystemMemory *pMemory) { 184 return pMemory->__sysmemIsExportAllowed__(pMemory); 185 } 186 187 static inline NvU32 sysmemGetRefCount_DISPATCH(struct SystemMemory *pResource) { 188 return pResource->__sysmemGetRefCount__(pResource); 189 } 190 191 static inline void sysmemAddAdditionalDependants_DISPATCH(struct RsClient *pClient, struct SystemMemory *pResource, RsResourceRef *pReference) { 192 pResource->__sysmemAddAdditionalDependants__(pClient, pResource, pReference); 193 } 194 195 static inline NV_STATUS sysmemControl_Prologue_DISPATCH(struct SystemMemory *pResource, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 196 return pResource->__sysmemControl_Prologue__(pResource, pCallContext, pParams); 197 } 198 199 static inline NvBool sysmemIsGpuMapAllowed_DISPATCH(struct SystemMemory *pMemory, struct OBJGPU *pGpu) { 200 return pMemory->__sysmemIsGpuMapAllowed__(pMemory, pGpu); 201 } 202 203 static inline NV_STATUS sysmemUnmapFrom_DISPATCH(struct SystemMemory *pResource, RS_RES_UNMAP_FROM_PARAMS *pParams) { 204 return pResource->__sysmemUnmapFrom__(pResource, pParams); 205 } 206 207 static inline void sysmemControl_Epilogue_DISPATCH(struct SystemMemory *pResource, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 208 pResource->__sysmemControl_Epilogue__(pResource, pCallContext, pParams); 209 } 210 211 static inline NV_STATUS sysmemControlLookup_DISPATCH(struct SystemMemory *pResource, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams, const struct NVOC_EXPORTED_METHOD_DEF **ppEntry) { 212 return pResource->__sysmemControlLookup__(pResource, pParams, ppEntry); 213 } 214 215 static inline NV_STATUS sysmemControl_DISPATCH(struct SystemMemory *pMemory, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 216 return pMemory->__sysmemControl__(pMemory, pCallContext, pParams); 217 } 218 219 static inline NV_STATUS sysmemUnmap_DISPATCH(struct SystemMemory *pMemory, CALL_CONTEXT *pCallContext, RsCpuMapping *pCpuMapping) { 220 return pMemory->__sysmemUnmap__(pMemory, pCallContext, pCpuMapping); 221 } 222 223 static inline NV_STATUS sysmemGetMemInterMapParams_DISPATCH(struct SystemMemory *pMemory, RMRES_MEM_INTER_MAP_PARAMS *pParams) { 224 return pMemory->__sysmemGetMemInterMapParams__(pMemory, pParams); 225 } 226 227 static inline NV_STATUS sysmemGetMemoryMappingDescriptor_DISPATCH(struct SystemMemory *pMemory, MEMORY_DESCRIPTOR **ppMemDesc) { 228 return pMemory->__sysmemGetMemoryMappingDescriptor__(pMemory, ppMemDesc); 229 } 230 231 static inline NV_STATUS sysmemControlFilter_DISPATCH(struct SystemMemory *pResource, struct CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 232 return pResource->__sysmemControlFilter__(pResource, pCallContext, pParams); 233 } 234 235 static inline NV_STATUS sysmemControlSerialization_Prologue_DISPATCH(struct SystemMemory *pResource, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 236 return pResource->__sysmemControlSerialization_Prologue__(pResource, pCallContext, pParams); 237 } 238 239 static inline NvBool sysmemCanCopy_DISPATCH(struct SystemMemory *pStandardMemory) { 240 return pStandardMemory->__sysmemCanCopy__(pStandardMemory); 241 } 242 243 static inline NV_STATUS sysmemIsReady_DISPATCH(struct SystemMemory *pMemory, NvBool bCopyConstructorContext) { 244 return pMemory->__sysmemIsReady__(pMemory, bCopyConstructorContext); 245 } 246 247 static inline NV_STATUS sysmemCheckCopyPermissions_DISPATCH(struct SystemMemory *pMemory, struct OBJGPU *pDstGpu, struct Device *pDstDevice) { 248 return pMemory->__sysmemCheckCopyPermissions__(pMemory, pDstGpu, pDstDevice); 249 } 250 251 static inline void sysmemPreDestruct_DISPATCH(struct SystemMemory *pResource) { 252 pResource->__sysmemPreDestruct__(pResource); 253 } 254 255 static inline NV_STATUS sysmemIsDuplicate_DISPATCH(struct SystemMemory *pMemory, NvHandle hMemory, NvBool *pDuplicate) { 256 return pMemory->__sysmemIsDuplicate__(pMemory, hMemory, pDuplicate); 257 } 258 259 static inline void sysmemControlSerialization_Epilogue_DISPATCH(struct SystemMemory *pResource, CALL_CONTEXT *pCallContext, struct RS_RES_CONTROL_PARAMS_INTERNAL *pParams) { 260 pResource->__sysmemControlSerialization_Epilogue__(pResource, pCallContext, pParams); 261 } 262 263 static inline NV_STATUS sysmemMap_DISPATCH(struct SystemMemory *pMemory, CALL_CONTEXT *pCallContext, struct RS_CPU_MAP_PARAMS *pParams, RsCpuMapping *pCpuMapping) { 264 return pMemory->__sysmemMap__(pMemory, pCallContext, pParams, pCpuMapping); 265 } 266 267 static inline NvBool sysmemAccessCallback_DISPATCH(struct SystemMemory *pResource, struct RsClient *pInvokingClient, void *pAllocParams, RsAccessRight accessRight) { 268 return pResource->__sysmemAccessCallback__(pResource, pInvokingClient, pAllocParams, accessRight); 269 } 270 271 NV_STATUS sysmemConstruct_IMPL(struct SystemMemory *arg_pStandardMemory, CALL_CONTEXT *arg_pCallContext, struct RS_RES_ALLOC_PARAMS_INTERNAL *arg_pParams); 272 273 #define __nvoc_sysmemConstruct(arg_pStandardMemory, arg_pCallContext, arg_pParams) sysmemConstruct_IMPL(arg_pStandardMemory, arg_pCallContext, arg_pParams) 274 #undef PRIVATE_FIELD 275 276 277 NV_STATUS sysmemAllocResources(OBJGPU *pGpu, struct MemoryManager *pMemoryManager, 278 MEMORY_ALLOCATION_REQUEST *pAllocRequest, FB_ALLOC_INFO *pFbAllocInfo, 279 struct SystemMemory *pSystemMemory); 280 281 #endif 282 283 #ifdef __cplusplus 284 } // extern "C" 285 #endif 286 287 #endif // _G_SYSTEM_MEM_NVOC_H_ 288