1 /* 2 * SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 3 * SPDX-License-Identifier: MIT 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in 13 * all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24 #include "g_ce_utils_nvoc.h" 25 26 #ifndef CE_UTILS_H 27 #define CE_UTILS_H 28 29 #include "gpu/gpu_resource.h" // GpuResource 30 #include "class/cl0050.h" 31 #include "ctrl/ctrl0050.h" 32 33 #include "kernel/gpu/mem_mgr/channel_utils.h" 34 35 typedef struct 36 { 37 MEMORY_DESCRIPTOR *pMemDesc; 38 NvU64 offset; 39 NvU64 length; 40 NvU32 pattern; 41 NvU64 flags; 42 NvU64 submittedWorkId; // Payload to poll for async completion 43 } CEUTILS_MEMSET_PARAMS; 44 45 typedef struct 46 { 47 MEMORY_DESCRIPTOR *pSrcMemDesc; 48 MEMORY_DESCRIPTOR *pDstMemDesc; 49 NvU64 dstOffset; 50 NvU64 srcOffset; 51 NvU64 length; 52 NvU64 flags; 53 NvU64 submittedWorkId; // Payload to poll for async completion 54 } CEUTILS_MEMCOPY_PARAMS; 55 56 57 NVOC_PREFIX(ceutils) class CeUtils : Object 58 { 59 public: 60 NV_STATUS ceutilsConstruct(CeUtils *pCeUtils, OBJGPU *pGpu, NV0050_ALLOCATION_PARAMETERS *pAllocParams); 61 62 void ceutilsDestruct(CeUtils *pCeUtils); 63 64 NV_STATUS ceutilsInitialize(CeUtils *pCeUtils, OBJGPU *pGpu, NV0050_ALLOCATION_PARAMETERS *pAllocParams); 65 void ceutilsDeinit(CeUtils *pCeUtils); 66 void ceutilsRegisterGPUInstance(CeUtils *pCeUtils, KERNEL_MIG_GPU_INSTANCE *pKernelMIGGPUInstance); 67 68 NV_STATUS ceutilsMemset(CeUtils *pCeUtils, CEUTILS_MEMSET_PARAMS *pParams); 69 NV_STATUS ceutilsMemcopy(CeUtils *pCeUtils, CEUTILS_MEMCOPY_PARAMS *pParams); 70 71 NvU64 ceutilsUpdateProgress(CeUtils *pCeUtils); 72 void ceutilsServiceInterrupts(CeUtils *pCeUtils); 73 74 // 75 // Internal states 76 // 77 78 NvHandle hClient; 79 NvHandle hDevice; 80 NvHandle hSubdevice; 81 82 OBJCHANNEL *pChannel; 83 KERNEL_MIG_GPU_INSTANCE *pKernelMIGGPUInstance; 84 OBJGPU *pGpu; 85 86 KernelCE *pKCe; 87 NvBool bUseVasForCeCopy; 88 NvU32 hTdCopyClass; 89 NvU64 lastSubmittedPayload; 90 NvU64 lastCompletedPayload; 91 }; 92 93 94 #if defined(DEBUG) || defined (DEVELOP) 95 NVOC_PREFIX(ceutilsapi) class CeUtilsApi : GpuResource 96 { 97 public: 98 NV_STATUS ceutilsapiConstruct(CeUtilsApi *pCeUtilsApi, CALL_CONTEXT *pCallContext, 99 RS_RES_ALLOC_PARAMS_INTERNAL *pParams) 100 : GpuResource(pCallContext, pParams); 101 102 void ceutilsapiDestruct(CeUtilsApi *pCeUtilsApi); 103 104 // 105 // Below APIs are only provided for SRT testing, thus only available for debug or 106 // develop driver builds 107 // 108 // 109 RMCTRL_EXPORT(NV0050_CTRL_CMD_MEMSET, RMCTRL_FLAGS(PRIVILEGED, API_LOCK_READONLY)) 110 NV_STATUS ceutilsapiCtrlCmdMemset(CeUtilsApi *pCeUtilsApi, NV0050_CTRL_MEMSET_PARAMS *pParams); 111 112 RMCTRL_EXPORT(NV0050_CTRL_CMD_MEMCOPY, RMCTRL_FLAGS(PRIVILEGED, API_LOCK_READONLY)) 113 NV_STATUS ceutilsapiCtrlCmdMemcopy(CeUtilsApi *pCeUtilsApi, NV0050_CTRL_MEMCOPY_PARAMS *pParams); 114 115 RMCTRL_EXPORT(NV0050_CTRL_CMD_CHECK_PROGRESS, RMCTRL_FLAGS(PRIVILEGED, API_LOCK_READONLY)) 116 NV_STATUS ceutilsapiCtrlCmdCheckProgress(CeUtilsApi *pCeUtilsApi, NV0050_CTRL_CHECK_PROGRESS_PARAMS *pParams); 117 118 CeUtils *pCeUtils; 119 }; 120 #endif 121 122 #endif // CE_UTILS_H 123