diff --git a/README.md b/README.md index ffe385f9a..f641df2af 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # NVIDIA Linux Open GPU Kernel Module Source This is the source release of the NVIDIA Linux open GPU kernel modules, -version 550.127.08. +version 550.135. ## How to Build @@ -17,7 +17,7 @@ as root: Note that the kernel modules built here must be used with GSP 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` option. E.g., @@ -188,7 +188,7 @@ encountered specific to them. For details on feature support and limitations, see the NVIDIA GPU driver 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 Package for more details. diff --git a/kernel-open/Kbuild b/kernel-open/Kbuild index 888d5344f..7d49b2fd1 100644 --- a/kernel-open/Kbuild +++ b/kernel-open/Kbuild @@ -72,7 +72,7 @@ EXTRA_CFLAGS += -I$(src)/common/inc EXTRA_CFLAGS += -I$(src) EXTRA_CFLAGS += -Wall $(DEFINES) $(INCLUDES) -Wno-cast-qual -Wno-format-extra-args EXTRA_CFLAGS += -D__KERNEL__ -DMODULE -DNVRM -EXTRA_CFLAGS += -DNV_VERSION_STRING=\"550.127.08\" +EXTRA_CFLAGS += -DNV_VERSION_STRING=\"550.135\" ifneq ($(SYSSRCHOST1X),) EXTRA_CFLAGS += -I$(SYSSRCHOST1X) diff --git a/kernel-open/Makefile b/kernel-open/Makefile index baafdbfc9..2dacb1cb9 100644 --- a/kernel-open/Makefile +++ b/kernel-open/Makefile @@ -52,6 +52,22 @@ else 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 LD ?= ld OBJDUMP ?= objdump @@ -65,6 +81,16 @@ else ) 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 := $(filter-out $(NV_EXCLUDE_KERNEL_MODULES), \ $(NV_KERNEL_MODULES)) @@ -106,8 +132,9 @@ else # module symbols on which the Linux kernel's module resolution is dependent # and hence must be used whenever present. - LD_SCRIPT ?= $(KERNEL_SOURCES)/scripts/module-common.lds \ - $(KERNEL_SOURCES)/arch/$(ARCH)/kernel/module.lds \ + LD_SCRIPT ?= $(KERNEL_SOURCES)/scripts/module-common.lds \ + $(KERNEL_SOURCES)/arch/$(KERNEL_ARCH)/kernel/module.lds \ + $(KERNEL_OUTPUT)/arch/$(KERNEL_ARCH)/module.lds \ $(KERNEL_OUTPUT)/scripts/module.lds NV_MODULE_COMMON_SCRIPTS := $(foreach s, $(wildcard $(LD_SCRIPT)), -T $(s)) diff --git a/kernel-open/conftest.sh b/kernel-open/conftest.sh index 060f47736..cd478625c 100755 --- a/kernel-open/conftest.sh +++ b/kernel-open/conftest.sh @@ -2523,6 +2523,22 @@ compile_test() { 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 + 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) # # 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" ;; + 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 + 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 # specifying the relevant upstream Linux kernel commit. Please # avoid specifying -rc kernels, and only use SHAs that actually exist diff --git a/kernel-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c index 91c7cbfc0..481220946 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-drv.c +++ b/kernel-open/nvidia-drm/nvidia-drm-drv.c @@ -1553,6 +1553,10 @@ static const struct file_operations nv_drm_fops = { .read = drm_read, .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[] = { diff --git a/kernel-open/nvidia-drm/nvidia-drm-sources.mk b/kernel-open/nvidia-drm/nvidia-drm-sources.mk index fec0a871c..fb3654c86 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-sources.mk +++ b/kernel-open/nvidia-drm/nvidia-drm-sources.mk @@ -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_unlocked_ioctl_flag_present NV_CONFTEST_TYPE_COMPILE_TESTS += drm_output_poll_changed +NV_CONFTEST_TYPE_COMPILE_TESTS += file_operations_fop_unsigned_offset_present diff --git a/kernel-open/nvidia-uvm/nvidia-uvm-sources.Kbuild b/kernel-open/nvidia-uvm/nvidia-uvm-sources.Kbuild index b9ab77bc2..b4e03b102 100644 --- a/kernel-open/nvidia-uvm/nvidia-uvm-sources.Kbuild +++ b/kernel-open/nvidia-uvm/nvidia-uvm-sources.Kbuild @@ -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_common.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/nvCpuUuid.c NVIDIA_UVM_SOURCES += nvidia-uvm/nv-kthread-q.c diff --git a/kernel-open/nvidia-uvm/nvidia-uvm.Kbuild b/kernel-open/nvidia-uvm/nvidia-uvm.Kbuild index 683aece10..ba99e3784 100644 --- a/kernel-open/nvidia-uvm/nvidia-uvm.Kbuild +++ b/kernel-open/nvidia-uvm/nvidia-uvm.Kbuild @@ -13,19 +13,6 @@ NVIDIA_UVM_OBJECTS = include $(src)/nvidia-uvm/nvidia-uvm-sources.Kbuild 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 nvidia-uvm-y := $(NVIDIA_UVM_OBJECTS) @@ -36,15 +23,14 @@ NVIDIA_UVM_KO = nvidia-uvm/nvidia-uvm.ko # ifeq ($(UVM_BUILD_TYPE),debug) - NVIDIA_UVM_CFLAGS += -DDEBUG -O1 -g -else - ifeq ($(UVM_BUILD_TYPE),develop) - # -DDEBUG is required, in order to allow pr_devel() print statements to - # work: - NVIDIA_UVM_CFLAGS += -DDEBUG - NVIDIA_UVM_CFLAGS += -DNVIDIA_UVM_DEVELOP - endif - NVIDIA_UVM_CFLAGS += -O2 + NVIDIA_UVM_CFLAGS += -DDEBUG -g +endif + +ifeq ($(UVM_BUILD_TYPE),develop) + # -DDEBUG is required, in order to allow pr_devel() print statements to + # work: + NVIDIA_UVM_CFLAGS += -DDEBUG + NVIDIA_UVM_CFLAGS += -DNVIDIA_UVM_DEVELOP endif 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)) -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 # @@ -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 += find_next_bit_wrap 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 += mm_context_t diff --git a/kernel-open/nvidia-uvm/uvm.c b/kernel-open/nvidia-uvm/uvm.c index f0f70e39c..dd9153b27 100644 --- a/kernel-open/nvidia-uvm/uvm.c +++ b/kernel-open/nvidia-uvm/uvm.c @@ -127,9 +127,9 @@ static NV_STATUS uvm_api_mm_initialize(UVM_MM_INITIALIZE_PARAMS *params, struct goto err; } - old_fd_type = nv_atomic_long_cmpxchg((atomic_long_t *)&filp->private_data, - UVM_FD_UNINITIALIZED, - UVM_FD_INITIALIZING); + old_fd_type = atomic_long_cmpxchg((atomic_long_t *)&filp->private_data, + UVM_FD_UNINITIALIZED, + UVM_FD_INITIALIZING); old_fd_type &= UVM_FD_TYPE_MASK; if (old_fd_type != UVM_FD_UNINITIALIZED) { 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 // a chance to observe UVM_FD_INITIALIZING and not UVM_FD_VA_SPACE in this // case. - old_fd_type = nv_atomic_long_cmpxchg((atomic_long_t *)&filp->private_data, - UVM_FD_UNINITIALIZED, UVM_FD_INITIALIZING); + old_fd_type = atomic_long_cmpxchg((atomic_long_t *)&filp->private_data, + UVM_FD_UNINITIALIZED, + UVM_FD_INITIALIZING); old_fd_type &= UVM_FD_TYPE_MASK; if (old_fd_type == UVM_FD_UNINITIALIZED) { status = uvm_va_space_create(filp->f_mapping, &va_space, params->flags); diff --git a/kernel-open/nvidia-uvm/uvm_api.h b/kernel-open/nvidia-uvm/uvm_api.h index a63d163bb..f86f7c3b1 100644 --- a/kernel-open/nvidia-uvm/uvm_api.h +++ b/kernel-open/nvidia-uvm/uvm_api.h @@ -47,7 +47,7 @@ { \ params_type params; \ 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; \ \ params.rmStatus = uvm_global_get_status(); \ @@ -60,7 +60,7 @@ 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 0; \ @@ -84,7 +84,7 @@ if (!params) \ return -ENOMEM; \ 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); \ return -EFAULT; \ } \ @@ -99,7 +99,7 @@ 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; \ \ uvm_kvfree(params); \ diff --git a/kernel-open/nvidia-uvm/uvm_debug_optimized.c b/kernel-open/nvidia-uvm/uvm_debug_optimized.c deleted file mode 100644 index af4a4cfbc..000000000 --- a/kernel-open/nvidia-uvm/uvm_debug_optimized.c +++ /dev/null @@ -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); -} - diff --git a/kernel-open/nvidia-uvm/uvm_global.c b/kernel-open/nvidia-uvm/uvm_global.c index 8bd16542f..baae7f32b 100644 --- a/kernel-open/nvidia-uvm/uvm_global.c +++ b/kernel-open/nvidia-uvm/uvm_global.c @@ -412,7 +412,7 @@ void uvm_global_set_fatal_error_impl(NV_STATUS error) 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) { 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_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) diff --git a/kernel-open/nvidia-uvm/uvm_hmm.c b/kernel-open/nvidia-uvm/uvm_hmm.c index d944f2dc6..977bd7a12 100644 --- a/kernel-open/nvidia-uvm/uvm_hmm.c +++ b/kernel-open/nvidia-uvm/uvm_hmm.c @@ -73,6 +73,24 @@ module_param(uvm_disable_hmm, bool, 0444); #include "uvm_va_policy.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, uvm_page_index_t page_index, 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); status = uvm_mmu_chunk_map(gpu_chunk); if (status != NV_OK) - goto out_zero; + goto out; status = uvm_parent_gpu_map_cpu_pages(gpu->parent, dst_page, PAGE_SIZE, &dma_addr); if (status != NV_OK) @@ -197,7 +215,7 @@ out_unmap_cpu: out_unmap_gpu: uvm_mmu_chunk_unmap(gpu_chunk, NULL); -out_zero: +out: // 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 // 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); + hmm_copy_devmem_page(dst_page, migrate_pfn_to_page(src_pfn)); dst_pfn = migrate_pfn(page_to_pfn(dst_page)); 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; } - if (PageSwapCache(src_page)) { + if (nv_PageSwapCache(src_page)) { // TODO: Bug 4050579: Remove this when swap cached pages can be // migrated. status = NV_WARN_MISMATCHED_TARGET; diff --git a/kernel-open/nvidia-uvm/uvm_linux.h b/kernel-open/nvidia-uvm/uvm_linux.h index 61a0964cf..eaac371e9 100644 --- a/kernel-open/nvidia-uvm/uvm_linux.h +++ b/kernel-open/nvidia-uvm/uvm_linux.h @@ -228,47 +228,6 @@ static inline const struct cpumask *uvm_cpumask_of_node(int node) #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 #define NV_ALIGN_DOWN(v,g) ((v) & ~((g) - 1)) #endif diff --git a/kernel-open/nvidia-uvm/uvm_tools.c b/kernel-open/nvidia-uvm/uvm_tools.c index cb7bc4dca..a1b4652ed 100644 --- a/kernel-open/nvidia-uvm/uvm_tools.c +++ b/kernel-open/nvidia-uvm/uvm_tools.c @@ -2206,7 +2206,7 @@ NV_STATUS uvm_api_tools_init_event_tracker(UVM_TOOLS_INIT_EVENT_TRACKER_PARAMS * 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; 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; 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) { status = NV_ERR_INVALID_ARGUMENT; 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. 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) { status = NV_ERR_INVALID_ARGUMENT; 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); 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 remaining = 0; uvm_kvfree(uuids); diff --git a/kernel-open/nvidia-uvm/uvm_va_range.c b/kernel-open/nvidia-uvm/uvm_va_range.c index a7149f97f..888b0cdda 100644 --- a/kernel-open/nvidia-uvm/uvm_va_range.c +++ b/kernel-open/nvidia-uvm/uvm_va_range.c @@ -1281,9 +1281,9 @@ NV_STATUS uvm_va_range_block_create(uvm_va_range_t *va_range, size_t index, uvm_ return status; // Try to insert it - old = (uvm_va_block_t *)nv_atomic_long_cmpxchg(&va_range->blocks[index], - (long)NULL, - (long)block); + old = (uvm_va_block_t *)atomic_long_cmpxchg(&va_range->blocks[index], + (long)NULL, + (long)block); if (old) { // Someone else beat us on the insert uvm_va_block_release(block); diff --git a/kernel-open/nvidia-uvm/uvm_va_space_mm.c b/kernel-open/nvidia-uvm/uvm_va_space_mm.c index 46d5f47e8..7dc08a3e7 100644 --- a/kernel-open/nvidia-uvm/uvm_va_space_mm.c +++ b/kernel-open/nvidia-uvm/uvm_va_space_mm.c @@ -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) { 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; } diff --git a/src/common/inc/nvBldVer.h b/src/common/inc/nvBldVer.h index dabbc82bc..aa514ffc5 100644 --- a/src/common/inc/nvBldVer.h +++ b/src/common/inc/nvBldVer.h @@ -36,25 +36,25 @@ // and then checked back in. You cannot make changes to these sections without // corresponding changes to the buildmeister script #ifndef NV_BUILD_BRANCH - #define NV_BUILD_BRANCH r553_17 + #define NV_BUILD_BRANCH r550_00 #endif #ifndef NV_PUBLIC_BRANCH - #define NV_PUBLIC_BRANCH r553_17 + #define NV_PUBLIC_BRANCH r550_00 #endif #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_CHANGELIST_NUM (35042495) +#define NV_BUILD_BRANCH_VERSION "rel/gpu_drv/r550/r550_00-475" +#define NV_BUILD_CHANGELIST_NUM (35120799) #define NV_BUILD_TYPE "Official" -#define NV_BUILD_NAME "rel/gpu_drv/r550/r553_17-432" -#define NV_LAST_OFFICIAL_CHANGELIST_NUM (35042495) +#define NV_BUILD_NAME "rel/gpu_drv/r550/r550_00-475" +#define NV_LAST_OFFICIAL_CHANGELIST_NUM (35120799) #else /* Windows builds */ -#define NV_BUILD_BRANCH_VERSION "r553_17-3" -#define NV_BUILD_CHANGELIST_NUM (34957518) +#define NV_BUILD_BRANCH_VERSION "r550_00-438" +#define NV_BUILD_CHANGELIST_NUM (35120799) #define NV_BUILD_TYPE "Official" -#define NV_BUILD_NAME "553.24" -#define NV_LAST_OFFICIAL_CHANGELIST_NUM (34957518) +#define NV_BUILD_NAME "553.35" +#define NV_LAST_OFFICIAL_CHANGELIST_NUM (35120799) #define NV_BUILD_BRANCH_BASE_VERSION R550 #endif // End buildmeister python edited section diff --git a/src/common/inc/nvUnixVersion.h b/src/common/inc/nvUnixVersion.h index b00086ab4..12f1031e8 100644 --- a/src/common/inc/nvUnixVersion.h +++ b/src/common/inc/nvUnixVersion.h @@ -4,7 +4,7 @@ #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) -#define NV_VERSION_STRING "550.127.08" +#define NV_VERSION_STRING "550.135" #else diff --git a/src/common/nvswitch/kernel/ls10/intr_ls10.c b/src/common/nvswitch/kernel/ls10/intr_ls10.c index 18c029112..ccdf53dc3 100644 --- a/src/common/nvswitch/kernel/ls10/intr_ls10.c +++ b/src/common/nvswitch/kernel/ls10/intr_ls10.c @@ -6660,9 +6660,9 @@ _nvswitch_service_nvltlc_tx_lnk_nonfatal_0_ls10 // 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. // - 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 & - ~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); @@ -6682,9 +6682,9 @@ _nvswitch_service_nvltlc_tx_lnk_nonfatal_0_ls10 // 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. // - 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 & - ~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); @@ -6709,9 +6709,9 @@ _nvswitch_service_nvltlc_tx_lnk_nonfatal_0_ls10 // 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. // - 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 & - ~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); @@ -6724,9 +6724,9 @@ _nvswitch_service_nvltlc_tx_lnk_nonfatal_0_ls10 // 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. // - 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 & - ~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); diff --git a/src/common/sdk/nvidia/inc/ctrl/ctrl208f/ctrl208fgr.h b/src/common/sdk/nvidia/inc/ctrl/ctrl208f/ctrl208fgr.h index 524f2c454..90846151e 100644 --- a/src/common/sdk/nvidia/inc/ctrl/ctrl208f/ctrl208fgr.h +++ b/src/common/sdk/nvidia/inc/ctrl/ctrl208f/ctrl208fgr.h @@ -106,4 +106,33 @@ typedef struct NV208F_CTRL_GR_ECC_INJECTION_SUPPORTED_PARAMS { NV_DECLARE_ALIGNED(NV2080_CTRL_GR_ROUTE_INFO grRouteInfo, 8); } 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_ */ diff --git a/src/nvidia-modeset/src/nvkms.c b/src/nvidia-modeset/src/nvkms.c index 9e9b54abb..b60a62fc4 100644 --- a/src/nvidia-modeset/src/nvkms.c +++ b/src/nvidia-modeset/src/nvkms.c @@ -4593,6 +4593,11 @@ static NvBool NotifyVblank( struct NvKmsPerOpenDisp* pOpenDisp = GetPerOpenDisp(pOpen, pParams->request.deviceHandle, pParams->request.dispHandle); + + if (pOpenDisp == NULL) { + return NV_FALSE; + } + const NvU32 apiHead = pParams->request.head; pEventOpenFd = nvkms_get_per_open_data(pParams->request.unicastEvent.fd); diff --git a/src/nvidia/arch/nvalloc/common/inc/gsp/gsp_fw_wpr_meta.h b/src/nvidia/arch/nvalloc/common/inc/gsp/gsp_fw_wpr_meta.h index b2a515384..4193108f9 100644 --- a/src/nvidia/arch/nvalloc/common/inc/gsp/gsp_fw_wpr_meta.h +++ b/src/nvidia/arch/nvalloc/common/inc/gsp/gsp_fw_wpr_meta.h @@ -226,5 +226,6 @@ typedef struct #define GSP_FW_FLAGS 8:0 #define GSP_FW_FLAGS_CLOCK_BOOST NVBIT(0) #define GSP_FW_FLAGS_RECOVERY_MARGIN_PRESENT NVBIT(1) +#define GSP_FW_FLAGS_PPCIE_ENABLED NVBIT(2) #endif // GSP_FW_WPR_META_H_ diff --git a/src/nvidia/arch/nvalloc/common/inc/inforom/ifrecc.h b/src/nvidia/arch/nvalloc/common/inc/inforom/ifrecc.h index ef2f97024..646b8a62e 100644 --- a/src/nvidia/arch/nvalloc/common/inc/inforom/ifrecc.h +++ b/src/nvidia/arch/nvalloc/common/inc/inforom/ifrecc.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 * * Permission is hereby granted, free of charge, to any person obtaining a diff --git a/src/nvidia/arch/nvalloc/common/inc/inforom/ifrstruct.h b/src/nvidia/arch/nvalloc/common/inc/inforom/ifrstruct.h index e56b10d79..2079cfa2f 100644 --- a/src/nvidia/arch/nvalloc/common/inc/inforom/ifrstruct.h +++ b/src/nvidia/arch/nvalloc/common/inc/inforom/ifrstruct.h @@ -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 * * Permission is hereby granted, free of charge, to any person obtaining a diff --git a/src/nvidia/arch/nvalloc/common/inc/nvcst.h b/src/nvidia/arch/nvalloc/common/inc/nvcst.h index 3f45b5428..383ad0963 100644 --- a/src/nvidia/arch/nvalloc/common/inc/nvcst.h +++ b/src/nvidia/arch/nvalloc/common/inc/nvcst.h @@ -65,6 +65,7 @@ CHIPSET_SETUP_FUNC(Intel_0685_setupFunc) CHIPSET_SETUP_FUNC(Intel_4381_setupFunc) CHIPSET_SETUP_FUNC(Intel_7A82_setupFunc) CHIPSET_SETUP_FUNC(Intel_7A04_setupFunc) +CHIPSET_SETUP_FUNC(Intel_5795_setupFunc) CHIPSET_SETUP_FUNC(SiS_656_setupFunc) CHIPSET_SETUP_FUNC(ATI_RS400_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, 0x18DC, CS_INTEL_18DC, "Intel-IceLake", NULL}, {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, 0x0FAF, CS_NVIDIA_T210, "T210", Nvidia_T210_setupFunc}, diff --git a/src/nvidia/generated/g_all_dcl_pb.c b/src/nvidia/generated/g_all_dcl_pb.c index 5726572df..eb0d9f947 100644 --- a/src/nvidia/generated/g_all_dcl_pb.c +++ b/src/nvidia/generated/g_all_dcl_pb.c @@ -122,6 +122,18 @@ const PRB_FIELD_DESC prb_fields_dcl_dclmsg[] = { PRB_MAYBE_FIELD_NAME("engine") 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 @@ -150,7 +162,7 @@ const PRB_MSG_DESC prb_messages_dcl[] = { PRB_MAYBE_MESSAGE_NAME("Dcl.Engines") }, { - 7, + 8, prb_fields_dcl_dclmsg, PRB_MAYBE_MESSAGE_NAME("Dcl.DclMsg") }, diff --git a/src/nvidia/generated/g_all_dcl_pb.h b/src/nvidia/generated/g_all_dcl_pb.h index 8fd5b053a..93efc3111 100644 --- a/src/nvidia/generated/g_all_dcl_pb.h +++ b/src/nvidia/generated/g_all_dcl_pb.h @@ -18,8 +18,8 @@ extern const PRB_MSG_DESC prb_messages_dcl[]; // Message maximum lengths // Does not include repeated fields, strings and byte arrays. #define DCL_ENGINES_LEN 130 -#define DCL_DCLMSG_LEN 567 -#define DCL_ERRORBLOCK_LEN 571 +#define DCL_DCLMSG_LEN 610 +#define DCL_ERRORBLOCK_LEN 614 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_RCCOUNTER (&prb_fields_dcl_dclmsg[5]) #define DCL_DCLMSG_ENGINE (&prb_fields_dcl_dclmsg[6]) +#define DCL_DCLMSG_RC_DIAG_RECS (&prb_fields_dcl_dclmsg[7]) // 'DclMsg' field lengths #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_RCCOUNTER_LEN 64 #define DCL_DCLMSG_ENGINE_LEN 133 +#define DCL_DCLMSG_RC_DIAG_RECS_LEN 42 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]) // 'ErrorBlock' field lengths -#define DCL_ERRORBLOCK_DATA_LEN 570 +#define DCL_ERRORBLOCK_DATA_LEN 613 extern const PRB_SERVICE_DESC prb_services_dcl[]; diff --git a/src/nvidia/generated/g_nvdebug_pb.h b/src/nvidia/generated/g_nvdebug_pb.h index 16c11f1c1..c559aaefd 100644 --- a/src/nvidia/generated/g_nvdebug_pb.h +++ b/src/nvidia/generated/g_nvdebug_pb.h @@ -40,7 +40,7 @@ extern const PRB_MSG_DESC prb_messages_nvdebug[]; // Does not include repeated fields, strings and byte arrays. #define NVDEBUG_SYSTEMINFO_LEN 275 #define NVDEBUG_GPUINFO_LEN 164 -#define NVDEBUG_NVDUMP_LEN 1308 +#define NVDEBUG_NVDUMP_LEN 1351 #define NVDEBUG_SYSTEMINFO_NORTHBRIDGEINFO_LEN 12 #define NVDEBUG_SYSTEMINFO_SOCINFO_LEN 12 #define NVDEBUG_SYSTEMINFO_CPUINFO_LEN 24 @@ -104,7 +104,7 @@ extern const PRB_FIELD_DESC prb_fields_nvdebug_nvdump[]; // 'NvDump' field lengths #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_EXCEPTION_ADDRESS_LEN 10 #define NVDEBUG_NVDUMP_SYSTEM_INFO_GSPRM_LEN 278 diff --git a/src/nvidia/inc/libraries/nvport/string.h b/src/nvidia/inc/libraries/nvport/string.h index 82da75ceb..402646c62 100644 --- a/src/nvidia/inc/libraries/nvport/string.h +++ b/src/nvidia/inc/libraries/nvport/string.h @@ -49,10 +49,8 @@ /** * @brief Compare two strings, character by character. * - * Will only compare lengthBytes bytes. Strings are assumed to be at least that - * long. - * - * Strings are allowed to overlap, but in . + * Will compare the first 'length' chars of each string, or until + * the nul-terminator is reached in either string, whichever comes first. * * @returns: * - 0 if all bytes are equal diff --git a/src/nvidia/interface/nvrm_registry.h b/src/nvidia/interface/nvrm_registry.h index 24865f85c..c45b80065 100644 --- a/src/nvidia/interface/nvrm_registry.h +++ b/src/nvidia/interface/nvrm_registry.h @@ -2284,9 +2284,9 @@ // 0 - Disable multi gpu mode // 1 - Enable protected pcie // -#define NV_REG_STR_RM_CC_MULTI_GPU_MODE "RmCCMultiGpuMode" -#define NV_REG_STR_RM_CC_MULTI_GPU_MODE_NONE 0x00000000 -#define NV_REG_STR_RM_CC_MULTI_GPU_MODE_PROTECTED_PCIE 0x00000001 +#define NV_REG_STR_RM_PPCIE_ENABLED "RmEnableProtectedPcie" +#define NV_REG_STR_RM_PPCIE_ENABLED_NO 0x00000000 +#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 #define NV_REG_STR_RM_FORCE_BAR_ACCESS_ON_HCC "RmForceBarAccessOnHcc" diff --git a/src/nvidia/src/kernel/diagnostics/journal.c b/src/nvidia/src/kernel/diagnostics/journal.c index 530060276..3fc2e2599 100644 --- a/src/nvidia/src/kernel/diagnostics/journal.c +++ b/src/nvidia/src/kernel/diagnostics/journal.c @@ -1814,6 +1814,33 @@ _rcdbDumpDclMsgRecord( } 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 RmPrbFullDump_V2: { diff --git a/src/nvidia/src/kernel/gpu/arch/hopper/kern_gpu_gh100.c b/src/nvidia/src/kernel/gpu/arch/hopper/kern_gpu_gh100.c index 55361214d..d482d40f3 100644 --- a/src/nvidia/src/kernel/gpu/arch/hopper/kern_gpu_gh100.c +++ b/src/nvidia/src/kernel/gpu/arch/hopper/kern_gpu_gh100.c @@ -26,6 +26,7 @@ #include "os/os.h" #include "nverror.h" #include "vgpu/rpc.h" +#include "nvrm_registry.h" #include "published/hopper/gh100/hwproject.h" #include "published/hopper/gh100/dev_gc6_island.h" @@ -493,7 +494,14 @@ gpuIsProtectedPcieEnabledInHw_GH100 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; } diff --git a/src/nvidia/src/kernel/gpu/conf_compute/conf_compute.c b/src/nvidia/src/kernel/gpu/conf_compute/conf_compute.c index d8b795792..925d6365a 100644 --- a/src/nvidia/src/kernel/gpu/conf_compute/conf_compute.c +++ b/src/nvidia/src/kernel/gpu/conf_compute/conf_compute.c @@ -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 (confComputeIsSpdmEnabled(pGpu, pConfCompute)) diff --git a/src/nvidia/src/kernel/gpu/fifo/kernel_channel_group_api.c b/src/nvidia/src/kernel/gpu/fifo/kernel_channel_group_api.c index 37f275b46..17bfd9a85 100644 --- a/src/nvidia/src/kernel/gpu/fifo/kernel_channel_group_api.c +++ b/src/nvidia/src/kernel/gpu/fifo/kernel_channel_group_api.c @@ -234,7 +234,9 @@ kchangrpapiConstruct_IMPL // vGpu plugin context flag should only be set on host if context is plugin if (gpuIsSriovEnabled(pGpu)) + { pKernelChannelGroup->bIsCallingContextVgpuPlugin = pAllocParams->bIsCallingContextVgpuPlugin; + } if (pKernelChannelGroup->bIsCallingContextVgpuPlugin) gfid = GPU_GFID_PF; diff --git a/src/nvidia/src/kernel/gpu/gpu_registry.c b/src/nvidia/src/kernel/gpu/gpu_registry.c index dcdf4240b..59f9880b7 100644 --- a/src/nvidia/src/kernel/gpu/gpu_registry.c +++ b/src/nvidia/src/kernel/gpu/gpu_registry.c @@ -229,9 +229,9 @@ gpuInitInstLocOverrides_IMPL // if (((osReadRegistryDword(pGpu, NV_REG_STR_RM_CONFIDENTIAL_COMPUTE, &data32) == NV_OK) && FLD_TEST_DRF(_REG_STR, _RM_CONFIDENTIAL_COMPUTE, _ENABLED, _YES, data32) && - pGpu->getProperty(pGpu, PDB_PROP_GPU_CC_FEATURE_CAPABLE)) || gpuIsCCEnabledInHw_HAL(pGpu) || - ((osReadRegistryDword(pGpu, NV_REG_STR_RM_CC_MULTI_GPU_MODE, &data32) == NV_OK) && - (data32 == NV_REG_STR_RM_CC_MULTI_GPU_MODE_PROTECTED_PCIE)) || gpuIsProtectedPcieEnabledInHw_HAL(pGpu)) + pGpu->getProperty(pGpu, PDB_PROP_GPU_CC_FEATURE_CAPABLE)) || + gpuIsCCEnabledInHw_HAL(pGpu) || + gpuIsProtectedPcieEnabledInHw_HAL(pGpu)) { pGpu->instLocOverrides = NV_REG_STR_RM_INST_LOC_ALL_VID; diff --git a/src/nvidia/src/kernel/gpu/gsp/arch/hopper/kernel_gsp_gh100.c b/src/nvidia/src/kernel/gpu/gsp/arch/hopper/kernel_gsp_gh100.c index 469b9853f..06126897d 100644 --- a/src/nvidia/src/kernel/gpu/gsp/arch/hopper/kernel_gsp_gh100.c +++ b/src/nvidia/src/kernel/gpu/gsp/arch/hopper/kernel_gsp_gh100.c @@ -363,6 +363,15 @@ kgspCalculateFbLayout_GH100 pWprMeta->revision = GSP_FW_WPR_META_REVISION; 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; } diff --git a/src/nvidia/src/kernel/gpu/gsp/kernel_gsp.c b/src/nvidia/src/kernel/gpu/gsp/kernel_gsp.c index d1d16589c..f80c3f99a 100644 --- a/src/nvidia/src/kernel/gpu/gsp/kernel_gsp.c +++ b/src/nvidia/src/kernel/gpu/gsp/kernel_gsp.c @@ -531,6 +531,67 @@ _kgspRpcRCTriggered 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); // With CC enabled, CPU-RM needs to write error notifiers diff --git a/src/nvidia/src/kernel/platform/chipset/chipset_info.c b/src/nvidia/src/kernel/platform/chipset/chipset_info.c index 574eb11ba..acefbdeaf 100644 --- a/src/nvidia/src/kernel/platform/chipset/chipset_info.c +++ b/src/nvidia/src/kernel/platform/chipset/chipset_info.c @@ -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 * * Permission is hereby granted, free of charge, to any person obtaining a @@ -894,6 +894,18 @@ Intel_7A04_setupFunc 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 Nvidia_T210_setupFunc ( diff --git a/src/nvidia/src/kernel/rmapi/nv_gpu_ops.c b/src/nvidia/src/kernel/rmapi/nv_gpu_ops.c index a75e3d5c2..4b2cb64ab 100644 --- a/src/nvidia/src/kernel/rmapi/nv_gpu_ops.c +++ b/src/nvidia/src/kernel/rmapi/nv_gpu_ops.c @@ -5990,24 +5990,13 @@ static NV_STATUS _convertGpuFabricProbeStateToErrorCode switch (fabricProbeParams.state) { case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_UNSUPPORTED: + case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_COMPLETE: return NV_OK; case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_IN_PROGRESS: case NV2080_CTRL_GPU_FABRIC_PROBE_STATE_NOT_STARTED: 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: NV_PRINTF(LEVEL_ERROR, "Invalid Fabric Probe State\n"); return NV_ERR_INVALID_STATE; diff --git a/src/nvidia/src/libraries/nvport/string/string_generic.c b/src/nvidia/src/libraries/nvport/string/string_generic.c index c576ea81c..eee9f5ce1 100644 --- a/src/nvidia/src/libraries/nvport/string/string_generic.c +++ b/src/nvidia/src/libraries/nvport/string/string_generic.c @@ -29,6 +29,7 @@ #include "nvport/nvport.h" #include "nvmisc.h" + #ifndef NVPORT_STRING_DONT_DEFINE_portStringLength NvLength portStringLength diff --git a/version.mk b/version.mk index 1d507d0cf..4da99c647 100644 --- a/version.mk +++ b/version.mk @@ -1,4 +1,4 @@ -NVIDIA_VERSION = 550.127.08 +NVIDIA_VERSION = 550.135 # This file. VERSION_MK_FILE := $(lastword $(MAKEFILE_LIST))