diff --git a/README.md b/README.md index 423be8d..ec74e57 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 540.4.0. +version 540.5.0. ## 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 -540.4.0 driver release. This can be achieved by installing +540.5.0 driver release. This can be achieved by installing the NVIDIA GPU driver from the .run file using the `--no-kernel-modules` option. E.g., @@ -180,7 +180,7 @@ software applications. ## Compatible GPUs The open-gpu-kernel-modules can be used on any Turing or later GPU -(see the table below). However, in the 540.4.0 release, +(see the table below). However, in the 540.5.0 release, GeForce and Workstation support is still considered alpha-quality. To enable use of the open kernel modules on GeForce and Workstation GPUs, @@ -188,7 +188,7 @@ set the "NVreg_OpenRmEnableUnsupportedGpus" nvidia.ko kernel module parameter to 1. For more details, see the NVIDIA GPU driver end user README here: -https://us.download.nvidia.com/XFree86/Linux-x86_64/540.4.0/README/kernel_open.html +https://us.download.nvidia.com/XFree86/Linux-x86_64/540.5.0/README/kernel_open.html In the below table, if three IDs are listed, the first is the PCI Device ID, the second is the PCI Subsystem Vendor ID, and the third is the PCI diff --git a/commitFile.txt b/commitFile.txt index bf77eea..de8150c 100644 --- a/commitFile.txt +++ b/commitFile.txt @@ -5,12 +5,12 @@ d13779dbbab1c776db15f462cd46b29f2c0f8c7c - Makefile 5728867ce2e96b63b29367be6aa1c0e47bcafc8f - SECURITY.md 6b73bf6a534ddc0f64e8ba88739381c3b7fb4b5c - nv-compiler.sh ac7f91dfb6c5c469d2d8196c6baebe46ede5aee0 - CHANGELOG.md -fe4e34f7f517ffe6976a020c22fefcf24ec0c211 - README.md +fb30136834a37c3b273df8352db5bcc1f46b3d7d - README.md ec5f1eb408e0b650158e0310fb1ddd8e9b323a6f - CONTRIBUTING.md af3ee56442f16029cb9b13537477c384226b22fc - CODE_OF_CONDUCT.md -41123f5c3015f9a14cf35b7c75c5b720f5fbed07 - kernel-open/Kbuild +e3d628e13e13e8f4b886c88d8b22adfbf3217a54 - kernel-open/Kbuild 4f4410c3c8db46e5a98d7a35f7d909a49de6cb43 - kernel-open/Makefile -ee6138c2662d06babf6cf3239383bbec0cb61325 - kernel-open/conftest.sh +3f1d791899ab2db1d55cc73ec56fc11c9bef67cb - kernel-open/conftest.sh 0b1508742a1c5a04b6c3a4be1b48b506f4180848 - kernel-open/dkms.conf 19a5da412ce1557b721b8550a4a80196f6162ba6 - kernel-open/common/inc/os_dsi_panel_props.h 4750735d6f3b334499c81d499a06a654a052713d - kernel-open/common/inc/nv-caps.h @@ -173,7 +173,7 @@ eb98761cdc99141ad937966e5533c57189db376a - kernel-open/nvidia-drm/nvidia-drm-fen 2529ef49fee3a01717aaabea530d94017d5c31cc - kernel-open/nvidia-drm/nvidia-drm-helper.h 2a48c9643c836a1b0a0c133afa9439b4f5ce0feb - kernel-open/nvidia-drm/nvidia-drm-os-interface.h b83e4c3ba825a75233eaedb0ac33feed74a53ab7 - kernel-open/nvidia-drm/nvidia-drm-gem-user-memory.c -de9bb1ee16ac6e3718844280f67550ccfd18ec22 - kernel-open/nvidia-drm/nvidia-drm-drv.c +21c629706f242599f6a81380155dd00bb0d994e7 - kernel-open/nvidia-drm/nvidia-drm-drv.c 203295380efca7e422746805437b05ce22505424 - kernel-open/nvidia-drm/nvidia-drm-gem.c cd987993109f7c020e296bf397905190a866d4ff - kernel-open/nvidia-drm/nvidia-drm-encoder.c 8bedc7374d7a43250e49fb09139c511b489d45e3 - kernel-open/nvidia-drm/nv-pci-table.h @@ -181,16 +181,16 @@ cd987993109f7c020e296bf397905190a866d4ff - kernel-open/nvidia-drm/nvidia-drm-enc ec550cba2bebff2c5054b6e12fc43d81e37ade48 - kernel-open/nvidia-drm/nvidia-dma-fence-helper.h e362c64aa67b47becdbf5c8ba2a245e135adeedf - kernel-open/nvidia-drm/nvidia-drm-gem-dma-buf.c 492a1b0b02dcd2d60f05ac670daeeddcaa4b0da5 - kernel-open/nvidia-drm/nvidia-dma-resv-helper.h -dbfbce802ea046ea776603eedf9aab4155e8c6da - kernel-open/nvidia-drm/nvidia-drm-connector.c +05d56aa5e69b2332dba36ed15703865533976681 - kernel-open/nvidia-drm/nvidia-drm-connector.c 97b6c56b1407de976898e0a8b5a8f38a5211f8bb - kernel-open/nvidia-drm/nvidia-drm-format.h 62b38738a83f67d0ea336cfadff1db5a5eaa8521 - kernel-open/nvidia-drm/nvidia-drm-priv.h deb00fa4d1de972d93d8e72355d81ba87044c86f - kernel-open/nvidia-drm/nvidia-drm-fence.c 8a8b431f45bd0fe477759c1527d792cb9a1fa3f5 - kernel-open/nvidia-drm/nvidia-drm-gem.h 1b7c0e4bc236101b930a9a95a622c0031c56978d - kernel-open/nvidia-drm/nvidia-drm-modeset.h -74530bdbcb5a40ba47687c9d2fcdd7baaf3e3863 - kernel-open/nvidia-drm/nvidia-drm.Kbuild +fa3bcbf2d4b25dc6e2337bcd9d04b0c1413be3da - kernel-open/nvidia-drm/nvidia-drm.Kbuild 40b5613d1fbbe6b74bff67a5d07974ad321f75f0 - kernel-open/nvidia-drm/nvidia-drm-utils.h 8da06bd922850e840c94ed380e3b92c63aecbf70 - kernel-open/nvidia-drm/nvidia-drm-fb.c -e8df2e0d44b9c0b938248112003cb534eca239fd - kernel-open/nvidia-drm/nvidia-drm-crtc.c +71560a9be3b3c2cd1c85f5d781524aadb6869eed - kernel-open/nvidia-drm/nvidia-drm-crtc.c 372ea4c8e7bbc0bdeb899e6f163c8f20c663ad22 - kernel-open/nvidia-modeset/nvidia-modeset-os-interface.h e02497b93f0f13d8e1624ff2effe417ec63bc2b0 - kernel-open/nvidia-modeset/nvidia-modeset-linux.c 0a0650835e8835d32418891a2fd25031f5d8770e - kernel-open/nvidia-modeset/nvkms.h @@ -492,7 +492,7 @@ e670ffdd499c13e5025aceae5541426ab2ab0925 - src/common/inc/gps.h 5257e84f2048b01258c78cec70987f158f6b0c44 - src/common/inc/nvlog_inc.h b58ed1b4372a5c84d5f3755b7090b196179a2729 - src/common/inc/nv_speculation_barrier.h d877f4b99ae7d18cc5c78b85e89c0a7e3f3e8418 - src/common/inc/nvPNPVendorIds.h -cd9253d1a83b171ca5aa514bc24ac87f2f9af961 - src/common/inc/nvUnixVersion.h +6e212afa22e8348eedf1b15bd4bd7f7fd698c3b2 - src/common/inc/nvUnixVersion.h 1fc95a17ddb619570063f6707d6a395684bfa884 - src/common/inc/displayport/dpcd20.h 90998aac8685a403fdec9ff875f7436373d76f71 - src/common/inc/displayport/dpcd14.h 669268ea1660e9e5b876f90da003599ba01356bb - src/common/inc/displayport/displayport.h @@ -538,7 +538,7 @@ cd9d3f57a9212166eba32b25cebc866a8d5bc026 - src/common/displayport/inc/dp_qse.h 72711e7f688ee25510fca0e7eef6a4a99bb0aff3 - src/common/displayport/inc/dp_linkconfig.h e02e5621eaea52a2266a86dcd587f4714680caf4 - src/common/displayport/inc/dp_linkedlist.h 2067e2ca3b86014c3e6dfc51d6574d87ae12d907 - src/common/displayport/inc/dp_timer.h -c953ceae3005d389fb0873d8c3cc3783c7b2d885 - src/common/displayport/inc/dp_connectorimpl.h +5a0d4df6d025eb24ae8af408416378d1e9e2f17a - src/common/displayport/inc/dp_connectorimpl.h 4a445c98d9541a53f77af2ffa154501793c01fe4 - src/common/displayport/inc/dp_connector.h 660ba146cf1242947eac3e2ded50ef4387ca8f35 - src/common/displayport/inc/dp_messagecodings.h df11366a5bcfb641025f12cddf9b5e8c2ed008de - src/common/displayport/inc/dp_watermark.h @@ -550,7 +550,7 @@ d199166ebfe00628b9c4894a97c3bb9f09d355e5 - src/common/displayport/src/dp_message aa2e56f6c66bf91c2b4a6030de2d29480f69710e - src/common/displayport/src/dp_wardatabase.cpp de264916d0e3e873a4c624f237ea228469d0a980 - src/common/displayport/src/dp_watermark.cpp e874ffeaeb6deec57605bf91eaa2af116a9762bd - src/common/displayport/src/dp_bitstream.cpp -f3d79cc73199a2250ac8219f0a696512f4e67d63 - src/common/displayport/src/dp_evoadapter.cpp +6b2384144feb749a974ca794ff74031e13ed6610 - src/common/displayport/src/dp_evoadapter.cpp 56ee9318a7b51a04baa1d25d7d9a798c733dc1bc - src/common/displayport/src/dp_vrr.cpp d991afdb694634e9df756184b5951739fc3fd0ab - src/common/displayport/src/dp_auxretry.cpp 554e6b7dadbb68ac0f3d2e368ca3fd90832ea254 - src/common/displayport/src/dp_discovery.cpp @@ -558,12 +558,12 @@ d991afdb694634e9df756184b5951739fc3fd0ab - src/common/displayport/src/dp_auxretr 719d2ddbfb8555636496cb5dd74ee6776059db92 - src/common/displayport/src/dp_timer.cpp 1923346b4f1209a8ceaf30d240f1b05717149be4 - src/common/displayport/src/dp_deviceimpl.cpp 98cec6b663cf630c789e9823675cbb4948e1ba5e - src/common/displayport/src/dp_edid.cpp -6a27fd2443690afb573116c13d3f976348dee298 - src/common/displayport/src/dp_groupimpl.cpp +9fc1b9ae59805ea96879de1960149398bfe8dccd - src/common/displayport/src/dp_groupimpl.cpp e10ed809c1ddb7e67f0d7caf88802f291c8567ef - src/common/displayport/src/dp_qse.cpp 4803cde0fffcf89fed46d6deaeba5c96c669a908 - src/common/displayport/src/dp_messageheader.cpp 9f31213ab8037d7bb18c96a67d2630d61546544a - src/common/displayport/src/dp_mst_edid.cpp f56f92e32710b0342805b785d34ba1a9f2a54ed3 - src/common/displayport/src/dp_guid.cpp -b487eed6e639a1aa485b06255beef61e112f24b3 - src/common/displayport/src/dp_connectorimpl.cpp +656cf635f5268df416d746378d25e773bde24758 - src/common/displayport/src/dp_connectorimpl.cpp f83b3c17e9f26651f12c8835a682abdd66aed3a2 - src/common/displayport/src/dp_splitter.cpp 1543bbaba8f3e149239cf44be3c0d080c624d5ba - src/common/displayport/src/dp_buffer.cpp fa4f4869d3d63c0180f30ae3736600a6627284c6 - src/common/displayport/src/dp_merger.cpp @@ -1232,9 +1232,9 @@ ce42ceac4c4cf9d249d66ab57ae2f435cd9623fc - src/nvidia-modeset/kapi/src/nvkms-kap 5f559582336ab0e252f25039d43b114a6630758c - src/nvidia-modeset/src/nvkms-evo.c 7262999494048226f8a94492899609fbecd729d8 - src/nvidia-modeset/src/nvkms-hw-flip.c 6a35b80a6995777dc9500cac9659e6f0f0c12d23 - src/nvidia-modeset/src/nvkms-cursor3.c -250313f03ab04c90a5018c357f9a2d3ebbcd8961 - src/nvidia-modeset/src/nvkms-rm.c +7326c2e84f81abbe6d8df0ce2632a83682fbd5dc - src/nvidia-modeset/src/nvkms-rm.c 30ad7839985dea46e6b6d43499210a3056da51ad - src/nvidia-modeset/src/nvkms-utils-flip.c -6a84fae64ca00bc8b5d9ae75c291140f23d8fd4d - src/nvidia-modeset/src/nvkms-evo3.c +2ff0dded5029b1284268ee9358f576828d073285 - src/nvidia-modeset/src/nvkms-evo3.c 0343d2f40978b0780b0dae54b22f366f723ff08e - src/nvidia-modeset/src/nvkms-flip.c 3e723edf2a0a2f4f93032feb4aeaaf7fd0acddfa - src/nvidia-modeset/src/g_nvkms-evo-states.c 761c8540278a1ffb9fe4aa0adb1b4ee95524787a - src/nvidia-modeset/src/nvkms-hal.c @@ -1244,7 +1244,7 @@ bd2e4a6102432d4ac1faf92b5d3db29e9e3cfafc - src/nvidia-modeset/src/nvkms-utils.c 9a8746ee4a4e772b8ac13f06dc0de8a250fdb4c7 - src/nvidia-modeset/src/nvkms-ctxdma.c e7a717712eb5f710df2c735013f27b0c03ae276c - src/nvidia-modeset/src/nvkms-hdmi.c 2fa9d9b3cbeeb9406f2dd51a4f4a5d53844a31c9 - src/nvidia-modeset/src/nvkms-dpy.c -97e0db0542c5e86b31d2238e09a4e5a695ccbebc - src/nvidia-modeset/src/nvkms.c +f92ae2b0ba77cf14cbe966a0c66fe6ca02a7e73e - src/nvidia-modeset/src/nvkms.c dff88ceaf95239b51b60af915f92e389bb844425 - src/nvidia-modeset/src/nvkms-cursor.c 2b304663f2a005b5ccdecfafb69a3407f2feeb18 - src/nvidia-modeset/src/nvkms-evo2.c 94e9c19b7b6a5e56fd46b0885e7dd6fe698fe2df - src/nvidia-modeset/src/nvkms-prealloc.c @@ -1269,7 +1269,7 @@ f96cd982b4c05351faa31d04ac30d6fa7c866bcb - src/nvidia-modeset/src/dp/nvdp-timer. a90b2c295271631b4c3abe6afb8dfd92d6b429c8 - src/nvidia-modeset/src/dp/nvdp-connector.cpp 535ce9f743903eb83a341eef1be812f4e4b50887 - src/nvidia-modeset/src/dp/nvdp-evo-interface.cpp c19775aebdaaaee3500378d47af6ff0b8eb486b8 - src/nvidia-modeset/src/dp/nvdp-device.cpp -a2a4b7063fa903cc434163ebceb7c8d48f703c33 - src/nvidia-modeset/src/dp/nvdp-connector-event-sink.cpp +98046832ecc2cad21e727fecf2b9626dd212d95c - src/nvidia-modeset/src/dp/nvdp-connector-event-sink.cpp 51af3c1ee6b74ee0c9add3fb7d50cbc502980789 - src/nvidia-modeset/src/dp/nvdp-evo-interface.hpp 110ac212ee8832c3fa3c4f45d6d33eed0301e992 - src/nvidia-modeset/src/dp/nvdp-host.cpp 69fed95ab3954dd5cb26590d02cd8ba09cdff1ac - src/nvidia-modeset/src/dp/nvdp-connector-event-sink.hpp diff --git a/kernel-open/Kbuild b/kernel-open/Kbuild index fa906d3..64328f1 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-error -Wno-format-extra-args EXTRA_CFLAGS += -D__KERNEL__ -DMODULE -DNVRM -EXTRA_CFLAGS += -DNV_VERSION_STRING=\"540.4.0\" +EXTRA_CFLAGS += -DNV_VERSION_STRING=\"540.5.0\" ifneq ($(SYSSRCHOST1X),) EXTRA_CFLAGS += -I$(SYSSRCHOST1X) @@ -212,6 +212,8 @@ $(obj)/conftest/patches.h: $(NV_CONFTEST_SCRIPT) # corresponding #define will be generated in conftest/headers.h. NV_HEADER_PRESENCE_TESTS = \ asm/system.h \ + drm/display/drm_hdcp.h \ + drm/display/drm_hdcp_helper.h \ drm/drmP.h \ drm/drm_aperture.h \ drm/drm_auth.h \ diff --git a/kernel-open/conftest.sh b/kernel-open/conftest.sh index 6d106be..61ac17d 100644 --- a/kernel-open/conftest.sh +++ b/kernel-open/conftest.sh @@ -1390,6 +1390,23 @@ compile_test() { compile_check_conftest "$CODE" "NV_DRM_DEV_UNREF_PRESENT" "" "functions" ;; + drm_sysfs_connector_property_event) + # + # Determine if drm_sysfs_connector_property_event() is present. + # + # Commit 0cf8d292ba5e ("drm/sysfs: rename drm_sysfs_connector_status_event()") + # renamed drm_sysfs_connector_status_event() to + # drm_sysfs_connector_property_event() in Linux v6.5. + # + CODE=" + #include + void conftest_drm_sysfs_connector_property_event(void) { + drm_sysfs_connector_property_event(); + }" + + compile_check_conftest "$CODE" "NV_DRM_SYSFS_CONNECTOR_PROPERTY_EVENT_PRESENT" "" "functions" + ;; + pde_data) # # Determine if the pde_data() function is present. diff --git a/kernel-open/nvidia-drm/nvidia-drm-connector.c b/kernel-open/nvidia-drm/nvidia-drm-connector.c index cb86b77..095563b 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-connector.c +++ b/kernel-open/nvidia-drm/nvidia-drm-connector.c @@ -45,7 +45,14 @@ #include #include +#if defined(NV_DRM_DISPLAY_DRM_HDCP_HELPER_H_PRESENT) +#include +#elif defined(NV_DRM_DISPLAY_DRM_HDCP_H_PRESENT) +#include +#else #include +#endif + #include static void nv_drm_connector_destroy(struct drm_connector *connector) @@ -786,8 +793,13 @@ int nv_drm_connector_update_topology_property(struct nv_drm_connector *nv_connec &connector->base, nv_dev->nv_hdcp_topology_property); // Generate uevent on cp property when topology is updated +#if defined(NV_DRM_SYSFS_CONNECTOR_PROPERTY_EVENT_PRESENT) + drm_sysfs_connector_property_event(connector, + dev->mode_config.content_protection_property); +#else drm_sysfs_connector_status_event(connector, dev->mode_config.content_protection_property); +#endif return ret; } diff --git a/kernel-open/nvidia-drm/nvidia-drm-crtc.c b/kernel-open/nvidia-drm/nvidia-drm-crtc.c index 1b908c5..69edc68 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-crtc.c +++ b/kernel-open/nvidia-drm/nvidia-drm-crtc.c @@ -625,7 +625,7 @@ static int nv_drm_plane_atomic_check(struct drm_plane *plane, } #if defined(NV_DRM_COLOR_MGMT_AVAILABLE) - if (crtc_state->color_mgmt_changed) { + if (crtc_state->color_mgmt_changed || ((plane->state->crtc != plane_state->crtc))) { /* * According to the comment in the Linux kernel's * drivers/gpu/drm/drm_color_mgmt.c, if this property is NULL, diff --git a/kernel-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c index 28c732d..87a4acd 100644 --- a/kernel-open/nvidia-drm/nvidia-drm-drv.c +++ b/kernel-open/nvidia-drm/nvidia-drm-drv.c @@ -1780,6 +1780,10 @@ static const struct file_operations nv_drm_fops = { .read = drm_read, .llseek = noop_llseek, + +#if defined(FOP_UNSIGNED_OFFSET) + .fop_flags = FOP_UNSIGNED_OFFSET, +#endif }; static const struct drm_ioctl_desc nv_drm_ioctls[] = { diff --git a/kernel-open/nvidia-drm/nvidia-drm.Kbuild b/kernel-open/nvidia-drm/nvidia-drm.Kbuild index ebf2fa6..f239dc3 100644 --- a/kernel-open/nvidia-drm/nvidia-drm.Kbuild +++ b/kernel-open/nvidia-drm/nvidia-drm.Kbuild @@ -89,6 +89,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_aperture_remove_conflicting_pci_frameb NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_fbdev_generic_setup NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_helper_crtc_enable_color_mgmt NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_crtc_enable_color_mgmt +NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_sysfs_connector_property_event NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_present NV_CONFTEST_TYPE_COMPILE_TESTS += drm_bus_has_bus_type diff --git a/push_info.txt b/push_info.txt index 8fd8f9a..ca815d7 100644 --- a/push_info.txt +++ b/push_info.txt @@ -1 +1 @@ -rel-36_eng_2025-02-28 +rel-36_eng_2025-12-05 diff --git a/src/common/displayport/inc/dp_connectorimpl.h b/src/common/displayport/inc/dp_connectorimpl.h index 4b2e9f8..34ee3a2 100644 --- a/src/common/displayport/inc/dp_connectorimpl.h +++ b/src/common/displayport/inc/dp_connectorimpl.h @@ -565,6 +565,7 @@ namespace DisplayPort void freeTimeslice(GroupImpl * targetGroup); void flushTimeslotsToHardware(); void hdcpRenegotiate(NvU64 cN, NvU64 cKsv); + void hdcpActiveGroupsSetECF(); bool getHDCPAbortCodesDP12(NvU32 &hdcpAbortCodesDP12); bool getOuiSink(unsigned &ouiId, char * modelName, size_t modelNameBufferSize, NvU8 & chipRevision); bool hdcpValidateKsv(const NvU8 *ksv, NvU32 Size); diff --git a/src/common/displayport/src/dp_connectorimpl.cpp b/src/common/displayport/src/dp_connectorimpl.cpp index 94919dd..7954e66 100644 --- a/src/common/displayport/src/dp_connectorimpl.cpp +++ b/src/common/displayport/src/dp_connectorimpl.cpp @@ -2141,6 +2141,24 @@ void ConnectorImpl::releaseLinkHandsOff() assessLink(); } +void ConnectorImpl::hdcpActiveGroupsSetECF() +{ + NvU64 ecf = 0x0; + // Set the ECF for the groups which are already active. + for (ListElement *i = this->activeGroups.begin(); i != this->activeGroups.end(); i = i->next) + { + GroupImpl * group = (GroupImpl *)i; + if (group->hdcpEnabled) + { + NvU64 countOnes = (((NvU64)1) << group->timeslot.count) - 1; + NvU64 mask = countOnes << group->timeslot.begin; + ecf |= mask; + } + } + // Restore the ECF and trigger ACT + main->configureAndTriggerECF(ecf); +} + // // Timer callback for event management // Uses: fireEvents() @@ -2160,7 +2178,10 @@ void ConnectorImpl::expired(const void * tag) while (!(hdcpEnableTransitionGroups.isEmpty())) { GroupImpl* curStrmEncrEnblGroup = hdcpEnableTransitionGroups.pop(); - curStrmEncrEnblGroup->hdcpSetEncrypted(true); + if (!(curStrmEncrEnblGroup->hdcpEnabled)) + { + curStrmEncrEnblGroup->hdcpSetEncrypted(true, NV0073_CTRL_SPECIFIC_HDCP_CTRL_HDCP22_TYPE_1); + } } } } @@ -2169,10 +2190,12 @@ void ConnectorImpl::expired(const void * tag) if (authRetries < HDCP_AUTHENTICATION_RETRIES) { HDCPState hdcpState = {0}; + // Get hdcp state which will be !HDCP_State_Authenticated for the first entry and + // subsequently it will reflect the result of last fired configureHDCPRenegotiate main->configureHDCPGetHDCPState(hdcpState); unsigned authDelay = (hdcpState.HDCP_State_22_Capable ? - HDCP22_AUTHENTICATION_COOLDOWN : HDCP_AUTHENTICATION_COOLDOWN); + HDCP22_AUTHENTICATION_COOLDOWN * 2 : HDCP_AUTHENTICATION_COOLDOWN); // Don't fire any reauthentication if we're not done with the modeset if (!intransitionGroups.isEmpty()) @@ -2190,26 +2213,23 @@ void ConnectorImpl::expired(const void * tag) authRetries++; isHDCPAuthTriggered = true; - main->configureHDCPRenegotiate(); - main->configureHDCPGetHDCPState(hdcpState); + + // Skip configureHDCPRenegotiate if HDCP is already enabled from previous + // previous call to configureHDCPRenegotiate + if (!hdcpState.HDCP_State_Authenticated) + { + main->configureHDCPRenegotiate(); + // Get fresh hdcp state after Renegotiate as HDCP1X can be enabled + // synchronously by configureHDCPRenegotiate (HDCP2X takes time) + main->configureHDCPGetHDCPState(hdcpState); + } if (hdcpState.HDCP_State_Authenticated) { isHDCPAuthOn = true; authRetries = 0; // Set the ECF for the groups which are already active. - for (ListElement *i = this->activeGroups.begin(); i != this->activeGroups.end(); i = i->next) - { - GroupImpl * group = (GroupImpl *)i; - if (group->hdcpEnabled) - { - NvU64 countOnes = (((NvU64)1) << group->timeslot.count) - 1; - NvU64 mask = countOnes << group->timeslot.begin; - ecf |= mask; - } - } - // Restore the ECF and trigger ACT - main->configureAndTriggerECF(ecf); + hdcpActiveGroupsSetECF(); // Enable HDCP for Group if (!(bHdcpStrmEncrEnblOnlyOnDemand)) { @@ -3260,6 +3280,12 @@ void ConnectorImpl::notifyAttachEnd(bool modesetCancelled) } } + { // Set stream type and bEnforceType0Hdcp1xDS upfront before enabling hdcp with hub + bool bNeedReNegotiate = false; + main->setStreamType(currentModesetDeviceGroup->streamIndex, + NV0073_CTRL_SPECIFIC_HDCP_CTRL_HDCP22_TYPE_1, &bNeedReNegotiate); + } + // // RM has the requirement of Head being ARMed to do authentication. // Postpone the authentication until the NAE to do the authentication for DP1.2 as solution. @@ -3486,6 +3512,27 @@ void ConnectorImpl::notifyDetachEnd(bool bKeepOdAlive) if (this->policyModesetOrderMitigation && this->modesetOrderMitigation) this->modesetOrderMitigation = false; } + else // !activeGroups.isEmpty() + { + if ((this->linkUseMultistream()) && (hdcpState.HDCP_State_Authenticated)) + { + if (hdcpState.HDCP_State_22_Capable) + { + main->configureAndTriggerECF(0x0); + authRetries = 0; + isHDCPAuthOn = false; + // numOfStream changed, AKE_Init needed to change dpTypeMask + main->configureHDCPRenegotiate(); + // ReAuth, so schedule callback to check state later. + timer->queueCallback(this, &tagHDCPReauthentication, HDCP_AUTHENTICATION_COOLDOWN); + } + else + { + hdcpActiveGroupsSetECF(); + } + } + } + fireEvents(); } diff --git a/src/common/displayport/src/dp_evoadapter.cpp b/src/common/displayport/src/dp_evoadapter.cpp index 70440d9..b5cd3a4 100644 --- a/src/common/displayport/src/dp_evoadapter.cpp +++ b/src/common/displayport/src/dp_evoadapter.cpp @@ -546,7 +546,7 @@ bool EvoMainLink::setStreamType(unsigned streamIndex, NvU8 streamType, bool * bN // 1. Will it stop engaging HWDRM with this fix ? // 2. VPR blanking gets applied and blanks repeater display as well // - paramsHdcpCtrl.bEnforceType0Hdcp1xDS = (streamType == NV0073_CTRL_SPECIFIC_HDCP_CTRL_HDCP22_TYPE_1); + paramsHdcpCtrl.bEnforceType0Hdcp1xDS = NV_TRUE; paramsHdcpCtrl.cmd |= DRF_DEF(0073_CTRL_SPECIFIC, _HDCP_CTRL, _CMD, _SET_TYPE); diff --git a/src/common/displayport/src/dp_groupimpl.cpp b/src/common/displayport/src/dp_groupimpl.cpp index 5434980..4f298de 100644 --- a/src/common/displayport/src/dp_groupimpl.cpp +++ b/src/common/displayport/src/dp_groupimpl.cpp @@ -491,6 +491,16 @@ bool GroupImpl::hdcpSetEncrypted(bool encrypted, NvU8 streamType, NvBool bForce if (this->headIndex == group->headIndex) { group->hdcpEnabled = false; + { // Inform ConnectorEventSink that we have disabled HDCP on this Device + Device * d = 0; + for (d = ((Group*)this)->enumDevices(0); d != 0; d = ((Group*)this)->enumDevices(d)) + { + if (((DeviceImpl*)d)->isHDCPCap == True) + { + parent->sink->notifyHDCPCapDone(d, False); + } + } + } } } } @@ -629,6 +639,16 @@ void GroupImpl::hdcpMSTQSEandSetECF() { DP_ASSERT(group->hdcpEnabled == false); group->hdcpEnabled = true; + { // Inform ConnectorEventSink that we have enabled HDCP on this Device + Device * d = 0; + for (d = ((Group*)this)->enumDevices(0); d != 0; d = ((Group*)this)->enumDevices(d)) + { + if (((DeviceImpl*)d)->isHDCPCap == True) + { + parent->sink->notifyHDCPCapDone(d, True); + } + } + } } } } diff --git a/src/common/inc/nvUnixVersion.h b/src/common/inc/nvUnixVersion.h index d7a44a1..0e0ef79 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 "540.4.0" +#define NV_VERSION_STRING "540.5.0" #else diff --git a/src/nvidia-modeset/src/dp/nvdp-connector-event-sink.cpp b/src/nvidia-modeset/src/dp/nvdp-connector-event-sink.cpp index f6fec79..9e64ae3 100644 --- a/src/nvidia-modeset/src/dp/nvdp-connector-event-sink.cpp +++ b/src/nvidia-modeset/src/dp/nvdp-connector-event-sink.cpp @@ -552,6 +552,19 @@ void ConnectorEventSink::notifyCableOkStateChange(DisplayPort::Device *dev, void ConnectorEventSink::notifyHDCPCapDone(DisplayPort::Device *dev, bool hdcpCap) { + NVDpyEvoPtr pDpyEvo = NULL; + pDpyEvo = FindDpyByDevice(pConnectorEvo, dev); + if (pDpyEvo) + { + if (hdcpCap) + { + nvSendDpyEventEvo(pDpyEvo, NVKMS_EVENT_TYPE_DPY_CP_CHANGED); + } + else + { + nvSendDpyClearEventEvo(pDpyEvo, NVKMS_EVENT_TYPE_DPY_CP_CHANGED); + } + } } void ConnectorEventSink::notifyMCCSEvent(DisplayPort::Device *dev) diff --git a/src/nvidia-modeset/src/nvkms-evo3.c b/src/nvidia-modeset/src/nvkms-evo3.c index 6f98cb7..529ec40 100644 --- a/src/nvidia-modeset/src/nvkms-evo3.c +++ b/src/nvidia-modeset/src/nvkms-evo3.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2010-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-FileCopyrightText: Copyright (c) 2010-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: MIT * * Permission is hereby granted, free of charge, to any person obtaining a @@ -1336,7 +1336,8 @@ static void ConfigureCsc1C5(NVDevEvoPtr pDevEvo, matrix = LMSToRec2020RGB; } else if (pHeadState->colorimetry == NVKMS_OUTPUT_COLORIMETRY_BT601) { matrix = LMSToRec601RGB; - } else if (pHeadState->colorimetry == NVKMS_OUTPUT_COLORIMETRY_BT709) { + } else { + // For unsupported or default output color spaces also , use 709 matrix matrix = LMSToRec709RGB; } @@ -1486,9 +1487,15 @@ static const NvU32* EvoGetFMTMatrixC5( } else { retValue = FMTMatrix[FMT_COEFF_TYPE_REC601_YUV_12BPC_LTD_TO_RGB_16BPC_FULL]; } + } else { + // Unsupported bit depth, fail silently by defaulting to identity. + retValue = FMTMatrix[FMT_COEFF_TYPE_IDENTITY]; } break; case NVKMS_INPUT_COLORSPACE_BT709: + case NVKMS_INPUT_COLORSPACE_NONE: + default: + // Unsupported or if input color space is not set, use 709 FMT matrix. if (pFormatInfo->yuv.depthPerComponent == 8) { if (specifiedFull) { retValue = FMTMatrix[FMT_COEFF_TYPE_REC709_YUV_8BPC_FULL_TO_RGB_16BPC_FULL]; @@ -1507,6 +1514,9 @@ static const NvU32* EvoGetFMTMatrixC5( } else { retValue = FMTMatrix[FMT_COEFF_TYPE_REC709_YUV_12BPC_LTD_TO_RGB_16BPC_FULL]; } + } else { + // Unsupported bit depth, fail silently by defaulting to identity. + retValue = FMTMatrix[FMT_COEFF_TYPE_IDENTITY]; } break; case NVKMS_INPUT_COLORSPACE_BT2100_PQ: @@ -1528,11 +1538,11 @@ static const NvU32* EvoGetFMTMatrixC5( } else { retValue = FMTMatrix[FMT_COEFF_TYPE_REC2020_YUV_12BPC_LTD_TO_RGB_16BPC_FULL]; } + } else { + // Unsupported bit depth, fail silently by defaulting to identity. + retValue = FMTMatrix[FMT_COEFF_TYPE_IDENTITY]; } break; - default: - // Unsupported bit depth, fail silently by defaulting to identity. - retValue = FMTMatrix[FMT_COEFF_TYPE_IDENTITY]; } } else { // All inputs with RGB colorspace receive an identity FMT. diff --git a/src/nvidia-modeset/src/nvkms-rm.c b/src/nvidia-modeset/src/nvkms-rm.c index d1bbec9..fc5fb48 100644 --- a/src/nvidia-modeset/src/nvkms-rm.c +++ b/src/nvidia-modeset/src/nvkms-rm.c @@ -1582,7 +1582,7 @@ static void ReceiveHotplugEvent(void *arg, void *pEventDataVoid, NvU32 hEvent, nvHandleHotplugEventDeferredWork, /* callback */ arg, /* argument (this is a ref_ptr to a pDispEvo) */ 0, /* dataU32 */ - 0); + 100000 /*sleep 100 ms */); } static void ReceiveDPIRQEvent(void *arg, void *pEventDataVoid, NvU32 hEvent, diff --git a/src/nvidia-modeset/src/nvkms.c b/src/nvidia-modeset/src/nvkms.c index 33841f4..7ede343 100644 --- a/src/nvidia-modeset/src/nvkms.c +++ b/src/nvidia-modeset/src/nvkms.c @@ -2649,7 +2649,7 @@ static NvBool RegisterSurface(struct NvKmsPerOpen *pOpen, nvEvoRegisterSurface(pOpenDev->pDevEvo, pOpenDev, pParams, NvHsMapPermissionsReadOnly); - return TRUE; + return pParams->reply.surfaceHandle != 0; } diff --git a/version.mk b/version.mk index 8cfa1db..14d18d7 100644 --- a/version.mk +++ b/version.mk @@ -1,4 +1,4 @@ -NVIDIA_VERSION = 540.4.0 +NVIDIA_VERSION = 540.5.0 # This file. VERSION_MK_FILE := $(lastword $(MAKEFILE_LIST))