1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2022-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 #define NVOC_KERNEL_MIG_MANAGER_H_PRIVATE_ACCESS_ALLOWED
25 
26 #include "kernel/gpu/mem_mgr/mem_mgr.h"
27 #include "kernel/gpu/mig_mgr/kernel_mig_manager.h"
28 #include "kernel/gpu/fifo/kernel_fifo.h"
29 
30 /*!
31  * @brief   Function to determine whether gpu instance flags are valid
32  *          for this GPU
33  *
34  * @param[IN]   pGpu
35  * @param[IN]   pKernelMIGManager
36  * @param[IN]   gpuInstanceFlag       NV2080_CTRL_GPU_PARTITION_FLAG_*
37  *
38  * @return  Returns true if flags are valid
39  */
40 NvBool
kmigmgrIsGPUInstanceFlagValid_GH100(OBJGPU * pGpu,KernelMIGManager * pGrMgr,NvU32 gpuInstanceFlag)41 kmigmgrIsGPUInstanceFlagValid_GH100
42 (
43     OBJGPU *pGpu,
44     KernelMIGManager *pGrMgr,
45     NvU32 gpuInstanceFlag
46 )
47 {
48     NvU32 memSizeFlag = DRF_VAL(2080_CTRL_GPU, _PARTITION_FLAG,
49                                 _MEMORY_SIZE, gpuInstanceFlag);
50     NvU32 computeSizeFlag = DRF_VAL(2080_CTRL_GPU, _PARTITION_FLAG,
51                                     _COMPUTE_SIZE, gpuInstanceFlag);
52     switch (memSizeFlag)
53     {
54         case NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_FULL:
55         case NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_HALF:
56         case NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_QUARTER:
57         case NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_EIGHTH:
58             break;
59         default:
60             NV_PRINTF(LEVEL_ERROR, "Unrecognized GPU mem partitioning flag 0x%x\n",
61                       memSizeFlag);
62             return NV_FALSE;
63     }
64 
65     switch (computeSizeFlag)
66     {
67         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_FULL:
68         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_HALF:
69         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_HALF:
70         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_QUARTER:
71         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_QUARTER:
72         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_EIGHTH:
73             break;
74         default:
75             NV_PRINTF(LEVEL_ERROR, "Unrecognized GPU compute partitioning flag 0x%x\n",
76                       computeSizeFlag);
77             return NV_FALSE;
78     }
79     return NV_TRUE;
80 }
81 
82 /*!
83  * @brief   Function to determine whether gpu instance flag combinations are valid
84  *          for this GPU
85  */
86 NvBool
kmigmgrIsGPUInstanceCombinationValid_GH100(OBJGPU * pGpu,KernelMIGManager * pKernelMIGManager,NvU32 gpuInstanceFlag)87 kmigmgrIsGPUInstanceCombinationValid_GH100
88 (
89     OBJGPU *pGpu,
90     KernelMIGManager *pKernelMIGManager,
91     NvU32 gpuInstanceFlag
92 )
93 {
94     NvU32 memSizeFlag = DRF_VAL(2080_CTRL_GPU, _PARTITION_FLAG, _MEMORY_SIZE, gpuInstanceFlag);
95     NvU32 computeSizeFlag = DRF_VAL(2080_CTRL_GPU, _PARTITION_FLAG, _COMPUTE_SIZE, gpuInstanceFlag);
96     NvU32 smallestComputeSizeFlag;
97 
98     if (!kmigmgrIsGPUInstanceFlagValid_HAL(pGpu, pKernelMIGManager, gpuInstanceFlag))
99     {
100         return NV_FALSE;
101     }
102 
103     NV_CHECK_OR_RETURN(LEVEL_ERROR,
104         kmigmgrGetSmallestGpuInstanceSize(pGpu, pKernelMIGManager, &smallestComputeSizeFlag) == NV_OK,
105         NV_FALSE);
106 
107     // JPG_OFA profile is only available on the smallest partition
108     if (FLD_TEST_REF(NV2080_CTRL_GPU_PARTITION_FLAG_REQ_DEC_JPG_OFA, _ENABLE, gpuInstanceFlag))
109     {
110         if (computeSizeFlag != smallestComputeSizeFlag)
111         {
112             return NV_FALSE;
113         }
114     }
115 
116     switch (computeSizeFlag)
117     {
118         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_FULL:
119             NV_CHECK_OR_RETURN(LEVEL_SILENT, memSizeFlag == NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_FULL,
120                                NV_FALSE);
121             break;
122         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_HALF:
123             NV_CHECK_OR_RETURN(LEVEL_SILENT, memSizeFlag == NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_HALF,
124                                NV_FALSE);
125             break;
126         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_HALF:
127             NV_CHECK_OR_RETURN(LEVEL_SILENT, memSizeFlag == NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_HALF,
128                                NV_FALSE);
129             break;
130         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_QUARTER:
131             NV_CHECK_OR_RETURN(LEVEL_SILENT, memSizeFlag == NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_QUARTER,
132                                NV_FALSE);
133             break;
134         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_MINI_QUARTER:
135             NV_CHECK_OR_RETURN(LEVEL_SILENT, memSizeFlag == NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_QUARTER,
136                                NV_FALSE);
137             break;
138         case NV2080_CTRL_GPU_PARTITION_FLAG_COMPUTE_SIZE_EIGHTH:
139             NV_CHECK_OR_RETURN(LEVEL_SILENT, memSizeFlag == NV2080_CTRL_GPU_PARTITION_FLAG_MEMORY_SIZE_EIGHTH,
140                                NV_FALSE);
141             break;
142         default:
143             NV_ASSERT(0);
144             return NV_FALSE;
145     }
146     return NV_TRUE;
147 }
148