mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2026-04-28 10:11:19 +00:00
550.135
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
# NVIDIA Linux Open GPU Kernel Module Source
|
# NVIDIA Linux Open GPU Kernel Module Source
|
||||||
|
|
||||||
This is the source release of the NVIDIA Linux open GPU kernel modules,
|
This is the source release of the NVIDIA Linux open GPU kernel modules,
|
||||||
version 550.127.08.
|
version 550.135.
|
||||||
|
|
||||||
|
|
||||||
## How to Build
|
## How to Build
|
||||||
@@ -17,7 +17,7 @@ as root:
|
|||||||
|
|
||||||
Note that the kernel modules built here must be used with GSP
|
Note that the kernel modules built here must be used with GSP
|
||||||
firmware and user-space NVIDIA GPU driver components from a corresponding
|
firmware and user-space NVIDIA GPU driver components from a corresponding
|
||||||
550.127.08 driver release. This can be achieved by installing
|
550.135 driver release. This can be achieved by installing
|
||||||
the NVIDIA GPU driver from the .run file using the `--no-kernel-modules`
|
the NVIDIA GPU driver from the .run file using the `--no-kernel-modules`
|
||||||
option. E.g.,
|
option. E.g.,
|
||||||
|
|
||||||
@@ -188,7 +188,7 @@ encountered specific to them.
|
|||||||
For details on feature support and limitations, see the NVIDIA GPU driver
|
For details on feature support and limitations, see the NVIDIA GPU driver
|
||||||
end user README here:
|
end user README here:
|
||||||
|
|
||||||
https://us.download.nvidia.com/XFree86/Linux-x86_64/550.127.08/README/kernel_open.html
|
https://us.download.nvidia.com/XFree86/Linux-x86_64/550.135/README/kernel_open.html
|
||||||
|
|
||||||
For vGPU support, please refer to the README.vgpu packaged in the vGPU Host
|
For vGPU support, please refer to the README.vgpu packaged in the vGPU Host
|
||||||
Package for more details.
|
Package for more details.
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ EXTRA_CFLAGS += -I$(src)/common/inc
|
|||||||
EXTRA_CFLAGS += -I$(src)
|
EXTRA_CFLAGS += -I$(src)
|
||||||
EXTRA_CFLAGS += -Wall $(DEFINES) $(INCLUDES) -Wno-cast-qual -Wno-format-extra-args
|
EXTRA_CFLAGS += -Wall $(DEFINES) $(INCLUDES) -Wno-cast-qual -Wno-format-extra-args
|
||||||
EXTRA_CFLAGS += -D__KERNEL__ -DMODULE -DNVRM
|
EXTRA_CFLAGS += -D__KERNEL__ -DMODULE -DNVRM
|
||||||
EXTRA_CFLAGS += -DNV_VERSION_STRING=\"550.127.08\"
|
EXTRA_CFLAGS += -DNV_VERSION_STRING=\"550.135\"
|
||||||
|
|
||||||
ifneq ($(SYSSRCHOST1X),)
|
ifneq ($(SYSSRCHOST1X),)
|
||||||
EXTRA_CFLAGS += -I$(SYSSRCHOST1X)
|
EXTRA_CFLAGS += -I$(SYSSRCHOST1X)
|
||||||
|
|||||||
@@ -52,6 +52,22 @@ else
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# If CC hasn't been set explicitly, check the value of CONFIG_CC_VERSION_TEXT.
|
||||||
|
# Look for the compiler specified there, and use it by default, if found.
|
||||||
|
ifeq ($(origin CC),default)
|
||||||
|
cc_version_text=$(firstword $(shell . $(KERNEL_OUTPUT)/.config; \
|
||||||
|
echo "$$CONFIG_CC_VERSION_TEXT"))
|
||||||
|
|
||||||
|
ifneq ($(cc_version_text),)
|
||||||
|
ifeq ($(shell command -v $(cc_version_text)),)
|
||||||
|
$(warning WARNING: Unable to locate the compiler $(cc_version_text) \
|
||||||
|
from CONFIG_CC_VERSION_TEXT in the kernel configuration.)
|
||||||
|
else
|
||||||
|
CC=$(cc_version_text)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
CC ?= cc
|
CC ?= cc
|
||||||
LD ?= ld
|
LD ?= ld
|
||||||
OBJDUMP ?= objdump
|
OBJDUMP ?= objdump
|
||||||
@@ -65,6 +81,16 @@ else
|
|||||||
)
|
)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
KERNEL_ARCH = $(ARCH)
|
||||||
|
|
||||||
|
ifneq ($(filter $(ARCH),i386 x86_64),)
|
||||||
|
KERNEL_ARCH = x86
|
||||||
|
else
|
||||||
|
ifeq ($(filter $(ARCH),arm64 powerpc),)
|
||||||
|
$(error Unsupported architecture $(ARCH))
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
NV_KERNEL_MODULES ?= $(wildcard nvidia nvidia-uvm nvidia-vgpu-vfio nvidia-modeset nvidia-drm nvidia-peermem)
|
NV_KERNEL_MODULES ?= $(wildcard nvidia nvidia-uvm nvidia-vgpu-vfio nvidia-modeset nvidia-drm nvidia-peermem)
|
||||||
NV_KERNEL_MODULES := $(filter-out $(NV_EXCLUDE_KERNEL_MODULES), \
|
NV_KERNEL_MODULES := $(filter-out $(NV_EXCLUDE_KERNEL_MODULES), \
|
||||||
$(NV_KERNEL_MODULES))
|
$(NV_KERNEL_MODULES))
|
||||||
@@ -106,8 +132,9 @@ else
|
|||||||
# module symbols on which the Linux kernel's module resolution is dependent
|
# module symbols on which the Linux kernel's module resolution is dependent
|
||||||
# and hence must be used whenever present.
|
# and hence must be used whenever present.
|
||||||
|
|
||||||
LD_SCRIPT ?= $(KERNEL_SOURCES)/scripts/module-common.lds \
|
LD_SCRIPT ?= $(KERNEL_SOURCES)/scripts/module-common.lds \
|
||||||
$(KERNEL_SOURCES)/arch/$(ARCH)/kernel/module.lds \
|
$(KERNEL_SOURCES)/arch/$(KERNEL_ARCH)/kernel/module.lds \
|
||||||
|
$(KERNEL_OUTPUT)/arch/$(KERNEL_ARCH)/module.lds \
|
||||||
$(KERNEL_OUTPUT)/scripts/module.lds
|
$(KERNEL_OUTPUT)/scripts/module.lds
|
||||||
NV_MODULE_COMMON_SCRIPTS := $(foreach s, $(wildcard $(LD_SCRIPT)), -T $(s))
|
NV_MODULE_COMMON_SCRIPTS := $(foreach s, $(wildcard $(LD_SCRIPT)), -T $(s))
|
||||||
|
|
||||||
|
|||||||
@@ -2523,6 +2523,22 @@ compile_test() {
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
file_operations_fop_unsigned_offset_present)
|
||||||
|
#
|
||||||
|
# Determine if the FOP_UNSIGNED_OFFSET define is present.
|
||||||
|
#
|
||||||
|
# Added by commit 641bb4394f40 ("fs: move FMODE_UNSIGNED_OFFSET to
|
||||||
|
# fop_flags") in v6.12.
|
||||||
|
#
|
||||||
|
CODE="
|
||||||
|
#include <linux/fs.h>
|
||||||
|
int conftest_file_operations_fop_unsigned_offset_present(void) {
|
||||||
|
return FOP_UNSIGNED_OFFSET;
|
||||||
|
}"
|
||||||
|
|
||||||
|
compile_check_conftest "$CODE" "NV_FILE_OPERATIONS_FOP_UNSIGNED_OFFSET_PRESENT" "" "types"
|
||||||
|
;;
|
||||||
|
|
||||||
mm_context_t)
|
mm_context_t)
|
||||||
#
|
#
|
||||||
# Determine if the 'mm_context_t' data type is present
|
# Determine if the 'mm_context_t' data type is present
|
||||||
@@ -6896,6 +6912,22 @@ compile_test() {
|
|||||||
compile_check_conftest "$CODE" "NV_DRM_UNLOCKED_IOCTL_FLAG_PRESENT" "" "types"
|
compile_check_conftest "$CODE" "NV_DRM_UNLOCKED_IOCTL_FLAG_PRESENT" "" "types"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
folio_test_swapcache)
|
||||||
|
#
|
||||||
|
# Determine if the folio_test_swapcache() function is present.
|
||||||
|
#
|
||||||
|
# folio_test_swapcache() was exported by commit d389a4a811551 ("mm:
|
||||||
|
# Add folio flag manipulation functions") in v5.16.
|
||||||
|
#
|
||||||
|
CODE="
|
||||||
|
#include <linux/page-flags.h>
|
||||||
|
void conftest_folio_test_swapcache(void) {
|
||||||
|
folio_test_swapcache();
|
||||||
|
}"
|
||||||
|
|
||||||
|
compile_check_conftest "$CODE" "NV_FOLIO_TEST_SWAPCACHE_PRESENT" "" "functions"
|
||||||
|
;;
|
||||||
|
|
||||||
# When adding a new conftest entry, please use the correct format for
|
# When adding a new conftest entry, please use the correct format for
|
||||||
# specifying the relevant upstream Linux kernel commit. Please
|
# specifying the relevant upstream Linux kernel commit. Please
|
||||||
# avoid specifying -rc kernels, and only use SHAs that actually exist
|
# avoid specifying -rc kernels, and only use SHAs that actually exist
|
||||||
|
|||||||
@@ -1553,6 +1553,10 @@ static const struct file_operations nv_drm_fops = {
|
|||||||
.read = drm_read,
|
.read = drm_read,
|
||||||
|
|
||||||
.llseek = noop_llseek,
|
.llseek = noop_llseek,
|
||||||
|
|
||||||
|
#if defined(NV_FILE_OPERATIONS_FOP_UNSIGNED_OFFSET_PRESENT)
|
||||||
|
.fop_flags = FOP_UNSIGNED_OFFSET,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct drm_ioctl_desc nv_drm_ioctls[] = {
|
static const struct drm_ioctl_desc nv_drm_ioctls[] = {
|
||||||
|
|||||||
@@ -131,3 +131,4 @@ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_aperture_remove_conflicting_pci_framebuffe
|
|||||||
NV_CONFTEST_TYPE_COMPILE_TESTS += drm_mode_create_dp_colorspace_property_has_supported_colorspaces_arg
|
NV_CONFTEST_TYPE_COMPILE_TESTS += drm_mode_create_dp_colorspace_property_has_supported_colorspaces_arg
|
||||||
NV_CONFTEST_TYPE_COMPILE_TESTS += drm_unlocked_ioctl_flag_present
|
NV_CONFTEST_TYPE_COMPILE_TESTS += drm_unlocked_ioctl_flag_present
|
||||||
NV_CONFTEST_TYPE_COMPILE_TESTS += drm_output_poll_changed
|
NV_CONFTEST_TYPE_COMPILE_TESTS += drm_output_poll_changed
|
||||||
|
NV_CONFTEST_TYPE_COMPILE_TESTS += file_operations_fop_unsigned_offset_present
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ NVIDIA_UVM_SOURCES += nvidia-uvm/uvm_maxwell_sec2.c
|
|||||||
NVIDIA_UVM_SOURCES += nvidia-uvm/uvm_hopper_sec2.c
|
NVIDIA_UVM_SOURCES += nvidia-uvm/uvm_hopper_sec2.c
|
||||||
NVIDIA_UVM_SOURCES += nvidia-uvm/uvm_common.c
|
NVIDIA_UVM_SOURCES += nvidia-uvm/uvm_common.c
|
||||||
NVIDIA_UVM_SOURCES += nvidia-uvm/uvm_linux.c
|
NVIDIA_UVM_SOURCES += nvidia-uvm/uvm_linux.c
|
||||||
NVIDIA_UVM_SOURCES += nvidia-uvm/uvm_debug_optimized.c
|
|
||||||
NVIDIA_UVM_SOURCES += nvidia-uvm/nvstatus.c
|
NVIDIA_UVM_SOURCES += nvidia-uvm/nvstatus.c
|
||||||
NVIDIA_UVM_SOURCES += nvidia-uvm/nvCpuUuid.c
|
NVIDIA_UVM_SOURCES += nvidia-uvm/nvCpuUuid.c
|
||||||
NVIDIA_UVM_SOURCES += nvidia-uvm/nv-kthread-q.c
|
NVIDIA_UVM_SOURCES += nvidia-uvm/nv-kthread-q.c
|
||||||
|
|||||||
@@ -13,19 +13,6 @@ NVIDIA_UVM_OBJECTS =
|
|||||||
include $(src)/nvidia-uvm/nvidia-uvm-sources.Kbuild
|
include $(src)/nvidia-uvm/nvidia-uvm-sources.Kbuild
|
||||||
NVIDIA_UVM_OBJECTS += $(patsubst %.c,%.o,$(NVIDIA_UVM_SOURCES))
|
NVIDIA_UVM_OBJECTS += $(patsubst %.c,%.o,$(NVIDIA_UVM_SOURCES))
|
||||||
|
|
||||||
# Some linux kernel functions rely on being built with optimizations on and
|
|
||||||
# to work around this we put wrappers for them in a separate file that's built
|
|
||||||
# with optimizations on in debug builds and skipped in other builds.
|
|
||||||
# Notably gcc 4.4 supports per function optimization attributes that would be
|
|
||||||
# easier to use, but is too recent to rely on for now.
|
|
||||||
NVIDIA_UVM_DEBUG_OPTIMIZED_SOURCE := nvidia-uvm/uvm_debug_optimized.c
|
|
||||||
NVIDIA_UVM_DEBUG_OPTIMIZED_OBJECT := $(patsubst %.c,%.o,$(NVIDIA_UVM_DEBUG_OPTIMIZED_SOURCE))
|
|
||||||
|
|
||||||
ifneq ($(UVM_BUILD_TYPE),debug)
|
|
||||||
# Only build the wrappers on debug builds
|
|
||||||
NVIDIA_UVM_OBJECTS := $(filter-out $(NVIDIA_UVM_DEBUG_OPTIMIZED_OBJECT), $(NVIDIA_UVM_OBJECTS))
|
|
||||||
endif
|
|
||||||
|
|
||||||
obj-m += nvidia-uvm.o
|
obj-m += nvidia-uvm.o
|
||||||
nvidia-uvm-y := $(NVIDIA_UVM_OBJECTS)
|
nvidia-uvm-y := $(NVIDIA_UVM_OBJECTS)
|
||||||
|
|
||||||
@@ -36,15 +23,14 @@ NVIDIA_UVM_KO = nvidia-uvm/nvidia-uvm.ko
|
|||||||
#
|
#
|
||||||
|
|
||||||
ifeq ($(UVM_BUILD_TYPE),debug)
|
ifeq ($(UVM_BUILD_TYPE),debug)
|
||||||
NVIDIA_UVM_CFLAGS += -DDEBUG -O1 -g
|
NVIDIA_UVM_CFLAGS += -DDEBUG -g
|
||||||
else
|
endif
|
||||||
ifeq ($(UVM_BUILD_TYPE),develop)
|
|
||||||
# -DDEBUG is required, in order to allow pr_devel() print statements to
|
ifeq ($(UVM_BUILD_TYPE),develop)
|
||||||
# work:
|
# -DDEBUG is required, in order to allow pr_devel() print statements to
|
||||||
NVIDIA_UVM_CFLAGS += -DDEBUG
|
# work:
|
||||||
NVIDIA_UVM_CFLAGS += -DNVIDIA_UVM_DEVELOP
|
NVIDIA_UVM_CFLAGS += -DDEBUG
|
||||||
endif
|
NVIDIA_UVM_CFLAGS += -DNVIDIA_UVM_DEVELOP
|
||||||
NVIDIA_UVM_CFLAGS += -O2
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
NVIDIA_UVM_CFLAGS += -DNVIDIA_UVM_ENABLED
|
NVIDIA_UVM_CFLAGS += -DNVIDIA_UVM_ENABLED
|
||||||
@@ -56,11 +42,6 @@ NVIDIA_UVM_CFLAGS += -I$(src)/nvidia-uvm
|
|||||||
|
|
||||||
$(call ASSIGN_PER_OBJ_CFLAGS, $(NVIDIA_UVM_OBJECTS), $(NVIDIA_UVM_CFLAGS))
|
$(call ASSIGN_PER_OBJ_CFLAGS, $(NVIDIA_UVM_OBJECTS), $(NVIDIA_UVM_CFLAGS))
|
||||||
|
|
||||||
ifeq ($(UVM_BUILD_TYPE),debug)
|
|
||||||
# Force optimizations on for the wrappers
|
|
||||||
$(call ASSIGN_PER_OBJ_CFLAGS, $(NVIDIA_UVM_DEBUG_OPTIMIZED_OBJECT), $(NVIDIA_UVM_CFLAGS) -O2)
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Register the conftests needed by nvidia-uvm.ko
|
# Register the conftests needed by nvidia-uvm.ko
|
||||||
#
|
#
|
||||||
@@ -88,6 +69,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += iommu_sva_bind_device_has_drvdata_arg
|
|||||||
NV_CONFTEST_FUNCTION_COMPILE_TESTS += vm_fault_to_errno
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += vm_fault_to_errno
|
||||||
NV_CONFTEST_FUNCTION_COMPILE_TESTS += find_next_bit_wrap
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += find_next_bit_wrap
|
||||||
NV_CONFTEST_FUNCTION_COMPILE_TESTS += iommu_is_dma_domain
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += iommu_is_dma_domain
|
||||||
|
NV_CONFTEST_FUNCTION_COMPILE_TESTS += folio_test_swapcache
|
||||||
|
|
||||||
NV_CONFTEST_TYPE_COMPILE_TESTS += backing_dev_info
|
NV_CONFTEST_TYPE_COMPILE_TESTS += backing_dev_info
|
||||||
NV_CONFTEST_TYPE_COMPILE_TESTS += mm_context_t
|
NV_CONFTEST_TYPE_COMPILE_TESTS += mm_context_t
|
||||||
|
|||||||
@@ -127,9 +127,9 @@ static NV_STATUS uvm_api_mm_initialize(UVM_MM_INITIALIZE_PARAMS *params, struct
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
old_fd_type = nv_atomic_long_cmpxchg((atomic_long_t *)&filp->private_data,
|
old_fd_type = atomic_long_cmpxchg((atomic_long_t *)&filp->private_data,
|
||||||
UVM_FD_UNINITIALIZED,
|
UVM_FD_UNINITIALIZED,
|
||||||
UVM_FD_INITIALIZING);
|
UVM_FD_INITIALIZING);
|
||||||
old_fd_type &= UVM_FD_TYPE_MASK;
|
old_fd_type &= UVM_FD_TYPE_MASK;
|
||||||
if (old_fd_type != UVM_FD_UNINITIALIZED) {
|
if (old_fd_type != UVM_FD_UNINITIALIZED) {
|
||||||
status = NV_ERR_IN_USE;
|
status = NV_ERR_IN_USE;
|
||||||
@@ -914,8 +914,9 @@ static NV_STATUS uvm_api_initialize(UVM_INITIALIZE_PARAMS *params, struct file *
|
|||||||
// attempt to be made. This is safe because other threads will have only had
|
// attempt to be made. This is safe because other threads will have only had
|
||||||
// a chance to observe UVM_FD_INITIALIZING and not UVM_FD_VA_SPACE in this
|
// a chance to observe UVM_FD_INITIALIZING and not UVM_FD_VA_SPACE in this
|
||||||
// case.
|
// case.
|
||||||
old_fd_type = nv_atomic_long_cmpxchg((atomic_long_t *)&filp->private_data,
|
old_fd_type = atomic_long_cmpxchg((atomic_long_t *)&filp->private_data,
|
||||||
UVM_FD_UNINITIALIZED, UVM_FD_INITIALIZING);
|
UVM_FD_UNINITIALIZED,
|
||||||
|
UVM_FD_INITIALIZING);
|
||||||
old_fd_type &= UVM_FD_TYPE_MASK;
|
old_fd_type &= UVM_FD_TYPE_MASK;
|
||||||
if (old_fd_type == UVM_FD_UNINITIALIZED) {
|
if (old_fd_type == UVM_FD_UNINITIALIZED) {
|
||||||
status = uvm_va_space_create(filp->f_mapping, &va_space, params->flags);
|
status = uvm_va_space_create(filp->f_mapping, &va_space, params->flags);
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
{ \
|
{ \
|
||||||
params_type params; \
|
params_type params; \
|
||||||
BUILD_BUG_ON(sizeof(params) > UVM_MAX_IOCTL_PARAM_STACK_SIZE); \
|
BUILD_BUG_ON(sizeof(params) > UVM_MAX_IOCTL_PARAM_STACK_SIZE); \
|
||||||
if (nv_copy_from_user(¶ms, (void __user*)arg, sizeof(params))) \
|
if (copy_from_user(¶ms, (void __user*)arg, sizeof(params))) \
|
||||||
return -EFAULT; \
|
return -EFAULT; \
|
||||||
\
|
\
|
||||||
params.rmStatus = uvm_global_get_status(); \
|
params.rmStatus = uvm_global_get_status(); \
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
params.rmStatus = function_name(¶ms, filp); \
|
params.rmStatus = function_name(¶ms, filp); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (nv_copy_to_user((void __user*)arg, ¶ms, sizeof(params))) \
|
if (copy_to_user((void __user*)arg, ¶ms, sizeof(params))) \
|
||||||
return -EFAULT; \
|
return -EFAULT; \
|
||||||
\
|
\
|
||||||
return 0; \
|
return 0; \
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
if (!params) \
|
if (!params) \
|
||||||
return -ENOMEM; \
|
return -ENOMEM; \
|
||||||
BUILD_BUG_ON(sizeof(*params) <= UVM_MAX_IOCTL_PARAM_STACK_SIZE); \
|
BUILD_BUG_ON(sizeof(*params) <= UVM_MAX_IOCTL_PARAM_STACK_SIZE); \
|
||||||
if (nv_copy_from_user(params, (void __user*)arg, sizeof(*params))) { \
|
if (copy_from_user(params, (void __user*)arg, sizeof(*params))) { \
|
||||||
uvm_kvfree(params); \
|
uvm_kvfree(params); \
|
||||||
return -EFAULT; \
|
return -EFAULT; \
|
||||||
} \
|
} \
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
params->rmStatus = function_name(params, filp); \
|
params->rmStatus = function_name(params, filp); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
if (nv_copy_to_user((void __user*)arg, params, sizeof(*params))) \
|
if (copy_to_user((void __user*)arg, params, sizeof(*params))) \
|
||||||
ret = -EFAULT; \
|
ret = -EFAULT; \
|
||||||
\
|
\
|
||||||
uvm_kvfree(params); \
|
uvm_kvfree(params); \
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
Copyright (c) 2015 NVIDIA Corporation
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
// This file provides simple wrappers that are always built with optimizations
|
|
||||||
// turned on to WAR issues with functions that don't build correctly otherwise.
|
|
||||||
|
|
||||||
#include "uvm_linux.h"
|
|
||||||
|
|
||||||
int nv_atomic_xchg(atomic_t *val, int new)
|
|
||||||
{
|
|
||||||
return atomic_xchg(val, new);
|
|
||||||
}
|
|
||||||
|
|
||||||
int nv_atomic_cmpxchg(atomic_t *val, int old, int new)
|
|
||||||
{
|
|
||||||
return atomic_cmpxchg(val, old, new);
|
|
||||||
}
|
|
||||||
|
|
||||||
long nv_atomic_long_cmpxchg(atomic_long_t *val, long old, long new)
|
|
||||||
{
|
|
||||||
return atomic_long_cmpxchg(val, old, new);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long nv_copy_from_user(void *to, const void __user *from, unsigned long n)
|
|
||||||
{
|
|
||||||
return copy_from_user(to, from, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long nv_copy_to_user(void __user *to, const void *from, unsigned long n)
|
|
||||||
{
|
|
||||||
return copy_to_user(to, from, n);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -412,7 +412,7 @@ void uvm_global_set_fatal_error_impl(NV_STATUS error)
|
|||||||
|
|
||||||
UVM_ASSERT(error != NV_OK);
|
UVM_ASSERT(error != NV_OK);
|
||||||
|
|
||||||
previous_error = nv_atomic_cmpxchg(&g_uvm_global.fatal_error, NV_OK, error);
|
previous_error = atomic_cmpxchg(&g_uvm_global.fatal_error, NV_OK, error);
|
||||||
|
|
||||||
if (previous_error == NV_OK) {
|
if (previous_error == NV_OK) {
|
||||||
UVM_ERR_PRINT("Encountered a global fatal error: %s\n", nvstatusToString(error));
|
UVM_ERR_PRINT("Encountered a global fatal error: %s\n", nvstatusToString(error));
|
||||||
@@ -430,7 +430,7 @@ NV_STATUS uvm_global_reset_fatal_error(void)
|
|||||||
return NV_ERR_INVALID_STATE;
|
return NV_ERR_INVALID_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nv_atomic_xchg(&g_uvm_global.fatal_error, NV_OK);
|
return atomic_xchg(&g_uvm_global.fatal_error, NV_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uvm_global_gpu_retain(const uvm_processor_mask_t *mask)
|
void uvm_global_gpu_retain(const uvm_processor_mask_t *mask)
|
||||||
|
|||||||
@@ -73,6 +73,24 @@ module_param(uvm_disable_hmm, bool, 0444);
|
|||||||
#include "uvm_va_policy.h"
|
#include "uvm_va_policy.h"
|
||||||
#include "uvm_tools.h"
|
#include "uvm_tools.h"
|
||||||
|
|
||||||
|
// The function nv_PageSwapCache() wraps the check for page swap cache flag in
|
||||||
|
// order to support a wide variety of kernel versions.
|
||||||
|
// The function PageSwapCache() is removed after 32f51ead3d77 ("mm: remove
|
||||||
|
// PageSwapCache") in v6.12-rc1.
|
||||||
|
// The function folio_test_swapcache() was added in Linux 5.16 (d389a4a811551
|
||||||
|
// "mm: Add folio flag manipulation functions")
|
||||||
|
// Systems with HMM patches backported to 5.14 are possible, but those systems
|
||||||
|
// do not include folio_test_swapcache()
|
||||||
|
// TODO: Bug 4050579: Remove this when migration of swap cached pages is updated
|
||||||
|
static __always_inline bool nv_PageSwapCache(struct page *page)
|
||||||
|
{
|
||||||
|
#if defined(NV_FOLIO_TEST_SWAPCACHE_PRESENT)
|
||||||
|
return folio_test_swapcache(page_folio(page));
|
||||||
|
#else
|
||||||
|
return PageSwapCache(page);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static NV_STATUS gpu_chunk_add(uvm_va_block_t *va_block,
|
static NV_STATUS gpu_chunk_add(uvm_va_block_t *va_block,
|
||||||
uvm_page_index_t page_index,
|
uvm_page_index_t page_index,
|
||||||
struct page *page);
|
struct page *page);
|
||||||
@@ -166,7 +184,7 @@ static void hmm_copy_devmem_page(struct page *dst_page, struct page *src_page)
|
|||||||
gpu = uvm_gpu_chunk_get_gpu(gpu_chunk);
|
gpu = uvm_gpu_chunk_get_gpu(gpu_chunk);
|
||||||
status = uvm_mmu_chunk_map(gpu_chunk);
|
status = uvm_mmu_chunk_map(gpu_chunk);
|
||||||
if (status != NV_OK)
|
if (status != NV_OK)
|
||||||
goto out_zero;
|
goto out;
|
||||||
|
|
||||||
status = uvm_parent_gpu_map_cpu_pages(gpu->parent, dst_page, PAGE_SIZE, &dma_addr);
|
status = uvm_parent_gpu_map_cpu_pages(gpu->parent, dst_page, PAGE_SIZE, &dma_addr);
|
||||||
if (status != NV_OK)
|
if (status != NV_OK)
|
||||||
@@ -197,7 +215,7 @@ out_unmap_cpu:
|
|||||||
out_unmap_gpu:
|
out_unmap_gpu:
|
||||||
uvm_mmu_chunk_unmap(gpu_chunk, NULL);
|
uvm_mmu_chunk_unmap(gpu_chunk, NULL);
|
||||||
|
|
||||||
out_zero:
|
out:
|
||||||
// We can't fail eviction because we need to free the device-private pages
|
// We can't fail eviction because we need to free the device-private pages
|
||||||
// so the GPU can be unregistered. So the best we can do is warn on any
|
// so the GPU can be unregistered. So the best we can do is warn on any
|
||||||
// failures and zero the uninitialised page. This could result in data loss
|
// failures and zero the uninitialised page. This could result in data loss
|
||||||
@@ -227,6 +245,7 @@ static NV_STATUS uvm_hmm_pmm_gpu_evict_pfn(unsigned long pfn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
lock_page(dst_page);
|
lock_page(dst_page);
|
||||||
|
|
||||||
hmm_copy_devmem_page(dst_page, migrate_pfn_to_page(src_pfn));
|
hmm_copy_devmem_page(dst_page, migrate_pfn_to_page(src_pfn));
|
||||||
dst_pfn = migrate_pfn(page_to_pfn(dst_page));
|
dst_pfn = migrate_pfn(page_to_pfn(dst_page));
|
||||||
migrate_device_pages(&src_pfn, &dst_pfn, 1);
|
migrate_device_pages(&src_pfn, &dst_pfn, 1);
|
||||||
@@ -2698,7 +2717,7 @@ static NV_STATUS dmamap_src_sysmem_pages(uvm_va_block_t *va_block,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PageSwapCache(src_page)) {
|
if (nv_PageSwapCache(src_page)) {
|
||||||
// TODO: Bug 4050579: Remove this when swap cached pages can be
|
// TODO: Bug 4050579: Remove this when swap cached pages can be
|
||||||
// migrated.
|
// migrated.
|
||||||
status = NV_WARN_MISMATCHED_TARGET;
|
status = NV_WARN_MISMATCHED_TARGET;
|
||||||
|
|||||||
@@ -228,47 +228,6 @@ static inline const struct cpumask *uvm_cpumask_of_node(int node)
|
|||||||
|
|
||||||
#define NV_UVM_GFP_FLAGS (GFP_KERNEL)
|
#define NV_UVM_GFP_FLAGS (GFP_KERNEL)
|
||||||
|
|
||||||
// Develop builds define DEBUG but enable optimization
|
|
||||||
#if defined(DEBUG) && !defined(NVIDIA_UVM_DEVELOP)
|
|
||||||
// Wrappers for functions not building correctly without optimizations on,
|
|
||||||
// implemented in uvm_debug_optimized.c. Notably the file is only built for
|
|
||||||
// debug builds, not develop or release builds.
|
|
||||||
|
|
||||||
// Unoptimized builds of atomic_xchg() hit a BUILD_BUG() on arm64 as it relies
|
|
||||||
// on __xchg being completely inlined:
|
|
||||||
// /usr/src/linux-3.12.19/arch/arm64/include/asm/cmpxchg.h:67:3: note: in expansion of macro 'BUILD_BUG'
|
|
||||||
//
|
|
||||||
// Powerppc hits a similar issue, but ends up with an undefined symbol:
|
|
||||||
// WARNING: "__xchg_called_with_bad_pointer" [...] undefined!
|
|
||||||
int nv_atomic_xchg(atomic_t *val, int new);
|
|
||||||
|
|
||||||
// Same problem as atomic_xchg() on powerppc:
|
|
||||||
// WARNING: "__cmpxchg_called_with_bad_pointer" [...] undefined!
|
|
||||||
int nv_atomic_cmpxchg(atomic_t *val, int old, int new);
|
|
||||||
|
|
||||||
// Same problem as atomic_xchg() on powerppc:
|
|
||||||
// WARNING: "__cmpxchg_called_with_bad_pointer" [...] undefined!
|
|
||||||
long nv_atomic_long_cmpxchg(atomic_long_t *val, long old, long new);
|
|
||||||
|
|
||||||
// This Linux kernel commit:
|
|
||||||
// 2016-08-30 0d025d271e55f3de21f0aaaf54b42d20404d2b23
|
|
||||||
// leads to build failures on x86_64, when compiling without optimization. Avoid
|
|
||||||
// that problem, by providing our own builds of copy_from_user / copy_to_user,
|
|
||||||
// for debug (non-optimized) UVM builds. Those are accessed via these
|
|
||||||
// nv_copy_to/from_user wrapper functions.
|
|
||||||
//
|
|
||||||
// Bug 1849583 has further details.
|
|
||||||
unsigned long nv_copy_from_user(void *to, const void __user *from, unsigned long n);
|
|
||||||
unsigned long nv_copy_to_user(void __user *to, const void *from, unsigned long n);
|
|
||||||
|
|
||||||
#else
|
|
||||||
#define nv_atomic_xchg atomic_xchg
|
|
||||||
#define nv_atomic_cmpxchg atomic_cmpxchg
|
|
||||||
#define nv_atomic_long_cmpxchg atomic_long_cmpxchg
|
|
||||||
#define nv_copy_to_user copy_to_user
|
|
||||||
#define nv_copy_from_user copy_from_user
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef NV_ALIGN_DOWN
|
#ifndef NV_ALIGN_DOWN
|
||||||
#define NV_ALIGN_DOWN(v,g) ((v) & ~((g) - 1))
|
#define NV_ALIGN_DOWN(v,g) ((v) & ~((g) - 1))
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2206,7 +2206,7 @@ NV_STATUS uvm_api_tools_init_event_tracker(UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS *
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nv_atomic_long_cmpxchg((atomic_long_t *)&filp->private_data, 0, (long)event_tracker) != 0) {
|
if (atomic_long_cmpxchg((atomic_long_t *)&filp->private_data, 0, (long)event_tracker) != 0) {
|
||||||
status = NV_ERR_INVALID_ARGUMENT;
|
status = NV_ERR_INVALID_ARGUMENT;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@@ -2577,7 +2577,7 @@ static NV_STATUS tools_access_process_memory(uvm_va_space_t *va_space,
|
|||||||
bool map_stage_mem_on_gpus = true;
|
bool map_stage_mem_on_gpus = true;
|
||||||
|
|
||||||
if (is_write) {
|
if (is_write) {
|
||||||
NvU64 remaining = nv_copy_from_user(stage_addr, user_va_start, bytes_now);
|
NvU64 remaining = copy_from_user(stage_addr, user_va_start, bytes_now);
|
||||||
if (remaining != 0) {
|
if (remaining != 0) {
|
||||||
status = NV_ERR_INVALID_ARGUMENT;
|
status = NV_ERR_INVALID_ARGUMENT;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -2660,7 +2660,7 @@ static NV_STATUS tools_access_process_memory(uvm_va_space_t *va_space,
|
|||||||
// point where the data is copied out.
|
// point where the data is copied out.
|
||||||
nv_speculation_barrier();
|
nv_speculation_barrier();
|
||||||
|
|
||||||
remaining = nv_copy_to_user(user_va_start, stage_addr, bytes_now);
|
remaining = copy_to_user(user_va_start, stage_addr, bytes_now);
|
||||||
if (remaining > 0) {
|
if (remaining > 0) {
|
||||||
status = NV_ERR_INVALID_ARGUMENT;
|
status = NV_ERR_INVALID_ARGUMENT;
|
||||||
goto exit;
|
goto exit;
|
||||||
@@ -2808,7 +2808,7 @@ NV_STATUS uvm_api_tools_get_processor_uuid_table(UVM_TOOLS_GET_PROCESSOR_UUID_TA
|
|||||||
uvm_va_space_up_read(va_space);
|
uvm_va_space_up_read(va_space);
|
||||||
|
|
||||||
if (params->tablePtr)
|
if (params->tablePtr)
|
||||||
remaining = nv_copy_to_user((void *)params->tablePtr, uuids, sizeof(NvProcessorUuid) * count);
|
remaining = copy_to_user((void *)params->tablePtr, uuids, sizeof(NvProcessorUuid) * count);
|
||||||
else
|
else
|
||||||
remaining = 0;
|
remaining = 0;
|
||||||
uvm_kvfree(uuids);
|
uvm_kvfree(uuids);
|
||||||
|
|||||||
@@ -1281,9 +1281,9 @@ NV_STATUS uvm_va_range_block_create(uvm_va_range_t *va_range, size_t index, uvm_
|
|||||||
return status;
|
return status;
|
||||||
|
|
||||||
// Try to insert it
|
// Try to insert it
|
||||||
old = (uvm_va_block_t *)nv_atomic_long_cmpxchg(&va_range->blocks[index],
|
old = (uvm_va_block_t *)atomic_long_cmpxchg(&va_range->blocks[index],
|
||||||
(long)NULL,
|
(long)NULL,
|
||||||
(long)block);
|
(long)block);
|
||||||
if (old) {
|
if (old) {
|
||||||
// Someone else beat us on the insert
|
// Someone else beat us on the insert
|
||||||
uvm_va_block_release(block);
|
uvm_va_block_release(block);
|
||||||
|
|||||||
@@ -588,7 +588,7 @@ NV_STATUS uvm_test_va_space_mm_or_current_retain(UVM_TEST_VA_SPACE_MM_OR_CURRENT
|
|||||||
if (params->retain_done_ptr) {
|
if (params->retain_done_ptr) {
|
||||||
NvU64 flag = true;
|
NvU64 flag = true;
|
||||||
|
|
||||||
if (nv_copy_to_user((void __user *)params->retain_done_ptr, &flag, sizeof(flag)))
|
if (copy_to_user((void __user *)params->retain_done_ptr, &flag, sizeof(flag)))
|
||||||
status = NV_ERR_INVALID_ARGUMENT;
|
status = NV_ERR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,25 +36,25 @@
|
|||||||
// and then checked back in. You cannot make changes to these sections without
|
// and then checked back in. You cannot make changes to these sections without
|
||||||
// corresponding changes to the buildmeister script
|
// corresponding changes to the buildmeister script
|
||||||
#ifndef NV_BUILD_BRANCH
|
#ifndef NV_BUILD_BRANCH
|
||||||
#define NV_BUILD_BRANCH r553_17
|
#define NV_BUILD_BRANCH r550_00
|
||||||
#endif
|
#endif
|
||||||
#ifndef NV_PUBLIC_BRANCH
|
#ifndef NV_PUBLIC_BRANCH
|
||||||
#define NV_PUBLIC_BRANCH r553_17
|
#define NV_PUBLIC_BRANCH r550_00
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(NV_LINUX) || defined(NV_BSD) || defined(NV_SUNOS)
|
#if defined(NV_LINUX) || defined(NV_BSD) || defined(NV_SUNOS)
|
||||||
#define NV_BUILD_BRANCH_VERSION "rel/gpu_drv/r550/r553_17-432"
|
#define NV_BUILD_BRANCH_VERSION "rel/gpu_drv/r550/r550_00-475"
|
||||||
#define NV_BUILD_CHANGELIST_NUM (35042495)
|
#define NV_BUILD_CHANGELIST_NUM (35120799)
|
||||||
#define NV_BUILD_TYPE "Official"
|
#define NV_BUILD_TYPE "Official"
|
||||||
#define NV_BUILD_NAME "rel/gpu_drv/r550/r553_17-432"
|
#define NV_BUILD_NAME "rel/gpu_drv/r550/r550_00-475"
|
||||||
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (35042495)
|
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (35120799)
|
||||||
|
|
||||||
#else /* Windows builds */
|
#else /* Windows builds */
|
||||||
#define NV_BUILD_BRANCH_VERSION "r553_17-3"
|
#define NV_BUILD_BRANCH_VERSION "r550_00-438"
|
||||||
#define NV_BUILD_CHANGELIST_NUM (34957518)
|
#define NV_BUILD_CHANGELIST_NUM (35120799)
|
||||||
#define NV_BUILD_TYPE "Official"
|
#define NV_BUILD_TYPE "Official"
|
||||||
#define NV_BUILD_NAME "553.24"
|
#define NV_BUILD_NAME "553.35"
|
||||||
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (34957518)
|
#define NV_LAST_OFFICIAL_CHANGELIST_NUM (35120799)
|
||||||
#define NV_BUILD_BRANCH_BASE_VERSION R550
|
#define NV_BUILD_BRANCH_BASE_VERSION R550
|
||||||
#endif
|
#endif
|
||||||
// End buildmeister python edited section
|
// End buildmeister python edited section
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#if defined(NV_LINUX) || defined(NV_BSD) || defined(NV_SUNOS) || defined(NV_VMWARE) || defined(NV_QNX) || defined(NV_INTEGRITY) || \
|
#if defined(NV_LINUX) || defined(NV_BSD) || defined(NV_SUNOS) || defined(NV_VMWARE) || defined(NV_QNX) || defined(NV_INTEGRITY) || \
|
||||||
(defined(RMCFG_FEATURE_PLATFORM_GSP) && RMCFG_FEATURE_PLATFORM_GSP == 1)
|
(defined(RMCFG_FEATURE_PLATFORM_GSP) && RMCFG_FEATURE_PLATFORM_GSP == 1)
|
||||||
|
|
||||||
#define NV_VERSION_STRING "550.127.08"
|
#define NV_VERSION_STRING "550.135"
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
|||||||
@@ -6660,9 +6660,9 @@ _nvswitch_service_nvltlc_tx_lnk_nonfatal_0_ls10
|
|||||||
// Driver WAR to disable ECC error and prevent an interrupt storm.
|
// Driver WAR to disable ECC error and prevent an interrupt storm.
|
||||||
// TODO: Clear ECC_ERROR_COUNTER by sending command to SOE and remove the WAR.
|
// TODO: Clear ECC_ERROR_COUNTER by sending command to SOE and remove the WAR.
|
||||||
//
|
//
|
||||||
NVSWITCH_LINK_WR32_LS10(device, link, NVLTLC, _NVLTLC_TX_LNK, _ERR_FATAL_REPORT_EN_0,
|
NVSWITCH_LINK_WR32_LS10(device, link, NVLTLC, _NVLTLC_TX_LNK, _ERR_NON_FATAL_REPORT_EN_0,
|
||||||
report.raw_enable &
|
report.raw_enable &
|
||||||
~DRF_NUM(_NVLTLC_TX_LNK, _ERR_FATAL_REPORT_EN_0, _CREQ_RAM_ECC_LIMIT_ERR, 1));
|
~DRF_NUM(_NVLTLC_TX_LNK, _ERR_NON_FATAL_REPORT_EN_0, _CREQ_RAM_ECC_LIMIT_ERR, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
bit = DRF_NUM(_NVLTLC_TX_LNK, _ERR_STATUS_0, _RSP_RAM_DAT_ECC_DBE_ERR, 1);
|
bit = DRF_NUM(_NVLTLC_TX_LNK, _ERR_STATUS_0, _RSP_RAM_DAT_ECC_DBE_ERR, 1);
|
||||||
@@ -6682,9 +6682,9 @@ _nvswitch_service_nvltlc_tx_lnk_nonfatal_0_ls10
|
|||||||
// Driver WAR to disable ECC error and prevent an interrupt storm.
|
// Driver WAR to disable ECC error and prevent an interrupt storm.
|
||||||
// TODO: Clear ECC_ERROR_COUNTER by sending command to SOE and remove the WAR.
|
// TODO: Clear ECC_ERROR_COUNTER by sending command to SOE and remove the WAR.
|
||||||
//
|
//
|
||||||
NVSWITCH_LINK_WR32_LS10(device, link, NVLTLC, _NVLTLC_TX_LNK, _ERR_FATAL_REPORT_EN_0,
|
NVSWITCH_LINK_WR32_LS10(device, link, NVLTLC, _NVLTLC_TX_LNK, _ERR_NON_FATAL_REPORT_EN_0,
|
||||||
report.raw_enable &
|
report.raw_enable &
|
||||||
~DRF_NUM(_NVLTLC_TX_LNK, _ERR_FATAL_REPORT_EN_0, _RSP_RAM_ECC_LIMIT_ERR, 1));
|
~DRF_NUM(_NVLTLC_TX_LNK, _ERR_NON_FATAL_REPORT_EN_0, _RSP_RAM_ECC_LIMIT_ERR, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
bit = DRF_NUM(_NVLTLC_TX_LNK, _ERR_STATUS_0, _COM_RAM_DAT_ECC_DBE_ERR, 1);
|
bit = DRF_NUM(_NVLTLC_TX_LNK, _ERR_STATUS_0, _COM_RAM_DAT_ECC_DBE_ERR, 1);
|
||||||
@@ -6709,9 +6709,9 @@ _nvswitch_service_nvltlc_tx_lnk_nonfatal_0_ls10
|
|||||||
// Driver WAR to disable ECC error and prevent an interrupt storm.
|
// Driver WAR to disable ECC error and prevent an interrupt storm.
|
||||||
// TODO: Clear ECC_ERROR_COUNTER by sending command to SOE and remove the WAR.
|
// TODO: Clear ECC_ERROR_COUNTER by sending command to SOE and remove the WAR.
|
||||||
//
|
//
|
||||||
NVSWITCH_LINK_WR32_LS10(device, link, NVLTLC, _NVLTLC_TX_LNK, _ERR_FATAL_REPORT_EN_0,
|
NVSWITCH_LINK_WR32_LS10(device, link, NVLTLC, _NVLTLC_TX_LNK, _ERR_NON_FATAL_REPORT_EN_0,
|
||||||
report.raw_enable &
|
report.raw_enable &
|
||||||
~DRF_NUM(_NVLTLC_TX_LNK, _ERR_FATAL_REPORT_EN_0, _COM_RAM_ECC_LIMIT_ERR, 1));
|
~DRF_NUM(_NVLTLC_TX_LNK, _ERR_NON_FATAL_REPORT_EN_0, _COM_RAM_ECC_LIMIT_ERR, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
bit = DRF_NUM(_NVLTLC_TX_LNK, _ERR_STATUS_0, _RSP1_RAM_ECC_LIMIT_ERR, 1);
|
bit = DRF_NUM(_NVLTLC_TX_LNK, _ERR_STATUS_0, _RSP1_RAM_ECC_LIMIT_ERR, 1);
|
||||||
@@ -6724,9 +6724,9 @@ _nvswitch_service_nvltlc_tx_lnk_nonfatal_0_ls10
|
|||||||
// Driver WAR to disable ECC error and prevent an interrupt storm.
|
// Driver WAR to disable ECC error and prevent an interrupt storm.
|
||||||
// TODO: Clear ECC_ERROR_COUNTER by sending command to SOE and remove the WAR.
|
// TODO: Clear ECC_ERROR_COUNTER by sending command to SOE and remove the WAR.
|
||||||
//
|
//
|
||||||
NVSWITCH_LINK_WR32_LS10(device, link, NVLTLC, _NVLTLC_TX_LNK, _ERR_FATAL_REPORT_EN_0,
|
NVSWITCH_LINK_WR32_LS10(device, link, NVLTLC, _NVLTLC_TX_LNK, _ERR_NON_FATAL_REPORT_EN_0,
|
||||||
report.raw_enable &
|
report.raw_enable &
|
||||||
~DRF_NUM(_NVLTLC_TX_LNK, _ERR_FATAL_REPORT_EN_0, _RSP1_RAM_ECC_LIMIT_ERR, 1));
|
~DRF_NUM(_NVLTLC_TX_LNK, _ERR_NON_FATAL_REPORT_EN_0, _RSP1_RAM_ECC_LIMIT_ERR, 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
NVSWITCH_UNHANDLED_CHECK(device, unhandled);
|
NVSWITCH_UNHANDLED_CHECK(device, unhandled);
|
||||||
|
|||||||
@@ -106,4 +106,33 @@ typedef struct NV208F_CTRL_GR_ECC_INJECTION_SUPPORTED_PARAMS {
|
|||||||
NV_DECLARE_ALIGNED(NV2080_CTRL_GR_ROUTE_INFO grRouteInfo, 8);
|
NV_DECLARE_ALIGNED(NV2080_CTRL_GR_ROUTE_INFO grRouteInfo, 8);
|
||||||
} NV208F_CTRL_GR_ECC_INJECTION_SUPPORTED_PARAMS;
|
} NV208F_CTRL_GR_ECC_INJECTION_SUPPORTED_PARAMS;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* NV208F_CTRL_CMD_GR_ECC_SET_TRANSIENT_CLEARING_POLICY
|
||||||
|
*
|
||||||
|
* Control command to determine whether or not the actions to clear potential transient
|
||||||
|
* errors in the SM should be taken
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
*
|
||||||
|
* policy
|
||||||
|
* NV208F_CTRL_GR_ECC_TRANSIENT_CLEARING_DISABLED
|
||||||
|
* Don't attempt to clear a transient error in the SM
|
||||||
|
* NV208F_CTRL_GR_ECC_TRANSIENT_CLEARING_ENABLED
|
||||||
|
* Attempt to clear a transient error in the SM
|
||||||
|
*
|
||||||
|
* Possible status values returned are:
|
||||||
|
* NV_OK
|
||||||
|
* NV_ERR_INVALID_ARGUMENT
|
||||||
|
*/
|
||||||
|
#define NV208F_CTRL_GR_ECC_TRANSIENT_CLEARING_DISABLED (0x00000000)
|
||||||
|
#define NV208F_CTRL_GR_ECC_TRANSIENT_CLEARING_ENABLED (0x00000001)
|
||||||
|
|
||||||
|
#define NV208F_CTRL_CMD_GR_ECC_SET_TRANSIENT_CLEARING_POLICY (0x208f1205) /* finn: Evaluated from "(FINN_NV20_SUBDEVICE_DIAG_GR_INTERFACE_ID << 8) | NV208F_CTRL_GR_ECC_SET_TRANSIENT_CLEARING_POLICY_PARAMS_MESSAGE_ID" */
|
||||||
|
|
||||||
|
#define NV208F_CTRL_GR_ECC_SET_TRANSIENT_CLEARING_POLICY_PARAMS_MESSAGE_ID (0x5U)
|
||||||
|
|
||||||
|
typedef struct NV208F_CTRL_GR_ECC_SET_TRANSIENT_CLEARING_POLICY_PARAMS {
|
||||||
|
NvU32 policy;
|
||||||
|
} NV208F_CTRL_GR_ECC_SET_TRANSIENT_CLEARING_POLICY_PARAMS;
|
||||||
|
|
||||||
/* _ctrl208fgr_h_ */
|
/* _ctrl208fgr_h_ */
|
||||||
|
|||||||
@@ -4593,6 +4593,11 @@ static NvBool NotifyVblank(
|
|||||||
struct NvKmsPerOpenDisp* pOpenDisp =
|
struct NvKmsPerOpenDisp* pOpenDisp =
|
||||||
GetPerOpenDisp(pOpen, pParams->request.deviceHandle,
|
GetPerOpenDisp(pOpen, pParams->request.deviceHandle,
|
||||||
pParams->request.dispHandle);
|
pParams->request.dispHandle);
|
||||||
|
|
||||||
|
if (pOpenDisp == NULL) {
|
||||||
|
return NV_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
const NvU32 apiHead = pParams->request.head;
|
const NvU32 apiHead = pParams->request.head;
|
||||||
|
|
||||||
pEventOpenFd = nvkms_get_per_open_data(pParams->request.unicastEvent.fd);
|
pEventOpenFd = nvkms_get_per_open_data(pParams->request.unicastEvent.fd);
|
||||||
|
|||||||
@@ -226,5 +226,6 @@ typedef struct
|
|||||||
#define GSP_FW_FLAGS 8:0
|
#define GSP_FW_FLAGS 8:0
|
||||||
#define GSP_FW_FLAGS_CLOCK_BOOST NVBIT(0)
|
#define GSP_FW_FLAGS_CLOCK_BOOST NVBIT(0)
|
||||||
#define GSP_FW_FLAGS_RECOVERY_MARGIN_PRESENT NVBIT(1)
|
#define GSP_FW_FLAGS_RECOVERY_MARGIN_PRESENT NVBIT(1)
|
||||||
|
#define GSP_FW_FLAGS_PPCIE_ENABLED NVBIT(2)
|
||||||
|
|
||||||
#endif // GSP_FW_WPR_META_H_
|
#endif // GSP_FW_WPR_META_H_
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: Copyright (c) 2017-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
* SPDX-FileCopyrightText: Copyright (c) 2017-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: Copyright (c) 1999-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
* SPDX-FileCopyrightText: Copyright (c) 1999-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ CHIPSET_SETUP_FUNC(Intel_0685_setupFunc)
|
|||||||
CHIPSET_SETUP_FUNC(Intel_4381_setupFunc)
|
CHIPSET_SETUP_FUNC(Intel_4381_setupFunc)
|
||||||
CHIPSET_SETUP_FUNC(Intel_7A82_setupFunc)
|
CHIPSET_SETUP_FUNC(Intel_7A82_setupFunc)
|
||||||
CHIPSET_SETUP_FUNC(Intel_7A04_setupFunc)
|
CHIPSET_SETUP_FUNC(Intel_7A04_setupFunc)
|
||||||
|
CHIPSET_SETUP_FUNC(Intel_5795_setupFunc)
|
||||||
CHIPSET_SETUP_FUNC(SiS_656_setupFunc)
|
CHIPSET_SETUP_FUNC(SiS_656_setupFunc)
|
||||||
CHIPSET_SETUP_FUNC(ATI_RS400_setupFunc)
|
CHIPSET_SETUP_FUNC(ATI_RS400_setupFunc)
|
||||||
CHIPSET_SETUP_FUNC(ATI_RS480_setupFunc)
|
CHIPSET_SETUP_FUNC(ATI_RS480_setupFunc)
|
||||||
@@ -192,7 +193,7 @@ CSINFO chipsetInfo[] =
|
|||||||
{PCI_VENDOR_ID_INTEL, 0x7A8A, CS_INTEL_1B81, "Intel-SapphireRapids", NULL},
|
{PCI_VENDOR_ID_INTEL, 0x7A8A, CS_INTEL_1B81, "Intel-SapphireRapids", NULL},
|
||||||
{PCI_VENDOR_ID_INTEL, 0x18DC, CS_INTEL_18DC, "Intel-IceLake", NULL},
|
{PCI_VENDOR_ID_INTEL, 0x18DC, CS_INTEL_18DC, "Intel-IceLake", NULL},
|
||||||
{PCI_VENDOR_ID_INTEL, 0x7A04, CS_INTEL_7A04, "Intel-RaptorLake", Intel_7A04_setupFunc},
|
{PCI_VENDOR_ID_INTEL, 0x7A04, CS_INTEL_7A04, "Intel-RaptorLake", Intel_7A04_setupFunc},
|
||||||
{PCI_VENDOR_ID_INTEL, 0x5795, CS_INTEL_5795, "Intel-GraniteRapids", NULL},
|
{PCI_VENDOR_ID_INTEL, 0x5795, CS_INTEL_5795, "Intel-GraniteRapids", Intel_5795_setupFunc},
|
||||||
|
|
||||||
{PCI_VENDOR_ID_NVIDIA, 0x0FAE, CS_NVIDIA_T210, "T210", Nvidia_T210_setupFunc},
|
{PCI_VENDOR_ID_NVIDIA, 0x0FAE, CS_NVIDIA_T210, "T210", Nvidia_T210_setupFunc},
|
||||||
{PCI_VENDOR_ID_NVIDIA, 0x0FAF, CS_NVIDIA_T210, "T210", Nvidia_T210_setupFunc},
|
{PCI_VENDOR_ID_NVIDIA, 0x0FAF, CS_NVIDIA_T210, "T210", Nvidia_T210_setupFunc},
|
||||||
|
|||||||
@@ -122,6 +122,18 @@ const PRB_FIELD_DESC prb_fields_dcl_dclmsg[] = {
|
|||||||
PRB_MAYBE_FIELD_NAME("engine")
|
PRB_MAYBE_FIELD_NAME("engine")
|
||||||
PRB_MAYBE_FIELD_DEFAULT(0)
|
PRB_MAYBE_FIELD_DEFAULT(0)
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
331,
|
||||||
|
{
|
||||||
|
PRB_OPTIONAL,
|
||||||
|
PRB_MESSAGE,
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
RC_RCDIAGRECORD,
|
||||||
|
0,
|
||||||
|
PRB_MAYBE_FIELD_NAME("rc_diag_recs")
|
||||||
|
PRB_MAYBE_FIELD_DEFAULT(0)
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// 'ErrorBlock' field defaults
|
// 'ErrorBlock' field defaults
|
||||||
@@ -150,7 +162,7 @@ const PRB_MSG_DESC prb_messages_dcl[] = {
|
|||||||
PRB_MAYBE_MESSAGE_NAME("Dcl.Engines")
|
PRB_MAYBE_MESSAGE_NAME("Dcl.Engines")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
7,
|
8,
|
||||||
prb_fields_dcl_dclmsg,
|
prb_fields_dcl_dclmsg,
|
||||||
PRB_MAYBE_MESSAGE_NAME("Dcl.DclMsg")
|
PRB_MAYBE_MESSAGE_NAME("Dcl.DclMsg")
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -18,8 +18,8 @@ extern const PRB_MSG_DESC prb_messages_dcl[];
|
|||||||
// Message maximum lengths
|
// Message maximum lengths
|
||||||
// Does not include repeated fields, strings and byte arrays.
|
// Does not include repeated fields, strings and byte arrays.
|
||||||
#define DCL_ENGINES_LEN 130
|
#define DCL_ENGINES_LEN 130
|
||||||
#define DCL_DCLMSG_LEN 567
|
#define DCL_DCLMSG_LEN 610
|
||||||
#define DCL_ERRORBLOCK_LEN 571
|
#define DCL_ERRORBLOCK_LEN 614
|
||||||
|
|
||||||
extern const PRB_FIELD_DESC prb_fields_dcl_engines[];
|
extern const PRB_FIELD_DESC prb_fields_dcl_engines[];
|
||||||
|
|
||||||
@@ -41,6 +41,7 @@ extern const PRB_FIELD_DESC prb_fields_dcl_dclmsg[];
|
|||||||
#define DCL_DCLMSG_JOURNAL_BUGCHECK (&prb_fields_dcl_dclmsg[4])
|
#define DCL_DCLMSG_JOURNAL_BUGCHECK (&prb_fields_dcl_dclmsg[4])
|
||||||
#define DCL_DCLMSG_RCCOUNTER (&prb_fields_dcl_dclmsg[5])
|
#define DCL_DCLMSG_RCCOUNTER (&prb_fields_dcl_dclmsg[5])
|
||||||
#define DCL_DCLMSG_ENGINE (&prb_fields_dcl_dclmsg[6])
|
#define DCL_DCLMSG_ENGINE (&prb_fields_dcl_dclmsg[6])
|
||||||
|
#define DCL_DCLMSG_RC_DIAG_RECS (&prb_fields_dcl_dclmsg[7])
|
||||||
|
|
||||||
// 'DclMsg' field lengths
|
// 'DclMsg' field lengths
|
||||||
#define DCL_DCLMSG_COMMON_LEN 42
|
#define DCL_DCLMSG_COMMON_LEN 42
|
||||||
@@ -50,6 +51,7 @@ extern const PRB_FIELD_DESC prb_fields_dcl_dclmsg[];
|
|||||||
#define DCL_DCLMSG_JOURNAL_BUGCHECK_LEN 69
|
#define DCL_DCLMSG_JOURNAL_BUGCHECK_LEN 69
|
||||||
#define DCL_DCLMSG_RCCOUNTER_LEN 64
|
#define DCL_DCLMSG_RCCOUNTER_LEN 64
|
||||||
#define DCL_DCLMSG_ENGINE_LEN 133
|
#define DCL_DCLMSG_ENGINE_LEN 133
|
||||||
|
#define DCL_DCLMSG_RC_DIAG_RECS_LEN 42
|
||||||
|
|
||||||
extern const PRB_FIELD_DESC prb_fields_dcl_errorblock[];
|
extern const PRB_FIELD_DESC prb_fields_dcl_errorblock[];
|
||||||
|
|
||||||
@@ -57,7 +59,7 @@ extern const PRB_FIELD_DESC prb_fields_dcl_errorblock[];
|
|||||||
#define DCL_ERRORBLOCK_DATA (&prb_fields_dcl_errorblock[0])
|
#define DCL_ERRORBLOCK_DATA (&prb_fields_dcl_errorblock[0])
|
||||||
|
|
||||||
// 'ErrorBlock' field lengths
|
// 'ErrorBlock' field lengths
|
||||||
#define DCL_ERRORBLOCK_DATA_LEN 570
|
#define DCL_ERRORBLOCK_DATA_LEN 613
|
||||||
|
|
||||||
extern const PRB_SERVICE_DESC prb_services_dcl[];
|
extern const PRB_SERVICE_DESC prb_services_dcl[];
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ extern const PRB_MSG_DESC prb_messages_nvdebug[];
|
|||||||
// Does not include repeated fields, strings and byte arrays.
|
// Does not include repeated fields, strings and byte arrays.
|
||||||
#define NVDEBUG_SYSTEMINFO_LEN 275
|
#define NVDEBUG_SYSTEMINFO_LEN 275
|
||||||
#define NVDEBUG_GPUINFO_LEN 164
|
#define NVDEBUG_GPUINFO_LEN 164
|
||||||
#define NVDEBUG_NVDUMP_LEN 1308
|
#define NVDEBUG_NVDUMP_LEN 1351
|
||||||
#define NVDEBUG_SYSTEMINFO_NORTHBRIDGEINFO_LEN 12
|
#define NVDEBUG_SYSTEMINFO_NORTHBRIDGEINFO_LEN 12
|
||||||
#define NVDEBUG_SYSTEMINFO_SOCINFO_LEN 12
|
#define NVDEBUG_SYSTEMINFO_SOCINFO_LEN 12
|
||||||
#define NVDEBUG_SYSTEMINFO_CPUINFO_LEN 24
|
#define NVDEBUG_SYSTEMINFO_CPUINFO_LEN 24
|
||||||
@@ -104,7 +104,7 @@ extern const PRB_FIELD_DESC prb_fields_nvdebug_nvdump[];
|
|||||||
|
|
||||||
// 'NvDump' field lengths
|
// 'NvDump' field lengths
|
||||||
#define NVDEBUG_NVDUMP_SYSTEM_INFO_LEN 278
|
#define NVDEBUG_NVDUMP_SYSTEM_INFO_LEN 278
|
||||||
#define NVDEBUG_NVDUMP_DCL_MSG_LEN 570
|
#define NVDEBUG_NVDUMP_DCL_MSG_LEN 613
|
||||||
#define NVDEBUG_NVDUMP_GPU_INFO_LEN 167
|
#define NVDEBUG_NVDUMP_GPU_INFO_LEN 167
|
||||||
#define NVDEBUG_NVDUMP_EXCEPTION_ADDRESS_LEN 10
|
#define NVDEBUG_NVDUMP_EXCEPTION_ADDRESS_LEN 10
|
||||||
#define NVDEBUG_NVDUMP_SYSTEM_INFO_GSPRM_LEN 278
|
#define NVDEBUG_NVDUMP_SYSTEM_INFO_GSPRM_LEN 278
|
||||||
|
|||||||
@@ -49,10 +49,8 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Compare two strings, character by character.
|
* @brief Compare two strings, character by character.
|
||||||
*
|
*
|
||||||
* Will only compare lengthBytes bytes. Strings are assumed to be at least that
|
* Will compare the first 'length' chars of each string, or until
|
||||||
* long.
|
* the nul-terminator is reached in either string, whichever comes first.
|
||||||
*
|
|
||||||
* Strings are allowed to overlap, but in .
|
|
||||||
*
|
*
|
||||||
* @returns:
|
* @returns:
|
||||||
* - 0 if all bytes are equal
|
* - 0 if all bytes are equal
|
||||||
|
|||||||
@@ -2284,9 +2284,9 @@
|
|||||||
// 0 - Disable multi gpu mode
|
// 0 - Disable multi gpu mode
|
||||||
// 1 - Enable protected pcie
|
// 1 - Enable protected pcie
|
||||||
//
|
//
|
||||||
#define NV_REG_STR_RM_CC_MULTI_GPU_MODE "RmCCMultiGpuMode"
|
#define NV_REG_STR_RM_PPCIE_ENABLED "RmEnableProtectedPcie"
|
||||||
#define NV_REG_STR_RM_CC_MULTI_GPU_MODE_NONE 0x00000000
|
#define NV_REG_STR_RM_PPCIE_ENABLED_NO 0x00000000
|
||||||
#define NV_REG_STR_RM_CC_MULTI_GPU_MODE_PROTECTED_PCIE 0x00000001
|
#define NV_REG_STR_RM_PPCIE_ENABLED_YES 0x00000001
|
||||||
|
|
||||||
// This regkey allows RM to access CPR vidmem over BARs when HCC devtools mode is ON
|
// This regkey allows RM to access CPR vidmem over BARs when HCC devtools mode is ON
|
||||||
#define NV_REG_STR_RM_FORCE_BAR_ACCESS_ON_HCC "RmForceBarAccessOnHcc"
|
#define NV_REG_STR_RM_FORCE_BAR_ACCESS_ON_HCC "RmForceBarAccessOnHcc"
|
||||||
|
|||||||
@@ -1814,6 +1814,33 @@ _rcdbDumpDclMsgRecord(
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case RmRcDiagReport:
|
||||||
|
{
|
||||||
|
RmRcDiag_RECORD* pRecord = (RmRcDiag_RECORD*) &pDclRecord[1];
|
||||||
|
OBJGPU *pGpu = gpumgrGetGpuFromId(pDclRecord->GPUTag);
|
||||||
|
|
||||||
|
// open an RC Diagnostic record in the Proto Bufffer
|
||||||
|
NV_CHECK_OK(nvStatus, LEVEL_ERROR,
|
||||||
|
prbEncNestedStart(pPrbEnc, DCL_DCLMSG_RC_DIAG_RECS));
|
||||||
|
if (nvStatus == NV_OK)
|
||||||
|
{
|
||||||
|
prbEncAddUInt32(pPrbEnc, RC_RCDIAGRECORD_RECORD_ID, pRecord->idx);
|
||||||
|
prbEncAddUInt32(pPrbEnc, RC_RCDIAGRECORD_RECORD_TYPE, pRecord->type);
|
||||||
|
if (NULL != pGpu)
|
||||||
|
{
|
||||||
|
NvU32 i;
|
||||||
|
for (i = 0; i < pRecord->count; ++i)
|
||||||
|
{
|
||||||
|
if (NV0000_CTRL_CMD_NVD_RCERR_RPT_REG_MAX_PSEDO_REG < pRecord->data[i].tag)
|
||||||
|
{
|
||||||
|
prbEncGpuRegImm(pGpu, pRecord->data[i].offset, pRecord->data[i].value, pPrbEnc, RC_RCDIAGRECORD_REGS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NV_CHECK_OK(nvStatus, LEVEL_ERROR, prbEncNestedEnd(pPrbEnc));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case RmPrbErrorInfo_V2:
|
case RmPrbErrorInfo_V2:
|
||||||
case RmPrbFullDump_V2:
|
case RmPrbFullDump_V2:
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#include "os/os.h"
|
#include "os/os.h"
|
||||||
#include "nverror.h"
|
#include "nverror.h"
|
||||||
#include "vgpu/rpc.h"
|
#include "vgpu/rpc.h"
|
||||||
|
#include "nvrm_registry.h"
|
||||||
|
|
||||||
#include "published/hopper/gh100/hwproject.h"
|
#include "published/hopper/gh100/hwproject.h"
|
||||||
#include "published/hopper/gh100/dev_gc6_island.h"
|
#include "published/hopper/gh100/dev_gc6_island.h"
|
||||||
@@ -493,7 +494,14 @@ gpuIsProtectedPcieEnabledInHw_GH100
|
|||||||
OBJGPU *pGpu
|
OBJGPU *pGpu
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Bug 4870925: Disabled PPCIE
|
NvU32 data;
|
||||||
|
|
||||||
|
if ((osReadRegistryDword(pGpu, NV_REG_STR_RM_PPCIE_ENABLED, &data) == NV_OK) &&
|
||||||
|
(data == NV_REG_STR_RM_PPCIE_ENABLED_YES))
|
||||||
|
{
|
||||||
|
return NV_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
return NV_FALSE;
|
return NV_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -220,18 +220,6 @@ _confComputeInitRegistryOverrides
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((osReadRegistryDword(pGpu, NV_REG_STR_RM_CC_MULTI_GPU_MODE, &data) == NV_OK) &&
|
|
||||||
(data == NV_REG_STR_RM_CC_MULTI_GPU_MODE_PROTECTED_PCIE))
|
|
||||||
{
|
|
||||||
NV_PRINTF(LEVEL_INFO, "Enabling protected PCIe\n");
|
|
||||||
// Internally, RM must use CC code paths for protected pcie as well
|
|
||||||
pConfCompute->setProperty(pConfCompute, PDB_PROP_CONFCOMPUTE_ENABLED, NV_TRUE);
|
|
||||||
pConfCompute->setProperty(pConfCompute,
|
|
||||||
PDB_PROP_CONFCOMPUTE_MULTI_GPU_PROTECTED_PCIE_MODE_ENABLED, NV_TRUE);
|
|
||||||
pConfCompute->gspProxyRegkeys |=
|
|
||||||
DRF_DEF(GSP, _PROXY_REG, _CONF_COMPUTE_MULTI_GPU_MODE, _PROTECTED_PCIE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pConfCompute->getProperty(pConfCompute, PDB_PROP_CONFCOMPUTE_ENABLED))
|
if (pConfCompute->getProperty(pConfCompute, PDB_PROP_CONFCOMPUTE_ENABLED))
|
||||||
{
|
{
|
||||||
if (confComputeIsSpdmEnabled(pGpu, pConfCompute))
|
if (confComputeIsSpdmEnabled(pGpu, pConfCompute))
|
||||||
|
|||||||
@@ -234,7 +234,9 @@ kchangrpapiConstruct_IMPL
|
|||||||
|
|
||||||
// vGpu plugin context flag should only be set on host if context is plugin
|
// vGpu plugin context flag should only be set on host if context is plugin
|
||||||
if (gpuIsSriovEnabled(pGpu))
|
if (gpuIsSriovEnabled(pGpu))
|
||||||
|
{
|
||||||
pKernelChannelGroup->bIsCallingContextVgpuPlugin = pAllocParams->bIsCallingContextVgpuPlugin;
|
pKernelChannelGroup->bIsCallingContextVgpuPlugin = pAllocParams->bIsCallingContextVgpuPlugin;
|
||||||
|
}
|
||||||
|
|
||||||
if (pKernelChannelGroup->bIsCallingContextVgpuPlugin)
|
if (pKernelChannelGroup->bIsCallingContextVgpuPlugin)
|
||||||
gfid = GPU_GFID_PF;
|
gfid = GPU_GFID_PF;
|
||||||
|
|||||||
@@ -229,9 +229,9 @@ gpuInitInstLocOverrides_IMPL
|
|||||||
//
|
//
|
||||||
if (((osReadRegistryDword(pGpu, NV_REG_STR_RM_CONFIDENTIAL_COMPUTE, &data32) == NV_OK) &&
|
if (((osReadRegistryDword(pGpu, NV_REG_STR_RM_CONFIDENTIAL_COMPUTE, &data32) == NV_OK) &&
|
||||||
FLD_TEST_DRF(_REG_STR, _RM_CONFIDENTIAL_COMPUTE, _ENABLED, _YES, data32) &&
|
FLD_TEST_DRF(_REG_STR, _RM_CONFIDENTIAL_COMPUTE, _ENABLED, _YES, data32) &&
|
||||||
pGpu->getProperty(pGpu, PDB_PROP_GPU_CC_FEATURE_CAPABLE)) || gpuIsCCEnabledInHw_HAL(pGpu) ||
|
pGpu->getProperty(pGpu, PDB_PROP_GPU_CC_FEATURE_CAPABLE)) ||
|
||||||
((osReadRegistryDword(pGpu, NV_REG_STR_RM_CC_MULTI_GPU_MODE, &data32) == NV_OK) &&
|
gpuIsCCEnabledInHw_HAL(pGpu) ||
|
||||||
(data32 == NV_REG_STR_RM_CC_MULTI_GPU_MODE_PROTECTED_PCIE)) || gpuIsProtectedPcieEnabledInHw_HAL(pGpu))
|
gpuIsProtectedPcieEnabledInHw_HAL(pGpu))
|
||||||
{
|
{
|
||||||
|
|
||||||
pGpu->instLocOverrides = NV_REG_STR_RM_INST_LOC_ALL_VID;
|
pGpu->instLocOverrides = NV_REG_STR_RM_INST_LOC_ALL_VID;
|
||||||
|
|||||||
@@ -363,6 +363,15 @@ kgspCalculateFbLayout_GH100
|
|||||||
pWprMeta->revision = GSP_FW_WPR_META_REVISION;
|
pWprMeta->revision = GSP_FW_WPR_META_REVISION;
|
||||||
pWprMeta->magic = GSP_FW_WPR_META_MAGIC;
|
pWprMeta->magic = GSP_FW_WPR_META_MAGIC;
|
||||||
|
|
||||||
|
if (gpuIsCCMultiGpuProtectedPcieModeEnabled(pGpu))
|
||||||
|
{
|
||||||
|
pWprMeta->flags |= GSP_FW_FLAGS_PPCIE_ENABLED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pWprMeta->flags &= ~GSP_FW_FLAGS_PPCIE_ENABLED;
|
||||||
|
}
|
||||||
|
|
||||||
return NV_OK;
|
return NV_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -531,6 +531,67 @@ _kgspRpcRCTriggered
|
|||||||
NV_ERR_INVALID_CHANNEL);
|
NV_ERR_INVALID_CHANNEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add the RcDiag records we received from GSP-RM to our system wide journal
|
||||||
|
{
|
||||||
|
OBJSYS *pSys = SYS_GET_INSTANCE();
|
||||||
|
Journal *pRcDB = SYS_GET_RCDB(pSys);
|
||||||
|
RmClient *pClient;
|
||||||
|
|
||||||
|
NvU32 recordSize = rcdbGetOcaRecordSizeWithHeader(pRcDB, RmRcDiagReport);
|
||||||
|
NvU32 rcDiagRecStart = pRcDB->RcErrRptNextIdx;
|
||||||
|
NvU32 rcDiagRecEnd;
|
||||||
|
NvU32 processId = 0;
|
||||||
|
NvU32 owner = RCDB_RCDIAG_DEFAULT_OWNER;
|
||||||
|
|
||||||
|
if (pKernelChannel != NULL)
|
||||||
|
{
|
||||||
|
pClient = dynamicCast(RES_GET_CLIENT(pKernelChannel), RmClient);
|
||||||
|
NV_ASSERT(pClient != NULL);
|
||||||
|
if (pClient != NULL)
|
||||||
|
processId = pClient->ProcID;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (NvU32 i = 0; i < rpc_params->rcJournalBufferSize / recordSize; i++)
|
||||||
|
{
|
||||||
|
RmRCCommonJournal_RECORD *pCommonRecord =
|
||||||
|
(RmRCCommonJournal_RECORD *)((NvU8*)&rpc_params->rcJournalBuffer + i * recordSize);
|
||||||
|
RmRcDiag_RECORD *pRcDiagRecord =
|
||||||
|
(RmRcDiag_RECORD *)&pCommonRecord[1];
|
||||||
|
|
||||||
|
#if defined(DEBUG)
|
||||||
|
NV_PRINTF(LEVEL_INFO, "%d: GPUTag=0x%x CPUTag=0x%llx timestamp=0x%llx stateMask=0x%llx\n",
|
||||||
|
i, pCommonRecord->GPUTag, pCommonRecord->CPUTag, pCommonRecord->timeStamp,
|
||||||
|
pCommonRecord->stateMask);
|
||||||
|
NV_PRINTF(LEVEL_INFO, " idx=%d timeStamp=0x%x type=0x%x flags=0x%x count=%d owner=0x%x processId=0x%x\n",
|
||||||
|
pRcDiagRecord->idx, pRcDiagRecord->timeStamp, pRcDiagRecord->type, pRcDiagRecord->flags,
|
||||||
|
pRcDiagRecord->count, pRcDiagRecord->owner, processId);
|
||||||
|
for (NvU32 j = 0; j < pRcDiagRecord->count; j++)
|
||||||
|
{
|
||||||
|
NV_PRINTF(LEVEL_INFO, " %d: offset=0x08%x tag=0x08%x value=0x08%x attribute=0x08%x\n",
|
||||||
|
j, pRcDiagRecord->data[j].offset, pRcDiagRecord->data[j].tag,
|
||||||
|
pRcDiagRecord->data[j].value, pRcDiagRecord->data[j].attribute);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (rcdbAddRcDiagRecFromGsp(pGpu, pRcDB, pCommonRecord, pRcDiagRecord) == NULL)
|
||||||
|
{
|
||||||
|
NV_PRINTF(LEVEL_WARNING, "Lost RC diagnostic record coming from GPU%d GSP: type=0x%x stateMask=0x%llx\n",
|
||||||
|
gpuGetInstance(pGpu), pRcDiagRecord->type, pCommonRecord->stateMask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rcDiagRecEnd = pRcDB->RcErrRptNextIdx - 1;
|
||||||
|
|
||||||
|
// Update records to have the correct PID associated with the channel
|
||||||
|
if (rcDiagRecStart != rcDiagRecEnd)
|
||||||
|
{
|
||||||
|
rcdbUpdateRcDiagRecContext(pRcDB,
|
||||||
|
rcDiagRecStart,
|
||||||
|
rcDiagRecEnd,
|
||||||
|
processId,
|
||||||
|
owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bIsCcEnabled = gpuIsCCFeatureEnabled(pGpu);
|
bIsCcEnabled = gpuIsCCFeatureEnabled(pGpu);
|
||||||
|
|
||||||
// With CC enabled, CPU-RM needs to write error notifiers
|
// With CC enabled, CPU-RM needs to write error notifiers
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: Copyright (c) 2004-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
* SPDX-FileCopyrightText: Copyright (c) 2004-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
@@ -894,6 +894,18 @@ Intel_7A04_setupFunc
|
|||||||
return NV_OK;
|
return NV_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NV_STATUS
|
||||||
|
Intel_5795_setupFunc
|
||||||
|
(
|
||||||
|
OBJCL *pCl
|
||||||
|
)
|
||||||
|
{
|
||||||
|
pCl->setProperty(pCl, PDB_PROP_CL_RELAXED_ORDERING_NOT_CAPABLE, NV_TRUE);
|
||||||
|
|
||||||
|
return NV_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static NV_STATUS
|
static NV_STATUS
|
||||||
Nvidia_T210_setupFunc
|
Nvidia_T210_setupFunc
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -5990,24 +5990,13 @@ static NV_STATUS _convertGpuFabricProbeStateToErrorCode
|
|||||||
switch (fabricProbeParams.state)
|
switch (fabricProbeParams.state)
|
||||||
{
|
{
|
||||||
case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_UNSUPPORTED:
|
case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_UNSUPPORTED:
|
||||||
|
case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_COMPLETE:
|
||||||
return NV_OK;
|
return NV_OK;
|
||||||
|
|
||||||
case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_IN_PROGRESS:
|
case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_IN_PROGRESS:
|
||||||
case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_NOT_STARTED:
|
case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_NOT_STARTED:
|
||||||
return NV_ERR_NVSWITCH_FABRIC_NOT_READY;
|
return NV_ERR_NVSWITCH_FABRIC_NOT_READY;
|
||||||
|
|
||||||
case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_COMPLETE:
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// When state is NV2080_CTRL_GPU_FABRIC_PROBE_STATE_COMPLETE
|
|
||||||
// status has to be checked for probe response success/failure.
|
|
||||||
//
|
|
||||||
if (fabricProbeParams.status != NV_OK)
|
|
||||||
return NV_ERR_NVSWITCH_FABRIC_FAILURE;
|
|
||||||
else
|
|
||||||
return NV_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
NV_PRINTF(LEVEL_ERROR, "Invalid Fabric Probe State\n");
|
NV_PRINTF(LEVEL_ERROR, "Invalid Fabric Probe State\n");
|
||||||
return NV_ERR_INVALID_STATE;
|
return NV_ERR_INVALID_STATE;
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
#include "nvport/nvport.h"
|
#include "nvport/nvport.h"
|
||||||
#include "nvmisc.h"
|
#include "nvmisc.h"
|
||||||
|
|
||||||
|
|
||||||
#ifndef NVPORT_STRING_DONT_DEFINE_portStringLength
|
#ifndef NVPORT_STRING_DONT_DEFINE_portStringLength
|
||||||
NvLength
|
NvLength
|
||||||
portStringLength
|
portStringLength
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
NVIDIA_VERSION = 550.127.08
|
NVIDIA_VERSION = 550.135
|
||||||
|
|
||||||
# This file.
|
# This file.
|
||||||
VERSION_MK_FILE := $(lastword $(MAKEFILE_LIST))
|
VERSION_MK_FILE := $(lastword $(MAKEFILE_LIST))
|
||||||
|
|||||||
Reference in New Issue
Block a user