summaryrefslogtreecommitdiffstats
path: root/userspace/sdks/nv525/nvalloc/unix/include
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-09-13 18:36:21 -0400
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-09-13 18:36:21 -0400
commit00e54c13c7c9030c4d5f7151467f2d85a3730e29 (patch)
tree17a45239df8d2e4912ff3697ed06e85a10b969de /userspace/sdks/nv525/nvalloc/unix/include
downloadopen-iov-00e54c13c7c9030c4d5f7151467f2d85a3730e29.tar.gz
open-iov-00e54c13c7c9030c4d5f7151467f2d85a3730e29.zip
Initial commit: Open-IOV vGPU-IO complete stack
- Firmware decompilation: GSP 570.144W (28.5MB ELF, RV64IMAC), 132 decompiled C files - Kernel modules: nvidia.ko (34MB, OpenRM), open-iov-vfio.ko (2.8MB, VFIO mdev), gsp-vgpu.ko (1.8MB, guest driver) - Userspace: libiov.so/libvgpu.so (76KB), example_vgpu (28KB), rpc_emulator.c - PCI config space emulation (256B with PM, MSI, MSI-X, PCIe caps) - 12 RPC types fully mapped from firmware decompilation - BAR trap, WPR, scheduling, notification, migration emulation - Helper scripts: load_vgpu_stack, create_mdev, launch_qemu_vgpu, test_vgpu_stack, setup_guest_driver, unload_vgpu_stack - Architecture documentation - Wiki: 10 technical documents - Git LFS for large binaries (.ko, .bin, .iso, .img, .o, ghidra repos) - nvidia-open-gpu-kernel-modules as submodule
Diffstat (limited to 'userspace/sdks/nv525/nvalloc/unix/include')
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/efi-console.h65
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv-caps.h94
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv-gpu-info.h44
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv-ioctl-numbers.h43
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv-ioctl.h145
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv-kernel-rmapi-ops.h61
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv-nb-regs.h65
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv-priv.h377
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv-reg.h927
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv-unix-nvos-params-wrappers.h49
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv.h1058
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/nv_escape.h54
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/os-interface.h250
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/os_custom.h61
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/osapi.h192
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/osfuncs.h55
-rw-r--r--userspace/sdks/nv525/nvalloc/unix/include/rmobjexportimport.h42
17 files changed, 3582 insertions, 0 deletions
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/efi-console.h b/userspace/sdks/nv525/nvalloc/unix/include/efi-console.h
new file mode 100644
index 0000000..7971565
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/efi-console.h
@@ -0,0 +1,65 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2015-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef EFI_CONSOLE_H
+#define EFI_CONSOLE_H
+
+#include "gpu/disp/kern_disp_max.h"
+
+struct OBJGPU;
+
+typedef struct
+{
+ NvBool isDispStateSave;
+
+ NvU32 activeDisplayId[OBJ_MAX_HEADS];
+
+ struct
+ {
+ NvU32 displayId;
+
+ struct {
+ NvU32 index;
+ NvU32 subLinkMask;
+ } sorXBar;
+
+ struct {
+ NvU32 linkBw;
+ NvU32 laneCount;
+ NvU32 linkCtl;
+ } displayPort;
+ } activeDfpState[OBJ_MAX_DFPS];
+ NvU32 numDfps;
+
+ struct
+ {
+ NvU32 coreChannelClass;
+ NvU32 cacheSize;
+ NvU32 *pCache;
+ } display;
+} nv_efi_t;
+
+void RmSaveEFIDisplayState (OBJGPU *pGpu);
+void RmRestoreEFIDisplayState (OBJGPU *pGpu);
+
+#endif // EFI_CONSOLE_H
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv-caps.h b/userspace/sdks/nv525/nvalloc/unix/include/nv-caps.h
new file mode 100644
index 0000000..35bbf7c
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv-caps.h
@@ -0,0 +1,94 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2019 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _NV_CAPS_H_
+#define _NV_CAPS_H_
+
+#include <nv-kernel-interface-api.h>
+
+/*
+ * Opaque OS-specific struct; on Linux, this has member
+ * 'struct proc_dir_entry'.
+ */
+typedef struct nv_cap nv_cap_t;
+
+/*
+ * Creates directory named "capabilities" under the provided path.
+ *
+ * @param[in] path Absolute path
+ *
+ * Returns a valid nv_cap_t upon success. Otherwise, returns NULL.
+ */
+nv_cap_t* NV_API_CALL nv_cap_init(const char *path);
+
+/*
+ * Creates capability directory entry
+ *
+ * @param[in] parent_cap Parent capability directory
+ * @param[in] name Capability directory's name
+ * @param[in] mode Capability directory's access mode
+ *
+ * Returns a valid nv_cap_t upon success. Otherwise, returns NULL.
+ */
+nv_cap_t* NV_API_CALL nv_cap_create_dir_entry(nv_cap_t *parent_cap, const char *name, int mode);
+
+/*
+ * Creates capability file entry
+ *
+ * @param[in] parent_cap Parent capability directory
+ * @param[in] name Capability file's name
+ * @param[in] mode Capability file's access mode
+ *
+ * Returns a valid nv_cap_t upon success. Otherwise, returns NULL.
+ */
+nv_cap_t* NV_API_CALL nv_cap_create_file_entry(nv_cap_t *parent_cap, const char *name, int mode);
+
+/*
+ * Destroys capability entry
+ *
+ * @param[in] cap Capability entry
+ */
+void NV_API_CALL nv_cap_destroy_entry(nv_cap_t *cap);
+
+/*
+ * Validates and duplicates the provided file descriptor
+ *
+ * @param[in] cap Capability entry
+ * @param[in] fd File descriptor to be validated
+ *
+ * Returns duplicate fd upon success. Otherwise, returns -1.
+ */
+int NV_API_CALL nv_cap_validate_and_dup_fd(const nv_cap_t *cap, int fd);
+
+/*
+ * Closes file descriptor
+ *
+ * This function should be used to close duplicate file descriptors
+ * returned by nv_cap_validate_and_dup_fd.
+ *
+ * @param[in] fd File descriptor to be validated
+ *
+ */
+void NV_API_CALL nv_cap_close_fd(int fd);
+
+#endif /* _NV_CAPS_H_ */
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv-gpu-info.h b/userspace/sdks/nv525/nvalloc/unix/include/nv-gpu-info.h
new file mode 100644
index 0000000..a8c0c0a
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv-gpu-info.h
@@ -0,0 +1,44 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2015 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _NV_GPU_INFO_H_
+#define _NV_GPU_INFO_H_
+
+typedef struct {
+ NvU32 gpu_id;
+
+ struct {
+ NvU32 domain;
+ NvU8 bus, slot, function;
+ } pci_info;
+
+ /*
+ * opaque OS-specific pointer; on Linux, this is a pointer to the
+ * 'struct device' for the GPU.
+ */
+ void *os_device_ptr;
+} nv_gpu_info_t;
+
+#define NV_MAX_GPUS 32
+
+#endif /* _NV_GPU_INFO_H_ */
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv-ioctl-numbers.h b/userspace/sdks/nv525/nvalloc/unix/include/nv-ioctl-numbers.h
new file mode 100644
index 0000000..cb0b6a2
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv-ioctl-numbers.h
@@ -0,0 +1,43 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef NV_IOCTL_NUMBERS_H
+#define NV_IOCTL_NUMBERS_H
+
+/* NOTE: using an ioctl() number > 55 will overflow! */
+#define NV_IOCTL_MAGIC 'F'
+#define NV_IOCTL_BASE 200
+#define NV_ESC_CARD_INFO (NV_IOCTL_BASE + 0)
+#define NV_ESC_REGISTER_FD (NV_IOCTL_BASE + 1)
+#define NV_ESC_ALLOC_OS_EVENT (NV_IOCTL_BASE + 6)
+#define NV_ESC_FREE_OS_EVENT (NV_IOCTL_BASE + 7)
+#define NV_ESC_STATUS_CODE (NV_IOCTL_BASE + 9)
+#define NV_ESC_CHECK_VERSION_STR (NV_IOCTL_BASE + 10)
+#define NV_ESC_IOCTL_XFER_CMD (NV_IOCTL_BASE + 11)
+#define NV_ESC_ATTACH_GPUS_TO_FD (NV_IOCTL_BASE + 12)
+#define NV_ESC_QUERY_DEVICE_INTR (NV_IOCTL_BASE + 13)
+#define NV_ESC_SYS_PARAMS (NV_IOCTL_BASE + 14)
+#define NV_ESC_EXPORT_TO_DMABUF_FD (NV_IOCTL_BASE + 17)
+
+#endif
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv-ioctl.h b/userspace/sdks/nv525/nvalloc/unix/include/nv-ioctl.h
new file mode 100644
index 0000000..ffd1dee
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv-ioctl.h
@@ -0,0 +1,145 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2020-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef NV_IOCTL_H
+#define NV_IOCTL_H
+
+#include <nv-ioctl-numbers.h>
+#include <nvtypes.h>
+
+typedef struct {
+ NvU32 domain; /* PCI domain number */
+ NvU8 bus; /* PCI bus number */
+ NvU8 slot; /* PCI slot number */
+ NvU8 function; /* PCI function number */
+ NvU16 vendor_id; /* PCI vendor ID */
+ NvU16 device_id; /* PCI device ID */
+} nv_pci_info_t;
+
+/*
+ * ioctl()'s with parameter structures too large for the
+ * _IOC cmd layout use the nv_ioctl_xfer_t structure
+ * and the NV_ESC_IOCTL_XFER_CMD ioctl() to pass the actual
+ * size and user argument pointer into the RM, which
+ * will then copy it to/from kernel space in separate steps.
+ */
+typedef struct nv_ioctl_xfer
+{
+ NvU32 cmd;
+ NvU32 size;
+ NvP64 ptr NV_ALIGN_BYTES(8);
+} nv_ioctl_xfer_t;
+
+typedef struct nv_ioctl_card_info
+{
+ NvBool valid;
+ nv_pci_info_t pci_info; /* PCI config information */
+ NvU32 gpu_id;
+ NvU16 interrupt_line;
+ NvU64 reg_address NV_ALIGN_BYTES(8);
+ NvU64 reg_size NV_ALIGN_BYTES(8);
+ NvU64 fb_address NV_ALIGN_BYTES(8);
+ NvU64 fb_size NV_ALIGN_BYTES(8);
+ NvU32 minor_number;
+ NvU8 dev_name[10]; /* device names such as vmgfx[0-32] for vmkernel */
+} nv_ioctl_card_info_t;
+
+/* alloc event */
+typedef struct nv_ioctl_alloc_os_event
+{
+ NvHandle hClient;
+ NvHandle hDevice;
+ NvU32 fd;
+ NvU32 Status;
+} nv_ioctl_alloc_os_event_t;
+
+/* free event */
+typedef struct nv_ioctl_free_os_event
+{
+ NvHandle hClient;
+ NvHandle hDevice;
+ NvU32 fd;
+ NvU32 Status;
+} nv_ioctl_free_os_event_t;
+
+/* status code */
+typedef struct nv_ioctl_status_code
+{
+ NvU32 domain;
+ NvU8 bus;
+ NvU8 slot;
+ NvU32 status;
+} nv_ioctl_status_code_t;
+
+/* check version string */
+#define NV_RM_API_VERSION_STRING_LENGTH 64
+
+typedef struct nv_ioctl_rm_api_version
+{
+ NvU32 cmd;
+ NvU32 reply;
+ char versionString[NV_RM_API_VERSION_STRING_LENGTH];
+} nv_ioctl_rm_api_version_t;
+
+#define NV_RM_API_VERSION_CMD_STRICT 0
+#define NV_RM_API_VERSION_CMD_RELAXED '1'
+#define NV_RM_API_VERSION_CMD_OVERRIDE '2'
+
+#define NV_RM_API_VERSION_REPLY_UNRECOGNIZED 0
+#define NV_RM_API_VERSION_REPLY_RECOGNIZED 1
+
+typedef struct nv_ioctl_query_device_intr
+{
+ NvU32 intrStatus NV_ALIGN_BYTES(4);
+ NvU32 status;
+} nv_ioctl_query_device_intr;
+
+/* system parameters that the kernel driver may use for configuration */
+typedef struct nv_ioctl_sys_params
+{
+ NvU64 memblock_size NV_ALIGN_BYTES(8);
+} nv_ioctl_sys_params_t;
+
+typedef struct nv_ioctl_register_fd
+{
+ int ctl_fd;
+} nv_ioctl_register_fd_t;
+
+#define NV_DMABUF_EXPORT_MAX_HANDLES 128
+
+typedef struct nv_ioctl_export_to_dma_buf_fd
+{
+ int fd;
+ NvHandle hClient;
+ NvU32 totalObjects;
+ NvU32 numObjects;
+ NvU32 index;
+ NvU64 totalSize NV_ALIGN_BYTES(8);
+ NvHandle handles[NV_DMABUF_EXPORT_MAX_HANDLES];
+ NvU64 offsets[NV_DMABUF_EXPORT_MAX_HANDLES] NV_ALIGN_BYTES(8);
+ NvU64 sizes[NV_DMABUF_EXPORT_MAX_HANDLES] NV_ALIGN_BYTES(8);
+ NvU32 status;
+} nv_ioctl_export_to_dma_buf_fd_t;
+
+#endif
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv-kernel-rmapi-ops.h b/userspace/sdks/nv525/nvalloc/unix/include/nv-kernel-rmapi-ops.h
new file mode 100644
index 0000000..f44799b
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv-kernel-rmapi-ops.h
@@ -0,0 +1,61 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2015-2019 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _NV_KERNEL_RMAPI_OPS_H_
+#define _NV_KERNEL_RMAPI_OPS_H_
+
+/*
+ * Define the RMAPI provided to kernel-level RM clients.
+ *
+ * Kernel-level RM clients should populate nvidia_kernel_rmapi_ops_t
+ * by assigning nvidia_kernel_rmapi_ops_t::op and the corresponding
+ * parameter structure in nvidia_kernel_rmapi_ops_t's params union.
+ * Then, pass a pointer to the nvidia_kernel_rmapi_ops_t to
+ * rm_kernel_rmapi_op().
+ */
+
+#include "nvtypes.h"
+#include "nvos.h"
+
+typedef struct {
+ NvU32 op; /* One of the NV0[14]_XXXX operations listed below. */
+
+ union {
+ NVOS00_PARAMETERS free; /* NV01_FREE */
+ NVOS02_PARAMETERS allocMemory64; /* NV01_ALLOC_MEMORY */
+ NVOS21_PARAMETERS alloc; /* NV04_ALLOC */
+ NVOS32_PARAMETERS *pVidHeapControl; /* NV04_VID_HEAP_CONTROL */
+ NVOS33_PARAMETERS mapMemory; /* NV04_MAP_MEMORY */
+ NVOS34_PARAMETERS unmapMemory; /* NV04_UNMAP_MEMORY */
+ NVOS39_PARAMETERS allocContextDma2; /* NV04_ALLOC_CONTEXT_DMA */
+ NVOS46_PARAMETERS mapMemoryDma; /* NV04_MAP_MEMORY_DMA */
+ NVOS47_PARAMETERS unmapMemoryDma; /* NV04_UNMAP_MEMORY_DMA */
+ NVOS49_PARAMETERS bindContextDma; /* NV04_BIND_CONTEXT_DMA */
+ NVOS54_PARAMETERS control; /* NV04_CONTROL*/
+ NVOS55_PARAMETERS dupObject; /* NV04_DUP_OBJECT */
+ NVOS57_PARAMETERS share; /* NV04_SHARE */
+ NVOS61_PARAMETERS addVblankCallback; /* NV04_ADD_VBLANK_CALLBACK */
+ } params;
+} nvidia_kernel_rmapi_ops_t;
+
+#endif /* _NV_KERNEL_RMAPI_OPS_H_ */
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv-nb-regs.h b/userspace/sdks/nv525/nvalloc/unix/include/nv-nb-regs.h
new file mode 100644
index 0000000..6282b35
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv-nb-regs.h
@@ -0,0 +1,65 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2007-2018 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _NV_NB_REGS_H_
+#define _NV_NB_REGS_H_
+
+#include "nvdevid.h"
+
+typedef struct
+{
+ NvU32 subsystem_vendor_id;
+ NvU32 subsystem_device_id;
+ NvU16 gpu_device_id;
+} nv_nb_id_t;
+
+typedef struct
+{
+ NvU32 vendor_id;
+ const char *name;
+ NvU32 data;
+} nv_nb_reg_t;
+
+/*
+ * nb_id_table contains the OEM vendor ID, the subsystem ID and the
+ * GPU device ID of the notebooks for which we need to enable
+ * vendor specific registry keys. nb_reg_table contains the vendor
+ * specific registry key values. The initVendorSpecificRegistry()
+ * function compares the present notebooks OEM subsystem ID and the
+ * GPU device ID with the values present in id_tables. If a match
+ * is found, initVendorSpecificRegistry() extracts the vendor
+ * ID and sets any associated registry key listed in nb_reg_table.
+ */
+
+static nv_nb_id_t nb_id_table[] = {
+ { PCI_VENDOR_ID_PC_PARTNER, 0x0620, 0x1284 }, // Acer GT 630
+ { PCI_VENDOR_ID_PC_PARTNER, 0x0620, 0x124b }, // Acer GT 640
+ { 0, 0, 0 }
+};
+
+static nv_nb_reg_t nb_reg_table[] = {
+ { PCI_VENDOR_ID_PC_PARTNER, "RmOverrideSupportChipsetAspm", 2 },
+ { 0, NULL, 0 }
+};
+
+#endif //_NV_NB_REGS_H_
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv-priv.h b/userspace/sdks/nv525/nvalloc/unix/include/nv-priv.h
new file mode 100644
index 0000000..b605a73
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv-priv.h
@@ -0,0 +1,377 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 1999-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _NV_PRIV_H_
+#define _NV_PRIV_H_
+
+#include <nv.h>
+#include <os/os.h>
+#include <ctrl/ctrl402c.h>
+#include <gpu/disp/kern_disp_max.h>
+#include <gpu/disp/kern_disp_type.h>
+
+#include <efi-console.h>
+
+#define NV_PRIV_REG_WR08(b,o,d) (*((volatile NvV8*)&(b)->Reg008[(o)/1])=(NvV8)(d))
+#define NV_PRIV_REG_WR16(b,o,d) (*((volatile NvV16*)&(b)->Reg016[(o)/2])=(NvV16)(d))
+#define NV_PRIV_REG_WR32(b,o,d) (*((volatile NvV32*)&(b)->Reg032[(o)/4])=(NvV32)(d))
+
+#define NV_PRIV_REG_RD08(b,o) ((b)->Reg008[(o)/1])
+#define NV_PRIV_REG_RD16(b,o) ((b)->Reg016[(o)/2])
+#define NV_PRIV_REG_RD32(b,o) ((b)->Reg032[(o)/4])
+
+struct OBJGPU;
+
+typedef struct
+{
+ NvBool baseValid;
+ VGAADDRDESC base;
+ NvBool workspaceBaseValid;
+ VGAADDRDESC workspaceBase;
+ NvU32 vesaMode;
+} nv_vga_t;
+
+/*
+* device state during Power Management
+*/
+typedef struct nv_pm_state_s
+{
+ NvU32 IntrEn;
+ NvBool InHibernate;
+} nv_pm_state_t;
+
+/*
+* data structure for the UNIX workqueues
+*/
+typedef struct nv_work_item_s
+{
+ NvU32 flags;
+ NvU32 gpuInstance;
+ union
+ {
+ OSWorkItemFunction *pGpuFunction;
+ OSSystemWorkItemFunction *pSystemFunction;
+ } func;
+ void *pData;
+} nv_work_item_t;
+
+#define NV_WORK_ITEM_FLAGS_NONE 0x0
+#define NV_WORK_ITEM_FLAGS_REQUIRES_GPU 0x1
+#define NV_WORK_ITEM_FLAGS_DONT_FREE_DATA 0x2
+
+/*
+ * pseudo-registry data structure
+ */
+
+typedef enum
+{
+ NV_REGISTRY_ENTRY_TYPE_UNKNOWN = 0,
+ NV_REGISTRY_ENTRY_TYPE_DWORD,
+ NV_REGISTRY_ENTRY_TYPE_BINARY,
+ NV_REGISTRY_ENTRY_TYPE_STRING
+} nv_reg_type_t;
+
+typedef struct nv_reg_entry_s
+{
+ char *regParmStr;
+ NvU32 type;
+ NvU32 data; // used when type == NV_REGISTRY_ENTRY_TYPE_DWORD
+ NvU8 *pdata; // used when type == NV_REGISTRY_ENTRY_TYPE_{BINARY,STRING}
+ NvU32 len; // used when type == NV_REGISTRY_ENTRY_TYPE_{BINARY,STRING}
+ struct nv_reg_entry_s *next;
+} nv_reg_entry_t;
+
+#define INVALID_DISP_ID 0xFFFFFFFF
+#define MAX_DISP_ID_PER_ADAPTER 0x2
+
+typedef struct nv_i2c_adapter_entry_s
+{
+ void *pOsAdapter;
+ NvU32 port;
+ NvU32 displayId[MAX_DISP_ID_PER_ADAPTER];
+} nv_i2c_adapter_entry_t;
+
+#define NV_INIT_FLAG_HAL 0x0001
+#define NV_INIT_FLAG_HAL_COMPONENTS 0x0002
+#define NV_INIT_FLAG_GPU_STATE 0x0004
+#define NV_INIT_FLAG_GPU_STATE_LOAD 0x0008
+#define NV_INIT_FLAG_FIFO_WATCHDOG 0x0010
+#define NV_INIT_FLAG_CORE_LOGIC 0x0020
+#define NV_INIT_FLAG_GPUMGR_ATTACH 0x0040
+#define NV_INIT_FLAG_PUBLIC_I2C 0x0080
+#define NV_INIT_FLAG_SCALABILITY 0x0100
+#define NV_INIT_FLAG_DMA 0x0200
+
+#define MAX_I2C_ADAPTERS NV402C_CTRL_NUM_I2C_PORTS
+
+/*
+ * GPU dynamic power state machine.
+ *
+ * The GPU is in exactly one of these states at at time. Only certain state
+ * transitions are valid, as documented by the DAGs below.
+ *
+ * When in "instant idle" or COARSE mode:
+ *
+ * +----------------------+
+ * v |
+ * +---------+ +----------------+ +--------+
+ * | UNKNOWN | --> | IDLE_INDICATED | --> | IN_USE |
+ * +---------+ +----------------+ +--------+
+ *
+ * The transition from UNKNOWN to IDLE_INDICATED happens in
+ * rm_init_dynamic_power_management().
+ *
+ * Thereafter, transitions from IDLE_INDICATED to IN_USE happen when
+ * os_ref_dynamic_power() is called and the refcount transitions from 0 to 1;
+ * transitions from IN_USE to IDLE_INDICATED happen when
+ * os_unref_dynamic_power() is called and the refcount transitions from 1 to 0.
+ * Note that only calls to os_(un)ref_dynamic_power() with the mode == COARSE
+ * are considered in this mode; calls with mode == FINE are ignored. Since
+ * COARSE calls are placed only in rm_init_adapter/rm_shutdown_adapter, the GPU
+ * effectively stays in the IN_USE state any time any client has initialized
+ * it.
+ *
+ *
+ * When in "deferred idle" or FINE mode:
+ *
+ * +----------------------------------------------------------------+
+ * | |
+ * | |
+ * | +-------------------------------------------+----------------------+
+ * | | | v
+ * | +---------+ +----------------+ +--------------+ +----------------+ +--------+
+ * | | UNKNOWN | --> | IDLE_INDICATED | --> | | --> | IDLE_SUSTAINED | --> | IN_USE | -+
+ * | +---------+ +----------------+ | | +----------------+ +--------+ |
+ * | ^ | | | ^ |
+ * +--------------------+ | IDLE_INSTANT | ------+----------------------+ |
+ * | | | |
+ * | | | |
+ * | | <-----+ |
+ * +--------------+ |
+ * ^ |
+ * +-----------------------------------------------------+
+ *
+ * As before, the transition from UNKNOWN to IDLE_INDICATED happens in
+ * rm_init_dynamic_power_management(). This is not ideal: it means the GPU may
+ * be powered down immediately upon loading the RM module, even if
+ * rm_init_adapter() is going to be called soon thereafter. However, we can't
+ * rely on deferred idle callbacks yet, since those currently rely on core RM
+ * being initialized.
+ *
+ * At the beginning of rm_init_adapter(), the GPU transitions to the IN_USE
+ * state; during the rm_init_adapter() sequence,
+ * RmInitDeferredDynamicPowerManagement() will be called which will schedule
+ * timer callbacks and set the "deferred_idle_enabled" boolean.
+ *
+ * While in "deferred idle" mode, one of the callbacks
+ * timerCallbackForIdlePreConditions(), timerCallbackToIndicateIdle(), or
+ * RmIndicateIdle() should be scheduled when in the states:
+ * - IN_USE
+ * - IDLE_INSTANT
+ * - IDLE_SUSTAINED
+ * Note that since we may transition from IN_USE to IDLE_INSTANT rapidly (e.g.,
+ * for a series of RM calls), we don't attempt to schedule the callbacks and
+ * cancel them on each of these transitions. The
+ * timerCallbackForIdlePreConditions() callback will simply exit early if in
+ * the IN_USE state.
+ *
+ * As before, the GPU will remain in the IN_USE state until
+ * os_unref_dynamic_power() is called and the count transitions from 1 to 0
+ * (calls with mode == FINE are honored, in this mode, and these transitions
+ * can happen frequently). When the refcount reaches 0, rather than going
+ * directly to the IDLE_INDICATED state, it transitions to the IDLE_INSTANT
+ * state.
+ *
+ * Then, when the next timerCallbackForIdlePreConditions() callback executes,
+ * if all preconditions are met, the state will transition to IDLE_SUSTAINED.
+ *
+ * If, when in the IDLE_SUSTAINED state, os_ref_dynamic_power() is called, the
+ * GPU will transition back to the IN_USE state and return to the IDLE_INSTANT
+ * state. This ensures that there is a suitable delay between any activity
+ * that requires bumping the refcount and indicating idleness.
+ *
+ * If the timerCallbackForIdlePreConditions() callback executes again and the
+ * GPU is still in the IDLE_SUSTAINED state, userspace mappings will be revoked
+ * and the timerCallbackToIndicateIdle() callback will be scheduled.
+ *
+ * If, before the timerCallbackToIndicateIdle() callback executes, either
+ * os_ref_dynamic_power() is called or a mapping which has been revoked is
+ * accessed (which triggers the RmForceGpuNotIdle() callback), the GPU will
+ * transition back to the IN_USE or IDLE_INSTANT state, respectively.
+ *
+ * Then, when the timerCallbackToIndicateIdle() callback executes, if all
+ * mappings are still revoked, and the GPU is still in the IDLE_SUSTAINED
+ * state, and all GPU idleness preconditions remain satisfied, the
+ * RmIndicateIdle() work item will be enqueued. (Else, the GPU will transition
+ * back to the IDLE_INSTANT state and the callback for preconditions is
+ * scheduled again.)
+ *
+ * Finally, once the RmIndicateIdle() work item is called, if all of the same
+ * conditions still hold, the state will transition to IDLE_INDICATED. No
+ * callbacks will be scheduled from here; the callbacks for preconditions
+ * should be re-scheduled when transitioning out of the IDLE_INDICATED state.
+ *
+ * Once in the IDLE_INDICATED state, the kernel is free to call the RM to
+ * perform the GC6 entry sequence then turn off power to the GPU (although it
+ * may not, if the audio function is being used for example).
+ *
+ * There are two paths to exit the IDLE_INDICATED state:
+ * (a) If os_ref_dynamic_power() is called, in which case it transitions
+ * directly to the IN_USE state;
+ * (b) If RmForceGpuNotIdle() is called, in which case it transitions back to
+ * the IDLE_INSTANT state.
+ */
+typedef enum
+{
+ NV_DYNAMIC_POWER_STATE_UNKNOWN = 0,
+
+ NV_DYNAMIC_POWER_STATE_IN_USE,
+
+ NV_DYNAMIC_POWER_STATE_IDLE_INSTANT,
+ NV_DYNAMIC_POWER_STATE_IDLE_SUSTAINED,
+ NV_DYNAMIC_POWER_STATE_IDLE_INDICATED,
+} nv_dynamic_power_state_t;
+
+typedef struct nv_dynamic_power_s
+{
+ /*
+ * mode is read without the mutex -- should be read-only outside of
+ * rm_init_dynamic_power_management, called during probe only.
+ */
+ nv_dynamic_power_mode_t mode;
+ /*
+ * Whether to indicate idle immediately when the refcount reaches 0, or
+ * only go to the IDLE_INSTANT state, and expect timer callbacks to
+ * transition through IDLE_SUSTAINED -> IDLE_INDICATED.
+ */
+ NvBool deferred_idle_enabled;
+
+ nv_dynamic_power_state_t state;
+ NvS32 refcount;
+
+ /*
+ * A word on lock ordering. These locks must be taken in the order:
+ *
+ * RM API lock > this dynamic_power mutex > RM GPUs lock
+ *
+ * Skipping any of those locks is fine (if they aren't required to protect
+ * whatever state is being accessed or modified), so long as the order is
+ * not violated.
+ */
+ PORT_MUTEX *mutex;
+
+ /*
+ * callback handles for deferred dynamic power management.
+ */
+ NvP64 idle_precondition_check_event;
+ NvP64 indicate_idle_event;
+ NvBool idle_precondition_check_callback_scheduled;
+
+ /*
+ * callback handle for kernel initiated gc6 entry/exit.
+ * these will be protected by the gpu lock.
+ */
+ NvP64 remove_idle_holdoff;
+ NvBool b_idle_holdoff;
+
+ /*
+ * flag set if the platform does not support fine grain dynamic power
+ * management.
+ */
+ NvBool b_fine_not_supported;
+
+ /*
+ * This flag is used to check if a workitem is queued for
+ * RmQueueIdleSustainedWorkitem().
+ */
+ NvBool b_idle_sustained_workitem_queued;
+
+ /*
+ * Counter to track clients disallowing GCOFF.
+ */
+ NvU32 clients_gcoff_disallow_refcount;
+
+ /*
+ * Maximum FB allocation size which can be saved in system memory
+ * while doing GCOFF based dynamic PM.
+ */
+ NvU64 gcoff_max_fb_size;
+
+ /*
+ * NVreg_DynamicPowerManagement regkey value set by the user
+ */
+ NvU32 dynamic_power_regkey;
+} nv_dynamic_power_t;
+
+typedef struct
+{
+ OBJGPU *pGpu;
+
+ NvU32 pmc_boot_0;
+
+ nv_vga_t vga;
+
+ nv_efi_t efi;
+
+ NvU32 flags;
+ NvU32 status;
+
+ nv_i2c_adapter_entry_t i2c_adapters[MAX_I2C_ADAPTERS];
+
+ void *pVbiosCopy;
+ NvU32 vbiosSize;
+
+ nv_pm_state_t pm_state;
+
+ nv_reg_entry_t *pRegistry;
+
+ nv_dynamic_power_t dynamic_power;
+
+ /* Flag to check if the GPU needs 4K page isolation. */
+ NvBool b_4k_page_isolation_required;
+
+ /* Flag to check if GPU mobile config is enabled */
+ NvBool b_mobile_config_enabled;
+
+ /* Flag to check if S0ix-based power management is enabled. */
+ NvBool s0ix_pm_enabled;
+
+ /*
+ * Maximum FB allocation size which can be saved in system memory
+ * during system supened with S0ix-based power management.
+ */
+ NvU64 s0ix_gcoff_max_fb_size;
+
+ NvU32 pmc_boot_42;
+} nv_priv_t;
+
+#define NV_SET_NV_PRIV(nv,p) ((nv)->priv = (p))
+#define NV_GET_NV_PRIV(nv) ((nv) ? (nv)->priv : NULL)
+
+/*
+ * Make sure that your stack has taken API Lock before using this macro.
+ */
+#define NV_GET_NV_PRIV_PGPU(nv) \
+ (NV_GET_NV_PRIV(nv) ? ((nv_priv_t *)NV_GET_NV_PRIV(nv))->pGpu : NULL)
+
+#endif // _NV_PRIV_H_
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv-reg.h b/userspace/sdks/nv525/nvalloc/unix/include/nv-reg.h
new file mode 100644
index 0000000..31d3560
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv-reg.h
@@ -0,0 +1,927 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2006-2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _RM_REG_H_
+#define _RM_REG_H_
+
+#include "nvtypes.h"
+
+/*
+ * use NV_REG_STRING to stringify a registry key when using that registry key
+ */
+
+#define __NV_REG_STRING(regkey) #regkey
+#define NV_REG_STRING(regkey) __NV_REG_STRING(regkey)
+
+/*
+ * use NV_DEFINE_REG_ENTRY and NV_DEFINE_PARAMS_TABLE_ENTRY to simplify definition
+ * of registry keys in the kernel module source code.
+ */
+
+#define __NV_REG_VAR(regkey) NVreg_##regkey
+
+#if defined(NV_MODULE_PARAMETER)
+#define NV_DEFINE_REG_ENTRY(regkey, default_value) \
+ static NvU32 __NV_REG_VAR(regkey) = (default_value); \
+ NV_MODULE_PARAMETER(__NV_REG_VAR(regkey))
+#define NV_DEFINE_REG_ENTRY_GLOBAL(regkey, default_value) \
+ NvU32 __NV_REG_VAR(regkey) = (default_value); \
+ NV_MODULE_PARAMETER(__NV_REG_VAR(regkey))
+#else
+#define NV_DEFINE_REG_ENTRY(regkey, default_value) \
+ static NvU32 __NV_REG_VAR(regkey) = (default_value)
+#define NV_DEFINE_REG_ENTRY_GLOBAL(regkey, default_value) \
+ NvU32 __NV_REG_VAR(regkey) = (default_value)
+#endif
+
+#if defined(NV_MODULE_STRING_PARAMETER)
+#define NV_DEFINE_REG_STRING_ENTRY(regkey, default_value) \
+ char *__NV_REG_VAR(regkey) = (default_value); \
+ NV_MODULE_STRING_PARAMETER(__NV_REG_VAR(regkey))
+#else
+#define NV_DEFINE_REG_STRING_ENTRY(regkey, default_value) \
+ char *__NV_REG_VAR(regkey) = (default_value)
+#endif
+
+#define NV_DEFINE_PARAMS_TABLE_ENTRY(regkey) \
+ { NV_REG_STRING(regkey), &__NV_REG_VAR(regkey) }
+
+/*
+ * Like NV_DEFINE_PARMS_TABLE_ENTRY, but allows a mismatch between the name of
+ * the regkey and the name of the module parameter. When using this macro, the
+ * name of the parameter is passed to the extra "parameter" argument, and it is
+ * this name that must be used in the NV_DEFINE_REG_ENTRY() macro.
+ */
+
+#define NV_DEFINE_PARAMS_TABLE_ENTRY_CUSTOM_NAME(regkey, parameter) \
+ { NV_REG_STRING(regkey), &__NV_REG_VAR(parameter)}
+
+/*
+ *----------------- registry key definitions--------------------------
+ */
+
+/*
+ * Option: ModifyDeviceFiles
+ *
+ * Description:
+ *
+ * When this option is enabled, the NVIDIA driver will verify the validity
+ * of the NVIDIA device files in /dev and attempt to dynamically modify
+ * and/or (re-)create them, if necessary. If you don't wish for the NVIDIA
+ * driver to touch the device files, you can use this registry key.
+ *
+ * This module parameter is only honored by the NVIDIA GPU driver and NVIDIA
+ * capability driver. Furthermore, the NVIDIA capability driver provides
+ * modifiable /proc file entry (DeviceFileModify=0/1) to alter the behavior of
+ * this module parameter per device file.
+ *
+ * Possible Values:
+ * 0 = disable dynamic device file management
+ * 1 = enable dynamic device file management (default)
+ */
+
+#define __NV_MODIFY_DEVICE_FILES ModifyDeviceFiles
+#define NV_REG_MODIFY_DEVICE_FILES NV_REG_STRING(__NV_MODIFY_DEVICE_FILES)
+
+/*
+ * Option: DeviceFileUID
+ *
+ * Description:
+ *
+ * This registry key specifies the UID assigned to the NVIDIA device files
+ * created and/or modified by the NVIDIA driver when dynamic device file
+ * management is enabled.
+ *
+ * This module parameter is only honored by the NVIDIA GPU driver.
+ *
+ * The default UID is 0 ('root').
+ */
+
+#define __NV_DEVICE_FILE_UID DeviceFileUID
+#define NV_REG_DEVICE_FILE_UID NV_REG_STRING(__NV_DEVICE_FILE_UID)
+
+/*
+ * Option: DeviceFileGID
+ *
+ * Description:
+ *
+ * This registry key specifies the GID assigned to the NVIDIA device files
+ * created and/or modified by the NVIDIA driver when dynamic device file
+ * management is enabled.
+ *
+ * This module parameter is only honored by the NVIDIA GPU driver.
+ *
+ * The default GID is 0 ('root').
+ */
+
+#define __NV_DEVICE_FILE_GID DeviceFileGID
+#define NV_REG_DEVICE_FILE_GID NV_REG_STRING(__NV_DEVICE_FILE_GID)
+
+/*
+ * Option: DeviceFileMode
+ *
+ * Description:
+ *
+ * This registry key specifies the device file mode assigned to the NVIDIA
+ * device files created and/or modified by the NVIDIA driver when dynamic
+ * device file management is enabled.
+ *
+ * This module parameter is only honored by the NVIDIA GPU driver.
+ *
+ * The default mode is 0666 (octal, rw-rw-rw-).
+ */
+
+#define __NV_DEVICE_FILE_MODE DeviceFileMode
+#define NV_REG_DEVICE_FILE_MODE NV_REG_STRING(__NV_DEVICE_FILE_MODE)
+
+/*
+ * Option: ResmanDebugLevel
+ *
+ * Default value: ~0
+ */
+
+#define __NV_RESMAN_DEBUG_LEVEL ResmanDebugLevel
+#define NV_REG_RESMAN_DEBUG_LEVEL NV_REG_STRING(__NV_RESMAN_DEBUG_LEVEL)
+
+/*
+ * Option: RmLogonRC
+ *
+ * Default value: 1
+ */
+
+#define __NV_RM_LOGON_RC RmLogonRC
+#define NV_REG_RM_LOGON_RC NV_REG_STRING(__NV_RM_LOGON_RC)
+
+/*
+ * Option: InitializeSystemMemoryAllocations
+ *
+ * Description:
+ *
+ * The NVIDIA Linux driver normally clears system memory it allocates
+ * for use with GPUs or within the driver stack. This is to ensure
+ * that potentially sensitive data is not rendered accessible by
+ * arbitrary user applications.
+ *
+ * Owners of single-user systems or similar trusted configurations may
+ * choose to disable the aforementioned clears using this option and
+ * potentially improve performance.
+ *
+ * Possible values:
+ *
+ * 1 = zero out system memory allocations (default)
+ * 0 = do not perform memory clears
+ */
+
+#define __NV_INITIALIZE_SYSTEM_MEMORY_ALLOCATIONS \
+ InitializeSystemMemoryAllocations
+#define NV_REG_INITIALIZE_SYSTEM_MEMORY_ALLOCATIONS \
+ NV_REG_STRING(__NV_INITIALIZE_SYSTEM_MEMORY_ALLOCATIONS)
+
+/*
+ * Option: RegistryDwords
+ *
+ * Description:
+ *
+ * This option accepts a semicolon-separated list of key=value pairs. Each
+ * key name is checked against the table of static options; if a match is
+ * found, the static option value is overridden, but invalid options remain
+ * invalid. Pairs that do not match an entry in the static option table
+ * are passed on to the RM directly.
+ *
+ * Format:
+ *
+ * NVreg_RegistryDwords="<key=value>;<key=value>;..."
+ */
+
+#define __NV_REGISTRY_DWORDS RegistryDwords
+#define NV_REG_REGISTRY_DWORDS NV_REG_STRING(__NV_REGISTRY_DWORDS)
+
+/*
+ * Option: RegistryDwordsPerDevice
+ *
+ * Description:
+ *
+ * This option allows to specify registry keys per GPU device. It helps to
+ * control registry at GPU level of granularity. It accepts a semicolon
+ * separated list of key=value pairs. The first key value pair MUST be
+ * "pci=DDDD:BB:DD.F;" where DDDD is Domain, BB is Bus Id, DD is device slot
+ * number and F is the Function. This PCI BDF is used to identify which GPU to
+ * assign the registry keys that follows next.
+ * If a GPU corresponding to the value specified in "pci=DDDD:BB:DD.F;" is NOT
+ * found, then all the registry keys that follows are skipped, until we find next
+ * valid pci identified "pci=DDDD:BB:DD.F;". Following are the valid formats for
+ * the value of the "pci" string:
+ * 1) bus:slot : Domain and function defaults to 0.
+ * 2) domain:bus:slot : Function defaults to 0.
+ * 3) domain:bus:slot.func : Complete PCI dev id string.
+ *
+ * For each of the registry keys that follows, key name is checked against the
+ * table of static options; if a match is found, the static option value is
+ * overridden, but invalid options remain invalid. Pairs that do not match an
+ * entry in the static option table are passed on to the RM directly.
+ *
+ * Format:
+ *
+ * NVreg_RegistryDwordsPerDevice="pci=DDDD:BB:DD.F;<key=value>;<key=value>;..; \
+ * pci=DDDD:BB:DD.F;<key=value>;..;"
+ */
+
+#define __NV_REGISTRY_DWORDS_PER_DEVICE RegistryDwordsPerDevice
+#define NV_REG_REGISTRY_DWORDS_PER_DEVICE NV_REG_STRING(__NV_REGISTRY_DWORDS_PER_DEVICE)
+
+#define __NV_RM_MSG RmMsg
+#define NV_RM_MSG NV_REG_STRING(__NV_RM_MSG)
+
+/*
+ * Option: UsePageAttributeTable
+ *
+ * Description:
+ *
+ * Enable/disable use of the page attribute table (PAT) available in
+ * modern x86/x86-64 processors to set the effective memory type of memory
+ * mappings to write-combining (WC).
+ *
+ * If enabled, an x86 processor with PAT support is present and the host
+ * system's Linux kernel did not configure one of the PAT entries to
+ * indicate the WC memory type, the driver will change the second entry in
+ * the PAT from its default (write-through (WT)) to WC at module load
+ * time. If the kernel did update one of the PAT entries, the driver will
+ * not modify the PAT.
+ *
+ * In both cases, the driver will honor attempts to map memory with the WC
+ * memory type by selecting the appropriate PAT entry using the correct
+ * set of PTE flags.
+ *
+ * Possible values:
+ *
+ * ~0 = use the NVIDIA driver's default logic (default)
+ * 1 = enable use of the PAT for WC mappings.
+ * 0 = disable use of the PAT for WC mappings.
+ */
+
+#define __NV_USE_PAGE_ATTRIBUTE_TABLE UsePageAttributeTable
+#define NV_USE_PAGE_ATTRIBUTE_TABLE NV_REG_STRING(__NV_USE_PAGE_ATTRIBUTE_TABLE)
+
+/*
+ * Option: EnableMSI
+ *
+ * Description:
+ *
+ * When this option is enabled and the host kernel supports the MSI feature,
+ * the NVIDIA driver will enable the PCI-E MSI capability of GPUs with the
+ * support for this feature instead of using PCI-E wired interrupt.
+ *
+ * Possible Values:
+ *
+ * 0 = disable MSI interrupt
+ * 1 = enable MSI interrupt (default)
+ *
+ */
+
+#define __NV_ENABLE_MSI EnableMSI
+#define NV_REG_ENABLE_MSI NV_REG_STRING(__NV_ENABLE_MSI)
+
+/*
+ * Option: EnablePCIeGen3
+ *
+ * Description:
+ *
+ * Due to interoperability problems seen with Kepler PCIe Gen3 capable GPUs
+ * when configured on SandyBridge E desktop platforms, NVIDIA feels that
+ * delivering a reliable, high-quality experience is not currently possible in
+ * PCIe Gen3 mode on all PCIe Gen3 platforms. Therefore, Quadro, Tesla and
+ * NVS Kepler products operate in PCIe Gen2 mode by default. You may use this
+ * option to enable PCIe Gen3 support.
+ *
+ * This is completely unsupported!
+ *
+ * Possible Values:
+ *
+ * 0: disable PCIe Gen3 support (default)
+ * 1: enable PCIe Gen3 support
+ */
+
+#define __NV_ENABLE_PCIE_GEN3 EnablePCIeGen3
+#define NV_REG_ENABLE_PCIE_GEN3 NV_REG_STRING(__NV_ENABLE_PCIE_GEN3)
+
+/*
+ * Option: MemoryPoolSize
+ *
+ * Description:
+ *
+ * When set to a non-zero value, this option specifies the size of the
+ * memory pool, given as a multiple of 1 GB, created on VMware ESXi to
+ * satisfy any system memory allocations requested by the NVIDIA kernel
+ * module.
+ */
+
+#define __NV_MEMORY_POOL_SIZE MemoryPoolSize
+#define NV_REG_MEMORY_POOL_SIZE NV_REG_STRING(__NV_MEMORY_POOL_SIZE)
+
+/*
+ * Option: KMallocHeapMaxSize
+ *
+ * Description:
+ *
+ * When set to a non-zero value, this option specifies the maximum size of the
+ * heap memory space reserved for kmalloc operations. Given as a
+ * multiple of 1 MB created on VMware ESXi to satisfy any system memory
+ * allocations requested by the NVIDIA kernel module.
+ */
+
+#define __NV_KMALLOC_HEAP_MAX_SIZE KMallocHeapMaxSize
+#define NV_KMALLOC_HEAP_MAX_SIZE NV_REG_STRING(__NV_KMALLOC_HEAP_MAX_SIZE)
+
+/*
+ * Option: VMallocHeapMaxSize
+ *
+ * Description:
+ *
+ * When set to a non-zero value, this option specifies the maximum size of the
+ * heap memory space reserved for vmalloc operations. Given as a
+ * multiple of 1 MB created on VMware ESXi to satisfy any system memory
+ * allocations requested by the NVIDIA kernel module.
+ */
+
+#define __NV_VMALLOC_HEAP_MAX_SIZE VMallocHeapMaxSize
+#define NV_VMALLOC_HEAP_MAX_SIZE NV_REG_STRING(__NV_VMALLOC_HEAP_MAX_SIZE)
+
+/*
+ * Option: IgnoreMMIOCheck
+ *
+ * Description:
+ *
+ * When this option is enabled, the NVIDIA kernel module will ignore
+ * MMIO limit check during device probe on VMWare ESXi kernel. This is
+ * typically necessary when VMware ESXi MMIO limit differs between any
+ * base version and its updates. Customer using updates can set regkey
+ * to avoid probe failure.
+ */
+
+#define __NV_IGNORE_MMIO_CHECK IgnoreMMIOCheck
+#define NV_REG_IGNORE_MMIO_CHECK NV_REG_STRING(__NV_IGNORE_MMIO_CHECK)
+
+/*
+ * Option: TCEBypassMode
+ *
+ * Description:
+ *
+ * When this option is enabled, the NVIDIA kernel module will attempt to setup
+ * all GPUs in "TCE bypass mode", in which DMA mappings of system memory bypass
+ * the IOMMU/TCE remapping hardware on IBM POWER systems. This is typically
+ * necessary for CUDA applications in which large system memory mappings may
+ * exceed the default TCE remapping capacity when operated in non-bypass mode.
+ *
+ * This option has no effect on non-POWER platforms.
+ *
+ * Possible Values:
+ *
+ * 0: system default TCE mode on all GPUs
+ * 1: enable TCE bypass mode on all GPUs
+ * 2: disable TCE bypass mode on all GPUs
+ */
+#define __NV_TCE_BYPASS_MODE TCEBypassMode
+#define NV_REG_TCE_BYPASS_MODE NV_REG_STRING(__NV_TCE_BYPASS_MODE)
+
+#define NV_TCE_BYPASS_MODE_DEFAULT 0
+#define NV_TCE_BYPASS_MODE_ENABLE 1
+#define NV_TCE_BYPASS_MODE_DISABLE 2
+
+/*
+ * Option: pci
+ *
+ * Description:
+ *
+ * On Unix platforms, per GPU based registry key can be specified as:
+ * NVreg_RegistryDwordsPerDevice="pci=DDDD:BB:DD.F,<per-gpu registry keys>".
+ * where DDDD:BB:DD.F refers to Domain:Bus:Device.Function.
+ * We need this key "pci" to identify what follows next is a PCI BDF identifier,
+ * for which the registry keys are to be applied.
+ *
+ * This define is not used on non-UNIX platforms.
+ *
+ * Possible Formats for value:
+ *
+ * 1) bus:slot : Domain and function defaults to 0.
+ * 2) domain:bus:slot : Function defaults to 0.
+ * 3) domain:bus:slot.func : Complete PCI BDF identifier string.
+ */
+#define __NV_PCI_DEVICE_BDF pci
+#define NV_REG_PCI_DEVICE_BDF NV_REG_STRING(__NV_PCI_DEVICE_BDF)
+
+/*
+ * Option: EnableStreamMemOPs
+ *
+ * Description:
+ *
+ * When this option is enabled, the CUDA driver will enable support for
+ * CUDA Stream Memory Operations in user-mode applications, which are so
+ * far required to be disabled by default due to limited support in
+ * devtools.
+ *
+ * Note: this is treated as a hint. MemOPs may still be left disabled by CUDA
+ * driver for other reasons.
+ *
+ * Possible Values:
+ *
+ * 0 = disable feature (default)
+ * 1 = enable feature
+ */
+#define __NV_ENABLE_STREAM_MEMOPS EnableStreamMemOPs
+#define NV_REG_ENABLE_STREAM_MEMOPS NV_REG_STRING(__NV_ENABLE_STREAM_MEMOPS)
+
+/*
+ * Option: EnableUserNUMAManagement
+ *
+ * Description:
+ *
+ * When this option is enabled, the NVIDIA kernel module will require the
+ * user-mode NVIDIA Persistence daemon to manage the onlining and offlining
+ * of its NUMA device memory.
+ *
+ * This option has no effect on platforms that do not support onlining
+ * device memory to a NUMA node (this feature is only supported on certain
+ * POWER9 systems).
+ *
+ * Possible Values:
+ *
+ * 0: disable user-mode NUMA management
+ * 1: enable user-mode NUMA management (default)
+ */
+#define __NV_ENABLE_USER_NUMA_MANAGEMENT EnableUserNUMAManagement
+#define NV_REG_ENABLE_USER_NUMA_MANAGEMENT NV_REG_STRING(__NV_ENABLE_USER_NUMA_MANAGEMENT)
+
+/*
+ * Option: GpuBlacklist
+ *
+ * Description:
+ *
+ * This option accepts a list of blacklisted GPUs, separated by commas, that
+ * cannot be attached or used. Each blacklisted GPU is identified by a UUID in
+ * the ASCII format with leading "GPU-". An exact match is required; no partial
+ * UUIDs. This regkey is deprecated and will be removed in the future. Use
+ * NV_REG_EXCLUDED_GPUS instead.
+ */
+#define __NV_GPU_BLACKLIST GpuBlacklist
+#define NV_REG_GPU_BLACKLIST NV_REG_STRING(__NV_GPU_BLACKLIST)
+
+/*
+ * Option: ExcludedGpus
+ *
+ * Description:
+ *
+ * This option accepts a list of excluded GPUs, separated by commas, that
+ * cannot be attached or used. Each excluded GPU is identified by a UUID in
+ * the ASCII format with leading "GPU-". An exact match is required; no partial
+ * UUIDs.
+ */
+#define __NV_EXCLUDED_GPUS ExcludedGpus
+#define NV_REG_EXCLUDED_GPUS NV_REG_STRING(__NV_EXCLUDED_GPUS)
+
+/*
+ * Option: NvLinkDisable
+ *
+ * Description:
+ *
+ * When this option is enabled, the NVIDIA kernel module will not attempt to
+ * initialize or train NVLink connections for any GPUs. System reboot is required
+ * for changes to take affect.
+ *
+ * This option has no effect if no GPUs support NVLink.
+ *
+ * Possible Values:
+ *
+ * 0: Do not disable NVLink (default)
+ * 1: Disable NVLink
+ */
+#define __NV_NVLINK_DISABLE NvLinkDisable
+#define NV_REG_NVLINK_DISABLE NV_REG_STRING(__NV_NVLINK_DISABLE)
+
+/*
+ * Option: RestrictProfilingToAdminUsers
+ *
+ * Description:
+ *
+ * When this option is enabled, the NVIDIA kernel module will prevent users
+ * without administrative access (i.e., the CAP_SYS_ADMIN capability) from
+ * using GPU performance counters.
+ *
+ * Possible Values:
+ *
+ * 0: Do not restrict GPU counters (default)
+ * 1: Restrict GPU counters to system administrators only
+ */
+
+#define __NV_RM_PROFILING_ADMIN_ONLY RmProfilingAdminOnly
+#define __NV_RM_PROFILING_ADMIN_ONLY_PARAMETER RestrictProfilingToAdminUsers
+#define NV_REG_RM_PROFILING_ADMIN_ONLY NV_REG_STRING(__NV_RM_PROFILING_ADMIN_ONLY)
+
+/*
+ * Option: TemporaryFilePath
+ *
+ * Description:
+ *
+ * When specified, this option changes the location in which the
+ * NVIDIA kernel module will create unnamed temporary files (e.g. to
+ * save the contents of video memory in). The indicated file must
+ * be a directory. By default, temporary files are created in /tmp.
+ */
+#define __NV_TEMPORARY_FILE_PATH TemporaryFilePath
+#define NV_REG_TEMPORARY_FILE_PATH NV_REG_STRING(__NV_TEMPORARY_FILE_PATH)
+
+/*
+ * Option: PreserveVideoMemoryAllocations
+ *
+ * If enabled, this option prompts the NVIDIA kernel module to save and
+ * restore all video memory allocations across system power management
+ * cycles, i.e. suspend/resume and hibernate/restore. Otherwise,
+ * only select allocations are preserved.
+ *
+ * Possible Values:
+ *
+ * 0: Preserve only select video memory allocations (default)
+ * 1: Preserve all video memory allocations
+ */
+#define __NV_PRESERVE_VIDEO_MEMORY_ALLOCATIONS PreserveVideoMemoryAllocations
+#define NV_REG_PRESERVE_VIDEO_MEMORY_ALLOCATIONS \
+ NV_REG_STRING(__NV_PRESERVE_VIDEO_MEMORY_ALLOCATIONS)
+
+/*
+ * Option: EnableS0ixPowerManagement
+ *
+ * When this option is enabled, the NVIDIA driver will use S0ix-based
+ * power management for system suspend/resume, if both the platform and
+ * the GPU support S0ix.
+ *
+ * During system suspend, if S0ix is enabled and
+ * video memory usage is above the threshold configured by
+ * 'S0ixPowerManagementVideoMemoryThreshold', video memory will be kept
+ * in self-refresh mode while the rest of the GPU is powered down.
+ *
+ * Otherwise, the driver will copy video memory contents to system memory
+ * and power off the video memory along with the GPU.
+ *
+ * Possible Values:
+ *
+ * 0: Disable S0ix based power management (default)
+ * 1: Enable S0ix based power management
+ */
+
+#define __NV_ENABLE_S0IX_POWER_MANAGEMENT EnableS0ixPowerManagement
+#define NV_REG_ENABLE_S0IX_POWER_MANAGEMENT \
+ NV_REG_STRING(__NV_ENABLE_S0IX_POWER_MANAGEMENT)
+
+/*
+ * Option: S0ixPowerManagementVideoMemoryThreshold
+ *
+ * This option controls the threshold that the NVIDIA driver will use during
+ * S0ix-based system power management.
+ *
+ * When S0ix is enabled and the system is suspended, the driver will
+ * compare the amount of video memory in use with this threshold,
+ * to decide whether to keep video memory in self-refresh or copy video
+ * memory content to system memory.
+ *
+ * See the 'EnableS0ixPowerManagement' option.
+ *
+ * Values are expressed in Megabytes (1048576 bytes).
+ *
+ * Default value for this option is 256MB.
+ *
+ */
+#define __NV_S0IX_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD \
+ S0ixPowerManagementVideoMemoryThreshold
+#define NV_REG_S0IX_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD \
+ NV_REG_STRING(__NV_S0IX_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD)
+
+/*
+ * Option: DynamicPowerManagement
+ *
+ * This option controls how aggressively the NVIDIA kernel module will manage
+ * GPU power through kernel interfaces.
+ *
+ * Possible Values:
+ *
+ * 0: Never allow the GPU to be powered down (default).
+ * 1: Power down the GPU when it is not initialized.
+ * 2: Power down the GPU after it has been inactive for some time.
+ * 3: (Default) Power down the GPU after a period of inactivity (i.e.,
+ * mode 2) on Ampere or later notebooks. Otherwise, do not power down
+ * the GPU.
+ */
+#define __NV_DYNAMIC_POWER_MANAGEMENT DynamicPowerManagement
+#define NV_REG_DYNAMIC_POWER_MANAGEMENT \
+ NV_REG_STRING(__NV_DYNAMIC_POWER_MANAGEMENT)
+
+#define NV_REG_DYNAMIC_POWER_MANAGEMENT_NEVER 0
+#define NV_REG_DYNAMIC_POWER_MANAGEMENT_COARSE 1
+#define NV_REG_DYNAMIC_POWER_MANAGEMENT_FINE 2
+#define NV_REG_DYNAMIC_POWER_MANAGEMENT_DEFAULT 3
+
+/*
+ * Option: DynamicPowerManagementVideoMemoryThreshold
+ *
+ * This option controls the threshold that the NVIDIA driver will use
+ * when selecting the dynamic power management scheme.
+ *
+ * When the driver detects that the GPU is idle, it will compare the amount
+ * of video memory in use with this threshold.
+ *
+ * If the current video memory usage is less than the threshold, the
+ * driver may preserve video memory contents in system memory and power off
+ * the video memory along with the GPU itself, if supported. Otherwise,
+ * the video memory will be kept in self-refresh mode while powering down
+ * the rest of the GPU, if supported.
+ *
+ * Values are expressed in Megabytes (1048576 bytes).
+ *
+ * If the requested value is greater than 200MB (the default), then it
+ * will be capped to 200MB.
+ */
+#define __NV_DYNAMIC_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD \
+ DynamicPowerManagementVideoMemoryThreshold
+#define NV_REG_DYNAMIC_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD \
+ NV_REG_STRING(__NV_DYNAMIC_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD)
+
+/*
+ * Option: RegisterPCIDriver
+ *
+ * Description:
+ *
+ * When this option is enabled, the NVIDIA driver will register with
+ * PCI subsystem.
+ *
+ * Possible values:
+ *
+ * 1 - register as PCI driver (default)
+ * 0 - do not register as PCI driver
+ */
+
+#define __NV_REGISTER_PCI_DRIVER RegisterPCIDriver
+#define NV_REG_REGISTER_PCI_DRIVER NV_REG_STRING(__NV_REGISTER_PCI_DRIVER)
+
+/*
+ * Option: EnablePCIERelaxedOrderingMode
+ *
+ * Description:
+ *
+ * When this option is enabled, the registry key RmSetPCIERelaxedOrdering will
+ * be set to NV_REG_STR_RM_SET_PCIE_TLP_RELAXED_ORDERING_FORCE_ENABLE, causing
+ * every device to set the relaxed ordering bit to 1 in all outbound MWr
+ * transaction-layer packets. This is equivalent to setting the regkey to
+ * FORCE_ENABLE as a non-per-device registry key.
+ *
+ * Possible values:
+ * 0 - Do not enable PCIe TLP relaxed ordering bit-setting (default)
+ * 1 - Enable PCIe TLP relaxed ordering bit-setting
+ */
+#define __NV_ENABLE_PCIE_RELAXED_ORDERING_MODE EnablePCIERelaxedOrderingMode
+#define NV_REG_ENABLE_PCIE_RELAXED_ORDERING_MODE \
+ NV_REG_STRING(__NV_ENABLE_PCIE_RELAXED_ORDERING_MODE)
+
+/*
+ * Option: EnableGpuFirmware
+ *
+ * Description:
+ *
+ * When this option is enabled, the NVIDIA driver will enable use of GPU
+ * firmware.
+ *
+ * Possible mode values:
+ * 0 - Do not enable GPU firmware
+ * 1 - Enable GPU firmware
+ * 2 - (Default) Use the default enablement policy for GPU firmware
+ *
+ * Setting this to anything other than 2 will alter driver firmware-
+ * enablement policies, possibly disabling GPU firmware where it would
+ * have otherwise been enabled by default.
+ *
+ * If this key is set globally to the system, the driver may still attempt
+ * to apply some policies to maintain uniform firmware modes across all
+ * GPUS. This may result in the driver failing initialization on some GPUs
+ * to maintain such a policy.
+ *
+ * If this key is set using NVreg_RegistryDwordsPerDevice, then the driver
+ * will attempt to honor whatever configuration is specified without applying
+ * additional policies. This may also result in failed GPU initialzations if
+ * the configuration is not possible (for example if the firmware is missing
+ * from the filesystem, or the GPU is not capable).
+ *
+ * Policy bits:
+ *
+ * POLICY_ALLOW_FALLBACK:
+ * As the normal behavior is to fail GPU initialization if this registry
+ * entry is set in such a way that results in an invalid configuration, if
+ * instead the user would like the driver to automatically try to fallback
+ * to initializing the failing GPU with firmware disabled, then this bit can
+ * be set (ex: 0x11 means try to enable GPU firmware but fall back if needed).
+ * Note that this can result in a mixed mode configuration (ex: GPU0 has
+ * firmware enabled, but GPU1 does not).
+ *
+ */
+
+#define __NV_ENABLE_GPU_FIRMWARE EnableGpuFirmware
+#define NV_REG_ENABLE_GPU_FIRMWARE NV_REG_STRING(__NV_ENABLE_GPU_FIRMWARE)
+
+#define NV_REG_ENABLE_GPU_FIRMWARE_MODE_MASK 0x0000000F
+#define NV_REG_ENABLE_GPU_FIRMWARE_MODE_DISABLED 0x00000000
+#define NV_REG_ENABLE_GPU_FIRMWARE_MODE_ENABLED 0x00000001
+#define NV_REG_ENABLE_GPU_FIRMWARE_MODE_DEFAULT 0x00000002
+
+#define NV_REG_ENABLE_GPU_FIRMWARE_POLICY_MASK 0x000000F0
+#define NV_REG_ENABLE_GPU_FIRMWARE_POLICY_ALLOW_FALLBACK 0x00000010
+
+#define NV_REG_ENABLE_GPU_FIRMWARE_DEFAULT_VALUE 0x00000012
+#define NV_REG_ENABLE_GPU_FIRMWARE_INVALID_VALUE 0xFFFFFFFF
+
+/*
+ * Option: EnableGpuFirmwareLogs
+ *
+ * When this option is enabled, the NVIDIA driver will send GPU firmware logs
+ * to the system log, when possible.
+ *
+ * Possible values:
+ * 0 - Do not send GPU firmware logs to the system log
+ * 1 - Enable sending of GPU firmware logs to the system log
+ * 2 - (Default) Enable sending of GPU firmware logs to the system log for
+ * the debug kernel driver build only
+ */
+#define __NV_ENABLE_GPU_FIRMWARE_LOGS EnableGpuFirmwareLogs
+#define NV_REG_ENABLE_GPU_FIRMWARE_LOGS NV_REG_STRING(__NV_ENABLE_GPU_FIRMWARE_LOGS)
+
+#define NV_REG_ENABLE_GPU_FIRMWARE_LOGS_DISABLE 0x00000000
+#define NV_REG_ENABLE_GPU_FIRMWARE_LOGS_ENABLE 0x00000001
+#define NV_REG_ENABLE_GPU_FIRMWARE_LOGS_ENABLE_ON_DEBUG 0x00000002
+
+/*
+ * Option: EnableDbgBreakpoint
+ *
+ * When this option is set to a non-zero value, and the kernel is configured
+ * appropriately, assertions within resman will trigger a CPU breakpoint (e.g.,
+ * INT3 on x86_64), assumed to be caught by an attached debugger.
+ *
+ * When this option is set to the value zero (the default), assertions within
+ * resman will print to the system log, but no CPU breakpoint will be triggered.
+ */
+#define __NV_ENABLE_DBG_BREAKPOINT EnableDbgBreakpoint
+
+
+/*
+ * Option: OpenRmEnableUnsupportedGpus
+ *
+ * Open nvidia.ko support for features beyond what is used on Data Center GPUs
+ * is still fairly immature, so for now require users to opt into use of open
+ * nvidia.ko with a special registry key, if not on a Data Center GPU.
+ */
+
+#define __NV_OPENRM_ENABLE_UNSUPPORTED_GPUS OpenRmEnableUnsupportedGpus
+#define NV_REG_OPENRM_ENABLE_UNSUPPORTED_GPUS NV_REG_STRING(__NV_OPENRM_ENABLE_UNSUPPORTED_GPUS)
+#define NV_REG_OPENRM_ENABLE_UNSUPPORTED_GPUS_DISABLE 0x00000000
+#define NV_REG_OPENRM_ENABLE_UNSUPPORTED_GPUS_ENABLE 0x00000001
+#define NV_REG_OPENRM_ENABLE_UNSUPPORTED_GPUS_DEFAULT NV_REG_OPENRM_ENABLE_UNSUPPORTED_GPUS_DISABLE
+
+/*
+ * Option: NVreg_DmaRemapPeerMmio
+ *
+ * Description:
+ *
+ * When this option is enabled, the NVIDIA driver will use device driver
+ * APIs provided by the Linux kernel for DMA-remapping part of a device's
+ * MMIO region to another device, creating e.g., IOMMU mappings as necessary.
+ * When this option is disabled, the NVIDIA driver will instead only apply a
+ * fixed offset, which may be zero, to CPU physical addresses to produce the
+ * DMA address for the peer's MMIO region, and no IOMMU mappings will be
+ * created.
+ *
+ * This option only affects peer MMIO DMA mappings, and not system memory
+ * mappings.
+ *
+ * Possible Values:
+ * 0 = disable dynamic DMA remapping of peer MMIO regions
+ * 1 = enable dynamic DMA remapping of peer MMIO regions (default)
+ */
+#define __NV_DMA_REMAP_PEER_MMIO DmaRemapPeerMmio
+#define NV_DMA_REMAP_PEER_MMIO NV_REG_STRING(__NV_DMA_REMAP_PEER_MMIO)
+#define NV_DMA_REMAP_PEER_MMIO_DISABLE 0x00000000
+#define NV_DMA_REMAP_PEER_MMIO_ENABLE 0x00000001
+
+#if defined(NV_DEFINE_REGISTRY_KEY_TABLE)
+
+/*
+ *---------registry key parameter declarations--------------
+ */
+
+NV_DEFINE_REG_ENTRY(__NV_RESMAN_DEBUG_LEVEL, ~0);
+NV_DEFINE_REG_ENTRY(__NV_RM_LOGON_RC, 1);
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_MODIFY_DEVICE_FILES, 1);
+NV_DEFINE_REG_ENTRY(__NV_DEVICE_FILE_UID, 0);
+NV_DEFINE_REG_ENTRY(__NV_DEVICE_FILE_GID, 0);
+NV_DEFINE_REG_ENTRY(__NV_DEVICE_FILE_MODE, 0666);
+NV_DEFINE_REG_ENTRY(__NV_INITIALIZE_SYSTEM_MEMORY_ALLOCATIONS, 1);
+NV_DEFINE_REG_ENTRY(__NV_USE_PAGE_ATTRIBUTE_TABLE, ~0);
+NV_DEFINE_REG_ENTRY(__NV_ENABLE_PCIE_GEN3, 0);
+NV_DEFINE_REG_ENTRY(__NV_ENABLE_MSI, 1);
+NV_DEFINE_REG_ENTRY(__NV_TCE_BYPASS_MODE, NV_TCE_BYPASS_MODE_DEFAULT);
+NV_DEFINE_REG_ENTRY(__NV_ENABLE_STREAM_MEMOPS, 0);
+NV_DEFINE_REG_ENTRY(__NV_RM_PROFILING_ADMIN_ONLY_PARAMETER, 1);
+NV_DEFINE_REG_ENTRY(__NV_PRESERVE_VIDEO_MEMORY_ALLOCATIONS, 0);
+NV_DEFINE_REG_ENTRY(__NV_ENABLE_S0IX_POWER_MANAGEMENT, 0);
+NV_DEFINE_REG_ENTRY(__NV_S0IX_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD, 256);
+NV_DEFINE_REG_ENTRY(__NV_DYNAMIC_POWER_MANAGEMENT, 3);
+NV_DEFINE_REG_ENTRY(__NV_DYNAMIC_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD, 200);
+NV_DEFINE_REG_ENTRY(__NV_ENABLE_GPU_FIRMWARE, NV_REG_ENABLE_GPU_FIRMWARE_DEFAULT_VALUE);
+NV_DEFINE_REG_ENTRY(__NV_ENABLE_GPU_FIRMWARE_LOGS, NV_REG_ENABLE_GPU_FIRMWARE_LOGS_ENABLE_ON_DEBUG);
+NV_DEFINE_REG_ENTRY(__NV_OPENRM_ENABLE_UNSUPPORTED_GPUS, NV_REG_OPENRM_ENABLE_UNSUPPORTED_GPUS_DEFAULT);
+
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_ENABLE_USER_NUMA_MANAGEMENT, 1);
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_MEMORY_POOL_SIZE, 0);
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_KMALLOC_HEAP_MAX_SIZE, 0);
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_VMALLOC_HEAP_MAX_SIZE, 0);
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_IGNORE_MMIO_CHECK, 0);
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_NVLINK_DISABLE, 0);
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_ENABLE_PCIE_RELAXED_ORDERING_MODE, 0);
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_REGISTER_PCI_DRIVER, 1);
+NV_DEFINE_REG_ENTRY_GLOBAL(__NV_ENABLE_DBG_BREAKPOINT, 0);
+
+NV_DEFINE_REG_STRING_ENTRY(__NV_REGISTRY_DWORDS, NULL);
+NV_DEFINE_REG_STRING_ENTRY(__NV_REGISTRY_DWORDS_PER_DEVICE, NULL);
+NV_DEFINE_REG_STRING_ENTRY(__NV_RM_MSG, NULL);
+NV_DEFINE_REG_STRING_ENTRY(__NV_GPU_BLACKLIST, NULL);
+NV_DEFINE_REG_STRING_ENTRY(__NV_TEMPORARY_FILE_PATH, NULL);
+NV_DEFINE_REG_STRING_ENTRY(__NV_EXCLUDED_GPUS, NULL);
+NV_DEFINE_REG_ENTRY(__NV_DMA_REMAP_PEER_MMIO, NV_DMA_REMAP_PEER_MMIO_ENABLE);
+
+/*
+ *----------------registry database definition----------------------
+ */
+
+/*
+ * You can enable any of the registry options disabled by default by
+ * editing their respective entries in the table below. The last field
+ * determines if the option is considered valid - in order for the
+ * changes to take effect, you need to recompile and reload the NVIDIA
+ * kernel module.
+ */
+nv_parm_t nv_parms[] = {
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_RESMAN_DEBUG_LEVEL),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_RM_LOGON_RC),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_MODIFY_DEVICE_FILES),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_DEVICE_FILE_UID),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_DEVICE_FILE_GID),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_DEVICE_FILE_MODE),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_INITIALIZE_SYSTEM_MEMORY_ALLOCATIONS),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_USE_PAGE_ATTRIBUTE_TABLE),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_MSI),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_PCIE_GEN3),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_MEMORY_POOL_SIZE),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_KMALLOC_HEAP_MAX_SIZE),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_VMALLOC_HEAP_MAX_SIZE),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_IGNORE_MMIO_CHECK),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_TCE_BYPASS_MODE),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_STREAM_MEMOPS),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_USER_NUMA_MANAGEMENT),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_NVLINK_DISABLE),
+ NV_DEFINE_PARAMS_TABLE_ENTRY_CUSTOM_NAME(__NV_RM_PROFILING_ADMIN_ONLY,
+ __NV_RM_PROFILING_ADMIN_ONLY_PARAMETER),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_PRESERVE_VIDEO_MEMORY_ALLOCATIONS),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_S0IX_POWER_MANAGEMENT),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_S0IX_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_DYNAMIC_POWER_MANAGEMENT),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_DYNAMIC_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_REGISTER_PCI_DRIVER),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_PCIE_RELAXED_ORDERING_MODE),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_GPU_FIRMWARE),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_GPU_FIRMWARE_LOGS),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_DBG_BREAKPOINT),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_OPENRM_ENABLE_UNSUPPORTED_GPUS),
+ NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_DMA_REMAP_PEER_MMIO),
+ {NULL, NULL}
+};
+
+#elif defined(NVRM)
+
+extern nv_parm_t nv_parms[];
+
+#endif /* NV_DEFINE_REGISTRY_KEY_TABLE */
+
+#endif /* _RM_REG_H_ */
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv-unix-nvos-params-wrappers.h b/userspace/sdks/nv525/nvalloc/unix/include/nv-unix-nvos-params-wrappers.h
new file mode 100644
index 0000000..02b0156
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv-unix-nvos-params-wrappers.h
@@ -0,0 +1,49 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2017 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _NV_UNIX_NVOS_PARAMS_WRAPPERS_H_
+#define _NV_UNIX_NVOS_PARAMS_WRAPPERS_H_
+
+#include <nvos.h>
+
+/*
+ * This is a wrapper for NVOS02_PARAMETERS with file descriptor
+ */
+
+typedef struct
+{
+ NVOS02_PARAMETERS params;
+ int fd;
+} nv_ioctl_nvos02_parameters_with_fd;
+
+/*
+ * This is a wrapper for NVOS33_PARAMETERS with file descriptor
+ */
+typedef struct
+{
+ NVOS33_PARAMETERS params;
+ int fd;
+} nv_ioctl_nvos33_parameters_with_fd;
+
+#endif // _NV_UNIX_NVOS_PARAMS_WRAPPERS_H_
+
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv.h b/userspace/sdks/nv525/nvalloc/unix/include/nv.h
new file mode 100644
index 0000000..5cb4d1b
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv.h
@@ -0,0 +1,1058 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 1999-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef _NV_H_
+#define _NV_H_
+
+
+
+#include <nvlimits.h>
+
+#if defined(NV_KERNEL_INTERFACE_LAYER) && defined(__FreeBSD__)
+ #include <sys/stddef.h> // NULL
+#elif defined(NV_KERNEL_INTERFACE_LAYER) && defined(NV_LINUX)
+ #include <linux/stddef.h> // NULL
+#else
+ #include <stddef.h> // NULL
+#endif
+
+#include <nvstatus.h>
+#include "nv_stdarg.h"
+#include <nv-caps.h>
+#include <nv-firmware.h>
+#include <nv-ioctl.h>
+#include <nvmisc.h>
+
+extern nv_cap_t *nvidia_caps_root;
+
+extern const NvBool nv_is_rm_firmware_supported_os;
+
+#include <nv-kernel-interface-api.h>
+
+/* NVIDIA's reserved major character device number (Linux). */
+#define NV_MAJOR_DEVICE_NUMBER 195
+
+#define GPU_UUID_LEN (16)
+
+/*
+ * Buffer size for an ASCII UUID: We need 2 digits per byte, plus space
+ * for "GPU", 5 dashes, and '\0' termination:
+ */
+#define GPU_UUID_ASCII_LEN (GPU_UUID_LEN * 2 + 9)
+
+/*
+ * #define an absolute maximum used as a sanity check for the
+ * NV_ESC_IOCTL_XFER_CMD ioctl() size argument.
+ */
+#define NV_ABSOLUTE_MAX_IOCTL_SIZE 16384
+
+/*
+ * Solaris provides no more than 8 bits for the argument size in
+ * the ioctl() command encoding; make sure we don't exceed this
+ * limit.
+ */
+#define __NV_IOWR_ASSERT(type) ((sizeof(type) <= NV_PLATFORM_MAX_IOCTL_SIZE) ? 1 : -1)
+#define __NV_IOWR(nr, type) ({ \
+ typedef char __NV_IOWR_TYPE_SIZE_ASSERT[__NV_IOWR_ASSERT(type)]; \
+ _IOWR(NV_IOCTL_MAGIC, (nr), type); \
+})
+
+#define NV_PCI_DEV_FMT "%04x:%02x:%02x.%x"
+#define NV_PCI_DEV_FMT_ARGS(nv) (nv)->pci_info.domain, (nv)->pci_info.bus, \
+ (nv)->pci_info.slot, (nv)->pci_info.function
+
+#define NV_RM_DEVICE_INTR_ADDRESS 0x100
+
+/*!
+ * @brief The order of the display clocks in the below defined enum
+ * should be synced with below mapping array and macro.
+ * All four should be updated simultaneously in case
+ * of removal or addition of clocks in below order.
+ * Also, TEGRASOC_WHICH_CLK_MAX is used in various places
+ * in below mentioned files.
+ * arch/nvalloc/unix/Linux/nv-linux.h
+ *
+ * arch/nvalloc/unix/src/os.c
+ * dispClkMapRmToOsArr[] = {...};
+ *
+ * arch/nvalloc/unix/Linux/nv-clk.c
+ * osMapClk[] = {...};
+ *
+ */
+typedef enum _TEGRASOC_WHICH_CLK
+{
+ TEGRASOC_WHICH_CLK_NVDISPLAYHUB,
+ TEGRASOC_WHICH_CLK_NVDISPLAY_DISP,
+ TEGRASOC_WHICH_CLK_NVDISPLAY_P0,
+ TEGRASOC_WHICH_CLK_NVDISPLAY_P1,
+ TEGRASOC_WHICH_CLK_DPAUX0,
+ TEGRASOC_WHICH_CLK_FUSE,
+ TEGRASOC_WHICH_CLK_DSIPLL_VCO,
+ TEGRASOC_WHICH_CLK_DSIPLL_CLKOUTPN,
+ TEGRASOC_WHICH_CLK_DSIPLL_CLKOUTA,
+ TEGRASOC_WHICH_CLK_SPPLL0_VCO,
+ TEGRASOC_WHICH_CLK_SPPLL0_CLKOUTPN,
+ TEGRASOC_WHICH_CLK_SPPLL0_CLKOUTA,
+ TEGRASOC_WHICH_CLK_SPPLL0_CLKOUTB,
+ TEGRASOC_WHICH_CLK_SPPLL0_DIV10,
+ TEGRASOC_WHICH_CLK_SPPLL0_DIV25,
+ TEGRASOC_WHICH_CLK_SPPLL0_DIV27,
+ TEGRASOC_WHICH_CLK_SPPLL1_VCO,
+ TEGRASOC_WHICH_CLK_SPPLL1_CLKOUTPN,
+ TEGRASOC_WHICH_CLK_SPPLL1_DIV27,
+ TEGRASOC_WHICH_CLK_VPLL0_REF,
+ TEGRASOC_WHICH_CLK_VPLL0,
+ TEGRASOC_WHICH_CLK_VPLL1,
+ TEGRASOC_WHICH_CLK_NVDISPLAY_P0_REF,
+ TEGRASOC_WHICH_CLK_RG0,
+ TEGRASOC_WHICH_CLK_RG1,
+ TEGRASOC_WHICH_CLK_DISPPLL,
+ TEGRASOC_WHICH_CLK_DISPHUBPLL,
+ TEGRASOC_WHICH_CLK_DSI_LP,
+ TEGRASOC_WHICH_CLK_DSI_CORE,
+ TEGRASOC_WHICH_CLK_DSI_PIXEL,
+ TEGRASOC_WHICH_CLK_PRE_SOR0,
+ TEGRASOC_WHICH_CLK_PRE_SOR1,
+ TEGRASOC_WHICH_CLK_DP_LINK_REF,
+ TEGRASOC_WHICH_CLK_SOR_LINKA_INPUT,
+ TEGRASOC_WHICH_CLK_SOR_LINKA_AFIFO,
+ TEGRASOC_WHICH_CLK_SOR_LINKA_AFIFO_M,
+ TEGRASOC_WHICH_CLK_RG0_M,
+ TEGRASOC_WHICH_CLK_RG1_M,
+ TEGRASOC_WHICH_CLK_SOR0_M,
+ TEGRASOC_WHICH_CLK_SOR1_M,
+ TEGRASOC_WHICH_CLK_PLLHUB,
+ TEGRASOC_WHICH_CLK_SOR0,
+ TEGRASOC_WHICH_CLK_SOR1,
+ TEGRASOC_WHICH_CLK_SOR_PAD_INPUT,
+ TEGRASOC_WHICH_CLK_PRE_SF0,
+ TEGRASOC_WHICH_CLK_SF0,
+ TEGRASOC_WHICH_CLK_SF1,
+ TEGRASOC_WHICH_CLK_DSI_PAD_INPUT,
+ TEGRASOC_WHICH_CLK_PRE_SOR0_REF,
+ TEGRASOC_WHICH_CLK_PRE_SOR1_REF,
+ TEGRASOC_WHICH_CLK_SOR0_PLL_REF,
+ TEGRASOC_WHICH_CLK_SOR1_PLL_REF,
+ TEGRASOC_WHICH_CLK_SOR0_REF,
+ TEGRASOC_WHICH_CLK_SOR1_REF,
+ TEGRASOC_WHICH_CLK_OSC,
+ TEGRASOC_WHICH_CLK_DSC,
+ TEGRASOC_WHICH_CLK_MAUD,
+ TEGRASOC_WHICH_CLK_AZA_2XBIT,
+ TEGRASOC_WHICH_CLK_AZA_BIT,
+ TEGRASOC_WHICH_CLK_MIPI_CAL,
+ TEGRASOC_WHICH_CLK_UART_FST_MIPI_CAL,
+ TEGRASOC_WHICH_CLK_SOR0_DIV,
+ TEGRASOC_WHICH_CLK_DISP_ROOT,
+ TEGRASOC_WHICH_CLK_HUB_ROOT,
+ TEGRASOC_WHICH_CLK_PLLA_DISP,
+ TEGRASOC_WHICH_CLK_PLLA_DISPHUB,
+ TEGRASOC_WHICH_CLK_PLLA,
+ TEGRASOC_WHICH_CLK_MAX, // TEGRASOC_WHICH_CLK_MAX is defined for boundary checks only.
+} TEGRASOC_WHICH_CLK;
+
+#ifdef NVRM
+
+extern const char *pNVRM_ID;
+
+/*
+ * ptr arithmetic convenience
+ */
+
+typedef union
+{
+ volatile NvV8 Reg008[1];
+ volatile NvV16 Reg016[1];
+ volatile NvV32 Reg032[1];
+} nv_hwreg_t, * nv_phwreg_t;
+
+
+#define NVRM_PCICFG_NUM_BARS 6
+#define NVRM_PCICFG_BAR_OFFSET(i) (0x10 + (i) * 4)
+#define NVRM_PCICFG_BAR_REQTYPE_MASK 0x00000001
+#define NVRM_PCICFG_BAR_REQTYPE_MEMORY 0x00000000
+#define NVRM_PCICFG_BAR_MEMTYPE_MASK 0x00000006
+#define NVRM_PCICFG_BAR_MEMTYPE_64BIT 0x00000004
+#define NVRM_PCICFG_BAR_ADDR_MASK 0xfffffff0
+
+#define NVRM_PCICFG_NUM_DWORDS 16
+
+#define NV_GPU_NUM_BARS 3
+#define NV_GPU_BAR_INDEX_REGS 0
+#define NV_GPU_BAR_INDEX_FB 1
+#define NV_GPU_BAR_INDEX_IMEM 2
+
+typedef struct
+{
+ NvU64 cpu_address;
+ NvU64 size;
+ NvU32 offset;
+ NvU32 *map;
+ nv_phwreg_t map_u;
+} nv_aperture_t;
+
+typedef struct
+{
+ char *name;
+ NvU32 *data;
+} nv_parm_t;
+
+#define NV_RM_PAGE_SHIFT 12
+#define NV_RM_PAGE_SIZE (1 << NV_RM_PAGE_SHIFT)
+#define NV_RM_PAGE_MASK (NV_RM_PAGE_SIZE - 1)
+
+#define NV_RM_TO_OS_PAGE_SHIFT (os_page_shift - NV_RM_PAGE_SHIFT)
+#define NV_RM_PAGES_PER_OS_PAGE (1U << NV_RM_TO_OS_PAGE_SHIFT)
+#define NV_RM_PAGES_TO_OS_PAGES(count) \
+ ((((NvUPtr)(count)) >> NV_RM_TO_OS_PAGE_SHIFT) + \
+ ((((count) & ((1 << NV_RM_TO_OS_PAGE_SHIFT) - 1)) != 0) ? 1 : 0))
+
+#if defined(NVCPU_X86_64)
+#define NV_STACK_SIZE (NV_RM_PAGE_SIZE * 3)
+#else
+#define NV_STACK_SIZE (NV_RM_PAGE_SIZE * 2)
+#endif
+
+typedef struct nvidia_stack_s
+{
+ NvU32 size;
+ void *top;
+ NvU8 stack[NV_STACK_SIZE-16] __attribute__ ((aligned(16)));
+} nvidia_stack_t;
+
+/*
+ * TODO: Remove once all UNIX layers have been converted to use nvidia_stack_t
+ */
+typedef nvidia_stack_t nv_stack_t;
+
+typedef struct nv_file_private_t nv_file_private_t;
+
+/*
+ * this is a wrapper for unix events
+ * unlike the events that will be returned to clients, this includes
+ * kernel-specific data, such as file pointer, etc..
+ */
+typedef struct nv_event_s
+{
+ NvHandle hParent;
+ NvHandle hObject;
+ NvU32 index;
+ NvU32 info32;
+ NvU16 info16;
+ nv_file_private_t *nvfp; /* per file-descriptor data pointer */
+ NvU32 fd;
+ NvBool active; /* whether the event should be signaled */
+ NvU32 refcount; /* count of associated RM events */
+ struct nv_event_s *next;
+} nv_event_t;
+
+typedef struct nv_kern_mapping_s
+{
+ void *addr;
+ NvU64 size;
+ NvU32 modeFlag;
+ struct nv_kern_mapping_s *next;
+} nv_kern_mapping_t;
+
+typedef struct nv_usermap_access_params_s
+{
+ NvU64 addr;
+ NvU64 size;
+ NvU64 offset;
+ NvU64 *page_array;
+ NvU64 num_pages;
+ NvU64 mmap_start;
+ NvU64 mmap_size;
+ NvU64 access_start;
+ NvU64 access_size;
+ NvU64 remap_prot_extra;
+ NvBool contig;
+ NvU32 caching;
+} nv_usermap_access_params_t;
+
+/*
+ * It stores mapping context per mapping
+ */
+typedef struct nv_alloc_mapping_context_s {
+ void *alloc;
+ NvU64 page_index;
+ NvU64 *page_array;
+ NvU64 num_pages;
+ NvU64 mmap_start;
+ NvU64 mmap_size;
+ NvU64 access_start;
+ NvU64 access_size;
+ NvU64 remap_prot_extra;
+ NvU32 prot;
+ NvBool valid;
+ NvU32 caching;
+} nv_alloc_mapping_context_t;
+
+typedef enum
+{
+ NV_SOC_IRQ_DISPLAY_TYPE = 0x1,
+ NV_SOC_IRQ_DPAUX_TYPE,
+ NV_SOC_IRQ_GPIO_TYPE,
+ NV_SOC_IRQ_HDACODEC_TYPE,
+ NV_SOC_IRQ_INVALID_TYPE
+} nv_soc_irq_type_t;
+
+/*
+ * It stores interrupt numbers and interrupt type and private data
+ */
+typedef struct nv_soc_irq_info_s {
+ NvU32 irq_num;
+ nv_soc_irq_type_t irq_type;
+ NvBool bh_pending;
+ union {
+ NvU32 gpio_num;
+ NvU32 dpaux_instance;
+ } irq_data;
+} nv_soc_irq_info_t;
+
+#define NV_MAX_SOC_IRQS 6
+#define NV_MAX_DPAUX_NUM_DEVICES 4
+#define NV_MAX_SOC_DPAUX_NUM_DEVICES 2 // From SOC_DEV_MAPPING
+
+#define NV_IGPU_LEGACY_STALL_IRQ 70
+#define NV_IGPU_MAX_STALL_IRQS 3
+#define NV_IGPU_MAX_NONSTALL_IRQS 1
+/*
+ * per device state
+ */
+
+/* DMA-capable device data, defined by kernel interface layer */
+typedef struct nv_dma_device nv_dma_device_t;
+
+typedef struct nv_state_t
+{
+ void *priv; /* private data */
+ void *os_state; /* os-specific device state */
+
+ int flags;
+
+ /* PCI config info */
+ nv_pci_info_t pci_info;
+ NvU16 subsystem_id;
+ NvU16 subsystem_vendor;
+ NvU32 gpu_id;
+ NvU32 iovaspace_id;
+ struct
+ {
+ NvBool valid;
+ NvU8 uuid[GPU_UUID_LEN];
+ } nv_uuid_cache;
+ void *handle;
+
+ NvU32 pci_cfg_space[NVRM_PCICFG_NUM_DWORDS];
+
+ /* physical characteristics */
+ nv_aperture_t bars[NV_GPU_NUM_BARS];
+ nv_aperture_t *regs;
+ nv_aperture_t *dpaux[NV_MAX_DPAUX_NUM_DEVICES];
+ nv_aperture_t *hdacodec_regs;
+ nv_aperture_t *mipical_regs;
+ nv_aperture_t *fb, ud;
+ nv_aperture_t *simregs;
+ nv_aperture_t *emc_regs;
+
+ NvU32 num_dpaux_instance;
+ NvU32 interrupt_line;
+ NvU32 dpaux_irqs[NV_MAX_DPAUX_NUM_DEVICES];
+ nv_soc_irq_info_t soc_irq_info[NV_MAX_SOC_IRQS];
+ NvS32 current_soc_irq;
+ NvU32 num_soc_irqs;
+ NvU32 hdacodec_irq;
+ NvU8 *soc_dcb_blob;
+ NvU32 soc_dcb_size;
+ NvU32 disp_sw_soc_chip_id;
+
+ NvU32 igpu_stall_irq[NV_IGPU_MAX_STALL_IRQS];
+ NvU32 igpu_nonstall_irq;
+ NvU32 num_stall_irqs;
+ NvU64 dma_mask;
+
+ NvBool primary_vga;
+
+ NvU32 sim_env;
+
+ NvU32 rc_timer_enabled;
+
+ /* list of events allocated for this device */
+ nv_event_t *event_list;
+
+ /* lock to protect event_list */
+ void *event_spinlock;
+
+ nv_kern_mapping_t *kern_mappings;
+
+ /* Kernel interface DMA device data */
+ nv_dma_device_t *dma_dev;
+ nv_dma_device_t *niso_dma_dev;
+
+ /*
+ * Per-GPU queue. The actual queue object is usually allocated in the
+ * arch-specific parent structure (e.g. nv_linux_state_t), and this
+ * pointer just points to it.
+ */
+ struct os_work_queue *queue;
+
+ /* For loading RM as a firmware (DCE or GSP) client */
+ NvBool request_firmware; /* request firmware from the OS */
+ NvBool request_fw_client_rm; /* attempt to init RM as FW a client */
+ NvBool allow_fallback_to_monolithic_rm; /* allow fallback to monolithic RM if FW client RM doesn't work out */
+ NvBool enable_firmware_logs; /* attempt to enable firmware log decoding/printing */
+
+ /* Variable to track, if nvidia_remove is called */
+ NvBool removed;
+
+ NvBool console_device;
+
+ /* Variable to track, if GPU is external GPU */
+ NvBool is_external_gpu;
+
+ /* Variable to track, if regkey PreserveVideoMemoryAllocations is set */
+ NvBool preserve_vidmem_allocations;
+
+ /* Variable to force allocation of 32-bit addressable memory */
+ NvBool force_dma32_alloc;
+
+ /* PCI power state should be D0 during system suspend */
+ NvBool d0_state_in_suspend;
+
+ /* Current cyclestats client and context */
+ NvU32 profiler_owner;
+ void *profiler_context;
+
+ /*
+ * RMAPI objects to use in the OS layer to talk to core RM.
+ *
+ * Note that we only need to store one subdevice handle: in SLI, we will
+ * have a separate nv_state_t per physical GPU.
+ */
+ struct {
+ NvHandle hClient;
+ NvHandle hDevice;
+ NvHandle hSubDevice;
+ NvHandle hI2C;
+ NvHandle hDisp;
+ } rmapi;
+
+ /* Bool to check if ISO iommu enabled */
+ NvBool iso_iommu_present;
+
+ /* Bool to check if dma-buf is supported */
+ NvBool dma_buf_supported;
+
+ NvBool printed_openrm_enable_unsupported_gpus_error;
+
+ /* Check if NVPCF DSM function is implemented under NVPCF or GPU device scope */
+ NvBool nvpcf_dsm_in_gpu_scope;
+
+ /* Bool to check if the device received a shutdown notification */
+ NvBool is_shutdown;
+
+} nv_state_t;
+
+// These define need to be in sync with defines in system.h
+#define OS_TYPE_LINUX 0x1
+#define OS_TYPE_FREEBSD 0x2
+#define OS_TYPE_SUNOS 0x3
+#define OS_TYPE_VMWARE 0x4
+
+#define NVFP_TYPE_NONE 0x0
+#define NVFP_TYPE_REFCOUNTED 0x1
+#define NVFP_TYPE_REGISTERED 0x2
+
+struct nv_file_private_t
+{
+ NvHandle *handles;
+ NvU16 maxHandles;
+ NvU32 deviceInstance;
+ NvU8 metadata[64];
+
+ nv_file_private_t *ctl_nvfp;
+ void *ctl_nvfp_priv;
+ NvU32 register_or_refcount;
+};
+
+// Forward define the gpu ops structures
+typedef struct gpuSession *nvgpuSessionHandle_t;
+typedef struct gpuDevice *nvgpuDeviceHandle_t;
+typedef struct gpuAddressSpace *nvgpuAddressSpaceHandle_t;
+typedef struct gpuChannel *nvgpuChannelHandle_t;
+typedef struct UvmGpuChannelInfo_tag *nvgpuChannelInfo_t;
+typedef struct UvmGpuChannelAllocParams_tag nvgpuChannelAllocParams_t;
+typedef struct UvmGpuCaps_tag *nvgpuCaps_t;
+typedef struct UvmGpuCopyEnginesCaps_tag *nvgpuCesCaps_t;
+typedef struct UvmGpuAddressSpaceInfo_tag *nvgpuAddressSpaceInfo_t;
+typedef struct UvmGpuAllocInfo_tag *nvgpuAllocInfo_t;
+typedef struct UvmGpuP2PCapsParams_tag *nvgpuP2PCapsParams_t;
+typedef struct UvmGpuFbInfo_tag *nvgpuFbInfo_t;
+typedef struct UvmGpuEccInfo_tag *nvgpuEccInfo_t;
+typedef struct UvmGpuFaultInfo_tag *nvgpuFaultInfo_t;
+typedef struct UvmGpuAccessCntrInfo_tag *nvgpuAccessCntrInfo_t;
+typedef struct UvmGpuAccessCntrConfig_tag *nvgpuAccessCntrConfig_t;
+typedef struct UvmGpuInfo_tag nvgpuInfo_t;
+typedef struct UvmGpuClientInfo_tag nvgpuClientInfo_t;
+typedef struct UvmPmaAllocationOptions_tag *nvgpuPmaAllocationOptions_t;
+typedef struct UvmPmaStatistics_tag *nvgpuPmaStatistics_t;
+typedef struct UvmGpuMemoryInfo_tag *nvgpuMemoryInfo_t;
+typedef struct UvmGpuExternalMappingInfo_tag *nvgpuExternalMappingInfo_t;
+typedef struct UvmGpuChannelResourceInfo_tag *nvgpuChannelResourceInfo_t;
+typedef struct UvmGpuChannelInstanceInfo_tag *nvgpuChannelInstanceInfo_t;
+typedef struct UvmGpuChannelResourceBindParams_tag *nvgpuChannelResourceBindParams_t;
+typedef struct UvmGpuPagingChannelAllocParams_tag nvgpuPagingChannelAllocParams_t;
+typedef struct UvmGpuPagingChannel_tag *nvgpuPagingChannelHandle_t;
+typedef struct UvmGpuPagingChannelInfo_tag *nvgpuPagingChannelInfo_t;
+typedef enum UvmPmaGpuMemoryType_tag nvgpuGpuMemoryType_t;
+typedef NV_STATUS (*nvPmaEvictPagesCallback)(void *, NvU32, NvU64 *, NvU32, NvU64, NvU64, nvgpuGpuMemoryType_t);
+typedef NV_STATUS (*nvPmaEvictRangeCallback)(void *, NvU64, NvU64, nvgpuGpuMemoryType_t);
+
+/*
+ * flags
+ */
+
+#define NV_FLAG_OPEN 0x0001
+#define NV_FLAG_EXCLUDE 0x0002
+#define NV_FLAG_CONTROL 0x0004
+// Unused 0x0008
+#define NV_FLAG_SOC_DISPLAY 0x0010
+#define NV_FLAG_USES_MSI 0x0020
+#define NV_FLAG_USES_MSIX 0x0040
+#define NV_FLAG_PASSTHRU 0x0080
+#define NV_FLAG_SUSPENDED 0x0100
+#define NV_FLAG_SOC_IGPU 0x0200
+// Unused 0x0400
+#define NV_FLAG_PERSISTENT_SW_STATE 0x0800
+#define NV_FLAG_IN_RECOVERY 0x1000
+// Unused 0x2000
+#define NV_FLAG_UNBIND_LOCK 0x4000
+/* To be set when GPU is not present on the bus, to help device teardown */
+#define NV_FLAG_IN_SURPRISE_REMOVAL 0x8000
+
+typedef enum
+{
+ NV_PM_ACTION_HIBERNATE,
+ NV_PM_ACTION_STANDBY,
+ NV_PM_ACTION_RESUME
+} nv_pm_action_t;
+
+typedef enum
+{
+ NV_PM_ACTION_DEPTH_DEFAULT,
+ NV_PM_ACTION_DEPTH_MODESET,
+ NV_PM_ACTION_DEPTH_UVM
+} nv_pm_action_depth_t;
+
+typedef enum
+{
+ NV_DYNAMIC_PM_NEVER,
+ NV_DYNAMIC_PM_COARSE,
+ NV_DYNAMIC_PM_FINE
+} nv_dynamic_power_mode_t;
+
+typedef enum
+{
+ NV_POWER_STATE_IN_HIBERNATE,
+ NV_POWER_STATE_IN_STANDBY,
+ NV_POWER_STATE_RUNNING
+} nv_power_state_t;
+
+#define NV_PRIMARY_VGA(nv) ((nv)->primary_vga)
+
+#define NV_IS_CTL_DEVICE(nv) ((nv)->flags & NV_FLAG_CONTROL)
+#define NV_IS_SOC_DISPLAY_DEVICE(nv) \
+ ((nv)->flags & NV_FLAG_SOC_DISPLAY)
+
+#define NV_IS_SOC_IGPU_DEVICE(nv) \
+ ((nv)->flags & NV_FLAG_SOC_IGPU)
+
+#define NV_IS_DEVICE_IN_SURPRISE_REMOVAL(nv) \
+ (((nv)->flags & NV_FLAG_IN_SURPRISE_REMOVAL) != 0)
+
+#define NV_SOC_IS_ISO_IOMMU_PRESENT(nv) \
+ ((nv)->iso_iommu_present)
+
+/*
+ * GPU add/remove events
+ */
+#define NV_SYSTEM_GPU_ADD_EVENT 0x9001
+#define NV_SYSTEM_GPU_REMOVE_EVENT 0x9002
+
+/*
+ * NVIDIA ACPI sub-event IDs (event types) to be passed into
+ * to core NVIDIA driver for ACPI events.
+ */
+#define NV_SYSTEM_ACPI_EVENT_VALUE_DISPLAY_SWITCH_DEFAULT 0
+#define NV_SYSTEM_ACPI_EVENT_VALUE_DOCK_EVENT_UNDOCKED 0
+#define NV_SYSTEM_ACPI_EVENT_VALUE_DOCK_EVENT_DOCKED 1
+
+#define NV_ACPI_NVIF_HANDLE_PRESENT 0x01
+#define NV_ACPI_DSM_HANDLE_PRESENT 0x02
+#define NV_ACPI_WMMX_HANDLE_PRESENT 0x04
+
+#define NV_EVAL_ACPI_METHOD_NVIF 0x01
+#define NV_EVAL_ACPI_METHOD_WMMX 0x02
+
+typedef enum {
+ NV_I2C_CMD_READ = 1,
+ NV_I2C_CMD_WRITE,
+ NV_I2C_CMD_SMBUS_READ,
+ NV_I2C_CMD_SMBUS_WRITE,
+ NV_I2C_CMD_SMBUS_QUICK_WRITE,
+ NV_I2C_CMD_SMBUS_QUICK_READ,
+ NV_I2C_CMD_SMBUS_BLOCK_READ,
+ NV_I2C_CMD_SMBUS_BLOCK_WRITE,
+ NV_I2C_CMD_BLOCK_READ,
+ NV_I2C_CMD_BLOCK_WRITE
+} nv_i2c_cmd_t;
+
+// Flags needed by OSAllocPagesNode
+#define NV_ALLOC_PAGES_NODE_NONE 0x0
+#define NV_ALLOC_PAGES_NODE_SKIP_RECLAIM 0x1
+
+/*
+** where we hide our nv_state_t * ...
+*/
+#define NV_SET_NV_STATE(pgpu,p) ((pgpu)->pOsGpuInfo = (p))
+#define NV_GET_NV_STATE(pGpu) \
+ (nv_state_t *)((pGpu) ? (pGpu)->pOsGpuInfo : NULL)
+
+static inline NvBool IS_REG_OFFSET(nv_state_t *nv, NvU64 offset, NvU64 length)
+{
+ return ((offset >= nv->regs->cpu_address) &&
+ ((offset + (length - 1)) >= offset) &&
+ ((offset + (length - 1)) <= (nv->regs->cpu_address + (nv->regs->size - 1))));
+}
+
+static inline NvBool IS_FB_OFFSET(nv_state_t *nv, NvU64 offset, NvU64 length)
+{
+ return ((nv->fb) && (offset >= nv->fb->cpu_address) &&
+ ((offset + (length - 1)) >= offset) &&
+ ((offset + (length - 1)) <= (nv->fb->cpu_address + (nv->fb->size - 1))));
+}
+
+static inline NvBool IS_UD_OFFSET(nv_state_t *nv, NvU64 offset, NvU64 length)
+{
+ return ((nv->ud.cpu_address != 0) && (nv->ud.size != 0) &&
+ (offset >= nv->ud.cpu_address) &&
+ ((offset + (length - 1)) >= offset) &&
+ ((offset + (length - 1)) <= (nv->ud.cpu_address + (nv->ud.size - 1))));
+}
+
+static inline NvBool IS_IMEM_OFFSET(nv_state_t *nv, NvU64 offset, NvU64 length)
+{
+ return ((nv->bars[NV_GPU_BAR_INDEX_IMEM].cpu_address != 0) &&
+ (nv->bars[NV_GPU_BAR_INDEX_IMEM].size != 0) &&
+ (offset >= nv->bars[NV_GPU_BAR_INDEX_IMEM].cpu_address) &&
+ ((offset + (length - 1)) >= offset) &&
+ ((offset + (length - 1)) <= (nv->bars[NV_GPU_BAR_INDEX_IMEM].cpu_address +
+ (nv->bars[NV_GPU_BAR_INDEX_IMEM].size - 1))));
+}
+
+#define NV_RM_MAX_MSIX_LINES 8
+
+#define NV_MAX_ISR_DELAY_US 20000
+#define NV_MAX_ISR_DELAY_MS (NV_MAX_ISR_DELAY_US / 1000)
+
+#define NV_TIMERCMP(a, b, CMP) \
+ (((a)->tv_sec == (b)->tv_sec) ? \
+ ((a)->tv_usec CMP (b)->tv_usec) : ((a)->tv_sec CMP (b)->tv_sec))
+
+#define NV_TIMERADD(a, b, result) \
+ { \
+ (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \
+ (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \
+ if ((result)->tv_usec >= 1000000) \
+ { \
+ ++(result)->tv_sec; \
+ (result)->tv_usec -= 1000000; \
+ } \
+ }
+
+#define NV_TIMERSUB(a, b, result) \
+ { \
+ (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
+ (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
+ if ((result)->tv_usec < 0) \
+ { \
+ --(result)->tv_sec; \
+ (result)->tv_usec += 1000000; \
+ } \
+ }
+
+#define NV_TIMEVAL_TO_US(tv) ((NvU64)(tv).tv_sec * 1000000 + (tv).tv_usec)
+
+#ifndef NV_ALIGN_UP
+#define NV_ALIGN_UP(v,g) (((v) + ((g) - 1)) & ~((g) - 1))
+#endif
+#ifndef NV_ALIGN_DOWN
+#define NV_ALIGN_DOWN(v,g) ((v) & ~((g) - 1))
+#endif
+
+/*
+ * driver internal interfaces
+ */
+
+/*
+ * ---------------------------------------------------------------------------
+ *
+ * Function prototypes for UNIX specific OS interface.
+ *
+ * ---------------------------------------------------------------------------
+ */
+
+NvU32 NV_API_CALL nv_get_dev_minor (nv_state_t *);
+void* NV_API_CALL nv_alloc_kernel_mapping (nv_state_t *, void *, NvU64, NvU32, NvU64, void **);
+NV_STATUS NV_API_CALL nv_free_kernel_mapping (nv_state_t *, void *, void *, void *);
+NV_STATUS NV_API_CALL nv_alloc_user_mapping (nv_state_t *, void *, NvU64, NvU32, NvU64, NvU32, NvU64 *, void **);
+NV_STATUS NV_API_CALL nv_free_user_mapping (nv_state_t *, void *, NvU64, void *);
+NV_STATUS NV_API_CALL nv_add_mapping_context_to_file (nv_state_t *, nv_usermap_access_params_t*, NvU32, void *, NvU64, NvU32);
+
+NvU64 NV_API_CALL nv_get_kern_phys_address (NvU64);
+NvU64 NV_API_CALL nv_get_user_phys_address (NvU64);
+nv_state_t* NV_API_CALL nv_get_adapter_state (NvU32, NvU8, NvU8);
+nv_state_t* NV_API_CALL nv_get_ctl_state (void);
+
+void NV_API_CALL nv_set_dma_address_size (nv_state_t *, NvU32 );
+
+NV_STATUS NV_API_CALL nv_alias_pages (nv_state_t *, NvU32, NvU32, NvU32, NvU64, NvU64 *, void **);
+NV_STATUS NV_API_CALL nv_alloc_pages (nv_state_t *, NvU32, NvBool, NvU32, NvBool, NvBool, NvU64 *, void **);
+NV_STATUS NV_API_CALL nv_free_pages (nv_state_t *, NvU32, NvBool, NvU32, void *);
+
+NV_STATUS NV_API_CALL nv_register_user_pages (nv_state_t *, NvU64, NvU64 *, void *, void **);
+void NV_API_CALL nv_unregister_user_pages (nv_state_t *, NvU64, void **, void **);
+
+NV_STATUS NV_API_CALL nv_register_peer_io_mem (nv_state_t *, NvU64 *, NvU64, void **);
+void NV_API_CALL nv_unregister_peer_io_mem(nv_state_t *, void *);
+
+struct sg_table;
+
+NV_STATUS NV_API_CALL nv_register_sgt (nv_state_t *, NvU64 *, NvU64, NvU32, void **, struct sg_table *, void *);
+void NV_API_CALL nv_unregister_sgt (nv_state_t *, struct sg_table **, void **, void *);
+NV_STATUS NV_API_CALL nv_register_phys_pages (nv_state_t *, NvU64 *, NvU64, NvU32, void **);
+void NV_API_CALL nv_unregister_phys_pages (nv_state_t *, void *);
+
+NV_STATUS NV_API_CALL nv_dma_map_sgt (nv_dma_device_t *, NvU64, NvU64 *, NvU32, void **);
+NV_STATUS NV_API_CALL nv_dma_map_pages (nv_dma_device_t *, NvU64, NvU64 *, NvBool, NvU32, void **);
+NV_STATUS NV_API_CALL nv_dma_unmap_pages (nv_dma_device_t *, NvU64, NvU64 *, void **);
+
+NV_STATUS NV_API_CALL nv_dma_map_alloc (nv_dma_device_t *, NvU64, NvU64 *, NvBool, void **);
+NV_STATUS NV_API_CALL nv_dma_unmap_alloc (nv_dma_device_t *, NvU64, NvU64 *, void **);
+
+NV_STATUS NV_API_CALL nv_dma_map_peer (nv_dma_device_t *, nv_dma_device_t *, NvU8, NvU64, NvU64 *);
+void NV_API_CALL nv_dma_unmap_peer (nv_dma_device_t *, NvU64, NvU64);
+
+NV_STATUS NV_API_CALL nv_dma_map_mmio (nv_dma_device_t *, NvU64, NvU64 *);
+void NV_API_CALL nv_dma_unmap_mmio (nv_dma_device_t *, NvU64, NvU64);
+
+void NV_API_CALL nv_dma_cache_invalidate (nv_dma_device_t *, void *);
+void NV_API_CALL nv_dma_enable_nvlink (nv_dma_device_t *);
+
+NvS32 NV_API_CALL nv_start_rc_timer (nv_state_t *);
+NvS32 NV_API_CALL nv_stop_rc_timer (nv_state_t *);
+
+void NV_API_CALL nv_post_event (nv_event_t *, NvHandle, NvU32, NvU32, NvU16, NvBool);
+NvS32 NV_API_CALL nv_get_event (nv_file_private_t *, nv_event_t *, NvU32 *);
+
+void* NV_API_CALL nv_i2c_add_adapter (nv_state_t *, NvU32);
+void NV_API_CALL nv_i2c_del_adapter (nv_state_t *, void *);
+
+void NV_API_CALL nv_acpi_methods_init (NvU32 *);
+void NV_API_CALL nv_acpi_methods_uninit (void);
+
+NV_STATUS NV_API_CALL nv_acpi_method (NvU32, NvU32, NvU32, void *, NvU16, NvU32 *, void *, NvU16 *);
+NV_STATUS NV_API_CALL nv_acpi_dsm_method (nv_state_t *, NvU8 *, NvU32, NvBool, NvU32, void *, NvU16, NvU32 *, void *, NvU16 *);
+NV_STATUS NV_API_CALL nv_acpi_ddc_method (nv_state_t *, void *, NvU32 *, NvBool);
+NV_STATUS NV_API_CALL nv_acpi_dod_method (nv_state_t *, NvU32 *, NvU32 *);
+NV_STATUS NV_API_CALL nv_acpi_rom_method (nv_state_t *, NvU32 *, NvU32 *);
+NV_STATUS NV_API_CALL nv_acpi_get_powersource (NvU32 *);
+NvBool NV_API_CALL nv_acpi_is_battery_present(void);
+
+NV_STATUS NV_API_CALL nv_acpi_mux_method (nv_state_t *, NvU32 *, NvU32, const char *);
+
+NV_STATUS NV_API_CALL nv_log_error (nv_state_t *, NvU32, const char *, va_list);
+
+NvU64 NV_API_CALL nv_get_dma_start_address (nv_state_t *);
+NV_STATUS NV_API_CALL nv_set_primary_vga_status(nv_state_t *);
+NV_STATUS NV_API_CALL nv_pci_trigger_recovery (nv_state_t *);
+NvBool NV_API_CALL nv_requires_dma_remap (nv_state_t *);
+
+NvBool NV_API_CALL nv_is_rm_firmware_active(nv_state_t *);
+const void*NV_API_CALL nv_get_firmware(nv_state_t *, nv_firmware_type_t, nv_firmware_chip_family_t, const void **, NvU32 *);
+void NV_API_CALL nv_put_firmware(const void *);
+
+nv_file_private_t* NV_API_CALL nv_get_file_private(NvS32, NvBool, void **);
+void NV_API_CALL nv_put_file_private(void *);
+
+NV_STATUS NV_API_CALL nv_get_device_memory_config(nv_state_t *, NvU64 *, NvU64 *, NvU32 *, NvS32 *);
+
+NV_STATUS NV_API_CALL nv_get_ibmnpu_genreg_info(nv_state_t *, NvU64 *, NvU64 *, void**);
+NV_STATUS NV_API_CALL nv_get_ibmnpu_relaxed_ordering_mode(nv_state_t *nv, NvBool *mode);
+
+void NV_API_CALL nv_wait_for_ibmnpu_rsync(nv_state_t *nv);
+
+void NV_API_CALL nv_ibmnpu_cache_flush_range(nv_state_t *nv, NvU64, NvU64);
+
+void NV_API_CALL nv_p2p_free_platform_data(void *data);
+
+#if defined(NVCPU_PPC64LE)
+NV_STATUS NV_API_CALL nv_get_nvlink_line_rate (nv_state_t *, NvU32 *);
+#endif
+
+NV_STATUS NV_API_CALL nv_revoke_gpu_mappings (nv_state_t *);
+void NV_API_CALL nv_acquire_mmap_lock (nv_state_t *);
+void NV_API_CALL nv_release_mmap_lock (nv_state_t *);
+NvBool NV_API_CALL nv_get_all_mappings_revoked_locked (nv_state_t *);
+void NV_API_CALL nv_set_safe_to_mmap_locked (nv_state_t *, NvBool);
+
+NV_STATUS NV_API_CALL nv_indicate_idle (nv_state_t *);
+NV_STATUS NV_API_CALL nv_indicate_not_idle (nv_state_t *);
+void NV_API_CALL nv_idle_holdoff (nv_state_t *);
+
+NvBool NV_API_CALL nv_dynamic_power_available (nv_state_t *);
+void NV_API_CALL nv_audio_dynamic_power (nv_state_t *);
+
+void NV_API_CALL nv_control_soc_irqs (nv_state_t *, NvBool bEnable);
+NV_STATUS NV_API_CALL nv_get_current_irq_priv_data(nv_state_t *, NvU32 *);
+
+NV_STATUS NV_API_CALL nv_acquire_fabric_mgmt_cap (int, int*);
+int NV_API_CALL nv_cap_drv_init(void);
+void NV_API_CALL nv_cap_drv_exit(void);
+NvBool NV_API_CALL nv_is_gpu_accessible(nv_state_t *);
+NvBool NV_API_CALL nv_match_gpu_os_info(nv_state_t *, void *);
+
+NvU32 NV_API_CALL nv_get_os_type(void);
+
+void NV_API_CALL nv_get_updated_emu_seg(NvU32 *start, NvU32 *end);
+struct dma_buf;
+typedef struct nv_dma_buf nv_dma_buf_t;
+struct drm_gem_object;
+
+NV_STATUS NV_API_CALL nv_dma_import_sgt (nv_dma_device_t *, struct sg_table *, struct drm_gem_object *);
+void NV_API_CALL nv_dma_release_sgt(struct sg_table *, struct drm_gem_object *);
+NV_STATUS NV_API_CALL nv_dma_import_dma_buf (nv_dma_device_t *, struct dma_buf *, NvU32 *, void **, struct sg_table **, nv_dma_buf_t **);
+NV_STATUS NV_API_CALL nv_dma_import_from_fd (nv_dma_device_t *, NvS32, NvU32 *, void **, struct sg_table **, nv_dma_buf_t **);
+void NV_API_CALL nv_dma_release_dma_buf (void *, nv_dma_buf_t *);
+
+void NV_API_CALL nv_schedule_uvm_isr (nv_state_t *);
+
+NvBool NV_API_CALL nv_platform_supports_s0ix (void);
+NvBool NV_API_CALL nv_s2idle_pm_configured (void);
+
+NvBool NV_API_CALL nv_is_chassis_notebook (void);
+void NV_API_CALL nv_allow_runtime_suspend (nv_state_t *nv);
+void NV_API_CALL nv_disallow_runtime_suspend (nv_state_t *nv);
+
+typedef void (*nvTegraDceClientIpcCallback)(NvU32, NvU32, NvU32, void *, void *);
+
+NV_STATUS NV_API_CALL nv_get_num_phys_pages (void *, NvU32 *);
+NV_STATUS NV_API_CALL nv_get_phys_pages (void *, void *, NvU32 *);
+
+/*
+ * ---------------------------------------------------------------------------
+ *
+ * Function prototypes for Resource Manager interface.
+ *
+ * ---------------------------------------------------------------------------
+ */
+
+NvBool NV_API_CALL rm_init_rm (nvidia_stack_t *);
+void NV_API_CALL rm_shutdown_rm (nvidia_stack_t *);
+NvBool NV_API_CALL rm_init_private_state (nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_free_private_state (nvidia_stack_t *, nv_state_t *);
+NvBool NV_API_CALL rm_init_adapter (nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_disable_adapter (nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_shutdown_adapter (nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_exclude_adapter (nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_acquire_api_lock (nvidia_stack_t *);
+NV_STATUS NV_API_CALL rm_release_api_lock (nvidia_stack_t *);
+NV_STATUS NV_API_CALL rm_acquire_gpu_lock (nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_release_gpu_lock (nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_acquire_all_gpus_lock (nvidia_stack_t *);
+NV_STATUS NV_API_CALL rm_release_all_gpus_lock (nvidia_stack_t *);
+NV_STATUS NV_API_CALL rm_ioctl (nvidia_stack_t *, nv_state_t *, nv_file_private_t *, NvU32, void *, NvU32);
+NvBool NV_API_CALL rm_isr (nvidia_stack_t *, nv_state_t *, NvU32 *);
+void NV_API_CALL rm_isr_bh (nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_isr_bh_unlocked (nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_power_management (nvidia_stack_t *, nv_state_t *, nv_pm_action_t);
+NV_STATUS NV_API_CALL rm_stop_user_channels (nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_restart_user_channels (nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_save_low_res_mode (nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_get_vbios_version (nvidia_stack_t *, nv_state_t *, char *);
+char* NV_API_CALL rm_get_gpu_uuid (nvidia_stack_t *, nv_state_t *);
+const NvU8* NV_API_CALL rm_get_gpu_uuid_raw (nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_set_rm_firmware_requested(nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_get_firmware_version (nvidia_stack_t *, nv_state_t *, char *, NvLength);
+void NV_API_CALL rm_cleanup_file_private (nvidia_stack_t *, nv_state_t *, nv_file_private_t *);
+void NV_API_CALL rm_unbind_lock (nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_read_registry_dword (nvidia_stack_t *, nv_state_t *, const char *, NvU32 *);
+NV_STATUS NV_API_CALL rm_write_registry_dword (nvidia_stack_t *, nv_state_t *, const char *, NvU32);
+NV_STATUS NV_API_CALL rm_write_registry_binary (nvidia_stack_t *, nv_state_t *, const char *, NvU8 *, NvU32);
+NV_STATUS NV_API_CALL rm_write_registry_string (nvidia_stack_t *, nv_state_t *, const char *, const char *, NvU32);
+void NV_API_CALL rm_parse_option_string (nvidia_stack_t *, const char *);
+char* NV_API_CALL rm_remove_spaces (const char *);
+char* NV_API_CALL rm_string_token (char **, const char);
+
+NV_STATUS NV_API_CALL rm_run_rc_callback (nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_execute_work_item (nvidia_stack_t *, void *);
+const char* NV_API_CALL rm_get_device_name (NvU16, NvU16, NvU16);
+
+NV_STATUS NV_API_CALL rm_is_supported_device (nvidia_stack_t *, nv_state_t *);
+NvBool NV_API_CALL rm_is_supported_pci_device(NvU8 pci_class,
+ NvU8 pci_subclass,
+ NvU16 vendor,
+ NvU16 device,
+ NvU16 subsystem_vendor,
+ NvU16 subsystem_device,
+ NvBool print_legacy_warning);
+
+void NV_API_CALL rm_i2c_remove_adapters (nvidia_stack_t *, nv_state_t *);
+NvBool NV_API_CALL rm_i2c_is_smbus_capable (nvidia_stack_t *, nv_state_t *, void *);
+NV_STATUS NV_API_CALL rm_i2c_transfer (nvidia_stack_t *, nv_state_t *, void *, nv_i2c_cmd_t, NvU8, NvU8, NvU32, NvU8 *);
+
+NV_STATUS NV_API_CALL rm_perform_version_check (nvidia_stack_t *, void *, NvU32);
+
+void NV_API_CALL rm_power_source_change_event (nvidia_stack_t *, NvU32);
+
+void NV_API_CALL rm_disable_gpu_state_persistence (nvidia_stack_t *sp, nv_state_t *);
+NV_STATUS NV_API_CALL rm_p2p_init_mapping (nvidia_stack_t *, NvU64, NvU64 *, NvU64 *, NvU64 *, NvU64 *, NvU64, NvU64, NvU64, NvU64, void (*)(void *), void *);
+NV_STATUS NV_API_CALL rm_p2p_destroy_mapping (nvidia_stack_t *, NvU64);
+NV_STATUS NV_API_CALL rm_p2p_get_pages (nvidia_stack_t *, NvU64, NvU32, NvU64, NvU64, NvU64 *, NvU32 *, NvU32 *, NvU32 *, NvU8 **, void *);
+NV_STATUS NV_API_CALL rm_p2p_get_gpu_info (nvidia_stack_t *, NvU64, NvU64, NvU8 **, void **);
+NV_STATUS NV_API_CALL rm_p2p_get_pages_persistent (nvidia_stack_t *, NvU64, NvU64, void **, NvU64 *, NvU32 *, void *, void *);
+NV_STATUS NV_API_CALL rm_p2p_register_callback (nvidia_stack_t *, NvU64, NvU64, NvU64, void *, void (*)(void *), void *);
+NV_STATUS NV_API_CALL rm_p2p_put_pages (nvidia_stack_t *, NvU64, NvU32, NvU64, void *);
+NV_STATUS NV_API_CALL rm_p2p_put_pages_persistent(nvidia_stack_t *, void *, void *);
+NV_STATUS NV_API_CALL rm_p2p_dma_map_pages (nvidia_stack_t *, nv_dma_device_t *, NvU8 *, NvU32, NvU32, NvU64 *, void **);
+NV_STATUS NV_API_CALL rm_dma_buf_dup_mem_handle (nvidia_stack_t *, nv_state_t *, NvHandle, NvHandle, NvHandle, NvHandle, void *, NvHandle, NvU64, NvU64, NvHandle *);
+void NV_API_CALL rm_dma_buf_undup_mem_handle(nvidia_stack_t *, nv_state_t *, NvHandle, NvHandle);
+NV_STATUS NV_API_CALL rm_dma_buf_map_mem_handle (nvidia_stack_t *, nv_state_t *, NvHandle, NvHandle, NvU64, NvU64, NvU64 *);
+NV_STATUS NV_API_CALL rm_dma_buf_unmap_mem_handle(nvidia_stack_t *, nv_state_t *, NvHandle, NvHandle, NvU64, NvU64);
+NV_STATUS NV_API_CALL rm_dma_buf_get_client_and_device(nvidia_stack_t *, nv_state_t *, NvHandle, NvHandle *, NvHandle *, NvHandle *, void **);
+void NV_API_CALL rm_dma_buf_put_client_and_device(nvidia_stack_t *, nv_state_t *, NvHandle, NvHandle, NvHandle, void *);
+NV_STATUS NV_API_CALL rm_log_gpu_crash (nv_stack_t *, nv_state_t *);
+
+void NV_API_CALL rm_kernel_rmapi_op(nvidia_stack_t *sp, void *ops_cmd);
+NvBool NV_API_CALL rm_get_device_remove_flag(nvidia_stack_t *sp, NvU32 gpu_id);
+NV_STATUS NV_API_CALL rm_gpu_copy_mmu_faults(nvidia_stack_t *, nv_state_t *, NvU32 *);
+NV_STATUS NV_API_CALL rm_gpu_copy_mmu_faults_unlocked(nvidia_stack_t *, nv_state_t *, NvU32 *);
+NV_STATUS NV_API_CALL rm_gpu_handle_mmu_faults(nvidia_stack_t *, nv_state_t *, NvU32 *);
+NvBool NV_API_CALL rm_gpu_need_4k_page_isolation(nv_state_t *);
+NvBool NV_API_CALL rm_is_chipset_io_coherent(nv_stack_t *);
+NvBool NV_API_CALL rm_init_event_locks(nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_destroy_event_locks(nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_get_gpu_numa_info(nvidia_stack_t *, nv_state_t *, NvS32 *, NvU64 *, NvU64 *, NvU64 *, NvU32 *);
+NV_STATUS NV_API_CALL rm_gpu_numa_online(nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_gpu_numa_offline(nvidia_stack_t *, nv_state_t *);
+NvBool NV_API_CALL rm_is_device_sequestered(nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_check_for_gpu_surprise_removal(nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_set_external_kernel_client_count(nvidia_stack_t *, nv_state_t *, NvBool);
+NV_STATUS NV_API_CALL rm_schedule_gpu_wakeup(nvidia_stack_t *, nv_state_t *);
+NvBool NV_API_CALL rm_is_iommu_needed_for_sriov(nvidia_stack_t *, nv_state_t *);
+NvBool NV_API_CALL rm_disable_iomap_wc(void);
+
+void NV_API_CALL rm_init_dynamic_power_management(nvidia_stack_t *, nv_state_t *, NvBool);
+void NV_API_CALL rm_cleanup_dynamic_power_management(nvidia_stack_t *, nv_state_t *);
+void NV_API_CALL rm_enable_dynamic_power_management(nvidia_stack_t *, nv_state_t *);
+NV_STATUS NV_API_CALL rm_ref_dynamic_power(nvidia_stack_t *, nv_state_t *, nv_dynamic_power_mode_t);
+void NV_API_CALL rm_unref_dynamic_power(nvidia_stack_t *, nv_state_t *, nv_dynamic_power_mode_t);
+NV_STATUS NV_API_CALL rm_transition_dynamic_power(nvidia_stack_t *, nv_state_t *, NvBool);
+const char* NV_API_CALL rm_get_vidmem_power_status(nvidia_stack_t *, nv_state_t *);
+const char* NV_API_CALL rm_get_dynamic_power_management_status(nvidia_stack_t *, nv_state_t *);
+const char* NV_API_CALL rm_get_gpu_gcx_support(nvidia_stack_t *, nv_state_t *, NvBool);
+
+void NV_API_CALL rm_acpi_notify(nvidia_stack_t *, nv_state_t *, NvU32);
+
+NvBool NV_API_CALL rm_is_altstack_in_use(void);
+
+/* vGPU VFIO specific functions */
+NV_STATUS NV_API_CALL nv_vgpu_create_request(nvidia_stack_t *, nv_state_t *, const NvU8 *, NvU32, NvU16 *, NvU32, NvBool *);
+NV_STATUS NV_API_CALL nv_vgpu_delete(nvidia_stack_t *, const NvU8 *, NvU16);
+NV_STATUS NV_API_CALL nv_vgpu_get_type_ids(nvidia_stack_t *, nv_state_t *, NvU32 *, NvU32 *, NvBool, NvU8, NvBool);
+NV_STATUS NV_API_CALL nv_vgpu_get_type_info(nvidia_stack_t *, nv_state_t *, NvU32, char *, int, NvU8);
+NV_STATUS NV_API_CALL nv_vgpu_get_bar_info(nvidia_stack_t *, nv_state_t *, const NvU8 *, NvU64 *, NvU32, void *);
+NV_STATUS NV_API_CALL nv_vgpu_start(nvidia_stack_t *, const NvU8 *, void *, NvS32 *, NvU8 *, NvU32);
+NV_STATUS NV_API_CALL nv_vgpu_get_sparse_mmap(nvidia_stack_t *, nv_state_t *, const NvU8 *, NvU64 **, NvU64 **, NvU32 *);
+NV_STATUS NV_API_CALL nv_vgpu_process_vf_info(nvidia_stack_t *, nv_state_t *, NvU8, NvU32, NvU8, NvU8, NvU8, NvBool, void *);
+NV_STATUS NV_API_CALL nv_vgpu_update_request(nvidia_stack_t *, const NvU8 *, NvU32, NvU64 *, NvU64 *, const char *);
+NV_STATUS NV_API_CALL nv_gpu_bind_event(nvidia_stack_t *);
+
+NV_STATUS NV_API_CALL nv_get_usermap_access_params(nv_state_t*, nv_usermap_access_params_t*);
+nv_soc_irq_type_t NV_API_CALL nv_get_current_irq_type(nv_state_t*);
+void NV_API_CALL nv_flush_coherent_cpu_cache_range(nv_state_t *nv, NvU64 cpu_virtual, NvU64 size);
+
+/* Callbacks should occur roughly every 10ms. */
+#define NV_SNAPSHOT_TIMER_HZ 100
+void NV_API_CALL nv_start_snapshot_timer(void (*snapshot_callback)(void *context));
+void NV_API_CALL nv_flush_snapshot_timer(void);
+void NV_API_CALL nv_stop_snapshot_timer(void);
+
+static inline const NvU8 *nv_get_cached_uuid(nv_state_t *nv)
+{
+ return nv->nv_uuid_cache.valid ? nv->nv_uuid_cache.uuid : NULL;
+}
+
+/* nano second resolution timer callback structure */
+typedef struct nv_nano_timer nv_nano_timer_t;
+
+/* nano timer functions */
+void NV_API_CALL nv_create_nano_timer(nv_state_t *, void *pTmrEvent, nv_nano_timer_t **);
+void NV_API_CALL nv_start_nano_timer(nv_state_t *nv, nv_nano_timer_t *, NvU64 timens);
+NV_STATUS NV_API_CALL rm_run_nano_timer_callback(nvidia_stack_t *, nv_state_t *, void *pTmrEvent);
+void NV_API_CALL nv_cancel_nano_timer(nv_state_t *, nv_nano_timer_t *);
+void NV_API_CALL nv_destroy_nano_timer(nv_state_t *nv, nv_nano_timer_t *);
+
+#if defined(NVCPU_X86_64)
+
+static inline NvU64 nv_rdtsc(void)
+{
+ NvU64 val;
+ __asm__ __volatile__ ("rdtsc \t\n"
+ "shlq $0x20,%%rdx \t\n"
+ "orq %%rdx,%%rax \t\n"
+ : "=A" (val));
+ return val;
+}
+
+#endif
+
+#endif /* NVRM */
+
+static inline int nv_count_bits(NvU64 word)
+{
+ NvU64 bits;
+
+ bits = (word & 0x5555555555555555ULL) + ((word >> 1) & 0x5555555555555555ULL);
+ bits = (bits & 0x3333333333333333ULL) + ((bits >> 2) & 0x3333333333333333ULL);
+ bits = (bits & 0x0f0f0f0f0f0f0f0fULL) + ((bits >> 4) & 0x0f0f0f0f0f0f0f0fULL);
+ bits = (bits & 0x00ff00ff00ff00ffULL) + ((bits >> 8) & 0x00ff00ff00ff00ffULL);
+ bits = (bits & 0x0000ffff0000ffffULL) + ((bits >> 16) & 0x0000ffff0000ffffULL);
+ bits = (bits & 0x00000000ffffffffULL) + ((bits >> 32) & 0x00000000ffffffffULL);
+
+ return (int)(bits);
+}
+
+#endif
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/nv_escape.h b/userspace/sdks/nv525/nvalloc/unix/include/nv_escape.h
new file mode 100644
index 0000000..629af5a
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/nv_escape.h
@@ -0,0 +1,54 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 1999-2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef NV_ESCAPE_H_INCLUDED
+#define NV_ESCAPE_H_INCLUDED
+
+#define NV_ESC_RM_ALLOC_MEMORY 0x27
+#define NV_ESC_RM_ALLOC_OBJECT 0x28
+#define NV_ESC_RM_FREE 0x29
+#define NV_ESC_RM_CONTROL 0x2A
+#define NV_ESC_RM_ALLOC 0x2B
+#define NV_ESC_RM_CONFIG_GET 0x32
+#define NV_ESC_RM_CONFIG_SET 0x33
+#define NV_ESC_RM_DUP_OBJECT 0x34
+#define NV_ESC_RM_SHARE 0x35
+#define NV_ESC_RM_CONFIG_GET_EX 0x37
+#define NV_ESC_RM_CONFIG_SET_EX 0x38
+#define NV_ESC_RM_I2C_ACCESS 0x39
+#define NV_ESC_RM_IDLE_CHANNELS 0x41
+#define NV_ESC_RM_VID_HEAP_CONTROL 0x4A
+#define NV_ESC_RM_ACCESS_REGISTRY 0x4D
+#define NV_ESC_RM_MAP_MEMORY 0x4E
+#define NV_ESC_RM_UNMAP_MEMORY 0x4F
+#define NV_ESC_RM_GET_EVENT_DATA 0x52
+#define NV_ESC_RM_ALLOC_CONTEXT_DMA2 0x54
+#define NV_ESC_RM_ADD_VBLANK_CALLBACK 0x56
+#define NV_ESC_RM_MAP_MEMORY_DMA 0x57
+#define NV_ESC_RM_UNMAP_MEMORY_DMA 0x58
+#define NV_ESC_RM_BIND_CONTEXT_DMA 0x59
+#define NV_ESC_RM_EXPORT_OBJECT_TO_FD 0x5C
+#define NV_ESC_RM_IMPORT_OBJECT_FROM_FD 0x5D
+#define NV_ESC_RM_UPDATE_DEVICE_MAPPING_INFO 0x5E
+
+#endif // NV_ESCAPE_H_INCLUDED
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/os-interface.h b/userspace/sdks/nv525/nvalloc/unix/include/os-interface.h
new file mode 100644
index 0000000..9ebeeed
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/os-interface.h
@@ -0,0 +1,250 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 1999-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+
+/*
+ * Os interface definitions needed by os-interface.c
+ */
+
+#ifndef OS_INTERFACE_H
+#define OS_INTERFACE_H
+
+/******************* Operating System Interface Routines *******************\
+* *
+* Operating system wrapper functions used to abstract the OS. *
+* *
+\***************************************************************************/
+
+#include <nvtypes.h>
+#include <nvstatus.h>
+#include "nv_stdarg.h"
+#include <nv-kernel-interface-api.h>
+#include <os/nv_memory_type.h>
+#include <nv-caps.h>
+
+
+
+typedef struct
+{
+ NvU32 os_major_version;
+ NvU32 os_minor_version;
+ NvU32 os_build_number;
+ const char * os_build_version_str;
+ const char * os_build_date_plus_str;
+}os_version_info;
+
+/* Each OS defines its own version of this opaque type */
+struct os_work_queue;
+
+/* Each OS defines its own version of this opaque type */
+typedef struct os_wait_queue os_wait_queue;
+
+/*
+ * ---------------------------------------------------------------------------
+ *
+ * Function prototypes for OS interface.
+ *
+ * ---------------------------------------------------------------------------
+ */
+
+NvU64 NV_API_CALL os_get_num_phys_pages (void);
+NV_STATUS NV_API_CALL os_alloc_mem (void **, NvU64);
+void NV_API_CALL os_free_mem (void *);
+NV_STATUS NV_API_CALL os_get_current_time (NvU32 *, NvU32 *);
+NvU64 NV_API_CALL os_get_current_tick (void);
+NvU64 NV_API_CALL os_get_current_tick_hr (void);
+NvU64 NV_API_CALL os_get_tick_resolution (void);
+NV_STATUS NV_API_CALL os_delay (NvU32);
+NV_STATUS NV_API_CALL os_delay_us (NvU32);
+NvU64 NV_API_CALL os_get_cpu_frequency (void);
+NvU32 NV_API_CALL os_get_current_process (void);
+void NV_API_CALL os_get_current_process_name (char *, NvU32);
+NV_STATUS NV_API_CALL os_get_current_thread (NvU64 *);
+char* NV_API_CALL os_string_copy (char *, const char *);
+NvU32 NV_API_CALL os_string_length (const char *);
+NvU32 NV_API_CALL os_strtoul (const char *, char **, NvU32);
+NvS32 NV_API_CALL os_string_compare (const char *, const char *);
+NvS32 NV_API_CALL os_snprintf (char *, NvU32, const char *, ...);
+NvS32 NV_API_CALL os_vsnprintf (char *, NvU32, const char *, va_list);
+void NV_API_CALL os_log_error (const char *, va_list);
+void* NV_API_CALL os_mem_copy (void *, const void *, NvU32);
+NV_STATUS NV_API_CALL os_memcpy_from_user (void *, const void *, NvU32);
+NV_STATUS NV_API_CALL os_memcpy_to_user (void *, const void *, NvU32);
+void* NV_API_CALL os_mem_set (void *, NvU8, NvU32);
+NvS32 NV_API_CALL os_mem_cmp (const NvU8 *, const NvU8 *, NvU32);
+void* NV_API_CALL os_pci_init_handle (NvU32, NvU8, NvU8, NvU8, NvU16 *, NvU16 *);
+NV_STATUS NV_API_CALL os_pci_read_byte (void *, NvU32, NvU8 *);
+NV_STATUS NV_API_CALL os_pci_read_word (void *, NvU32, NvU16 *);
+NV_STATUS NV_API_CALL os_pci_read_dword (void *, NvU32, NvU32 *);
+NV_STATUS NV_API_CALL os_pci_write_byte (void *, NvU32, NvU8);
+NV_STATUS NV_API_CALL os_pci_write_word (void *, NvU32, NvU16);
+NV_STATUS NV_API_CALL os_pci_write_dword (void *, NvU32, NvU32);
+NvBool NV_API_CALL os_pci_remove_supported (void);
+void NV_API_CALL os_pci_remove (void *);
+void* NV_API_CALL os_map_kernel_space (NvU64, NvU64, NvU32);
+void NV_API_CALL os_unmap_kernel_space (void *, NvU64);
+void* NV_API_CALL os_map_user_space (NvU64, NvU64, NvU32, NvU32, void **);
+void NV_API_CALL os_unmap_user_space (void *, NvU64, void *);
+NV_STATUS NV_API_CALL os_flush_cpu_cache (void);
+NV_STATUS NV_API_CALL os_flush_cpu_cache_all (void);
+NV_STATUS NV_API_CALL os_flush_user_cache (void);
+void NV_API_CALL os_flush_cpu_write_combine_buffer(void);
+NvU8 NV_API_CALL os_io_read_byte (NvU32);
+NvU16 NV_API_CALL os_io_read_word (NvU32);
+NvU32 NV_API_CALL os_io_read_dword (NvU32);
+void NV_API_CALL os_io_write_byte (NvU32, NvU8);
+void NV_API_CALL os_io_write_word (NvU32, NvU16);
+void NV_API_CALL os_io_write_dword (NvU32, NvU32);
+NvBool NV_API_CALL os_is_administrator (void);
+NvBool NV_API_CALL os_allow_priority_override (void);
+void NV_API_CALL os_dbg_init (void);
+void NV_API_CALL os_dbg_breakpoint (void);
+void NV_API_CALL os_dbg_set_level (NvU32);
+NvU32 NV_API_CALL os_get_cpu_count (void);
+NvU32 NV_API_CALL os_get_cpu_number (void);
+void NV_API_CALL os_disable_console_access (void);
+void NV_API_CALL os_enable_console_access (void);
+NV_STATUS NV_API_CALL os_registry_init (void);
+NvU64 NV_API_CALL os_get_max_user_va (void);
+NV_STATUS NV_API_CALL os_schedule (void);
+NV_STATUS NV_API_CALL os_alloc_spinlock (void **);
+void NV_API_CALL os_free_spinlock (void *);
+NvU64 NV_API_CALL os_acquire_spinlock (void *);
+void NV_API_CALL os_release_spinlock (void *, NvU64);
+NV_STATUS NV_API_CALL os_queue_work_item (struct os_work_queue *, void *);
+NV_STATUS NV_API_CALL os_flush_work_queue (struct os_work_queue *);
+NV_STATUS NV_API_CALL os_alloc_mutex (void **);
+void NV_API_CALL os_free_mutex (void *);
+NV_STATUS NV_API_CALL os_acquire_mutex (void *);
+NV_STATUS NV_API_CALL os_cond_acquire_mutex (void *);
+void NV_API_CALL os_release_mutex (void *);
+void* NV_API_CALL os_alloc_semaphore (NvU32);
+void NV_API_CALL os_free_semaphore (void *);
+NV_STATUS NV_API_CALL os_acquire_semaphore (void *);
+NV_STATUS NV_API_CALL os_cond_acquire_semaphore (void *);
+NV_STATUS NV_API_CALL os_release_semaphore (void *);
+void* NV_API_CALL os_alloc_rwlock (void);
+void NV_API_CALL os_free_rwlock (void *);
+NV_STATUS NV_API_CALL os_acquire_rwlock_read (void *);
+NV_STATUS NV_API_CALL os_acquire_rwlock_write (void *);
+NV_STATUS NV_API_CALL os_cond_acquire_rwlock_read (void *);
+NV_STATUS NV_API_CALL os_cond_acquire_rwlock_write(void *);
+void NV_API_CALL os_release_rwlock_read (void *);
+void NV_API_CALL os_release_rwlock_write (void *);
+NvBool NV_API_CALL os_semaphore_may_sleep (void);
+NV_STATUS NV_API_CALL os_get_version_info (os_version_info*);
+NvBool NV_API_CALL os_is_isr (void);
+NvBool NV_API_CALL os_pat_supported (void);
+void NV_API_CALL os_dump_stack (void);
+NvBool NV_API_CALL os_is_efi_enabled (void);
+NvBool NV_API_CALL os_is_xen_dom0 (void);
+NvBool NV_API_CALL os_is_vgx_hyper (void);
+NV_STATUS NV_API_CALL os_inject_vgx_msi (NvU16, NvU64, NvU32);
+NvBool NV_API_CALL os_is_grid_supported (void);
+NvU32 NV_API_CALL os_get_grid_csp_support (void);
+void NV_API_CALL os_get_screen_info (NvU64 *, NvU16 *, NvU16 *, NvU16 *, NvU16 *, NvU64, NvU64);
+void NV_API_CALL os_bug_check (NvU32, const char *);
+NV_STATUS NV_API_CALL os_lock_user_pages (void *, NvU64, void **, NvU32);
+NV_STATUS NV_API_CALL os_lookup_user_io_memory (void *, NvU64, NvU64 **, void**);
+NV_STATUS NV_API_CALL os_unlock_user_pages (NvU64, void *);
+NV_STATUS NV_API_CALL os_match_mmap_offset (void *, NvU64, NvU64 *);
+NV_STATUS NV_API_CALL os_get_euid (NvU32 *);
+NV_STATUS NV_API_CALL os_get_smbios_header (NvU64 *pSmbsAddr);
+NV_STATUS NV_API_CALL os_get_acpi_rsdp_from_uefi (NvU32 *);
+void NV_API_CALL os_add_record_for_crashLog (void *, NvU32);
+void NV_API_CALL os_delete_record_for_crashLog (void *);
+NV_STATUS NV_API_CALL os_call_vgpu_vfio (void *, NvU32);
+NV_STATUS NV_API_CALL os_numa_memblock_size (NvU64 *);
+NV_STATUS NV_API_CALL os_alloc_pages_node (NvS32, NvU32, NvU32, NvU64 *);
+NV_STATUS NV_API_CALL os_get_page (NvU64 address);
+NV_STATUS NV_API_CALL os_put_page (NvU64 address);
+NvU32 NV_API_CALL os_get_page_refcount (NvU64 address);
+NvU32 NV_API_CALL os_count_tail_pages (NvU64 address);
+void NV_API_CALL os_free_pages_phys (NvU64, NvU32);
+NV_STATUS NV_API_CALL os_call_nv_vmbus (NvU32, void *);
+NV_STATUS NV_API_CALL os_open_temporary_file (void **);
+void NV_API_CALL os_close_file (void *);
+NV_STATUS NV_API_CALL os_write_file (void *, NvU8 *, NvU64, NvU64);
+NV_STATUS NV_API_CALL os_read_file (void *, NvU8 *, NvU64, NvU64);
+NV_STATUS NV_API_CALL os_open_readonly_file (const char *, void **);
+NV_STATUS NV_API_CALL os_open_and_read_file (const char *, NvU8 *, NvU64);
+NvBool NV_API_CALL os_is_nvswitch_present (void);
+void NV_API_CALL os_get_random_bytes (NvU8 *, NvU16);
+NV_STATUS NV_API_CALL os_alloc_wait_queue (os_wait_queue **);
+void NV_API_CALL os_free_wait_queue (os_wait_queue *);
+void NV_API_CALL os_wait_uninterruptible (os_wait_queue *);
+void NV_API_CALL os_wait_interruptible (os_wait_queue *);
+void NV_API_CALL os_wake_up (os_wait_queue *);
+nv_cap_t* NV_API_CALL os_nv_cap_init (const char *);
+nv_cap_t* NV_API_CALL os_nv_cap_create_dir_entry (nv_cap_t *, const char *, int);
+nv_cap_t* NV_API_CALL os_nv_cap_create_file_entry (nv_cap_t *, const char *, int);
+void NV_API_CALL os_nv_cap_destroy_entry (nv_cap_t *);
+int NV_API_CALL os_nv_cap_validate_and_dup_fd(const nv_cap_t *, int);
+void NV_API_CALL os_nv_cap_close_fd (int);
+
+enum os_pci_req_atomics_type {
+ OS_INTF_PCIE_REQ_ATOMICS_32BIT,
+ OS_INTF_PCIE_REQ_ATOMICS_64BIT,
+ OS_INTF_PCIE_REQ_ATOMICS_128BIT
+};
+NV_STATUS NV_API_CALL os_enable_pci_req_atomics (void *, enum os_pci_req_atomics_type);
+
+extern NvU32 os_page_size;
+extern NvU64 os_page_mask;
+extern NvU8 os_page_shift;
+extern NvU32 os_sev_status;
+extern NvBool os_sev_enabled;
+extern NvBool os_dma_buf_enabled;
+
+/*
+ * ---------------------------------------------------------------------------
+ *
+ * Debug macros.
+ *
+ * ---------------------------------------------------------------------------
+ */
+
+#define NV_DBG_INFO 0x0
+#define NV_DBG_SETUP 0x1
+#define NV_DBG_USERERRORS 0x2
+#define NV_DBG_WARNINGS 0x3
+#define NV_DBG_ERRORS 0x4
+
+
+void NV_API_CALL out_string(const char *str);
+int NV_API_CALL nv_printf(NvU32 debuglevel, const char *printf_format, ...);
+
+#define NV_DEV_PRINTF(debuglevel, nv, format, ... ) \
+ nv_printf(debuglevel, "NVRM: GPU " NV_PCI_DEV_FMT ": " format, NV_PCI_DEV_FMT_ARGS(nv), ## __VA_ARGS__)
+
+#define NV_DEV_PRINTF_STATUS(debuglevel, nv, status, format, ... ) \
+ nv_printf(debuglevel, "NVRM: GPU " NV_PCI_DEV_FMT ": " format " (0x%x)\n", NV_PCI_DEV_FMT_ARGS(nv), ## __VA_ARGS__, status)
+
+/*
+ * Fields for os_lock_user_pages flags parameter
+ */
+#define NV_LOCK_USER_PAGES_FLAGS_WRITE 0:0
+#define NV_LOCK_USER_PAGES_FLAGS_WRITE_NO 0x00000000
+#define NV_LOCK_USER_PAGES_FLAGS_WRITE_YES 0x00000001
+
+#endif /* OS_INTERFACE_H */
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/os_custom.h b/userspace/sdks/nv525/nvalloc/unix/include/os_custom.h
new file mode 100644
index 0000000..37df06f
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/os_custom.h
@@ -0,0 +1,61 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 1999-2018 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _OS_CUSTOM_H_
+#define _OS_CUSTOM_H_
+
+/*!
+ * @file os_custom.h
+ * @brief OS module specific definitions for this OS
+ */
+
+#include <os-interface.h>
+#include <osfuncs.h>
+
+// File modes, added for NVIDIA capabilities.
+#define OS_RUSR 00400 // read permission, owner
+#define OS_WUSR 00200 // write permission, owner
+#define OS_XUSR 00100 // execute/search permission, owner
+#define OS_RWXU (OS_RUSR | OS_WUSR | OS_XUSR) // read, write, execute/search, owner
+#define OS_RGRP 00040 // read permission, group
+#define OS_WGRP 00020 // write permission, group
+#define OS_XGRP 00010 // execute/search permission, group
+#define OS_RWXG (OS_RGRP | OS_WGRP | OS_XGRP) // read, write, execute/search, group
+#define OS_ROTH 00004 // read permission, other
+#define OS_WOTH 00002 // write permission, other
+#define OS_XOTH 00001 // execute/search permission, other
+#define OS_RWXO (OS_ROTH | OS_WOTH | OS_XOTH) // read, write, execute/search, other
+#define OS_RUGO (OS_RUSR | OS_RGRP | OS_ROTH)
+#define OS_WUGO (OS_WUSR | OS_WGRP | OS_WOTH)
+#define OS_XUGO (OS_XUSR | OS_XGRP | OS_XOTH)
+
+// Trigger for collecting GPU state for later extraction.
+NV_STATUS RmLogGpuCrash(OBJGPU *);
+
+// This is callback function in the miniport.
+// The argument is a device extension, and must be cast as such to be useful.
+typedef void (*MINIPORT_CALLBACK)(void*);
+
+NV_STATUS osPackageRegistry(OBJGPU *pGpu, PACKED_REGISTRY_TABLE *, NvU32 *);
+
+#endif // _OS_CUSTOM_H_
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/osapi.h b/userspace/sdks/nv525/nvalloc/unix/include/osapi.h
new file mode 100644
index 0000000..7c71874
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/osapi.h
@@ -0,0 +1,192 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 1999-2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _OSAPI_H_
+#define _OSAPI_H_
+
+#include "core/system.h"
+#include "gpu/gpu.h"
+
+#include <os-interface.h> // NV_DBG_ERRORS
+#include <rmapi/rmapi.h>
+#include <core/thread_state.h>
+
+#if defined(__use_altstack__)
+#if defined(QA_BUILD)
+//---------------------------------------------------------------------------
+//
+// 32 bit debug marker values.
+//
+//---------------------------------------------------------------------------
+
+#define NV_MARKER1 (NvU32)(('M' << 24) | ('R' << 16) | ('V' << 8) | 'N')
+#define NV_MARKER2 (NvU32)(('N' << 24) | ('V' << 16) | ('R' << 8) | 'M')
+
+//
+// The two macros below implement a simple alternate stack usage sanity
+// check for QA_BUILD RM builds. NV_ALTSTACK_WRITE_MARKERS() fills
+// altstacks with NV_MARKER1, which enables NV_ALTSTACK_CHECK_MARKERS()
+// to determine the stack usage fairly reliably by looking for the
+// first clobbered marker. If more than 7/8 of the alternate stack were
+// used, NV_ALTSTACK_CHECK_MARKERS() prints an error and asserts.
+//
+#define NV_ALTSTACK_WRITE_MARKERS(sp) \
+{ \
+ NvU32 i, *stack = (void *)(sp)->stack; \
+ for (i = 0; i < ((sp)->size / sizeof(NvU32)); i++) \
+ stack[i] = NV_MARKER1; \
+}
+
+#define NV_ALTSTACK_CHECK_MARKERS(sp) \
+{ \
+ NvU32 i, *stack = (void *)(sp)->stack; \
+ for (i = 0; i < ((sp)->size / sizeof(NvU32)); i++) \
+ { \
+ if (stack[i] != NV_MARKER1) \
+ break; \
+ } \
+ if ((i * sizeof(NvU32)) < ((sp)->size / 8)) \
+ { \
+ nv_printf(NV_DBG_ERRORS, "NVRM: altstack: used %d of %d bytes!\n", \
+ ((sp)->size - (i * sizeof(NvU32))), (sp)->size); \
+ NV_ASSERT_PRECOMP((i * sizeof(NvU32)) >= ((sp)->size / 8)); \
+ } \
+}
+#else
+#define NV_ALTSTACK_WRITE_MARKERS(sp)
+#define NV_ALTSTACK_CHECK_MARKERS(sp)
+#endif
+#if defined(NVCPU_X86_64)
+#define NV_ENTER_RM_RUNTIME(sp,fp) \
+{ \
+ NV_ALTSTACK_WRITE_MARKERS(sp); \
+ __asm__ __volatile__ ("movq %%rbp,%0" : "=r" (fp)); /* save %rbp */ \
+ __asm__ __volatile__ ("movq %0,%%rbp" :: "r" ((sp)->top)); \
+}
+
+#define NV_EXIT_RM_RUNTIME(sp,fp) \
+{ \
+ register void *__rbp __asm__ ("rbp"); \
+ if (__rbp != (sp)->top) \
+ { \
+ nv_printf(NV_DBG_ERRORS, "NVRM: detected corrupted runtime stack!\n"); \
+ NV_ASSERT_PRECOMP(__rbp == (sp)->top); \
+ } \
+ NV_ALTSTACK_CHECK_MARKERS(sp); \
+ __asm__ __volatile__ ("movq %0,%%rbp" :: "r" (fp)); /* restore %rbp */ \
+}
+#else
+#error "gcc \"altstacks\" support is not implemented on this platform!"
+#endif
+#else
+#define NV_ENTER_RM_RUNTIME(sp,fp) { (void)sp; (void)fp; }
+#define NV_EXIT_RM_RUNTIME(sp,fp)
+#endif
+
+void RmShutdownRm (void);
+
+NvBool RmInitPrivateState (nv_state_t *);
+void RmFreePrivateState (nv_state_t *);
+
+NvBool RmInitAdapter (nv_state_t *);
+NvBool RmPartiallyInitAdapter (nv_state_t *);
+void RmShutdownAdapter (nv_state_t *);
+void RmDisableAdapter (nv_state_t *);
+void RmPartiallyDisableAdapter(nv_state_t *);
+NV_STATUS RmGetAdapterStatus (nv_state_t *, NvU32 *);
+NV_STATUS RmExcludeAdapter (nv_state_t *);
+
+NvBool RmGpuHasIOSpaceEnabled (nv_state_t *);
+
+void RmFreeUnusedClients (nv_state_t *, nv_file_private_t *);
+NV_STATUS RmIoctl (nv_state_t *, nv_file_private_t *, NvU32, void *, NvU32);
+
+NV_STATUS RmAllocOsEvent (NvHandle, nv_file_private_t *, NvU32);
+NV_STATUS RmFreeOsEvent (NvHandle, NvU32);
+
+void RmI2cAddGpuPorts(nv_state_t *);
+
+NV_STATUS RmInitX86EmuState(OBJGPU *);
+void RmFreeX86EmuState(OBJGPU *);
+NV_STATUS RmPowerSourceChangeEvent(nv_state_t *, NvU32);
+
+const NvU8 *RmGetGpuUuidRaw(nv_state_t *);
+
+NV_STATUS nv_vbios_call(OBJGPU *, NvU32 *, NvU32 *);
+
+int amd_adv_spec_cache_feature(OBJOS *);
+int amd_msr_c0011022_incompatible(OBJOS *);
+
+NV_STATUS rm_get_adapter_status (nv_state_t *, NvU32 *);
+
+NV_STATUS rm_alloc_os_event (NvHandle, nv_file_private_t *, NvU32);
+NV_STATUS rm_free_os_event (NvHandle, NvU32);
+NV_STATUS rm_get_event_data (nv_file_private_t *, NvP64, NvU32 *);
+void rm_client_free_os_events (NvHandle);
+
+NV_STATUS rm_create_mmap_context (NvHandle, NvHandle, NvHandle, NvP64, NvU64, NvU64, NvU32, NvU32);
+NV_STATUS rm_update_device_mapping_info (NvHandle, NvHandle, NvHandle, void *, void *);
+
+NV_STATUS rm_access_registry (NvHandle, NvHandle, NvU32, NvP64, NvU32, NvP64, NvU32, NvP64, NvU32 *, NvU32 *, NvU32 *);
+
+// registry management
+NV_STATUS RmInitRegistry (void);
+NV_STATUS RmDestroyRegistry (nv_state_t *);
+
+NV_STATUS RmWriteRegistryDword (nv_state_t *, const char *, NvU32 );
+NV_STATUS RmReadRegistryDword (nv_state_t *, const char *, NvU32 *);
+NV_STATUS RmWriteRegistryString (nv_state_t *, const char *, const char *, NvU32);
+NV_STATUS RmReadRegistryBinary (nv_state_t *, const char *, NvU8 *, NvU32 *);
+NV_STATUS RmWriteRegistryBinary (nv_state_t *, const char *, NvU8 *, NvU32);
+NV_STATUS RmReadRegistryString (nv_state_t *, const char *, NvU8 *, NvU32 *);
+
+NV_STATUS RmPackageRegistry (nv_state_t *, PACKED_REGISTRY_TABLE *, NvU32 *);
+
+NvBool RmIsNvifFunctionSupported(NvU32, NvU32);
+void RmInitAcpiMethods (OBJOS *, OBJSYS *, OBJGPU *);
+void RmUnInitAcpiMethods (OBJSYS *);
+
+void RmInflateOsToRmPageArray (RmPhysAddr *, NvU64);
+void RmDeflateRmToOsPageArray (RmPhysAddr *, NvU64);
+
+void RmInitS0ixPowerManagement (nv_state_t *);
+void RmInitDeferredDynamicPowerManagement (nv_state_t *);
+void RmDestroyDeferredDynamicPowerManagement(nv_state_t *);
+
+NV_STATUS os_ref_dynamic_power (nv_state_t *, nv_dynamic_power_mode_t);
+void os_unref_dynamic_power (nv_state_t *, nv_dynamic_power_mode_t);
+void RmHandleDisplayChange (nvidia_stack_t *, nv_state_t *);
+void RmUpdateGc6ConsoleRefCount (nv_state_t *, NvBool);
+
+NvBool rm_get_uefi_console_status (nv_state_t *);
+NvU64 rm_get_uefi_console_size (nv_state_t *, NvU64 *);
+
+RM_API *RmUnixRmApiPrologue (nv_state_t *, THREAD_STATE_NODE *, NvU32 module);
+void RmUnixRmApiEpilogue (nv_state_t *, THREAD_STATE_NODE *);
+
+static inline NvBool rm_is_system_notebook(void)
+{
+ return (nv_is_chassis_notebook() || nv_acpi_is_battery_present());
+}
+
+#endif // _OSAPI_H_
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/osfuncs.h b/userspace/sdks/nv525/nvalloc/unix/include/osfuncs.h
new file mode 100644
index 0000000..7afbf63
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/osfuncs.h
@@ -0,0 +1,55 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 1993-2020 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef OSFUNCS_H
+#define OSFUNCS_H
+
+/**************** Resource Manager Defines and Structures ******************\
+* *
+* Declarations for the Operating System Specific Functions. *
+* *
+\***************************************************************************/
+
+#include <os/os.h>
+
+OSQueueWorkItem osQueueWorkItem;
+OSQueueWorkItemWithFlags osQueueWorkItemWithFlags;
+OSQueueSystemWorkItem osQueueSystemWorkItem;
+OSDbgBreakpointEnabled osDbgBreakpointEnabled;
+
+void* osGetStereoDongleInterface(void);
+
+OSCallACPI_DSM osCallACPI_DSM;
+OSCallACPI_DDC osCallACPI_DDC;
+OSCallACPI_NVHG_ROM osCallACPI_NVHG_ROM;
+OSCallACPI_DOD osCallACPI_DOD;
+OSCallACPI_MXDS osCallACPI_MXDS;
+OSCallACPI_MXDM osCallACPI_MXDM;
+
+#if defined(NVCPU_X86_64)
+OSnv_rdcr4 nv_rdcr4;
+NvU64 nv_rdcr3(OBJOS *);
+OSnv_cpuid nv_cpuid;
+#endif
+
+#endif // OSFUNCS_H
diff --git a/userspace/sdks/nv525/nvalloc/unix/include/rmobjexportimport.h b/userspace/sdks/nv525/nvalloc/unix/include/rmobjexportimport.h
new file mode 100644
index 0000000..1330ad8
--- /dev/null
+++ b/userspace/sdks/nv525/nvalloc/unix/include/rmobjexportimport.h
@@ -0,0 +1,42 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2016 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: MIT
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _RMOBJEXPORTIMPORT_H_
+#define _RMOBJEXPORTIMPORT_H_
+
+#include "nvstatus.h"
+
+typedef NvHandle RmObjExportHandle;
+
+NV_STATUS RmExportObject(NvHandle hSrcClient, NvHandle hSrcObject,
+ RmObjExportHandle *pDstObject, NvU32 *pDeviceInstance);
+
+void RmFreeObjExportHandle(RmObjExportHandle hObject);
+
+NV_STATUS RmImportObject(NvHandle hDstClient, NvHandle hDstParent,
+ NvHandle *phDstObject, RmObjExportHandle hSrcObject,
+ NvU8 *pObjectType);
+
+NV_STATUS RmGetExportObjectInfo(RmObjExportHandle hSrcObject, NvU32 *deviceInstance);
+#endif // _RMOBJEXPORTIMPORT_H_
+