1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2014-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 //
25 // This file provides common types for both UVM driver and RM's UVM interface.
26 //
27 
28 #ifndef _NV_UVM_TYPES_H_
29 #define _NV_UVM_TYPES_H_
30 
31 #include "nvtypes.h"
32 #include "nvstatus.h"
33 #include "nvgputypes.h"
34 #include "nvCpuUuid.h"
35 
36 
37 //
38 // Default Page Size if left "0" because in RM BIG page size is default & there
39 // are multiple BIG page sizes in RM. These defines are used as flags to "0"
40 // should be OK when user is not sure which pagesize allocation it wants
41 //
42 #define UVM_PAGE_SIZE_DEFAULT    0x0
43 #define UVM_PAGE_SIZE_4K         0x1000
44 #define UVM_PAGE_SIZE_64K        0x10000
45 #define UVM_PAGE_SIZE_128K       0x20000
46 #define UVM_PAGE_SIZE_2M         0x200000
47 #define UVM_PAGE_SIZE_512M       0x20000000
48 
49 //
50 // When modifying flags, make sure they are compatible with the mirrored
51 // PMA_* flags in phys_mem_allocator.h.
52 //
53 // Input flags
54 #define UVM_PMA_ALLOCATE_DONT_EVICT             NVBIT(0)
55 #define UVM_PMA_ALLOCATE_PINNED                 NVBIT(1)
56 #define UVM_PMA_ALLOCATE_SPECIFY_MINIMUM_SPEED  NVBIT(2)
57 #define UVM_PMA_ALLOCATE_SPECIFY_ADDRESS_RANGE  NVBIT(3)
58 #define UVM_PMA_ALLOCATE_SPECIFY_REGION_ID      NVBIT(4)
59 #define UVM_PMA_ALLOCATE_PREFER_SLOWEST         NVBIT(5)
60 #define UVM_PMA_ALLOCATE_CONTIGUOUS             NVBIT(6)
61 #define UVM_PMA_ALLOCATE_PERSISTENT             NVBIT(7)
62 #define UVM_PMA_ALLOCATE_PROTECTED_REGION       NVBIT(8)
63 #define UVM_PMA_ALLOCATE_FORCE_ALIGNMENT        NVBIT(9)
64 #define UVM_PMA_ALLOCATE_NO_ZERO                NVBIT(10)
65 #define UVM_PMA_ALLOCATE_TURN_BLACKLIST_OFF     NVBIT(11)
66 #define UVM_PMA_ALLOCATE_ALLOW_PARTIAL          NVBIT(12)
67 
68 // Output flags
69 #define UVM_PMA_ALLOCATE_RESULT_IS_ZERO         NVBIT(0)
70 
71 // Input flags to pmaFree
72 #define UVM_PMA_FREE_IS_ZERO                    NVBIT(0)
73 
74 //
75 // Indicate that the PMA operation is being done from one of the PMA eviction
76 // callbacks.
77 //
78 // Notably this flag is currently used only by the UVM/RM interface and not
79 // mirrored in PMA.
80 //
81 #define UVM_PMA_CALLED_FROM_PMA_EVICTION        16384
82 
83 #define UVM_UUID_LEN 16
84 #define UVM_SW_OBJ_SUBCHANNEL 5
85 
86 typedef unsigned long long UvmGpuPointer;
87 
88 //
89 // The following typedefs serve to explain the resources they point to.
90 // The actual resources remain RM internal and not exposed.
91 //
92 typedef struct uvmGpuSession_tag       *uvmGpuSessionHandle;       // gpuSessionHandle
93 typedef struct uvmGpuDevice_tag        *uvmGpuDeviceHandle;        // gpuDeviceHandle
94 typedef struct uvmGpuAddressSpace_tag  *uvmGpuAddressSpaceHandle;  // gpuAddressSpaceHandle
95 typedef struct uvmGpuTsg_tag           *uvmGpuTsgHandle;           // gpuTsgHandle
96 typedef struct uvmGpuChannel_tag       *uvmGpuChannelHandle;       // gpuChannelHandle
97 typedef struct uvmGpuCopyEngine_tag    *uvmGpuCopyEngineHandle;    // gpuObjectHandle
98 
99 typedef struct UvmGpuMemoryInfo_tag
100 {
101     // Out: Memory layout.
102     NvU32 kind;
103 
104     // Out: Set to TRUE, if the allocation is in sysmem.
105     NvBool sysmem;
106 
107     // Out: Set to TRUE, if this allocation is treated as EGM.
108     //      sysmem is also TRUE when egm is TRUE.
109     NvBool egm;
110 
111     // Out: Set to TRUE, if the allocation is a constructed
112     //      under a Device or Subdevice.
113     //      All permutations of sysmem and deviceDescendant are valid.
114     //      !sysmem && !deviceDescendant implies a fabric allocation.
115     NvBool deviceDescendant;
116 
117     // Out: Page size associated with the phys alloc.
118     NvU64 pageSize;
119 
120     // Out: Set to TRUE, if the allocation is contiguous.
121     NvBool contig;
122 
123     // Out: Starting Addr if the allocation is contiguous.
124     //      This is only valid if contig is NV_TRUE.
125     NvU64 physAddr;
126 
127     // Out: Total size of the allocation.
128     NvU64 size;
129 
130     // Out: Uuid of the GPU to which the allocation belongs.
131     //      This is only valid if deviceDescendant is NV_TRUE.
132     //      When egm is NV_TRUE, this is also the UUID of the GPU
133     //      for which EGM is local.
134     //      If the GPU has SMC enabled, the UUID is the GI UUID.
135     //      Otherwise, it is the UUID for the physical GPU.
136     //      Note: If the allocation is owned by a device in
137     //      an SLI group and the allocation is broadcast
138     //      across the SLI group, this UUID will be any one
139     //      of the subdevices in the SLI group.
140     NvProcessorUuid uuid;
141 } UvmGpuMemoryInfo;
142 
143 // Some resources must share the same virtual mappings across channels. A mapped
144 // resource must be shared by a channel iff:
145 //
146 // 1) The channel belongs to a TSG (UvmGpuChannelInstanceInfo::bTsgChannel is
147 //    NV_TRUE).
148 //
149 // 2) The channel is in the same TSG as all other channels sharing that mapping
150 //    (UvmGpuChannelInstanceInfo::tsgId matches among channels).
151 //
152 // 3) The channel is in the same GPU address space as the other channels
153 //    sharing that mapping.
154 //
155 // 4) The resource handle(s) match those of the shared mapping
156 //    (UvmGpuChannelResourceInfo::resourceDescriptor and
157 //    UvmGpuChannelResourceInfo::resourceId).
158 typedef struct UvmGpuChannelResourceInfo_tag
159 {
160     // Out: Ptr to the RM memDesc of the channel resource.
161     NvP64 resourceDescriptor;
162 
163     // Out: RM ID of the channel resource.
164     NvU32 resourceId;
165 
166     // Out: Alignment needed for the resource allocation.
167     NvU64 alignment;
168 
169     // Out: Info about the resource allocation.
170     UvmGpuMemoryInfo resourceInfo;
171 } UvmGpuChannelResourceInfo;
172 
173 typedef struct UvmGpuPagingChannelInfo_tag
174 {
175     // Pointer to a shadown buffer mirroring the contents of the error notifier
176     // for the paging channel
177     NvNotification    *shadowErrorNotifier;
178 } UvmGpuPagingChannelInfo;
179 
180 typedef enum
181 {
182     UVM_GPU_CHANNEL_ENGINE_TYPE_GR = 1,
183     UVM_GPU_CHANNEL_ENGINE_TYPE_CE = 2,
184     UVM_GPU_CHANNEL_ENGINE_TYPE_SEC2 = 3,
185 } UVM_GPU_CHANNEL_ENGINE_TYPE;
186 
187 #define UVM_GPU_CHANNEL_MAX_RESOURCES   13
188 
189 typedef struct UvmGpuChannelInstanceInfo_tag
190 {
191     // Out: Starting address of the channel instance.
192     NvU64 base;
193 
194     // Out: Set to NV_TRUE, if the instance is in sysmem.
195     //      Set to NV_FALSE, if the instance is in vidmem.
196     NvBool sysmem;
197 
198     // Out: Hardware runlist ID.
199     NvU32 runlistId;
200 
201     // Out: Hardware channel ID.
202     NvU32 chId;
203 
204     // Out: NV_TRUE if the channel belongs to a subcontext or NV_FALSE if it
205     // belongs to a regular context.
206     NvBool bInSubctx;
207 
208     // Out: ID of the subcontext to which the channel belongs.
209     NvU32 subctxId;
210 
211     // Out: Whether the channel belongs to a TSG or not
212     NvBool bTsgChannel;
213 
214     // Out: ID of the TSG to which the channel belongs
215     NvU32 tsgId;
216 
217     // Out: Maximum number of subcontexts in the TSG to which the channel belongs
218     NvU32 tsgMaxSubctxCount;
219 
220     // Out: Info of channel resources associated with the channel.
221     UvmGpuChannelResourceInfo resourceInfo[UVM_GPU_CHANNEL_MAX_RESOURCES];
222 
223     // Out: Number of valid entries in resourceInfo array.
224     NvU32 resourceCount;
225 
226     // Out: Type of the engine the channel is bound to
227     NvU32 channelEngineType;
228 
229     // Out: Channel handle to be used in the CLEAR_FAULTED method
230     NvU32 clearFaultedToken;
231 
232     // Out: Address of the NV_CHRAM_CHANNEL register required to clear the
233     // ENG_FAULTED/PBDMA_FAULTED bits after servicing non-replayable faults on
234     // Ampere+ GPUs
235     volatile NvU32 *pChramChannelRegister;
236 
237     // Out: Address of the Runlist PRI Base Register required to ring the
238     // doorbell after clearing the faulted bit.
239     volatile NvU32 *pRunlistPRIBaseRegister;
240 
241     // Out: SMC engine id to which the GR channel is bound, or zero if the GPU
242     // does not support SMC or it is a CE channel
243     NvU32 smcEngineId;
244 
245     // Out: Start of the VEID range assigned to the SMC engine the GR channel
246     // is bound to, or zero if the GPU does not support SMC or it is a CE
247     // channel
248     NvU32 smcEngineVeIdOffset;
249 } UvmGpuChannelInstanceInfo;
250 
251 typedef struct UvmGpuChannelResourceBindParams_tag
252 {
253     // In: RM ID of the channel resource.
254     NvU32 resourceId;
255 
256     // In: Starting VA at which the channel resource is mapped.
257     NvU64 resourceVa;
258 } UvmGpuChannelResourceBindParams;
259 
260 typedef struct UvmGpuChannelInfo_tag
261 {
262     volatile unsigned *gpGet;
263     volatile unsigned *gpPut;
264     UvmGpuPointer     *gpFifoEntries;
265     unsigned           numGpFifoEntries;
266     unsigned           channelClassNum;
267 
268     // The errorNotifier is filled out when the channel hits an RC error.
269     NvNotification    *errorNotifier;
270 
271     NvU32              hwRunlistId;
272     NvU32              hwChannelId;
273 
274     volatile unsigned *dummyBar1Mapping;
275 
276     // These values are filled by nvUvmInterfaceCopyEngineAlloc. The work
277     // submission token requires the channel to be bound to a runlist and that
278     // happens after CE allocation.
279     volatile NvU32    *workSubmissionOffset;
280 
281     // To be deprecated. See pWorkSubmissionToken below.
282     NvU32              workSubmissionToken;
283 
284     //
285     // This is the memory location where the most recently updated work
286     // submission token for this channel will be written to. After submitting
287     // new work and updating GP_PUT with the appropriate fence, the token must
288     // be read from this location before writing it to the workSubmissionOffset
289     // to kick off the new work.
290     //
291     volatile NvU32    *pWorkSubmissionToken;
292 
293     // GPU VAs of both GPFIFO and GPPUT are needed in Confidential Computing
294     // so a channel can be controlled via another channel (SEC2 or WLC/LCIC)
295     NvU64             gpFifoGpuVa;
296     NvU64             gpPutGpuVa;
297     NvU64             gpGetGpuVa;
298     // GPU VA of work submission offset is needed in Confidential Computing
299     // so CE channels can ring doorbell of other channels as required for
300     // WLC/LCIC work submission
301     NvU64             workSubmissionOffsetGpuVa;
302 } UvmGpuChannelInfo;
303 
304 typedef enum
305 {
306     // This value must be passed by Pascal and pre-Pascal GPUs for those
307     // allocations for which a specific location cannot be enforced.
308     UVM_BUFFER_LOCATION_DEFAULT = 0,
309 
310     UVM_BUFFER_LOCATION_SYS  = 1,
311     UVM_BUFFER_LOCATION_VID  = 2,
312 } UVM_BUFFER_LOCATION;
313 
314 typedef struct UvmGpuTsgAllocParams_tag
315 {
316     // Interpreted as UVM_GPU_CHANNEL_ENGINE_TYPE
317     NvU32 engineType;
318 
319     // Index of the engine the TSG is bound to.
320     // Ignored if engineType is anything other than
321     // UVM_GPU_CHANNEL_ENGINE_TYPE_CE.
322     NvU32 engineIndex;
323 } UvmGpuTsgAllocParams;
324 
325 typedef struct UvmGpuChannelAllocParams_tag
326 {
327     NvU32 numGpFifoEntries;
328 
329     // The next two fields store UVM_BUFFER_LOCATION values
330     NvU32 gpFifoLoc;
331     NvU32 gpPutLoc;
332 } UvmGpuChannelAllocParams;
333 
334 typedef struct UvmGpuPagingChannelAllocParams_tag
335 {
336     // Index of the LCE engine the channel will be bound to, a zero-based offset
337     // from NV2080_ENGINE_TYPE_COPY0.
338     NvU32 engineIndex;
339 } UvmGpuPagingChannelAllocParams;
340 
341 // The max number of Copy Engines supported by a GPU.
342 // The gpu ops build has a static assert that this is the correct number.
343 #define UVM_COPY_ENGINE_COUNT_MAX 64
344 
345 typedef struct
346 {
347     // True if the CE is supported at all
348     NvBool supported:1;
349 
350     // True if the CE is synchronous with GR
351     NvBool grce:1;
352 
353     // True if the CE shares physical CEs with any other CE
354     //
355     // The value returned by RM for this field may change when a GPU is
356     // registered with RM for the first time, so UVM needs to query it
357     // again each time a GPU is registered.
358     NvBool shared:1;
359 
360     // True if the CE can give enhanced performance for SYSMEM reads over other CEs
361     NvBool sysmemRead:1;
362 
363     // True if the CE can give enhanced performance for SYSMEM writes over other CEs
364     NvBool sysmemWrite:1;
365 
366     // True if the CE can be used for SYSMEM transactions
367     NvBool sysmem:1;
368 
369     // True if the CE can be used for P2P transactions using NVLINK
370     NvBool nvlinkP2p:1;
371 
372     // True if the CE can be used for P2P transactions
373     NvBool p2p:1;
374 
375     // Mask of physical CEs assigned to this LCE
376     //
377     // The value returned by RM for this field may change when a GPU is
378     // registered with RM for the first time, so UVM needs to query it
379     // again each time a GPU is registered.
380     NvU32 cePceMask;
381 } UvmGpuCopyEngineCaps;
382 
383 typedef struct UvmGpuCopyEnginesCaps_tag
384 {
385     // Supported CEs may not be contiguous
386     UvmGpuCopyEngineCaps copyEngineCaps[UVM_COPY_ENGINE_COUNT_MAX];
387 } UvmGpuCopyEnginesCaps;
388 
389 typedef enum
390 {
391     UVM_LINK_TYPE_NONE,
392     UVM_LINK_TYPE_PCIE,
393     UVM_LINK_TYPE_NVLINK_1,
394     UVM_LINK_TYPE_NVLINK_2,
395     UVM_LINK_TYPE_NVLINK_3,
396     UVM_LINK_TYPE_NVLINK_4,
397     UVM_LINK_TYPE_C2C,
398 } UVM_LINK_TYPE;
399 
400 typedef struct UvmGpuCaps_tag
401 {
402     // If numaEnabled is NV_TRUE, then the system address of allocated GPU
403     // memory can be converted to struct pages. See
404     // UvmGpuInfo::systemMemoryWindowStart.
405     NvBool   numaEnabled;
406     NvU32    numaNodeId;
407 } UvmGpuCaps;
408 
409 typedef struct UvmGpuAddressSpaceInfo_tag
410 {
411     NvU64           bigPageSize;
412 
413     NvBool          atsEnabled;
414 
415     // Mapped registers that contain the current GPU time
416     volatile NvU32  *time0Offset;
417     volatile NvU32  *time1Offset;
418 
419     // Maximum number of subcontexts supported under this GPU address space
420     NvU32           maxSubctxCount;
421 
422     NvBool          smcEnabled;
423 
424     NvU32           smcSwizzId;
425 
426     NvU32           smcGpcCount;
427 } UvmGpuAddressSpaceInfo;
428 
429 typedef struct UvmGpuAllocInfo_tag
430 {
431     NvU64   gpuPhysOffset;          // Returns gpuPhysOffset if contiguous requested
432     NvU64   pageSize;               // default is RM big page size - 64K or 128 K" else use 4K or 2M
433     NvU64   alignment;              // Virtual alignment
434     NvBool  bContiguousPhysAlloc;   // Flag to request contiguous physical allocation
435     NvBool  bMemGrowsDown;          // Causes RM to reserve physical heap from top of FB
436     NvBool  bPersistentVidmem;      // Causes RM to allocate persistent video memory
437     NvHandle hPhysHandle;           // Handle for phys allocation either provided or retrieved
438     NvBool   bUnprotected;            // Allocation to be made in unprotected memory whenever
439                                       // SEV or GPU CC modes are enabled. Ignored otherwise
440 } UvmGpuAllocInfo;
441 
442 typedef enum
443 {
444     UVM_VIRT_MODE_NONE = 0,             // Baremetal or passthrough virtualization
445     UVM_VIRT_MODE_LEGACY = 1,           // Virtualization without SRIOV support
446     UVM_VIRT_MODE_SRIOV_HEAVY = 2,      // Virtualization with SRIOV Heavy configured
447     UVM_VIRT_MODE_SRIOV_STANDARD = 3,   // Virtualization with SRIOV Standard configured
448     UVM_VIRT_MODE_COUNT = 4,
449 } UVM_VIRT_MODE;
450 
451 // !!! The following enums (with UvmRm prefix) are defined and documented in
452 // mm/uvm/interface/uvm_types.h and must be mirrored. Please refer to that file
453 // for more details.
454 
455 // UVM GPU mapping types
456 typedef enum
457 {
458     UvmRmGpuMappingTypeDefault = 0,
459     UvmRmGpuMappingTypeReadWriteAtomic = 1,
460     UvmRmGpuMappingTypeReadWrite = 2,
461     UvmRmGpuMappingTypeReadOnly = 3,
462     UvmRmGpuMappingTypeCount = 4
463 } UvmRmGpuMappingType;
464 
465 // UVM GPU caching types
466 typedef enum
467 {
468     UvmRmGpuCachingTypeDefault = 0,
469     UvmRmGpuCachingTypeForceUncached = 1,
470     UvmRmGpuCachingTypeForceCached = 2,
471     UvmRmGpuCachingTypeCount = 3
472 } UvmRmGpuCachingType;
473 
474 // UVM GPU format types
475 typedef enum {
476    UvmRmGpuFormatTypeDefault = 0,
477    UvmRmGpuFormatTypeBlockLinear = 1,
478    UvmRmGpuFormatTypeCount = 2
479 } UvmRmGpuFormatType;
480 
481 // UVM GPU Element bits types
482 typedef enum {
483    UvmRmGpuFormatElementBitsDefault = 0,
484    UvmRmGpuFormatElementBits8 = 1,
485    UvmRmGpuFormatElementBits16 = 2,
486    // Cuda does not support 24-bit width
487    UvmRmGpuFormatElementBits32 = 4,
488    UvmRmGpuFormatElementBits64 = 5,
489    UvmRmGpuFormatElementBits128 = 6,
490    UvmRmGpuFormatElementBitsCount = 7
491 } UvmRmGpuFormatElementBits;
492 
493 // UVM GPU Compression types
494 typedef enum {
495     UvmRmGpuCompressionTypeDefault = 0,
496     UvmRmGpuCompressionTypeEnabledNoPlc = 1,
497     UvmRmGpuCompressionTypeCount = 2
498 } UvmRmGpuCompressionType;
499 
500 typedef struct UvmGpuExternalMappingInfo_tag
501 {
502     // In: GPU caching ability.
503     UvmRmGpuCachingType cachingType;
504 
505     // In: Virtual permissions.
506     UvmRmGpuMappingType mappingType;
507 
508     // In: RM virtual mapping memory format
509     UvmRmGpuFormatType formatType;
510 
511     // In: RM virtual mapping element bits
512     UvmRmGpuFormatElementBits elementBits;
513 
514     // In: RM virtual compression type
515     UvmRmGpuCompressionType compressionType;
516 
517     // In: Size of the buffer to store PTEs (in bytes).
518     NvU64 pteBufferSize;
519 
520     // In: Page size for mapping
521     //     If this field is passed as 0, the page size
522     //     of the allocation is used for mapping.
523     //     nvUvmInterfaceGetExternalAllocPtes must pass
524     //     this field as zero.
525     NvU64 mappingPageSize;
526 
527     // In: Pointer to a buffer to store PTEs.
528     // Out: The interface will fill the buffer with PTEs
529     NvU64 *pteBuffer;
530 
531     // Out: Number of PTEs filled in to the buffer.
532     NvU64 numWrittenPtes;
533 
534     // Out: Number of PTEs remaining to be filled
535     //      if the buffer is not sufficient to accommodate
536     //      requested PTEs.
537     NvU64 numRemainingPtes;
538 
539     // Out: PTE size (in bytes)
540     NvU32 pteSize;
541 } UvmGpuExternalMappingInfo;
542 
543 typedef struct UvmGpuP2PCapsParams_tag
544 {
545     // Out: peerId[i] contains gpu[i]'s peer id of gpu[1 - i]. Only defined if
546     // the GPUs are direct peers.
547     NvU32 peerIds[2];
548 
549     // Out: peerId[i] contains gpu[i]'s EGM peer id of gpu[1 - i]. Only defined
550     // if the GPUs are direct peers and EGM enabled in the system.
551     NvU32 egmPeerIds[2];
552 
553     // Out: UVM_LINK_TYPE
554     NvU32 p2pLink;
555 
556     // Out: optimalNvlinkWriteCEs[i] contains gpu[i]'s optimal CE for writing to
557     // gpu[1 - i]. The CE indexes are valid only if the GPUs are NVLink peers.
558     //
559     // The value returned by RM for this field may change when a GPU is
560     // registered with RM for the first time, so UVM needs to query it again
561     // each time a GPU is registered.
562     NvU32 optimalNvlinkWriteCEs[2];
563 
564     // Out: Maximum unidirectional bandwidth between the peers in megabytes per
565     // second, not taking into account the protocols overhead. The reported
566     // bandwidth for indirect peers is zero.
567     NvU32 totalLinkLineRateMBps;
568 
569     // Out: True if the peers have a indirect link to communicate. On P9
570     // systems, this is true if peers are connected to different NPUs that
571     // forward the requests between them.
572     NvU32 indirectAccess      : 1;
573 } UvmGpuP2PCapsParams;
574 
575 // Platform-wide information
576 typedef struct UvmPlatformInfo_tag
577 {
578     // Out: ATS (Address Translation Services) is supported
579     NvBool atsSupported;
580 
581     // Out: True if HW trusted execution, such as AMD's SEV-SNP or Intel's TDX,
582     // is enabled in the VM, indicating that Confidential Computing must be
583     // also enabled in the GPU(s); these two security features are either both
584     // enabled, or both disabled.
585     NvBool confComputingEnabled;
586 } UvmPlatformInfo;
587 
588 typedef struct UvmGpuClientInfo_tag
589 {
590     NvHandle hClient;
591 
592     NvHandle hSmcPartRef;
593 } UvmGpuClientInfo;
594 
595 typedef enum
596 {
597     UVM_GPU_CONF_COMPUTE_MODE_NONE,
598     UVM_GPU_CONF_COMPUTE_MODE_APM,
599     UVM_GPU_CONF_COMPUTE_MODE_HCC,
600     UVM_GPU_CONF_COMPUTE_MODE_COUNT
601 } UvmGpuConfComputeMode;
602 
603 typedef struct UvmGpuConfComputeCaps_tag
604 {
605     // Out: GPU's confidential compute mode
606     UvmGpuConfComputeMode mode;
607 } UvmGpuConfComputeCaps;
608 
609 #define UVM_GPU_NAME_LENGTH 0x40
610 
611 typedef struct UvmGpuInfo_tag
612 {
613     // Printable gpu name
614     char name[UVM_GPU_NAME_LENGTH];
615 
616     // Uuid of the physical GPU or GI UUID if nvUvmInterfaceGetGpuInfo()
617     // requested information for a valid SMC partition.
618     NvProcessorUuid uuid;
619 
620     // Gpu architecture; NV2080_CTRL_MC_ARCH_INFO_ARCHITECTURE_*
621     NvU32 gpuArch;
622 
623     // Gpu implementation; NV2080_CTRL_MC_ARCH_INFO_IMPLEMENTATION_*
624     NvU32 gpuImplementation;
625 
626     // Host (gpfifo) class; *_CHANNEL_GPFIFO_*, e.g. KEPLER_CHANNEL_GPFIFO_A
627     NvU32 hostClass;
628 
629     // Copy engine (dma) class; *_DMA_COPY_*, e.g. KEPLER_DMA_COPY_A
630     NvU32 ceClass;
631 
632     // Compute class; *_COMPUTE_*, e.g. KEPLER_COMPUTE_A
633     NvU32 computeClass;
634 
635     // Set if GPU supports TCC Mode & is in TCC mode.
636     NvBool gpuInTcc;
637 
638     // Number of subdevices in SLI group.
639     NvU32 subdeviceCount;
640 
641     // Virtualization mode of this gpu.
642     NvU32 virtMode;         // UVM_VIRT_MODE
643 
644     // NV_TRUE if this is a simulated/emulated GPU. NV_FALSE, otherwise.
645     NvBool isSimulated;
646 
647     // Number of GPCs
648     // If SMC is enabled, this is the currently configured number of GPCs for
649     // the given partition (also see the smcSwizzId field below).
650     NvU32 gpcCount;
651 
652     // Maximum number of GPCs; NV_SCAL_LITTER_NUM_GPCS
653     // This number is independent of the partition configuration, and can be
654     // used to conservatively size GPU-global constructs.
655     NvU32 maxGpcCount;
656 
657     // Number of TPCs
658     NvU32 tpcCount;
659 
660     // Maximum number of TPCs per GPC
661     NvU32 maxTpcPerGpcCount;
662 
663     // NV_TRUE if SMC is enabled on this GPU.
664     NvBool smcEnabled;
665 
666     // SMC partition ID (unique per GPU); note: valid when first looked up in
667     // nvUvmInterfaceGetGpuInfo(), but not guaranteed to remain valid.
668     // nvUvmInterfaceDeviceCreate() re-verifies the swizzId and fails if it is
669     // no longer valid.
670     NvU32 smcSwizzId;
671 
672     UvmGpuClientInfo smcUserClientInfo;
673 
674     // Confidential Compute capabilities of this GPU
675     UvmGpuConfComputeCaps gpuConfComputeCaps;
676 
677     // UVM_LINK_TYPE
678     NvU32 sysmemLink;
679 
680     // See UvmGpuP2PCapsParams::totalLinkLineRateMBps
681     NvU32 sysmemLinkRateMBps;
682 
683     // On coherent systems each GPU maps its memory to a window in the System
684     // Physical Address (SPA) space. The following fields describe that window.
685     //
686     // systemMemoryWindowSize > 0 indicates that the window is valid. meaning
687     // that GPU memory can be mapped by the CPU as cache-coherent by adding the
688     // GPU address to the window start.
689     NvU64 systemMemoryWindowStart;
690     NvU64 systemMemoryWindowSize;
691 
692     // This tells if the GPU is connected to NVSwitch. On systems with NVSwitch
693     // all GPUs are connected to it. If connectedToSwitch is NV_TRUE,
694     // nvswitchMemoryWindowStart tells the base address for the GPU in the
695     // NVSwitch address space. It is used when creating PTEs of memory mappings
696     // to NVSwitch peers.
697     NvBool connectedToSwitch;
698     NvU64 nvswitchMemoryWindowStart;
699 
700     // local EGM properties
701     // NV_TRUE if EGM is enabled
702     NvBool   egmEnabled;
703     // Peer ID to reach local EGM when EGM is enabled
704     NvU8     egmPeerId;
705     // EGM base address to offset in the GMMU PTE entry for EGM mappings
706     NvU64    egmBaseAddr;
707 } UvmGpuInfo;
708 
709 typedef struct UvmGpuFbInfo_tag
710 {
711     // Max physical address that can be allocated by UVM. This excludes internal
712     // RM regions that are not registered with PMA either.
713     NvU64 maxAllocatableAddress;
714 
715     NvU32 heapSize;         // RAM in KB available for user allocations
716     NvU32 reservedHeapSize; // RAM in KB reserved for internal RM allocation
717     NvBool bZeroFb;         // Zero FB mode enabled.
718 } UvmGpuFbInfo;
719 
720 typedef struct UvmGpuEccInfo_tag
721 {
722     unsigned eccMask;
723     unsigned eccOffset;
724     void    *eccReadLocation;
725     NvBool  *eccErrorNotifier;
726     NvBool   bEccEnabled;
727 } UvmGpuEccInfo;
728 
729 typedef struct UvmPmaAllocationOptions_tag
730 {
731     NvU32 flags;
732     NvU32 minimumSpeed;         // valid if flags & UVM_PMA_ALLOCATE_SPECIFY_MININUM_SPEED
733     NvU64 physBegin, physEnd;   // valid if flags & UVM_PMA_ALLOCATE_SPECIFY_ADDRESS_RANGE
734     NvU32 regionId;             // valid if flags & UVM_PMA_ALLOCATE_SPECIFY_REGION_ID
735     NvU64 alignment;            // valid if flags & UVM_PMA_ALLOCATE_FORCE_ALIGNMENT
736     NvLength numPagesAllocated; // valid if flags & UVM_PMA_ALLOCATE_ALLOW_PARTIAL
737 
738     NvU32 resultFlags;          // valid if the allocation function returns NV_OK
739 } UvmPmaAllocationOptions;
740 
741 //
742 // Mirrored in PMA (PMA_STATS)
743 //
744 typedef struct UvmPmaStatistics_tag
745 {
746     volatile NvU64 numPages2m;                // PMA-wide 2MB pages count across all regions
747     volatile NvU64 numFreePages64k;           // PMA-wide free 64KB page count across all regions
748     volatile NvU64 numFreePages2m;            // PMA-wide free 2MB pages count across all regions
749     volatile NvU64 numPages2mProtected;       // PMA-wide 2MB pages count in protected memory
750     volatile NvU64 numFreePages64kProtected;  // PMA-wide free 64KB page count in protected memory
751     volatile NvU64 numFreePages2mProtected;   // PMA-wide free 2MB pages count in protected memory
752 } UvmPmaStatistics;
753 
754 /*******************************************************************************
755     uvmEventSuspend
756     This function will be called by the GPU driver to signal to UVM that the
757     system is about to enter a sleep state.  When it is called, the
758     following assumptions/guarantees are valid/made:
759 
760       * User channels have been preempted and disabled
761       * UVM channels are still running normally and will continue to do
762         so until after this function returns control
763       * User threads are still running, but can no longer issue system
764         system calls to the GPU driver
765       * Until exit from this function, UVM is allowed to make full use of
766         the GPUs under its control, as well as of the GPU driver
767 
768     Upon return from this function, UVM may not access GPUs under its control
769     until the GPU driver calls uvmEventResume().  It may still receive
770     calls to uvmEventIsrTopHalf() during this time, which it should return
771     NV_ERR_NO_INTR_PENDING from.  It will not receive any other calls.
772 */
773 typedef NV_STATUS (*uvmEventSuspend_t) (void);
774 
775 /*******************************************************************************
776     uvmEventResume
777     This function will be called by the GPU driver to signal to UVM that the
778     system has exited a previously entered sleep state.  When it is called,
779     the following assumptions/guarantees are valid/made:
780 
781       * UVM is again allowed to make full use of the GPUs under its
782         control, as well as of the GPU driver
783       * UVM channels are running normally
784       * User channels are still preempted and disabled
785       * User threads are again running, but still cannot issue system
786         calls to the GPU driver, nor submit new work
787 
788     Upon return from this function, UVM is expected to be fully functional.
789 */
790 typedef NV_STATUS (*uvmEventResume_t) (void);
791 
792 /*******************************************************************************
793     uvmEventStartDevice
794     This function will be called by the GPU driver once it has finished its
795     initialization to tell the UVM driver that this physical GPU has come up.
796 */
797 typedef NV_STATUS (*uvmEventStartDevice_t) (const NvProcessorUuid *pGpuUuidStruct);
798 
799 /*******************************************************************************
800     uvmEventStopDevice
801     This function will be called by the GPU driver to let UVM know that a
802     physical GPU is going down.
803 */
804 typedef NV_STATUS (*uvmEventStopDevice_t) (const NvProcessorUuid *pGpuUuidStruct);
805 
806 #if defined (_WIN32)
807 /*******************************************************************************
808     uvmEventWddmResetDuringTimeout
809     This function will be called by KMD in a TDR servicing path to unmap channel
810     resources and to destroy channels. This is a Windows specific event.
811 */
812 typedef NV_STATUS (*uvmEventWddmResetDuringTimeout_t) (const NvProcessorUuid *pGpuUuidStruct);
813 
814 /*******************************************************************************
815     uvmEventWddmRestartAfterTimeout
816     This function will be called by KMD in a TDR servicing path to map channel
817     resources and to create channels. This is a Windows specific event.
818 */
819 typedef NV_STATUS (*uvmEventWddmRestartAfterTimeout_t) (const NvProcessorUuid *pGpuUuidStruct);
820 
821 /*******************************************************************************
822     uvmEventServiceInterrupt
823     This function gets called from RM's intr service routine when an interrupt
824     to service a page fault is triggered.
825 */
826 typedef NV_STATUS (*uvmEventServiceInterrupt_t) (void *pDeviceObject,
827     NvU32 deviceId, NvU32 subdeviceId);
828 #endif
829 
830 /*******************************************************************************
831     uvmEventIsrTopHalf_t
832     This function will be called by the GPU driver to let UVM know
833     that an interrupt has occurred on the given physical GPU.
834 
835     Returns:
836         NV_OK if the UVM driver handled the interrupt
837         NV_ERR_NO_INTR_PENDING if the interrupt is not for the UVM driver
838 */
839 #if defined (__linux__)
840 typedef NV_STATUS (*uvmEventIsrTopHalf_t) (const NvProcessorUuid *pGpuUuidStruct);
841 #else
842 typedef void (*uvmEventIsrTopHalf_t) (void);
843 #endif
844 
845 struct UvmOpsUvmEvents
846 {
847     uvmEventSuspend_t     suspend;
848     uvmEventResume_t      resume;
849     uvmEventStartDevice_t startDevice;
850     uvmEventStopDevice_t  stopDevice;
851     uvmEventIsrTopHalf_t  isrTopHalf;
852 #if defined (_WIN32)
853     uvmEventWddmResetDuringTimeout_t wddmResetDuringTimeout;
854     uvmEventWddmRestartAfterTimeout_t wddmRestartAfterTimeout;
855     uvmEventServiceInterrupt_t serviceInterrupt;
856 #endif
857 };
858 
859 #define UVM_CSL_SIGN_AUTH_TAG_SIZE_BYTES 32
860 #define UVM_CSL_CRYPT_AUTH_TAG_SIZE_BYTES 16
861 
862 typedef union UvmFaultMetadataPacket_tag
863 {
864     struct {
865         NvU8   authTag[UVM_CSL_CRYPT_AUTH_TAG_SIZE_BYTES];
866         NvBool valid;
867     };
868     // padding to 32Bytes
869     NvU8 _padding[32];
870 } UvmFaultMetadataPacket;
871 
872 // This struct shall not be accessed nor modified directly by UVM as it is
873 // entirely managed by the RM layer
874 typedef struct UvmCslContext_tag
875 {
876     struct ccslContext_t *ctx;
877     void *nvidia_stack;
878 } UvmCslContext;
879 
880 typedef struct UvmGpuFaultInfo_tag
881 {
882     struct
883     {
884         // Fault buffer GET register mapping.
885         //
886         // When Confidential Computing is enabled, GET refers to the shadow
887         // buffer (see bufferAddress below), and not to the actual HW buffer.
888         // In this setup, writes of GET (by UVM) do not result on re-evaluation
889         // of any interrupt condition.
890         volatile NvU32* pFaultBufferGet;
891 
892         // Fault buffer PUT register mapping.
893         //
894         // When Confidential Computing is enabled, PUT refers to the shadow
895         // buffer (see bufferAddress below), and not to the actual HW buffer.
896         // In this setup, writes of PUT (by GSP-RM) do not result on
897         // re-evaluation of any interrupt condition.
898         volatile NvU32* pFaultBufferPut;
899 
900         // Note: this variable is deprecated since buffer overflow is not a
901         // separate register from future chips.
902         volatile NvU32* pFaultBufferInfo;
903 
904         // Register mapping used to clear a replayable fault interrupt in
905         // Turing+ GPUs.
906         volatile NvU32* pPmcIntr;
907 
908         // Register mapping used to enable replayable fault interrupts.
909         volatile NvU32* pPmcIntrEnSet;
910 
911         // Register mapping used to disable replayable fault interrupts.
912         volatile NvU32* pPmcIntrEnClear;
913 
914         // Register used to enable, or disable, faults on prefetches.
915         volatile NvU32* pPrefetchCtrl;
916 
917         // Replayable fault interrupt mask identifier.
918         NvU32 replayableFaultMask;
919 
920         // Fault buffer CPU mapping
921         void*  bufferAddress;
922         //
923         // When Confidential Computing is disabled, the mapping points to the
924         // actual HW fault buffer.
925         //
926         // When Confidential Computing is enabled, the mapping points to a
927         // copy of the HW fault buffer. This "shadow buffer" is maintained
928         // by GSP-RM.
929 
930         // Size, in bytes, of the fault buffer pointed by bufferAddress.
931         NvU32  bufferSize;
932         // Mapping pointing to the start of the fault buffer metadata containing
933         // a 16Byte authentication tag and a valid byte. Always NULL when
934         // Confidential Computing is disabled.
935         UvmFaultMetadataPacket *bufferMetadata;
936 
937         // CSL context used for performing decryption of replayable faults when
938         // Confidential Computing is enabled.
939         UvmCslContext cslCtx;
940     } replayable;
941     struct
942     {
943         // Shadow buffer for non-replayable faults on cpu memory. Resman copies
944         // here the non-replayable faults that need to be handled by UVM
945         void* shadowBufferAddress;
946 
947         // Execution context for the queue associated with the fault buffer
948         void* shadowBufferContext;
949 
950         // Fault buffer size
951         NvU32  bufferSize;
952 
953         // Preallocated stack for functions called from the UVM isr top half
954         void *isr_sp;
955 
956         // Preallocated stack for functions called from the UVM isr bottom half
957         void *isr_bh_sp;
958 
959         // Used only when Hopper Confidential Compute is enabled
960         // Register mappings obtained from RM
961         volatile NvU32* pFaultBufferPut;
962 
963         // Used only when Hopper Confidential Compute is enabled
964         // Cached get index of the non-replayable shadow buffer
965         NvU32 shadowBufferGet;
966 
967         // See replayable.bufferMetadata
968         UvmFaultMetadataPacket  *shadowBufferMetadata;
969     } nonReplayable;
970     NvHandle faultBufferHandle;
971     struct Device *pDevice;
972 } UvmGpuFaultInfo;
973 
974 struct Device;
975 
976 typedef struct UvmGpuPagingChannel_tag
977 {
978     struct gpuDevice  *device;
979     NvNotification    *errorNotifier;
980     NvHandle          channelHandle;
981     NvHandle          errorNotifierHandle;
982     void              *pushStreamSp;
983     struct Device     *pDevice;
984 } UvmGpuPagingChannel, *UvmGpuPagingChannelHandle;
985 
986 typedef struct UvmGpuAccessCntrInfo_tag
987 {
988     // Register mappings obtained from RM
989     // pointer to the Get register for the access counter buffer
990     volatile NvU32* pAccessCntrBufferGet;
991     // pointer to the Put register for the access counter buffer
992     volatile NvU32* pAccessCntrBufferPut;
993     // pointer to the Full register for the access counter buffer
994     volatile NvU32* pAccessCntrBufferFull;
995     // pointer to the hub interrupt
996     volatile NvU32* pHubIntr;
997     // pointer to interrupt enable register
998     volatile NvU32* pHubIntrEnSet;
999     // pointer to interrupt disable register
1000     volatile NvU32* pHubIntrEnClear;
1001     // mask for the access counter buffer
1002     NvU32 accessCounterMask;
1003     // access counter buffer cpu mapping and size
1004     void* bufferAddress;
1005     NvU32  bufferSize;
1006     NvHandle accessCntrBufferHandle;
1007 } UvmGpuAccessCntrInfo;
1008 
1009 typedef enum
1010 {
1011     UVM_ACCESS_COUNTER_GRANULARITY_64K = 1,
1012     UVM_ACCESS_COUNTER_GRANULARITY_2M  = 2,
1013     UVM_ACCESS_COUNTER_GRANULARITY_16M = 3,
1014     UVM_ACCESS_COUNTER_GRANULARITY_16G = 4,
1015 } UVM_ACCESS_COUNTER_GRANULARITY;
1016 
1017 typedef enum
1018 {
1019     UVM_ACCESS_COUNTER_USE_LIMIT_NONE = 1,
1020     UVM_ACCESS_COUNTER_USE_LIMIT_QTR  = 2,
1021     UVM_ACCESS_COUNTER_USE_LIMIT_HALF = 3,
1022     UVM_ACCESS_COUNTER_USE_LIMIT_FULL = 4,
1023 } UVM_ACCESS_COUNTER_USE_LIMIT;
1024 
1025 typedef struct UvmGpuAccessCntrConfig_tag
1026 {
1027     NvU32 mimcGranularity;
1028 
1029     NvU32 momcGranularity;
1030 
1031     NvU32 mimcUseLimit;
1032 
1033     NvU32 momcUseLimit;
1034 
1035     NvU32 threshold;
1036 } UvmGpuAccessCntrConfig;
1037 
1038 //
1039 // When modifying this enum, make sure they are compatible with the mirrored
1040 // MEMORY_PROTECTION enum in phys_mem_allocator.h.
1041 //
1042 typedef enum UvmPmaGpuMemoryType_tag
1043 {
1044     UVM_PMA_GPU_MEMORY_TYPE_UNPROTECTED = 0,
1045     UVM_PMA_GPU_MEMORY_TYPE_PROTECTED   = 1
1046 } UVM_PMA_GPU_MEMORY_TYPE;
1047 
1048 typedef UvmGpuChannelInfo gpuChannelInfo;
1049 typedef UvmGpuTsgAllocParams gpuTsgAllocParams;
1050 typedef UvmGpuChannelAllocParams gpuChannelAllocParams;
1051 typedef UvmGpuCaps gpuCaps;
1052 typedef UvmGpuCopyEngineCaps gpuCeCaps;
1053 typedef UvmGpuCopyEnginesCaps gpuCesCaps;
1054 typedef UvmGpuP2PCapsParams getP2PCapsParams;
1055 typedef UvmGpuAddressSpaceInfo gpuAddressSpaceInfo;
1056 typedef UvmGpuAllocInfo gpuAllocInfo;
1057 typedef UvmGpuInfo gpuInfo;
1058 typedef UvmGpuClientInfo gpuClientInfo;
1059 typedef UvmGpuAccessCntrInfo gpuAccessCntrInfo;
1060 typedef UvmGpuAccessCntrConfig gpuAccessCntrConfig;
1061 typedef UvmGpuFaultInfo gpuFaultInfo;
1062 typedef UvmGpuMemoryInfo gpuMemoryInfo;
1063 typedef UvmGpuExternalMappingInfo gpuExternalMappingInfo;
1064 typedef UvmGpuChannelResourceInfo gpuChannelResourceInfo;
1065 typedef UvmGpuChannelInstanceInfo gpuChannelInstanceInfo;
1066 typedef UvmGpuChannelResourceBindParams gpuChannelResourceBindParams;
1067 typedef UvmGpuFbInfo gpuFbInfo;
1068 typedef UvmGpuEccInfo gpuEccInfo;
1069 typedef UvmGpuPagingChannel *gpuPagingChannelHandle;
1070 typedef UvmGpuPagingChannelInfo gpuPagingChannelInfo;
1071 typedef UvmGpuPagingChannelAllocParams gpuPagingChannelAllocParams;
1072 typedef UvmPmaAllocationOptions gpuPmaAllocationOptions;
1073 
1074 typedef struct UvmCslIv
1075 {
1076     NvU8 iv[12];
1077     NvU8 fresh;
1078 } UvmCslIv;
1079 
1080 typedef enum UvmCslOperation
1081 {
1082     UVM_CSL_OPERATION_ENCRYPT,
1083     UVM_CSL_OPERATION_DECRYPT
1084 } UvmCslOperation;
1085 
1086 #endif // _NV_UVM_TYPES_H_
1087