From 722ae84526a09ed672fbe75448e2909834ba4cce Mon Sep 17 00:00:00 2001 From: Maneet Singh Date: Wed, 17 Jun 2026 12:58:23 -0700 Subject: [PATCH] 595.84 --- README.md | 6 +- kernel-open/Kbuild | 2 +- kernel-open/common/inc/nv-linux.h | 1 + kernel-open/common/inc/nv.h | 4 +- kernel-open/nvidia-drm/nvidia-drm-connector.c | 2 +- kernel-open/nvidia-drm/nvidia-drm-crtc.c | 12 +-- kernel-open/nvidia-drm/nvidia-drm-drv.c | 14 +-- kernel-open/nvidia-drm/nvidia-drm-helper.c | 6 +- kernel-open/nvidia-drm/nvidia-drm-helper.h | 86 +++++++++++++++++++ kernel-open/nvidia-drm/nvidia-drm-modeset.c | 26 +++--- kernel-open/nvidia-drm/nvidia-drm-modeset.h | 13 +-- kernel-open/nvidia-drm/nvidia-drm-sources.mk | 1 + kernel-open/nvidia/nv-dma.c | 31 +++++-- kernel-open/nvidia/nv-dmabuf.c | 2 +- kernel-open/nvidia/nv-procfs.c | 1 + src/common/displayport/inc/dp_configcaps.h | 4 +- src/common/displayport/inc/dp_deviceimpl.h | 3 +- .../displayport/inc/dp_regkeydatabase.h | 7 ++ src/common/displayport/src/dp_configcaps.cpp | 1 + .../displayport/src/dp_connectorimpl.cpp | 16 +++- src/common/displayport/src/dp_deviceimpl.cpp | 8 +- src/common/displayport/src/dp_edid.cpp | 12 +++ src/common/displayport/src/dp_evoadapter.cpp | 4 +- src/common/displayport/src/dp_sst_edid.cpp | 13 +++ src/common/inc/nvBldVer.h | 16 ++-- src/common/inc/nvUnixVersion.h | 2 +- src/common/sdk/nvidia/inc/ctrl/ctrla081.h | 2 +- src/common/shared/inc/g_vgpu_chip_flags.h | 26 ++++++ .../shared/inc/g_vgpu_resman_specific.h | 14 +++ src/nvidia/arch/nvalloc/unix/include/nv.h | 4 +- .../arch/nvalloc/unix/src/dynamic-power.c | 13 ++- src/nvidia/arch/nvalloc/unix/src/os.c | 17 +++- src/nvidia/arch/nvalloc/unix/src/osapi.c | 7 +- src/nvidia/generated/g_kernel_channel_nvoc.h | 1 + src/nvidia/generated/g_nv_name_released.h | 26 ++++++ .../diagnostics/ucode_instrumentation_ctrl.c | 4 + src/nvidia/src/kernel/gpu/device_share.c | 3 + .../src/kernel/gpu/fifo/kernel_channel.c | 35 ++++++-- .../src/kernel/gpu/fifo/kernel_fifo_ctrl.c | 3 +- .../gpu/gr/kernel_sm_debugger_session_ctrl.c | 1 - .../kernel/gpu/gsp/kernel_gsp_trace_rats.c | 3 + .../gpu/mig_mgr/gpu_instance_subscription.c | 1 + .../kernel/gpu/mig_mgr/kernel_mig_manager.c | 11 ++- .../src/kernel/gpu/nvenc/nvencsession.c | 1 + .../kernel/gpu/subdevice/subdevice_ctrl_nvd.c | 2 +- src/nvidia/src/kernel/mem_mgr/gpu_vaspace.c | 3 +- src/nvidia/src/kernel/mem_mgr/os_desc_mem.c | 1 - src/nvidia/src/kernel/mem_mgr/video_mem.c | 27 +++--- src/nvidia/src/kernel/rmapi/event_api.c | 3 +- src/nvidia/src/kernel/rmapi/event_buffer.c | 1 + src/nvidia/src/kernel/rmapi/nv_gpu_ops.c | 3 +- src/nvidia/src/kernel/rmapi/rmapi_finn.c | 40 ++++++--- .../virtualization/kernel_hostvgpudeviceapi.c | 4 +- .../src/libraries/resserv/src/rs_resource.c | 1 + .../src/libraries/resserv/src/rs_server.c | 4 + version.mk | 4 +- 56 files changed, 435 insertions(+), 123 deletions(-) diff --git a/README.md b/README.md index ec06e13a4..4cba271fb 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 595.80. +version 595.84. ## 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 -595.80 driver release. This can be achieved by installing +595.84 driver release. This can be achieved by installing the NVIDIA GPU driver from the .run file using the `--no-kernel-modules` option. E.g., @@ -185,7 +185,7 @@ table below). 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/595.80/README/kernel_open.html +https://us.download.nvidia.com/XFree86/Linux-x86_64/595.84/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 4f51a2c5a..998624259 100644 --- a/kernel-open/Kbuild +++ b/kernel-open/Kbuild @@ -79,7 +79,7 @@ ccflags-y += -I$(src)/common/inc ccflags-y += -I$(src) ccflags-y += -Wall $(DEFINES) $(INCLUDES) -Wno-cast-qual -Wno-format-extra-args ccflags-y += -D__KERNEL__ -DMODULE -DNVRM -ccflags-y += -DNV_VERSION_STRING=\"595.80\" +ccflags-y += -DNV_VERSION_STRING=\"595.84\" # Include and link Tegra out-of-tree modules. ifneq ($(wildcard /usr/src/nvidia/nvidia-public),) diff --git a/kernel-open/common/inc/nv-linux.h b/kernel-open/common/inc/nv-linux.h index 545490915..f179531f4 100644 --- a/kernel-open/common/inc/nv-linux.h +++ b/kernel-open/common/inc/nv-linux.h @@ -1063,6 +1063,7 @@ typedef struct nv_dma_map_s { NvU64 page_count; NvBool contiguous; NvU32 cache_type; + NvBool bReadOnlyDeviceMap; struct sg_table *import_sgt; union diff --git a/kernel-open/common/inc/nv.h b/kernel-open/common/inc/nv.h index 91d00cbeb..35bd37a97 100644 --- a/kernel-open/common/inc/nv.h +++ b/kernel-open/common/inc/nv.h @@ -968,9 +968,9 @@ void NV_API_CALL nv_unregister_sgt (nv_state_t *, struct sg_table NV_STATUS NV_API_CALL nv_register_phys_pages (nv_state_t *, NvU64 *, NvU64, NvU32, void **); void NV_API_CALL nv_unregister_phys_pages (nv_state_t *, void *); -NV_STATUS NV_API_CALL nv_dma_map_sgt (nv_dma_device_t *, NvU64, NvU64 *, NvU32, void **); +NV_STATUS NV_API_CALL nv_dma_map_sgt (nv_dma_device_t *, NvU64, NvU64 *, NvU32, NvBool, void **); -NV_STATUS NV_API_CALL nv_dma_map_alloc (nv_dma_device_t *, NvU64, NvU64 *, NvBool, void **); +NV_STATUS NV_API_CALL nv_dma_map_alloc (nv_dma_device_t *, NvU64, NvU64 *, NvBool, NvBool, void **); NV_STATUS NV_API_CALL nv_dma_unmap_alloc (nv_dma_device_t *, NvU64, NvU64 *, void **); NV_STATUS NV_API_CALL nv_dma_map_peer (nv_dma_device_t *, nv_dma_device_t *, NvU8, NvU64, NvU64 *); diff --git a/kernel-open/nvidia-drm/nvidia-drm-connector.c b/kernel-open/nvidia-drm/nvidia-drm-connector.c index 2d5483a74..2bfd07d24 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-connector.c +++ b/kernel-open/nvidia-drm/nvidia-drm-connector.c @@ -408,7 +408,7 @@ static const NvU32 __nv_drm_connector_supported_colorspaces = #if defined(NV_DRM_CONNECTOR_ATTACH_HDR_OUTPUT_METADATA_PROPERTY_PRESENT) static int __nv_drm_connector_atomic_check(struct drm_connector *connector, - struct drm_atomic_state *state) + nv_drm_atomic_state_base_t *state) { struct drm_connector_state *new_connector_state = drm_atomic_get_new_connector_state(state, connector); diff --git a/kernel-open/nvidia-drm/nvidia-drm-crtc.c b/kernel-open/nvidia-drm/nvidia-drm-crtc.c index e7b5c4d98..8a6d3cd6b 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-crtc.c +++ b/kernel-open/nvidia-drm/nvidia-drm-crtc.c @@ -1624,16 +1624,16 @@ static int __nv_drm_cursor_atomic_check(struct drm_plane *plane, return 0; } -#if defined(NV_DRM_PLANE_ATOMIC_CHECK_HAS_ATOMIC_STATE_ARG) +#if defined(NV_DRM_PLANE_ATOMIC_CHECK_HAS_FULL_STATE_ARG) static int nv_drm_plane_atomic_check(struct drm_plane *plane, - struct drm_atomic_state *state) + nv_drm_atomic_state_base_t *state) #else static int nv_drm_plane_atomic_check(struct drm_plane *plane, struct drm_plane_state *plane_state) #endif { struct nv_drm_plane *nv_plane = to_nv_plane(plane); -#if defined(NV_DRM_PLANE_ATOMIC_CHECK_HAS_ATOMIC_STATE_ARG) +#if defined(NV_DRM_PLANE_ATOMIC_CHECK_HAS_FULL_STATE_ARG) struct drm_plane_state *plane_state = drm_atomic_get_new_plane_state(state, plane); #endif @@ -2442,15 +2442,15 @@ static int color_mgmt_config_set_luts(struct nv_drm_crtc_state *nv_crtc_state, * the 'nv_drm_crtc_state::req_config', that is fine because 'nv_drm_crtc_state' * will be discarded if ->atomic_check() fails. */ -#if defined(NV_DRM_CRTC_ATOMIC_CHECK_HAS_ATOMIC_STATE_ARG) +#if defined(NV_DRM_CRTC_ATOMIC_CHECK_HAS_FULL_STATE_ARG) static int nv_drm_crtc_atomic_check(struct drm_crtc *crtc, - struct drm_atomic_state *state) + nv_drm_atomic_state_base_t *state) #else static int nv_drm_crtc_atomic_check(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state) #endif { -#if defined(NV_DRM_CRTC_ATOMIC_CHECK_HAS_ATOMIC_STATE_ARG) +#if defined(NV_DRM_CRTC_ATOMIC_CHECK_HAS_FULL_STATE_ARG) struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state, crtc); #endif diff --git a/kernel-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c index e4ae38a0c..dd50cde47 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-drv.c +++ b/kernel-open/nvidia-drm/nvidia-drm-drv.c @@ -934,7 +934,7 @@ static void nv_drm_master_set(struct drm_device *dev, static int nv_drm_reset_input_colorspace(struct drm_device *dev) { - struct drm_atomic_state *state; + nv_drm_atomic_state_base_t *state; struct drm_plane_state *plane_state; struct drm_plane *plane; struct nv_drm_plane_state *nv_drm_plane_state; @@ -943,7 +943,7 @@ int nv_drm_reset_input_colorspace(struct drm_device *dev) bool do_reset = false; NvU32 flags = 0; - state = drm_atomic_state_alloc(dev); + state = nv_drm_atomic_state_base_alloc(dev); if (!state) return -ENOMEM; @@ -974,7 +974,7 @@ int nv_drm_reset_input_colorspace(struct drm_device *dev) } out: - drm_atomic_state_put(state); + nv_drm_atomic_state_base_put(state); drm_modeset_drop_locks(&ctx); drm_modeset_acquire_fini(&ctx); @@ -1382,7 +1382,7 @@ static int nv_drm_grant_permission_ioctl(struct drm_device *dev, void *data, } static int -nv_drm_atomic_disable_connector(struct drm_atomic_state *state, +nv_drm_atomic_disable_connector(nv_drm_atomic_state_base_t *state, struct nv_drm_connector *nv_connector) { struct drm_crtc_state *crtc_state; @@ -1415,7 +1415,7 @@ static int nv_drm_revoke_modeset_permission(struct drm_device *dev, struct drm_file *filep, NvU32 dpyId) { struct drm_modeset_acquire_ctx *pctx; - struct drm_atomic_state *state; + nv_drm_atomic_state_base_t *state; struct drm_connector *connector; struct drm_crtc *crtc; int ret = 0; @@ -1430,7 +1430,7 @@ static int nv_drm_revoke_modeset_permission(struct drm_device *dev, pctx = dev->mode_config.acquire_ctx; #endif - state = drm_atomic_state_alloc(dev); + state = nv_drm_atomic_state_base_alloc(dev); if (!state) { ret = -ENOMEM; goto done; @@ -1466,7 +1466,7 @@ static int nv_drm_revoke_modeset_permission(struct drm_device *dev, ret = drm_atomic_commit(state); done: - drm_atomic_state_put(state); + nv_drm_atomic_state_base_put(state); #if NV_DRM_MODESET_LOCK_ALL_END_ARGUMENT_COUNT == 3 DRM_MODESET_LOCK_ALL_END(dev, ctx, ret); diff --git a/kernel-open/nvidia-drm/nvidia-drm-helper.c b/kernel-open/nvidia-drm/nvidia-drm-helper.c index 8f1a78849..a2eab5240 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-helper.c +++ b/kernel-open/nvidia-drm/nvidia-drm-helper.c @@ -91,7 +91,7 @@ int nv_drm_atomic_helper_disable_all(struct drm_device *dev, struct drm_modeset_acquire_ctx *ctx) { - struct drm_atomic_state *state; + nv_drm_atomic_state_base_t *state; struct drm_connector_state *conn_state; struct drm_connector *conn; struct drm_plane_state *plane_state; @@ -101,7 +101,7 @@ int nv_drm_atomic_helper_disable_all(struct drm_device *dev, unsigned plane_mask = 0; int ret, i; - state = drm_atomic_state_alloc(dev); + state = nv_drm_atomic_state_base_alloc(dev); if (!state) return -ENOMEM; @@ -173,7 +173,7 @@ free: } } - drm_atomic_state_put(state); + nv_drm_atomic_state_base_put(state); return ret; } diff --git a/kernel-open/nvidia-drm/nvidia-drm-helper.h b/kernel-open/nvidia-drm/nvidia-drm-helper.h index 068949a02..7b4f773c7 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-helper.h +++ b/kernel-open/nvidia-drm/nvidia-drm-helper.h @@ -135,6 +135,92 @@ nv_drm_prime_pages_to_sg(struct drm_device *dev, #include #include +/* + * Linux commit 5164f7e7ff8e ("drm: Rename struct drm_atomic_state to + * drm_atomic_commit"), expected in Linux v7.2, renamed the top-level atomic + * commit object and its lifetime helpers. + */ +#if defined(NV_DRM_ATOMIC_COMMIT_STRUCT_PRESENT) +typedef struct drm_atomic_commit nv_drm_atomic_state_base_t; +#else +typedef struct drm_atomic_state nv_drm_atomic_state_base_t; +#endif + +/* + * Linux commits 29b77ad7b9ca ("drm/atomic: Pass the full state to CRTC + * atomic_check") and 7c11b99a8e58 ("drm/atomic: Pass the full state to + * planes atomic_check") changed the CRTC and plane helper atomic_check + * callbacks from per-object state arguments to the full atomic transaction + * state. The existing conftests detect those full-state callback signatures + * when the argument type is still struct drm_atomic_state. + * + * Linux commit 5164f7e7ff8e ("drm: Rename struct drm_atomic_state to + * drm_atomic_commit"), expected in Linux v7.2, renamed that full transaction + * type. In those kernels, the callbacks still use the full atomic transaction + * state ABI, but the argument type is struct drm_atomic_commit. Either + * conftest means the helper callbacks take the full atomic transaction state. + */ +#if defined(NV_DRM_CRTC_ATOMIC_CHECK_HAS_ATOMIC_STATE_ARG) || \ + defined(NV_DRM_ATOMIC_COMMIT_STRUCT_PRESENT) +#define NV_DRM_CRTC_ATOMIC_CHECK_HAS_FULL_STATE_ARG +#endif + +#if defined(NV_DRM_PLANE_ATOMIC_CHECK_HAS_ATOMIC_STATE_ARG) || \ + defined(NV_DRM_ATOMIC_COMMIT_STRUCT_PRESENT) +#define NV_DRM_PLANE_ATOMIC_CHECK_HAS_FULL_STATE_ARG +#endif + +static inline nv_drm_atomic_state_base_t * +nv_drm_atomic_state_base_alloc(struct drm_device *dev) +{ +#if defined(NV_DRM_ATOMIC_COMMIT_STRUCT_PRESENT) + return drm_atomic_commit_alloc(dev); +#else + return drm_atomic_state_alloc(dev); +#endif +} + +static inline int +nv_drm_atomic_state_base_init(struct drm_device *dev, + nv_drm_atomic_state_base_t *state) +{ +#if defined(NV_DRM_ATOMIC_COMMIT_STRUCT_PRESENT) + return drm_atomic_commit_init(dev, state); +#else + return drm_atomic_state_init(dev, state); +#endif +} + +static inline void +nv_drm_atomic_state_base_put(nv_drm_atomic_state_base_t *state) +{ +#if defined(NV_DRM_ATOMIC_COMMIT_STRUCT_PRESENT) + drm_atomic_commit_put(state); +#else + drm_atomic_state_put(state); +#endif +} + +static inline void +nv_drm_atomic_state_base_default_clear(nv_drm_atomic_state_base_t *state) +{ +#if defined(NV_DRM_ATOMIC_COMMIT_STRUCT_PRESENT) + drm_atomic_commit_default_clear(state); +#else + drm_atomic_state_default_clear(state); +#endif +} + +static inline void +nv_drm_atomic_state_base_default_release(nv_drm_atomic_state_base_t *state) +{ +#if defined(NV_DRM_ATOMIC_COMMIT_STRUCT_PRESENT) + drm_atomic_commit_default_release(state); +#else + drm_atomic_state_default_release(state); +#endif +} + int nv_drm_atomic_helper_disable_all(struct drm_device *dev, struct drm_modeset_acquire_ctx *ctx); diff --git a/kernel-open/nvidia-drm/nvidia-drm-modeset.c b/kernel-open/nvidia-drm/nvidia-drm-modeset.c index da167a075..342821c57 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-modeset.c +++ b/kernel-open/nvidia-drm/nvidia-drm-modeset.c @@ -49,21 +49,23 @@ struct nv_drm_atomic_state { struct NvKmsKapiRequestedModeSetConfig config; - struct drm_atomic_state base; + nv_drm_atomic_state_base_t base; }; static inline struct nv_drm_atomic_state *to_nv_atomic_state( - struct drm_atomic_state *state) + nv_drm_atomic_state_base_t *state) { return container_of(state, struct nv_drm_atomic_state, base); } -struct drm_atomic_state *nv_drm_atomic_state_alloc(struct drm_device *dev) +nv_drm_atomic_state_base_t * +nv_drm_atomic_state_alloc(struct drm_device *dev) { struct nv_drm_atomic_state *nv_state = nv_drm_calloc(1, sizeof(*nv_state)); - if (nv_state == NULL || drm_atomic_state_init(dev, &nv_state->base) < 0) { + if (nv_state == NULL || + nv_drm_atomic_state_base_init(dev, &nv_state->base) < 0) { nv_drm_free(nv_state); return NULL; } @@ -71,16 +73,16 @@ struct drm_atomic_state *nv_drm_atomic_state_alloc(struct drm_device *dev) return &nv_state->base; } -void nv_drm_atomic_state_clear(struct drm_atomic_state *state) +void nv_drm_atomic_state_clear(nv_drm_atomic_state_base_t *state) { - drm_atomic_state_default_clear(state); + nv_drm_atomic_state_base_default_clear(state); } -void nv_drm_atomic_state_free(struct drm_atomic_state *state) +void nv_drm_atomic_state_free(nv_drm_atomic_state_base_t *state) { struct nv_drm_atomic_state *nv_state = to_nv_atomic_state(state); - drm_atomic_state_default_release(state); + nv_drm_atomic_state_base_default_release(state); nv_drm_free(nv_state); } @@ -177,7 +179,7 @@ __nv_drm_plane_fence_cb( static int __nv_drm_convert_in_fences( struct nv_drm_device *nv_dev, - struct drm_atomic_state *state, + nv_drm_atomic_state_base_t *state, struct drm_crtc *crtc, struct drm_crtc_state *crtc_state) { @@ -391,7 +393,7 @@ static int __nv_drm_get_syncpt_data( */ static int nv_drm_atomic_apply_modeset_config(struct drm_device *dev, - struct drm_atomic_state *state, + nv_drm_atomic_state_base_t *state, bool commit) { struct nv_drm_device *nv_dev = to_nv_device(dev); @@ -508,7 +510,7 @@ nv_drm_atomic_apply_modeset_config(struct drm_device *dev, } int nv_drm_atomic_check(struct drm_device *dev, - struct drm_atomic_state *state) + nv_drm_atomic_state_base_t *state) { int ret = 0; @@ -617,7 +619,7 @@ static void __nv_drm_handle_flip_event(struct nv_drm_crtc *nv_crtc) } int nv_drm_atomic_commit(struct drm_device *dev, - struct drm_atomic_state *state, + nv_drm_atomic_state_base_t *state, bool nonblock) { int ret = -EBUSY; diff --git a/kernel-open/nvidia-drm/nvidia-drm-modeset.h b/kernel-open/nvidia-drm/nvidia-drm-modeset.h index e95cc808e..d9f393ac4 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-modeset.h +++ b/kernel-open/nvidia-drm/nvidia-drm-modeset.h @@ -27,20 +27,21 @@ #if defined(NV_DRM_AVAILABLE) +#include "nvidia-drm-helper.h" #include "nvkms-kapi.h" struct drm_device; -struct drm_atomic_state; -struct drm_atomic_state *nv_drm_atomic_state_alloc(struct drm_device *dev); -void nv_drm_atomic_state_clear(struct drm_atomic_state *state); -void nv_drm_atomic_state_free(struct drm_atomic_state *state); +nv_drm_atomic_state_base_t * +nv_drm_atomic_state_alloc(struct drm_device *dev); +void nv_drm_atomic_state_clear(nv_drm_atomic_state_base_t *state); +void nv_drm_atomic_state_free(nv_drm_atomic_state_base_t *state); int nv_drm_atomic_check(struct drm_device *dev, - struct drm_atomic_state *state); + nv_drm_atomic_state_base_t *state); int nv_drm_atomic_commit(struct drm_device *dev, - struct drm_atomic_state *state, bool nonblock); + nv_drm_atomic_state_base_t *state, bool nonblock); void nv_drm_handle_flip_occurred(struct nv_drm_device *nv_dev, diff --git a/kernel-open/nvidia-drm/nvidia-drm-sources.mk b/kernel-open/nvidia-drm/nvidia-drm-sources.mk index a2c3a3862..2d338f23e 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-sources.mk +++ b/kernel-open/nvidia-drm/nvidia-drm-sources.mk @@ -109,3 +109,4 @@ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_output_poll_changed NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_date NV_CONFTEST_TYPE_COMPILE_TESTS += drm_connector_helper_funcs_mode_valid_has_const_mode_arg NV_CONFTEST_TYPE_COMPILE_TESTS += drm_fb_create_takes_format_info +NV_CONFTEST_TYPE_COMPILE_TESTS += drm_atomic_commit_struct_present diff --git a/kernel-open/nvidia/nv-dma.c b/kernel-open/nvidia/nv-dma.c index 4ab445092..cd3ebfb42 100644 --- a/kernel-open/nvidia/nv-dma.c +++ b/kernel-open/nvidia/nv-dma.c @@ -53,6 +53,14 @@ void nv_unmap_dma_map_scatterlist (nv_dma_map_t *dma_map); static void nv_dma_unmap_contig (nv_dma_map_t *dma_map); static void nv_dma_unmap_scatterlist (nv_dma_map_t *dma_map); +static enum dma_data_direction nv_dma_get_direction +( + nv_dma_map_t *dma_map +) +{ + return DMA_BIDIRECTIONAL; +} + static inline NvBool nv_dma_is_addressable( nv_dma_device_t *dma_dev, NvU64 start, @@ -72,9 +80,11 @@ static NV_STATUS nv_dma_map_contig( NvU64 *va ) { + enum dma_data_direction direction = nv_dma_get_direction(dma_map); + *va = dma_map_page_attrs(dma_map->dev, dma_map->pages[0], 0, dma_map->page_count * PAGE_SIZE, - DMA_BIDIRECTIONAL, + direction, (dma_map->cache_type == NV_MEMORY_UNCACHED) ? DMA_ATTR_SKIP_CPU_SYNC : 0); if (dma_mapping_error(dma_map->dev, *va)) @@ -101,9 +111,11 @@ static NV_STATUS nv_dma_map_contig( static void nv_dma_unmap_contig(nv_dma_map_t *dma_map) { + enum dma_data_direction direction = nv_dma_get_direction(dma_map); + dma_unmap_page_attrs(dma_map->dev, dma_map->mapping.contig.dma_addr, dma_map->page_count * PAGE_SIZE, - DMA_BIDIRECTIONAL, + direction, (dma_map->cache_type == NV_MEMORY_UNCACHED) ? DMA_ATTR_SKIP_CPU_SYNC : 0); } @@ -224,6 +236,7 @@ NV_STATUS nv_map_dma_map_scatterlist(nv_dma_map_t *dma_map) NV_STATUS status = NV_OK; nv_dma_submap_t *submap; NvU64 i; + enum dma_data_direction direction = nv_dma_get_direction(dma_map); NV_FOR_EACH_DMA_SUBMAP(dma_map, submap, i) { @@ -233,7 +246,7 @@ NV_STATUS nv_map_dma_map_scatterlist(nv_dma_map_t *dma_map) dma_map_sg(dma_map->dev, submap->sgt.sgl, submap->sgt.orig_nents, - DMA_BIDIRECTIONAL); + direction); if (submap->sg_map_count == 0) { status = NV_ERR_OPERATING_SYSTEM; @@ -253,6 +266,7 @@ void nv_unmap_dma_map_scatterlist(nv_dma_map_t *dma_map) { nv_dma_submap_t *submap; NvU64 i; + enum dma_data_direction direction = nv_dma_get_direction(dma_map); NV_FOR_EACH_DMA_SUBMAP(dma_map, submap, i) { @@ -269,7 +283,7 @@ void nv_unmap_dma_map_scatterlist(nv_dma_map_t *dma_map) dma_unmap_sg(dma_map->dev, submap->sgt.sgl, submap->sgt.orig_nents, - DMA_BIDIRECTIONAL); + direction); } } @@ -376,6 +390,7 @@ NV_STATUS NV_API_CALL nv_dma_map_sgt( NvU64 page_count, NvU64 *va_array, NvU32 cache_type, + NvBool bReadOnlyDeviceMap, void **priv ) { @@ -408,6 +423,7 @@ NV_STATUS NV_API_CALL nv_dma_map_sgt( dma_map->page_count = page_count; dma_map->contiguous = NV_FALSE; dma_map->cache_type = cache_type; + dma_map->bReadOnlyDeviceMap = bReadOnlyDeviceMap; dma_map->mapping.discontig.submap_count = 0; status = nv_dma_map_scatterlist(dma_dev, dma_map, va_array); @@ -453,6 +469,7 @@ static NV_STATUS NV_API_CALL nv_dma_map_pages( NvU64 *va_array, NvBool contig, NvU32 cache_type, + NvBool bReadOnlyDeviceMap, void **priv ) { @@ -489,6 +506,7 @@ static NV_STATUS NV_API_CALL nv_dma_map_pages( dma_map->page_count = page_count; dma_map->contiguous = contig; dma_map->cache_type = cache_type; + dma_map->bReadOnlyDeviceMap = bReadOnlyDeviceMap; if (dma_map->page_count > 1 && !dma_map->contiguous) { @@ -579,6 +597,7 @@ NV_STATUS NV_API_CALL nv_dma_map_alloc NvU64 page_count, NvU64 *va_array, NvBool contig, + NvBool bReadOnlyDeviceMap, void **priv ) { @@ -594,7 +613,7 @@ NV_STATUS NV_API_CALL nv_dma_map_alloc { *priv = at->import_sgt; status = nv_dma_map_sgt(dma_dev, page_count, va_array, at->cache_type, - priv); + bReadOnlyDeviceMap, priv); if (status != NV_OK) { *priv = at; @@ -653,7 +672,7 @@ NV_STATUS NV_API_CALL nv_dma_map_alloc *priv = pages; status = nv_dma_map_pages(dma_dev, page_count, va_array, contig, cache_type, - priv); + bReadOnlyDeviceMap, priv); if (status != NV_OK) { *priv = at; diff --git a/kernel-open/nvidia/nv-dmabuf.c b/kernel-open/nvidia/nv-dmabuf.c index 776befb8b..fb41e12d1 100644 --- a/kernel-open/nvidia/nv-dmabuf.c +++ b/kernel-open/nvidia/nv-dmabuf.c @@ -610,7 +610,7 @@ nv_dma_buf_get_phys_addresses ( nvidia_stack_t *sp = NULL; NvBool api_lock_taken = NV_FALSE; NvBool gpu_lock_taken = NV_FALSE; - NvU32 i; + NvU32 i = 0; int rc = 0; if (!nv_inc_and_check_one_phys_refcount(priv, start_index, handle_count)) diff --git a/kernel-open/nvidia/nv-procfs.c b/kernel-open/nvidia/nv-procfs.c index 7dd217578..6ed4ebc24 100644 --- a/kernel-open/nvidia/nv-procfs.c +++ b/kernel-open/nvidia/nv-procfs.c @@ -468,6 +468,7 @@ nv_procfs_read_registry( nvl->registry_keys : nv_registry_keys); seq_printf(s, "Binary: \"%s\"\n", registry_keys); + return 0; } diff --git a/src/common/displayport/inc/dp_configcaps.h b/src/common/displayport/inc/dp_configcaps.h index 03ddc6aae..b5d0c8ca9 100644 --- a/src/common/displayport/inc/dp_configcaps.h +++ b/src/common/displayport/inc/dp_configcaps.h @@ -601,8 +601,8 @@ namespace DisplayPort NvU32 overrideDpcdMaxLinkRate; NvU32 overrideDpcdRev; NvU32 overrideDpcdMaxLaneCount; - NvU32 gpuDPSupportedVersions; + bool bSkipPanelD3InPsr; struct _LegacyPort: public LegacyPort { @@ -790,7 +790,7 @@ namespace DisplayPort : bus(bus), timer(timer), bGrantsPostLtRequest(false), uprequestEnable(false), upstreamIsSource(false), bMultistream(false), bGpuFECSupported(false), bBypassILREdpRevCheck(false), overrideDpcdMaxLinkRate(0), - overrideDpcdRev(0), gpuDPSupportedVersions(0) + overrideDpcdRev(0), gpuDPSupportedVersions(0), bSkipPanelD3InPsr(false) { // start with default caps. dpcdOffline = true; diff --git a/src/common/displayport/inc/dp_deviceimpl.h b/src/common/displayport/inc/dp_deviceimpl.h index e785fb0fb..b143a6f84 100644 --- a/src/common/displayport/inc/dp_deviceimpl.h +++ b/src/common/displayport/inc/dp_deviceimpl.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 1993-2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 1993-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: MIT * * Permission is hereby granted, free of charge, to any person obtaining a @@ -557,7 +557,6 @@ namespace DisplayPort retriesRemote22BCapsReadMessage(0), retryRemoteBKSVReadMessage(false), retryRemoteBCapsReadMessage(false), retryRemote22BCapsReadMessage(false), bBKSVReadMessagePending(false), bBCapsReadMessagePending(false) - { this->parent = parent; this->messageManager = messageManager; diff --git a/src/common/displayport/inc/dp_regkeydatabase.h b/src/common/displayport/inc/dp_regkeydatabase.h index 987861eea..76e42a840 100644 --- a/src/common/displayport/inc/dp_regkeydatabase.h +++ b/src/common/displayport/inc/dp_regkeydatabase.h @@ -100,6 +100,9 @@ // Bug 5880515 : Avoid writing to DPCD 600h if panel target and current state is same #define NV_DP_REGKEY_SKIP_PANEL_POWER_WRITE "DP_SKIP_PANEL_POWER_WRITE" +// Bug 5850739 : If panel is in PSR, do not put panel into D3 +#define NV_DP_REGKEY_SKIP_PANEL_D3_IN_PSR "DP_SKIP_PANEL_D3_IN_PSR" + // Bug 4793112 : On eDP panel, do not cache source OUI if it reads zero #define NV_DP_REGKEY_SKIP_ZERO_OUI_CACHE "DP_SKIP_ZERO_OUI_CACHE" @@ -127,6 +130,8 @@ // Sets connector as HDMI for Dongle on DP++ port #define NV_DP_REGKEY_SET_CONNECTOR_HDMI_FOR_DONGLE "DP_SET_CONNECTOR_HDMI_FOR_DONGLE" +#define NV_DP_REGKEY_ENABLE_SST_EDID_RECOVERY_FIX "DP_ENABLE_SST_EDID_RECOVERY_FIX" + // // Data Base used to store all the regkey values. // The actual data base is declared statically in dp_evoadapter.cpp. @@ -165,6 +170,7 @@ struct DP_REGKEY_DATABASE bool bDisableEffBppSST8b10b; bool bDisableWatermarkCaching; bool bMSTPCONCapsReadDisabled; + bool bSkipPanelPowerdownInPsr; bool bSkipPanelPowerWrite; bool bForceDisableTunnelBwAllocation; bool bDownspreadDisabled; @@ -181,6 +187,7 @@ struct DP_REGKEY_DATABASE bool bIgnoreUnplugUnlessRequested; bool bEnableClearMSAWhenNotUsed; bool bSetConnectorHdmiForDongle; + bool bEnableSstEdidRecoveryFix; }; extern struct DP_REGKEY_DATABASE dpRegkeyDatabase; diff --git a/src/common/displayport/src/dp_configcaps.cpp b/src/common/displayport/src/dp_configcaps.cpp index ecc717222..03c17666a 100644 --- a/src/common/displayport/src/dp_configcaps.cpp +++ b/src/common/displayport/src/dp_configcaps.cpp @@ -2237,6 +2237,7 @@ void DPCDHALImpl::applyRegkeyOverrides(const DP_REGKEY_DATABASE& dpRegkeyDatabas "All regkeys are invalid because dpRegkeyDatabase is not initialized!"); overrideDpcdRev = dpRegkeyDatabase.dpcdRevOveride; bBypassILREdpRevCheck = dpRegkeyDatabase.bBypassEDPRevCheck; + bSkipPanelD3InPsr = dpRegkeyDatabase.bSkipPanelPowerdownInPsr; } bool DPCDHALImpl::clearPendingMsg() diff --git a/src/common/displayport/src/dp_connectorimpl.cpp b/src/common/displayport/src/dp_connectorimpl.cpp index 9b1217457..4ceaa418d 100644 --- a/src/common/displayport/src/dp_connectorimpl.cpp +++ b/src/common/displayport/src/dp_connectorimpl.cpp @@ -178,7 +178,7 @@ void ConnectorImpl::applyRegkeyOverrides(const DP_REGKEY_DATABASE& dpRegkeyDatab "All regkeys are invalid because dpRegkeyDatabase is not initialized!"); this->bSkipAssessLinkForEDP = dpRegkeyDatabase.bAssesslinkForEdpSkipped; - this->bSkipPanelPowerWrite = dpRegkeyDatabase.bSkipPanelPowerWrite; + this->bSkipPanelPowerWrite = dpRegkeyDatabase.bSkipPanelPowerWrite; // // Default bHdcpAuthOnlyOnDemand, bMstRestoreHdcpStateAtAttach are true @@ -7320,7 +7320,6 @@ void ConnectorImpl::disconnectDeviceList() { delete ((DeviceImpl*)d)->deviceHDCPDetection; ((DeviceImpl*)d)->deviceHDCPDetection = NULL; - ((DeviceImpl*)d)->isHDCPCap = False; } } } @@ -7736,7 +7735,16 @@ void ConnectorImpl::notifyLongPulseInternal(bool statusConnected) else { dev.peerDevice = DownstreamSink; - if (hal->isAtLeastVersion(1, 4) && !bDisableNativeDisplayId2xSupport) + bool bIsDpToHdmiDongle = false; + if (hal->getLegacyPortCount() != 0) + { + LegacyPort * port = hal->getLegacyPort(0); + bIsDpToHdmiDongle = (port->getDownstreamPortType() == HDMI); + } + + if (hal->isAtLeastVersion(1, 4) && + !bIsDpToHdmiDongle && + !bDisableNativeDisplayId2xSupport) { DisplayId2ReadSST(tmpDid2x, auxBus, timer, main); } @@ -8834,7 +8842,7 @@ bool ConnectorImpl::updatePsrLinkState(bool bTurnOnLink) { bSetPanelPower = false; } - + if (bSetPanelPower) { hal->setPowerState(PowerStateD0); diff --git a/src/common/displayport/src/dp_deviceimpl.cpp b/src/common/displayport/src/dp_deviceimpl.cpp index 9d1313e5c..ce8429027 100644 --- a/src/common/displayport/src/dp_deviceimpl.cpp +++ b/src/common/displayport/src/dp_deviceimpl.cpp @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 1993-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 1993-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: MIT * * Permission is hereby granted, free of charge, to any person obtaining a @@ -3503,6 +3503,7 @@ DeviceHDCPDetection::handleRemoteDpcdReadDownReply MessageManager::Message *from ) { + NvU8 i2cBcaps; unsigned dataCompleted; unsigned defaultReason; @@ -3716,6 +3717,7 @@ DeviceHDCPDetection::messageFailed NakData *nakData ) { + if (from == &remoteBKSVReadMessage) { if ((retriesRemoteBKSVReadMessage < DPCD_REMOTE_DPCD_READ_MESSAGE_RETRIES) && @@ -3791,6 +3793,7 @@ DeviceHDCPDetection::messageFailed // Destruct only when no message is pending if (!(bBKSVReadMessagePending || bBCapsReadMessagePending)) { + // Becareful below is ! .. parent->isDeviceHDCPDetectionAlive = false; // Complete remote HDCP probe and check if can power down again. @@ -3810,6 +3813,7 @@ DeviceHDCPDetection::expired const void *tag ) { + // Clear stale HDCP states when monitor instance is already destroyed if (!parent->plugged) { @@ -3900,7 +3904,6 @@ DeviceHDCPDetection::expired DeviceHDCPDetection::~DeviceHDCPDetection() { - parent->isDeviceHDCPDetectionAlive = false; // Clear all pending callbacks/messages if (this->timer) @@ -3921,6 +3924,7 @@ DeviceHDCPDetection::waivePendingHDCPCapDoneNotification() { // Waive the pendingHDCPCapDone notification parent->shadow.hdcpCapDone = true; + parent->isDeviceHDCPDetectionAlive = false; delete this; } diff --git a/src/common/displayport/src/dp_edid.cpp b/src/common/displayport/src/dp_edid.cpp index 935ab375b..3da504199 100644 --- a/src/common/displayport/src/dp_edid.cpp +++ b/src/common/displayport/src/dp_edid.cpp @@ -32,6 +32,7 @@ #include "dp_internal.h" #include "dp_edid.h" #include "dp_printf.h" +#include "dp_regkeydatabase.h" using namespace DisplayPort; @@ -418,6 +419,17 @@ unsigned Edid::getEdidSize() const void DisplayPort::Edid::swap(Edid & right) { swapBuffers(buffer, right.buffer); + + if (dpRegkeyDatabase.bEnableSstEdidRecoveryFix) + { + bool tmp; + tmp = forcedCheckSum; forcedCheckSum = right.forcedCheckSum; right.forcedCheckSum = tmp; + tmp = fallbackEdid; fallbackEdid = right.fallbackEdid; right.fallbackEdid = tmp; + tmp = patchedChecksum; patchedChecksum = right.patchedChecksum; right.patchedChecksum = tmp; + + right.validateCheckSum(); + } + validateCheckSum(); } diff --git a/src/common/displayport/src/dp_evoadapter.cpp b/src/common/displayport/src/dp_evoadapter.cpp index 0ccf36cbd..8e00265b6 100644 --- a/src/common/displayport/src/dp_evoadapter.cpp +++ b/src/common/displayport/src/dp_evoadapter.cpp @@ -116,10 +116,12 @@ const struct {NV_DP_REGKEY_ENABLE_128b132b_DSC_LNK_CFG_REDUCTION, &dpRegkeyDatabase.bEnable128b132bDSCLnkCfgReduction, DP_REG_VAL_BOOL}, {NV_DP_REGKEY_DISABLE_NATIVE_DISPLAYID2X_SUPPORT, &dpRegkeyDatabase.bDisableNativeDisplayId2xSupport, DP_REG_VAL_BOOL}, {NV_DP_REGKEY_USE_MAX_DSC_COMPRESSION_MST, &dpRegkeyDatabase.bUseMaxDSCCompressionMST, DP_REG_VAL_BOOL}, + {NV_DP_REGKEY_SKIP_PANEL_D3_IN_PSR, &dpRegkeyDatabase.bSkipPanelPowerdownInPsr, DP_REG_VAL_BOOL}, {NV_DP_REGKEY_FORCE_NLPIGNORE_DDS, &dpRegkeyDatabase.bIgnoreUnplugUnlessRequested, DP_REG_VAL_BOOL}, {NV_DP_REGKEY_ENABLE_CLEAR_MSA_WHEN_NOT_USED, &dpRegkeyDatabase.bEnableClearMSAWhenNotUsed, DP_REG_VAL_BOOL}, {NV_DP_REGKEY_SKIP_PANEL_POWER_WRITE, &dpRegkeyDatabase.bSkipPanelPowerWrite, DP_REG_VAL_BOOL}, - {NV_DP_REGKEY_SET_CONNECTOR_HDMI_FOR_DONGLE, &dpRegkeyDatabase.bSetConnectorHdmiForDongle, DP_REG_VAL_BOOL} + {NV_DP_REGKEY_SET_CONNECTOR_HDMI_FOR_DONGLE, &dpRegkeyDatabase.bSetConnectorHdmiForDongle, DP_REG_VAL_BOOL}, + {NV_DP_REGKEY_ENABLE_SST_EDID_RECOVERY_FIX, &dpRegkeyDatabase.bEnableSstEdidRecoveryFix, DP_REG_VAL_BOOL} }; EvoMainLink::EvoMainLink(EvoInterface * provider, Timer * timer) : diff --git a/src/common/displayport/src/dp_sst_edid.cpp b/src/common/displayport/src/dp_sst_edid.cpp index 94ec10508..0527f2f86 100644 --- a/src/common/displayport/src/dp_sst_edid.cpp +++ b/src/common/displayport/src/dp_sst_edid.cpp @@ -33,6 +33,7 @@ #include "dp_internal.h" #include "dp_edid.h" #include "dp_printf.h" +#include "dp_regkeydatabase.h" using namespace DisplayPort; @@ -191,6 +192,10 @@ static bool sstReadEdid(AuxBus * auxBus, Edid & edid, unsigned DDCAddr, Timer * NvU8 offset = 0; unsigned totalRead = 0; edidReaderManager.reset(); + if (dpRegkeyDatabase.bEnableSstEdidRecoveryFix) + { + edid.setPatchedChecksum(false); + } // start by reading first EDID block, posting it and analyzing for next request do @@ -310,6 +315,14 @@ bool DisplayPort::EdidReadSST(Edid & edid, AuxBus * auxBus, Timer* timer, if (status) { + if (dpRegkeyDatabase.bEnableSstEdidRecoveryFix && + !edid.isValidHeader()) + { + edid.resetData(); + timer->sleep(EDID_READ_RETRY_TIMEOUT_MS); + continue; + } + if (edid.verifyCRC()) { return true; diff --git a/src/common/inc/nvBldVer.h b/src/common/inc/nvBldVer.h index cc2ae48ea..3cb975b9a 100644 --- a/src/common/inc/nvBldVer.h +++ b/src/common/inc/nvBldVer.h @@ -43,18 +43,18 @@ #endif #if defined(NV_LINUX) || defined(NV_BSD) || defined(NV_SUNOS) || defined(NV_DCECORE) -#define NV_BUILD_BRANCH_VERSION "rel/gpu_drv/r595/r595_00-275" -#define NV_BUILD_CHANGELIST_NUM (38036026) +#define NV_BUILD_BRANCH_VERSION "rel/gpu_drv/r595/r595_00-298" +#define NV_BUILD_CHANGELIST_NUM (38256673) #define NV_BUILD_TYPE "Official" -#define NV_BUILD_NAME "rel/gpu_drv/r595/r595_00-275" -#define NV_LAST_OFFICIAL_CHANGELIST_NUM (38036026) +#define NV_BUILD_NAME "rel/gpu_drv/r595/r595_00-298" +#define NV_LAST_OFFICIAL_CHANGELIST_NUM (38256673) #else /* Windows builds */ -#define NV_BUILD_BRANCH_VERSION "r595_00-238" -#define NV_BUILD_CHANGELIST_NUM (38036026) +#define NV_BUILD_BRANCH_VERSION "r595_00-264" +#define NV_BUILD_CHANGELIST_NUM (38256673) #define NV_BUILD_TYPE "Official" -#define NV_BUILD_NAME "596.59" -#define NV_LAST_OFFICIAL_CHANGELIST_NUM (38036026) +#define NV_BUILD_NAME "596.72" +#define NV_LAST_OFFICIAL_CHANGELIST_NUM (38256673) #define NV_BUILD_BRANCH_BASE_VERSION R595 #endif // End buildmeister python edited section diff --git a/src/common/inc/nvUnixVersion.h b/src/common/inc/nvUnixVersion.h index ece69064b..7a8cce29d 100644 --- a/src/common/inc/nvUnixVersion.h +++ b/src/common/inc/nvUnixVersion.h @@ -5,7 +5,7 @@ (defined(RMCFG_FEATURE_PLATFORM_GSP) && RMCFG_FEATURE_PLATFORM_GSP == 1) || \ defined(NV_DCECORE) -#define NV_VERSION_STRING "595.80" +#define NV_VERSION_STRING "595.84" #else diff --git a/src/common/sdk/nvidia/inc/ctrl/ctrla081.h b/src/common/sdk/nvidia/inc/ctrl/ctrla081.h index e63a7faa4..627d719dc 100644 --- a/src/common/sdk/nvidia/inc/ctrl/ctrla081.h +++ b/src/common/sdk/nvidia/inc/ctrl/ctrla081.h @@ -46,7 +46,7 @@ #define NVA081_MAX_VGPU_TYPES_PER_PGPU 0x80 #define NVA081_MAX_VGPU_PER_PGPU 48 #define NVA081_MAX_VGPU_PER_PGPU_NON_MIG 32 -#define NVA081_MAX_VGPU_PER_GI 12 +#define NVA081_MAX_VGPU_PER_GI 18 #define NVA081_VM_UUID_SIZE 16 #define NVA081_VGPU_STRING_BUFFER_SIZE 64 #define NVA081_VGPU_SIGNATURE_SIZE 128 diff --git a/src/common/shared/inc/g_vgpu_chip_flags.h b/src/common/shared/inc/g_vgpu_chip_flags.h index c04328dcf..78736579f 100644 --- a/src/common/shared/inc/g_vgpu_chip_flags.h +++ b/src/common/shared/inc/g_vgpu_chip_flags.h @@ -949,6 +949,32 @@ ENTRY(0x2941, 0x20CF, 0x10de, "NVIDIA GB200-3-95C"), ENTRY(0x2941, 0x20D0, 0x10de, "NVIDIA GB200-4-95C"), ENTRY(0x2941, 0x20D1, 0x10de, "NVIDIA GB200-7-189C"), ENTRY(0x2941, 0x20D2, 0x10de, "NVIDIA GB200-189C"), +ENTRY(0x2BB3, 0x2324, 0x10de, "NVIDIA RTX PRO 5000 WE-1-2Q"), +ENTRY(0x2BB3, 0x2326, 0x10de, "NVIDIA RTX PRO 5000 WE-1-2B"), +ENTRY(0x2BB3, 0x2328, 0x10de, "NVIDIA RTX PRO 5000 WE-1-3Q"), +ENTRY(0x2BB3, 0x232A, 0x10de, "NVIDIA RTX PRO 5000 WE-1-3B"), +ENTRY(0x2BB3, 0x232C, 0x10de, "NVIDIA RTX PRO 5000 WE-1-4Q"), +ENTRY(0x2BB3, 0x232E, 0x10de, "NVIDIA RTX PRO 5000 WE-1-6Q"), +ENTRY(0x2BB3, 0x232F, 0x10de, "NVIDIA RTX PRO 5000 WE-1-9Q"), +ENTRY(0x2BB3, 0x2332, 0x10de, "NVIDIA RTX PRO 5000 WE-1-12Q"), +ENTRY(0x2BB3, 0x2336, 0x10de, "NVIDIA RTX PRO 5000 WE-1-18Q"), +ENTRY(0x2BB3, 0x233A, 0x10de, "NVIDIA RTX PRO 5000 WE-1-36Q"), +ENTRY(0x2BB3, 0x2342, 0x10de, "NVIDIA RTX PRO 5000 WE-2-18Q"), +ENTRY(0x2BB3, 0x2346, 0x10de, "NVIDIA RTX PRO 5000 WE-2-24Q"), +ENTRY(0x2BB3, 0x234A, 0x10de, "NVIDIA RTX PRO 5000 WE-2-36Q"), +ENTRY(0x2BB3, 0x234E, 0x10de, "NVIDIA RTX PRO 5000 WE-2-72Q"), +ENTRY(0x2BB3, 0x2352, 0x10de, "NVIDIA RTX PRO 5000 WE-2B"), +ENTRY(0x2BB3, 0x2353, 0x10de, "NVIDIA RTX PRO 5000 WE-2Q"), +ENTRY(0x2BB3, 0x2354, 0x10de, "NVIDIA RTX PRO 5000 WE-3Q"), +ENTRY(0x2BB3, 0x2356, 0x10de, "NVIDIA RTX PRO 5000 WE-3B"), +ENTRY(0x2BB3, 0x2358, 0x10de, "NVIDIA RTX PRO 5000 WE-4Q"), +ENTRY(0x2BB3, 0x235B, 0x10de, "NVIDIA RTX PRO 5000 WE-6Q"), +ENTRY(0x2BB3, 0x235E, 0x10de, "NVIDIA RTX PRO 5000 WE-9Q"), +ENTRY(0x2BB3, 0x2362, 0x10de, "NVIDIA RTX PRO 5000 WE-12Q"), +ENTRY(0x2BB3, 0x2366, 0x10de, "NVIDIA RTX PRO 5000 WE-18Q"), +ENTRY(0x2BB3, 0x236A, 0x10de, "NVIDIA RTX PRO 5000 WE-24Q"), +ENTRY(0x2BB3, 0x236E, 0x10de, "NVIDIA RTX PRO 5000 WE-36Q"), +ENTRY(0x2BB3, 0x2372, 0x10de, "NVIDIA RTX PRO 5000 WE-72Q"), ENTRY(0x2BB5, 0x2160, 0x10de, "NVIDIA RTX Pro 6000 Blackwell DC-1-2Q"), ENTRY(0x2BB5, 0x2161, 0x10de, "NVIDIA RTX Pro 6000 Blackwell DC-1-2A"), ENTRY(0x2BB5, 0x2162, 0x10de, "NVIDIA RTX Pro 6000 Blackwell DC-1-2B"), diff --git a/src/common/shared/inc/g_vgpu_resman_specific.h b/src/common/shared/inc/g_vgpu_resman_specific.h index 3f979b4ea..76d7eeea4 100644 --- a/src/common/shared/inc/g_vgpu_resman_specific.h +++ b/src/common/shared/inc/g_vgpu_resman_specific.h @@ -242,6 +242,20 @@ static const struct { {0x294110DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU , 1459}, // NVIDIA GB200-3-95C {0x294110DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_HALF_GPU , 1448}, // NVIDIA GB200-4-95C {0x294110DE, NV2080_CTRL_GPU_PARTITION_FLAG_FULL_GPU , 1460}, // NVIDIA GB200-7-189C + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2268}, // NVIDIA RTX PRO 5000 WE-1-2Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2269}, // NVIDIA RTX PRO 5000 WE-1-2B + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2270}, // NVIDIA RTX PRO 5000 WE-1-3Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2271}, // NVIDIA RTX PRO 5000 WE-1-3B + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2272}, // NVIDIA RTX PRO 5000 WE-1-4Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2273}, // NVIDIA RTX PRO 5000 WE-1-6Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2274}, // NVIDIA RTX PRO 5000 WE-1-9Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2275}, // NVIDIA RTX PRO 5000 WE-1-12Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2276}, // NVIDIA RTX PRO 5000 WE-1-18Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_MINI_HALF_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _MINI_HALF) , 2277}, // NVIDIA RTX PRO 5000 WE-1-36Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_FULL_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _FULL) , 2278}, // NVIDIA RTX PRO 5000 WE-2-18Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_FULL_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _FULL) , 2279}, // NVIDIA RTX PRO 5000 WE-2-24Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_FULL_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _FULL) , 2280}, // NVIDIA RTX PRO 5000 WE-2-36Q + {0x2BB310DE, NV2080_CTRL_GPU_PARTITION_FLAG_FULL_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _FULL) , 2281}, // NVIDIA RTX PRO 5000 WE-2-72Q {0x2BB510DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_QUARTER_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _QUARTER) , 1546}, // NVIDIA RTX Pro 6000 Blackwell DC-1-2Q {0x2BB510DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_QUARTER_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _QUARTER) , 1547}, // NVIDIA RTX Pro 6000 Blackwell DC-1-2A {0x2BB510DE, NV2080_CTRL_GPU_PARTITION_FLAG_ONE_QUARTER_GPU | DRF_DEF(2080, _CTRL_GPU_PARTITION_FLAG, _GFX_SIZE, _QUARTER) , 1548}, // NVIDIA RTX Pro 6000 Blackwell DC-1-2B diff --git a/src/nvidia/arch/nvalloc/unix/include/nv.h b/src/nvidia/arch/nvalloc/unix/include/nv.h index fe7899af7..3bb443f60 100644 --- a/src/nvidia/arch/nvalloc/unix/include/nv.h +++ b/src/nvidia/arch/nvalloc/unix/include/nv.h @@ -968,9 +968,9 @@ void NV_API_CALL nv_unregister_sgt (nv_state_t *, struct sg_table NV_STATUS NV_API_CALL nv_register_phys_pages (nv_state_t *, NvU64 *, NvU64, NvU32, void **); void NV_API_CALL nv_unregister_phys_pages (nv_state_t *, void *); -NV_STATUS NV_API_CALL nv_dma_map_sgt (nv_dma_device_t *, NvU64, NvU64 *, NvU32, void **); +NV_STATUS NV_API_CALL nv_dma_map_sgt (nv_dma_device_t *, NvU64, NvU64 *, NvU32, NvBool, void **); -NV_STATUS NV_API_CALL nv_dma_map_alloc (nv_dma_device_t *, NvU64, NvU64 *, NvBool, void **); +NV_STATUS NV_API_CALL nv_dma_map_alloc (nv_dma_device_t *, NvU64, NvU64 *, NvBool, NvBool, void **); NV_STATUS NV_API_CALL nv_dma_unmap_alloc (nv_dma_device_t *, NvU64, NvU64 *, void **); NV_STATUS NV_API_CALL nv_dma_map_peer (nv_dma_device_t *, nv_dma_device_t *, NvU8, NvU64, NvU64 *); diff --git a/src/nvidia/arch/nvalloc/unix/src/dynamic-power.c b/src/nvidia/arch/nvalloc/unix/src/dynamic-power.c index c465e0f89..d8dd86499 100644 --- a/src/nvidia/arch/nvalloc/unix/src/dynamic-power.c +++ b/src/nvidia/arch/nvalloc/unix/src/dynamic-power.c @@ -2355,6 +2355,7 @@ NV_STATUS RmGcxPowerManagement( NvBool *bTryAgain ) { + MemoryManager *pMemoryManager = GPU_GET_MEMORY_MANAGER(pGpu); KernelMemorySystem *pKernelMemorySystem = GPU_GET_KERNEL_MEMORY_SYSTEM(pGpu); nv_state_t *nv = NV_GET_NV_STATE(pGpu); nv_priv_t *nvp = NV_GET_NV_PRIV(nv); @@ -2376,7 +2377,6 @@ NV_STATUS RmGcxPowerManagement( if (bEnter) { - MemoryManager *pMemoryManager = GPU_GET_MEMORY_MANAGER(pGpu); NvU64 usedFbSize = 0; NvBool bCanUseGc6 = NV_FALSE; NV_STATUS fbsrStatus = NV_ERR_GENERIC; @@ -2441,7 +2441,11 @@ NV_STATUS RmGcxPowerManagement( * might not be freed. */ fbsrFreeReservedSysMemoryForPowerMgmt(pMemoryManager->pFbsr[FBSR_TYPE_DMA]); - pKernelMemorySystem->bPreserveComptagBackingStoreOnSuspend = NV_FALSE; + + if (!pMemoryManager->bUseVirtualCopyOnSuspend) + { + pKernelMemorySystem->bPreserveComptagBackingStoreOnSuspend = nv->preserve_vidmem_allocations; + } } } else if (bCanUseGc6) @@ -2515,7 +2519,10 @@ NV_STATUS RmGcxPowerManagement( { status = RmPowerManagement(pGpu, NV_PM_ACTION_RESUME); pGpu->setProperty(pGpu, PDB_PROP_GPU_GCOFF_STATE_ENTERED, NV_FALSE); - pKernelMemorySystem->bPreserveComptagBackingStoreOnSuspend = NV_FALSE; + if (!pMemoryManager->bUseVirtualCopyOnSuspend) + { + pKernelMemorySystem->bPreserveComptagBackingStoreOnSuspend = nv->preserve_vidmem_allocations; + } } else if (pGpu->getProperty(pGpu, PDB_PROP_GPU_RG_STATE_ENTERED)) { diff --git a/src/nvidia/arch/nvalloc/unix/src/os.c b/src/nvidia/arch/nvalloc/unix/src/os.c index 2fd091823..be3cf6212 100644 --- a/src/nvidia/arch/nvalloc/unix/src/os.c +++ b/src/nvidia/arch/nvalloc/unix/src/os.c @@ -1465,6 +1465,8 @@ static void postEvent( NvBool bDoRefCount ) { + nv_event_t *eventToPost = event; + if (bDoRefCount) { if (osReferenceObjectCount(event) != NV_OK) @@ -1477,7 +1479,7 @@ static void postEvent( return; } - nv_post_event(event, hEvent, notifyIndex, + nv_post_event(eventToPost, hEvent, notifyIndex, info32, info16, dataValid); if (bDoRefCount) @@ -3455,6 +3457,14 @@ static NvBool skipIovaMappingForTegra return NV_FALSE; } +static NvBool osMemDescRequiresReadOnlyDeviceDmaMap +( + MEMORY_DESCRIPTOR *pMemDesc +) +{ + return NV_FALSE; +} + /*! * @brief Map memory into an IOVA space according to the given mapping info. * @@ -3615,11 +3625,14 @@ osIovaMap if (!bIsBar0 && (!bIsFbOffset || bIsIndirectPeerMapping)) { + NvBool bReadOnlyDeviceMap = + osMemDescRequiresReadOnlyDeviceDmaMap(pIovaMapping->pPhysMemDesc); + status = nv_dma_map_alloc( osGetDmaDeviceForMemDesc(nv, pIovaMapping->pPhysMemDesc), osPageCount, &pIovaMapping->iovaArray[0], - bIsContig, &pPriv); + bIsContig, bReadOnlyDeviceMap, &pPriv); if (status != NV_OK) { NV_PRINTF(LEVEL_ERROR, diff --git a/src/nvidia/arch/nvalloc/unix/src/osapi.c b/src/nvidia/arch/nvalloc/unix/src/osapi.c index 948adcc81..4e176cfaf 100644 --- a/src/nvidia/arch/nvalloc/unix/src/osapi.c +++ b/src/nvidia/arch/nvalloc/unix/src/osapi.c @@ -23,6 +23,7 @@ + #include #include #include @@ -643,7 +644,7 @@ done: } else { - NV_PRINTF(LEVEL_ERROR, "failed to allocate OS event: 0x%08x\n", status); + NV_PRINTF(LEVEL_INFO, "failed to allocate OS event: 0x%08x\n", status); status = NV_ERR_INSUFFICIENT_RESOURCES; portMemFree(new_event); } @@ -1553,7 +1554,7 @@ static NV_STATUS RmP2PDmaMapPages( if (pageSize == os_page_size) { - status = nv_dma_map_alloc(peer, pageCount, pDmaAddresses, NV_FALSE, ppPriv); + status = nv_dma_map_alloc(peer, pageCount, pDmaAddresses, NV_FALSE, NV_FALSE, ppPriv); goto put_pgmap; } @@ -1588,7 +1589,7 @@ static NV_STATUS RmP2PDmaMapPages( } } - status = nv_dma_map_alloc(peer, osPageCount, pOsDmaAddresses, NV_FALSE, ppPriv); + status = nv_dma_map_alloc(peer, osPageCount, pOsDmaAddresses, NV_FALSE, NV_FALSE, ppPriv); if (status != NV_OK) { goto failed; diff --git a/src/nvidia/generated/g_kernel_channel_nvoc.h b/src/nvidia/generated/g_kernel_channel_nvoc.h index 4128ca5be..beabbb07a 100644 --- a/src/nvidia/generated/g_kernel_channel_nvoc.h +++ b/src/nvidia/generated/g_kernel_channel_nvoc.h @@ -1592,6 +1592,7 @@ NV_STATUS kchannelGetNotifierInfo(struct OBJGPU *pGpu, NvHandle hErrorContext, MEMORY_DESCRIPTOR **ppMemDesc, ErrorNotifierType *pNotifierType, + RsResourceRef **ppNotifierRef, NvU64 *pOffset); // Utils to iterate over ChannelDescendants on one Channels diff --git a/src/nvidia/generated/g_nv_name_released.h b/src/nvidia/generated/g_nv_name_released.h index a848f37be..b92b8d410 100644 --- a/src/nvidia/generated/g_nv_name_released.h +++ b/src/nvidia/generated/g_nv_name_released.h @@ -1791,6 +1791,32 @@ static const CHIPS_RELEASED sChipsReleased[] = { { 0x2941, 0x20d0, 0x10DE, "NVIDIA GB200-4-95C" }, { 0x2941, 0x20d1, 0x10DE, "NVIDIA GB200-7-189C" }, { 0x2941, 0x20d2, 0x10DE, "NVIDIA GB200-189C" }, + { 0x2BB3, 0x2324, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-2Q" }, + { 0x2BB3, 0x2326, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-2B" }, + { 0x2BB3, 0x2328, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-3Q" }, + { 0x2BB3, 0x232a, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-3B" }, + { 0x2BB3, 0x232c, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-4Q" }, + { 0x2BB3, 0x232e, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-6Q" }, + { 0x2BB3, 0x232f, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-9Q" }, + { 0x2BB3, 0x2332, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-12Q" }, + { 0x2BB3, 0x2336, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-18Q" }, + { 0x2BB3, 0x233a, 0x10DE, "NVIDIA RTX PRO 5000 WE-1-36Q" }, + { 0x2BB3, 0x2342, 0x10DE, "NVIDIA RTX PRO 5000 WE-2-18Q" }, + { 0x2BB3, 0x2346, 0x10DE, "NVIDIA RTX PRO 5000 WE-2-24Q" }, + { 0x2BB3, 0x234a, 0x10DE, "NVIDIA RTX PRO 5000 WE-2-36Q" }, + { 0x2BB3, 0x234e, 0x10DE, "NVIDIA RTX PRO 5000 WE-2-72Q" }, + { 0x2BB3, 0x2352, 0x10DE, "NVIDIA RTX PRO 5000 WE-2B" }, + { 0x2BB3, 0x2353, 0x10DE, "NVIDIA RTX PRO 5000 WE-2Q" }, + { 0x2BB3, 0x2354, 0x10DE, "NVIDIA RTX PRO 5000 WE-3Q" }, + { 0x2BB3, 0x2356, 0x10DE, "NVIDIA RTX PRO 5000 WE-3B" }, + { 0x2BB3, 0x2358, 0x10DE, "NVIDIA RTX PRO 5000 WE-4Q" }, + { 0x2BB3, 0x235b, 0x10DE, "NVIDIA RTX PRO 5000 WE-6Q" }, + { 0x2BB3, 0x235e, 0x10DE, "NVIDIA RTX PRO 5000 WE-9Q" }, + { 0x2BB3, 0x2362, 0x10DE, "NVIDIA RTX PRO 5000 WE-12Q" }, + { 0x2BB3, 0x2366, 0x10DE, "NVIDIA RTX PRO 5000 WE-18Q" }, + { 0x2BB3, 0x236a, 0x10DE, "NVIDIA RTX PRO 5000 WE-24Q" }, + { 0x2BB3, 0x236e, 0x10DE, "NVIDIA RTX PRO 5000 WE-36Q" }, + { 0x2BB3, 0x2372, 0x10DE, "NVIDIA RTX PRO 5000 WE-72Q" }, { 0x2BB5, 0x2160, 0x10DE, "NVIDIA RTX Pro 6000 Blackwell DC-1-2Q" }, { 0x2BB5, 0x2161, 0x10DE, "NVIDIA RTX Pro 6000 Blackwell DC-1-2A" }, { 0x2BB5, 0x2162, 0x10DE, "NVIDIA RTX Pro 6000 Blackwell DC-1-2B" }, diff --git a/src/nvidia/src/kernel/diagnostics/ucode_instrumentation_ctrl.c b/src/nvidia/src/kernel/diagnostics/ucode_instrumentation_ctrl.c index 33d452333..b4bbb2680 100644 --- a/src/nvidia/src/kernel/diagnostics/ucode_instrumentation_ctrl.c +++ b/src/nvidia/src/kernel/diagnostics/ucode_instrumentation_ctrl.c @@ -36,6 +36,7 @@ #include "core/system.h" #include "kernel/vgpu/rpc.h" #include "diagnostics/instrumentation_manager.h" +#include "virtualization/common_vgpu_mgr.h" typedef struct { NvU8 taskRmCoverage[BULLSEYE_TASK_RM_COVERAGE_SIZE]; @@ -150,6 +151,7 @@ diagapiCtrlCmdUcodeInstrumentationGetState_IMPL { NV_STATUS status = NV_OK; OBJGPU *pGpu = GPU_RES_GET_GPU(pDiagApi); + if (IS_GSP_CLIENT(pGpu)) { CALL_CONTEXT *pCallContext = resservGetTlsCallContext(); @@ -178,6 +180,7 @@ diagapiCtrlCmdUcodeInstrumentationSetState_IMPL { NV_STATUS status = NV_OK; OBJGPU *pGpu = GPU_RES_GET_GPU(pDiagApi); + if (IS_GSP_CLIENT(pGpu)) { CALL_CONTEXT *pCallContext = resservGetTlsCallContext(); @@ -206,6 +209,7 @@ diagapiCtrlCmdUcodeInstrumentationGetData_IMPL { NV_STATUS status = NV_OK; OBJGPU *pGpu = GPU_RES_GET_GPU(pDiagApi); + if (IS_GSP_CLIENT(pGpu)) { CALL_CONTEXT *pCallContext = resservGetTlsCallContext(); diff --git a/src/nvidia/src/kernel/gpu/device_share.c b/src/nvidia/src/kernel/gpu/device_share.c index 4b1e03119..edb089c91 100644 --- a/src/nvidia/src/kernel/gpu/device_share.c +++ b/src/nvidia/src/kernel/gpu/device_share.c @@ -21,6 +21,8 @@ * DEALINGS IN THE SOFTWARE. */ + + #include "core/core.h" #include "os/os.h" #include "mem_mgr/virt_mem_mgr.h" @@ -270,6 +272,7 @@ deviceInitClientShare // Init target share if needed if (pShareDevice->pVASpace == NULL) { + status = deviceInitClientShare(pShareDevice, pShareDevice->hClientShare, pShareDevice->vaSize, diff --git a/src/nvidia/src/kernel/gpu/fifo/kernel_channel.c b/src/nvidia/src/kernel/gpu/fifo/kernel_channel.c index 94c7a80f1..07526e1d8 100644 --- a/src/nvidia/src/kernel/gpu/fifo/kernel_channel.c +++ b/src/nvidia/src/kernel/gpu/fifo/kernel_channel.c @@ -137,7 +137,10 @@ kchannelConstruct_IMPL RmClient *pRmClient = NULL; RsResourceRef *pResourceRef = pCallContext->pResourceRef; RsResourceRef *pKernelCtxShareRef = NULL; + RsResourceRef *pErrorContextRef = NULL; + RsResourceRef *pEccErrorContextRef = NULL; NV_STATUS status; + NV_STATUS notifierStatus; RM_API *pRmApi = NULL; NvHandle hClient = pRsClient->hClient; NvHandle hParent = pResourceRef->pParentRef->hResource; @@ -517,13 +520,18 @@ kchannelConstruct_IMPL } else if (!(RMCFG_FEATURE_PLATFORM_GSP && !pKernelChannel->bGspOwned)) { - NV_ASSERT_OK(kchannelGetNotifierInfo(pGpu, pDevice, + notifierStatus = kchannelGetNotifierInfo(pGpu, pDevice, pKernelChannel->hErrorContext, &pKernelChannel->pErrContextMemDesc, &pKernelChannel->errorContextType, - &pKernelChannel->errorContextOffset)); - NV_ASSERT(pKernelChannel->errorContextType != - ERROR_NOTIFIER_TYPE_NONE); + &pErrorContextRef, + &pKernelChannel->errorContextOffset); + NV_ASSERT_OK(notifierStatus); + if (notifierStatus == NV_OK) + { + NV_ASSERT(pKernelChannel->errorContextType != + ERROR_NOTIFIER_TYPE_NONE); + } } if (pKernelChannel->hEccErrorContext == NV01_NULL_OBJECT) { @@ -531,13 +539,18 @@ kchannelConstruct_IMPL } else if (!(RMCFG_FEATURE_PLATFORM_GSP && !pKernelChannel->bGspOwned)) { - NV_ASSERT_OK(kchannelGetNotifierInfo(pGpu, pDevice, + notifierStatus = kchannelGetNotifierInfo(pGpu, pDevice, pKernelChannel->hEccErrorContext, &pKernelChannel->pEccErrContextMemDesc, &pKernelChannel->eccErrorContextType, - &pKernelChannel->eccErrorContextOffset)); - NV_ASSERT(pKernelChannel->eccErrorContextType != - ERROR_NOTIFIER_TYPE_NONE); + &pEccErrorContextRef, + &pKernelChannel->eccErrorContextOffset); + NV_ASSERT_OK(notifierStatus); + if (notifierStatus == NV_OK) + { + NV_ASSERT(pKernelChannel->eccErrorContextType != + ERROR_NOTIFIER_TYPE_NONE); + } } if (IS_GSP_CLIENT(pGpu) || bFullSriov) @@ -1878,6 +1891,7 @@ kchannelGetNotifierInfo NvHandle hErrorContext, MEMORY_DESCRIPTOR **ppMemDesc, ErrorNotifierType *pNotifierType, + RsResourceRef **ppNotifierRef, NvU64 *pOffset ) { @@ -1887,9 +1901,11 @@ kchannelGetNotifierInfo NV_ASSERT_OR_RETURN(ppMemDesc != NULL, NV_ERR_INVALID_PARAMETER); NV_ASSERT_OR_RETURN(pNotifierType != NULL, NV_ERR_INVALID_PARAMETER); + NV_ASSERT_OR_RETURN(ppNotifierRef != NULL, NV_ERR_INVALID_PARAMETER); *ppMemDesc = NULL; *pNotifierType = ERROR_NOTIFIER_TYPE_UNKNOWN; + *ppNotifierRef = NULL; *pOffset = 0; if (hErrorContext == NV01_NULL_OBJECT) @@ -1958,12 +1974,14 @@ kchannelGetNotifierInfo *ppMemDesc = pDmaMappingInfo->pMemDesc; // The notifier format here is struct NOTIFICATION, same as ctxdma *pNotifierType = ERROR_NOTIFIER_TYPE_CTXDMA; + *ppNotifierRef = RES_GET_REF(pMemory); *pOffset = offset; } else { *ppMemDesc = pMemory->pMemDesc; *pNotifierType = ERROR_NOTIFIER_TYPE_MEMORY; + *ppNotifierRef = RES_GET_REF(pMemory); } return NV_OK; } @@ -1972,6 +1990,7 @@ kchannelGetNotifierInfo { *ppMemDesc = pContextDma->pMemDesc; *pNotifierType = ERROR_NOTIFIER_TYPE_CTXDMA; + *ppNotifierRef = RES_GET_REF(pContextDma); return NV_OK; } diff --git a/src/nvidia/src/kernel/gpu/fifo/kernel_fifo_ctrl.c b/src/nvidia/src/kernel/gpu/fifo/kernel_fifo_ctrl.c index 53a480da6..2c6d98a67 100644 --- a/src/nvidia/src/kernel/gpu/fifo/kernel_fifo_ctrl.c +++ b/src/nvidia/src/kernel/gpu/fifo/kernel_fifo_ctrl.c @@ -45,6 +45,7 @@ #include "kernel/gpu/conf_compute/conf_compute.h" static NV_STATUS _kfifoGetCaps(OBJGPU *pGpu, NvU8 *pKfifoCaps); + /*! * @brief deviceCtrlCmdFifoGetChannelList */ @@ -1008,10 +1009,10 @@ subdeviceCtrlCmdFifoQueryChannelUniqueId_IMPL NV2080_CTRL_FIFO_QUERY_CHANNEL_UNIQUE_ID_PARAMS *pGetChannelUidParams ) { - RsClient *pRsClient = NULL; RsResourceRef *pResourceRef = NULL; KernelChannel *pKernelChannel = NULL; NvU32 i; + RsClient *pRsClient = NULL; NV_CHECK_OR_RETURN(LEVEL_INFO, (pGetChannelUidParams->numChannels > 0 && pGetChannelUidParams->numChannels <= NV2080_CTRL_CMD_FIFO_MAX_CHANNELS_PER_TSG), diff --git a/src/nvidia/src/kernel/gpu/gr/kernel_sm_debugger_session_ctrl.c b/src/nvidia/src/kernel/gpu/gr/kernel_sm_debugger_session_ctrl.c index 4c38b3538..3549580f7 100644 --- a/src/nvidia/src/kernel/gpu/gr/kernel_sm_debugger_session_ctrl.c +++ b/src/nvidia/src/kernel/gpu/gr/kernel_sm_debugger_session_ctrl.c @@ -870,4 +870,3 @@ ksmdbgssnCtrlCmdDebugReadMMUFaultInfo_IMPL return NV_OK; } - diff --git a/src/nvidia/src/kernel/gpu/gsp/kernel_gsp_trace_rats.c b/src/nvidia/src/kernel/gpu/gsp/kernel_gsp_trace_rats.c index 512651486..38b197498 100644 --- a/src/nvidia/src/kernel/gpu/gsp/kernel_gsp_trace_rats.c +++ b/src/nvidia/src/kernel/gpu/gsp/kernel_gsp_trace_rats.c @@ -27,6 +27,7 @@ */ #include "gpu/gsp/kernel_gsp_trace_rats.h" +#include "nvport/nvport.h" #include "rmapi/client.h" #include "rmapi/event_api.h" @@ -41,6 +42,8 @@ #include "gpu/mem_mgr/mem_mgr.h" #include "gpu/timer/objtmr.h" +#define GSP_TRACE_BUFFER_ALLOC_SIZE_MAX (1 * 1024 * 1024) // 1 MB + static NV_STATUS _gspTraceEventBufferAdd diff --git a/src/nvidia/src/kernel/gpu/mig_mgr/gpu_instance_subscription.c b/src/nvidia/src/kernel/gpu/mig_mgr/gpu_instance_subscription.c index c268c4b40..d3f8a3d66 100644 --- a/src/nvidia/src/kernel/gpu/mig_mgr/gpu_instance_subscription.c +++ b/src/nvidia/src/kernel/gpu/mig_mgr/gpu_instance_subscription.c @@ -447,6 +447,7 @@ gisubscriptionCtrlCmdExecPartitionsCreate_IMPL // Only continue if execution partition creation succeeded in the host NV_ASSERT_OK_OR_RETURN(status); + } if (!IS_GSP_CLIENT(pGpu)) diff --git a/src/nvidia/src/kernel/gpu/mig_mgr/kernel_mig_manager.c b/src/nvidia/src/kernel/gpu/mig_mgr/kernel_mig_manager.c index e87df77ee..e9ad168d1 100644 --- a/src/nvidia/src/kernel/gpu/mig_mgr/kernel_mig_manager.c +++ b/src/nvidia/src/kernel/gpu/mig_mgr/kernel_mig_manager.c @@ -5911,11 +5911,14 @@ kmigmgrConfigureGPUInstance_IMPL // // Return an error if there are any channels on any engines targeted by this - // request + // request. Skip this check for GSP fast unload codepath, since we may have channels on engines + // but with no active workloads. // - NV_CHECK_OR_RETURN(LEVEL_SILENT, - !kfifoEngineListHasChannel(pGpu, pKernelFifo, checkGrs, checkGrCount), - NV_ERR_STATE_IN_USE); + { + NV_CHECK_OR_RETURN(LEVEL_SILENT, + !kfifoEngineListHasChannel(pGpu, pKernelFifo, checkGrs, checkGrCount), + NV_ERR_STATE_IN_USE); + } if (!bAssigning) { diff --git a/src/nvidia/src/kernel/gpu/nvenc/nvencsession.c b/src/nvidia/src/kernel/gpu/nvenc/nvencsession.c index 070b204fa..e21f0ccb0 100644 --- a/src/nvidia/src/kernel/gpu/nvenc/nvencsession.c +++ b/src/nvidia/src/kernel/gpu/nvenc/nvencsession.c @@ -118,6 +118,7 @@ nvencsessionConstruct_IMPL pNvencSession->pMemory = NULL; return status; } + } else { diff --git a/src/nvidia/src/kernel/gpu/subdevice/subdevice_ctrl_nvd.c b/src/nvidia/src/kernel/gpu/subdevice/subdevice_ctrl_nvd.c index ec687434d..e257a00d8 100644 --- a/src/nvidia/src/kernel/gpu/subdevice/subdevice_ctrl_nvd.c +++ b/src/nvidia/src/kernel/gpu/subdevice/subdevice_ctrl_nvd.c @@ -220,6 +220,7 @@ subdeviceCtrlCmdNvdGetNocatJournalRpt_IMPL return status; } + /*! * @brief Set the NOCAT TDR data collected by KMD in the NOCAT journal record * @@ -320,4 +321,3 @@ subdeviceCtrlCmdNvdInsertNocatJournalRecord_IMPL return NV_OK; } - diff --git a/src/nvidia/src/kernel/mem_mgr/gpu_vaspace.c b/src/nvidia/src/kernel/mem_mgr/gpu_vaspace.c index 62b68fc7c..f25ff72a4 100644 --- a/src/nvidia/src/kernel/mem_mgr/gpu_vaspace.c +++ b/src/nvidia/src/kernel/mem_mgr/gpu_vaspace.c @@ -4298,7 +4298,8 @@ gvaspaceCopyServerReservedPdes_IMPL aperture = ADDR_SYSMEM; break; default: - NV_ASSERT_OR_GOTO(0, done); + NV_ASSERT(0); + goto done; } status = memdescCreate(&pMemDescNew, pGpu, diff --git a/src/nvidia/src/kernel/mem_mgr/os_desc_mem.c b/src/nvidia/src/kernel/mem_mgr/os_desc_mem.c index cc3e96bc3..d92650880 100644 --- a/src/nvidia/src/kernel/mem_mgr/os_desc_mem.c +++ b/src/nvidia/src/kernel/mem_mgr/os_desc_mem.c @@ -280,4 +280,3 @@ osdescCanCopy_IMPL // In case of MODS the caller is responsible for not freeing the memory. return (RMCFG_FEATURE_PLATFORM_UNIX || RMCFG_FEATURE_PLATFORM_MODS); } - diff --git a/src/nvidia/src/kernel/mem_mgr/video_mem.c b/src/nvidia/src/kernel/mem_mgr/video_mem.c index f33a1f44b..713eaae9b 100644 --- a/src/nvidia/src/kernel/mem_mgr/video_mem.c +++ b/src/nvidia/src/kernel/mem_mgr/video_mem.c @@ -461,10 +461,19 @@ vidmemCopyConstruct ) { Memory *pMemorySrc = dynamicCast(pParams->pSrcRef->pResource, Memory); - OBJGPU *pGpu = pMemorySrc->pGpu; + OBJGPU *pGpu = pMemorySrc->pMemDesc->pGpu; MEMORY_DESCRIPTOR *pMemDesc = pMemorySrc->pMemDesc; NV_STATUS status = NV_ERR_INVALID_ARGUMENT; KernelBus *pKernelBus = GPU_GET_KERNEL_BUS(pGpu); + NvBool bSrcLockAcquired = NV_FALSE; + + if (!rmDeviceGpuLockIsOwner(pGpu->gpuInstance) && !rmGpuLockIsOwner()) + { + NV_ASSERT_OK_OR_RETURN(rmDeviceGpuLocksAcquire(pGpu, GPUS_LOCK_FLAGS_NONE, RM_LOCK_MODULES_MEM)); + + bSrcLockAcquired = NV_TRUE; + } + // No flags specified on the initial static BAR1 mapping status = kbusIncreaseStaticBar1Refcount_HAL(pGpu, pKernelBus, @@ -502,6 +511,12 @@ vidmemCopyConstruct break; } + if (bSrcLockAcquired) + { + // UNLOCK: release GPUs lock + rmDeviceGpuLocksRelease(pGpu, GPUS_LOCK_FLAGS_NONE, NULL); + } + return status; } @@ -577,15 +592,7 @@ vidmemConstruct_IMPL if (RS_IS_COPY_CTOR(pParams)) { - if (!rmDeviceGpuLockIsOwner(pGpu->gpuInstance) && !rmGpuLockIsOwner()) - { - NV_ASSERT_OK_OR_GOTO(rmStatus, - rmDeviceGpuLocksAcquire(pGpu, GPUS_LOCK_FLAGS_NONE, RM_LOCK_MODULES_MEM), - done); - - bLockAcquired = NV_TRUE; - } - + // No need to lock this GPU rmStatus = vidmemCopyConstruct(pVideoMemory, pCallContext, pParams); goto done; } diff --git a/src/nvidia/src/kernel/rmapi/event_api.c b/src/nvidia/src/kernel/rmapi/event_api.c index 70461c54a..b5ab55ca2 100644 --- a/src/nvidia/src/kernel/rmapi/event_api.c +++ b/src/nvidia/src/kernel/rmapi/event_api.c @@ -179,7 +179,8 @@ eventapiConstruct_IMPL rmStatus = osUserHandleToKernelPtr(pRsClient->hClient, pNv0050AllocParams->data, &pNv0050AllocParams->data); - bUserOsEventHandle = NV_TRUE; + if (rmStatus == NV_OK) + bUserOsEventHandle = NV_TRUE; } } diff --git a/src/nvidia/src/kernel/rmapi/event_buffer.c b/src/nvidia/src/kernel/rmapi/event_buffer.c index 05136e835..ee3e15e44 100644 --- a/src/nvidia/src/kernel/rmapi/event_buffer.c +++ b/src/nvidia/src/kernel/rmapi/event_buffer.c @@ -386,6 +386,7 @@ eventbufferConstruct_IMPL status = memCreateKernelMapping(pMemory, NV_PROTECT_READ_WRITE, NV_TRUE); if (status != NV_OK) goto cleanup; + } pKernelMap->vardataBuffAddr = pMemory->KernelVAddr; diff --git a/src/nvidia/src/kernel/rmapi/nv_gpu_ops.c b/src/nvidia/src/kernel/rmapi/nv_gpu_ops.c index ef81fc505..5a34759b7 100644 --- a/src/nvidia/src/kernel/rmapi/nv_gpu_ops.c +++ b/src/nvidia/src/kernel/rmapi/nv_gpu_ops.c @@ -1146,10 +1146,11 @@ static void nvGpuOpsRmDeviceDestroy(struct gpuDevice *device) portSyncRwLockAcquireWrite(session->devicesLock); deleteDescriptor(&session->devices, deviceKey, (void**)&rmDevice); + portSyncRwLockReleaseWrite(session->devicesLock); + pRmApi->Free(pRmApi, session->handle, rmDevice->deviceHandle); portSyncRwLockDestroy(rmDevice->btreeLock); portMemFree(rmDevice); - portSyncRwLockReleaseWrite(session->devicesLock); } } diff --git a/src/nvidia/src/kernel/rmapi/rmapi_finn.c b/src/nvidia/src/kernel/rmapi/rmapi_finn.c index 6fa3b79c0..c3de8fa92 100644 --- a/src/nvidia/src/kernel/rmapi/rmapi_finn.c +++ b/src/nvidia/src/kernel/rmapi/rmapi_finn.c @@ -21,6 +21,7 @@ * DEALINGS IN THE SOFTWARE. */ + #include "resserv/resserv.h" #include "rmapi/rmapi.h" @@ -28,6 +29,25 @@ #include "g_finn_rm_api.h" +static NvU32 +_rmapiFinnGetInterfaceId +( + NvU32 cmd +) +{ + return (DRF_VAL(XXXX, _CTRL_CMD, _CLASS, cmd) << 8) | + DRF_VAL(XXXX, _CTRL_CMD, _CATEGORY, cmd); +} + +static NvU32 +_rmapiFinnGetMessageId +( + NvU32 cmd +) +{ + return DRF_VAL(XXXX, _CTRL_CMD, _INDEX, cmd); +} + /** * Serialize parameters for servicing command * @@ -50,9 +70,8 @@ serverSerializeCtrlDown { NV_STATUS status; NvU8 *pSerBuffer; - const NvU32 interface_id = (DRF_VAL(XXXX, _CTRL_CMD, _CLASS, cmd) << 8) | - DRF_VAL(XXXX, _CTRL_CMD, _CATEGORY, cmd); - const NvU32 message_id = DRF_VAL(XXXX, _CTRL_CMD, _INDEX, cmd); + const NvU32 interface_id = _rmapiFinnGetInterfaceId(cmd); + const NvU32 message_id = _rmapiFinnGetMessageId(cmd); NvU32 serializedSize = (NvU32)FinnRmApiGetSerializedSize(interface_id, message_id, *ppParams); pCallContext->pDeserializedParams = *ppParams; @@ -130,9 +149,8 @@ serverDeserializeCtrlDown NV_STATUS status; NvU8 *pSerBuffer; void *pDeserParams; - const NvU32 interface_id = (DRF_VAL(XXXX, _CTRL_CMD, _CLASS, cmd) << 8) | - DRF_VAL(XXXX, _CTRL_CMD, _CATEGORY, cmd); - const NvU32 message_id = DRF_VAL(XXXX, _CTRL_CMD, _INDEX, cmd); + const NvU32 interface_id = _rmapiFinnGetInterfaceId(cmd); + const NvU32 message_id = _rmapiFinnGetMessageId(cmd); NvU32 unserializedSize = (NvU32)FinnRmApiGetUnserializedSize(interface_id, message_id); // Report error if FINN can't deserialize but RM is reporting the control as serialized @@ -217,9 +235,8 @@ serverSerializeCtrlUp NV_STATUS status; NvU8 *pSerBuffer; void *pDeserBuffer; - const NvU32 interface_id = (DRF_VAL(XXXX, _CTRL_CMD, _CLASS, cmd) << 8) | - DRF_VAL(XXXX, _CTRL_CMD, _CATEGORY, cmd); - const NvU32 message_id = DRF_VAL(XXXX, _CTRL_CMD, _INDEX, cmd); + const NvU32 interface_id = _rmapiFinnGetInterfaceId(cmd); + const NvU32 message_id = _rmapiFinnGetMessageId(cmd); // Should be serialized at this point. Expect that serializedSize is set otherwise something is wrong if (pCallContext->serializedSize == 0) @@ -282,9 +299,8 @@ serverDeserializeCtrlUp NV_STATUS status; NvU8 *pSerBuffer; void *pDeserBuffer; - const NvU32 interface_id = (DRF_VAL(XXXX, _CTRL_CMD, _CLASS, cmd) << 8) | - DRF_VAL(XXXX, _CTRL_CMD, _CATEGORY, cmd); - const NvU32 message_id = DRF_VAL(XXXX, _CTRL_CMD, _INDEX, cmd); + const NvU32 interface_id = _rmapiFinnGetInterfaceId(cmd); + const NvU32 message_id = _rmapiFinnGetMessageId(cmd); NvU32 unserializedSize = (NvU32)FinnRmApiGetUnserializedSize(interface_id, message_id); if (!pCallContext->bLocalSerialization) diff --git a/src/nvidia/src/kernel/virtualization/kernel_hostvgpudeviceapi.c b/src/nvidia/src/kernel/virtualization/kernel_hostvgpudeviceapi.c index e6c259d74..f30bf59d4 100644 --- a/src/nvidia/src/kernel/virtualization/kernel_hostvgpudeviceapi.c +++ b/src/nvidia/src/kernel/virtualization/kernel_hostvgpudeviceapi.c @@ -1011,7 +1011,6 @@ kernelhostvgpudeviceapiCtrlCmdBootloadVgpuTask_IMPL goto done; } - pBootloadParams->initTaskLogBuffOffset = pParams->initTaskLogBuffOffset + pBootloadParams->pluginHeapMemoryPhysAddr; pBootloadParams->initTaskLogBuffSize = pParams->initTaskLogBuffSize; @@ -1021,6 +1020,9 @@ kernelhostvgpudeviceapiCtrlCmdBootloadVgpuTask_IMPL pBootloadParams->kernelLogBuffOffset = pParams->kernelLogBuffOffset + pBootloadParams->pluginHeapMemoryPhysAddr; pBootloadParams->kernelLogBuffSize = pParams->kernelLogBuffSize; + pBootloadParams->initTaskLogBuffSize = pParams->initTaskLogBuffSize; + pBootloadParams->vgpuTaskLogBuffSize = pParams->vgpuTaskLogBuffSize; + pBootloadParams->kernelLogBuffSize = pParams->kernelLogBuffSize; NV_CHECK_OK_OR_GOTO(status, LEVEL_ERROR, diff --git a/src/nvidia/src/libraries/resserv/src/rs_resource.c b/src/nvidia/src/libraries/resserv/src/rs_resource.c index 8bc865f36..d131aaf17 100644 --- a/src/nvidia/src/libraries/resserv/src/rs_resource.c +++ b/src/nvidia/src/libraries/resserv/src/rs_resource.c @@ -29,6 +29,7 @@ #include "resserv/rs_client.h" #include "resserv/rs_server.h" + #if !(RS_STANDALONE) #include "os/os.h" #endif diff --git a/src/nvidia/src/libraries/resserv/src/rs_server.c b/src/nvidia/src/libraries/resserv/src/rs_server.c index 1e61974b5..af84eae21 100644 --- a/src/nvidia/src/libraries/resserv/src/rs_server.c +++ b/src/nvidia/src/libraries/resserv/src/rs_server.c @@ -2180,6 +2180,9 @@ done: return status; } +#if !RS_STANDALONE +#endif + NV_STATUS serverInterMap ( @@ -2285,6 +2288,7 @@ serverInterMap pMapping->pMemDesc = pParams->pMemDesc; done: + serverInterMap_Epilogue(pServer, pParams, &releaseFlags); if (bRestoreCallContext) diff --git a/version.mk b/version.mk index 6025960e8..f0b47689a 100644 --- a/version.mk +++ b/version.mk @@ -1,5 +1,5 @@ -NVIDIA_VERSION = 595.80 -NVIDIA_NVID_VERSION = 595.80 +NVIDIA_VERSION = 595.84 +NVIDIA_NVID_VERSION = 595.84 NVIDIA_NVID_EXTRA = # This file.