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