From 056f62dd9995067d1ed4845a5d5e7ab65fba84e3 Mon Sep 17 00:00:00 2001 From: Hilton Chain Date: Mon, 13 Apr 2026 16:54:27 +0800 Subject: nongnu: nvidia-module-open: Fix DSC rainbow static artifacts on Bigscreen Beyond VR headset. This commit applies patch from . * nongnu/packages/patches/nvidia-module-open-bsb-dsc-fix.patch: New file. * nongnu/packages/nvidia.scm (nvidia-module-open-580, nvidia-module-open-590) (nvidia-module-open-595, nvidia-module-open-beta): Apply it. --- nongnu/packages/nvidia.scm | 10 +- .../patches/nvidia-module-open-bsb-dsc-fix.patch | 116 +++++++++++++++++++++ 2 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 nongnu/packages/patches/nvidia-module-open-bsb-dsc-fix.patch (limited to 'nongnu/packages') diff --git a/nongnu/packages/nvidia.scm b/nongnu/packages/nvidia.scm index ecce310..86e26ea 100644 --- a/nongnu/packages/nvidia.scm +++ b/nongnu/packages/nvidia.scm @@ -1025,7 +1025,8 @@ driver."))) (base32 "01nq1hmb0kcd7wx38z5a1ivc6r1z3vbwp1zcyz0wijvanhnvrpmz")) (patches - (nongnu-patches "nvidia-module-open-add-ibt-support.patch")))) + (nongnu-patches "nvidia-module-open-add-ibt-support.patch" + "nvidia-module-open-bsb-dsc-fix.patch")))) (build-system linux-module-build-system) (arguments (list @@ -1075,6 +1076,7 @@ NVIDIA driver.") "13izbl0npxc6mxaq7123sj7cqksqwcha8fgsgj2dphdk1dz8fh44")) (patches (nongnu-patches "nvidia-module-open-add-ibt-support.patch" + "nvidia-module-open-bsb-dsc-fix.patch" "nvidia-module-open-fix-linux-6.19.patch")))) (synopsis "Proprietary NVIDIA driver (open source kernel modules), new feature branch"))) @@ -1094,7 +1096,8 @@ NVIDIA driver.") (base32 "0zz2297icklbjk4301vahsfkxdznbp48f0yxvf972c8w7p4wkfz8")) (patches - (nongnu-patches "nvidia-module-open-add-ibt-support.patch")))) + (nongnu-patches "nvidia-module-open-add-ibt-support.patch" + "nvidia-module-open-bsb-dsc-fix.patch")))) (synopsis "Proprietary NVIDIA driver (open source kernel modules), production branch"))) (define-public nvidia-module-open-beta @@ -1113,7 +1116,8 @@ NVIDIA driver.") (base32 "108faqi446ck42gc9q10dbl0779yagyp853phay14ahkdhi5z8xs")) (patches - (nongnu-patches "nvidia-module-open-add-ibt-support.patch")))) + (nongnu-patches "nvidia-module-open-add-ibt-support.patch" + "nvidia-module-open-bsb-dsc-fix.patch")))) (synopsis "Proprietary NVIDIA driver (open source kernel modules), beta"))) (define-public nvidia-module-open nvidia-module-open-580) diff --git a/nongnu/packages/patches/nvidia-module-open-bsb-dsc-fix.patch b/nongnu/packages/patches/nvidia-module-open-bsb-dsc-fix.patch new file mode 100644 index 0000000..26668b7 --- /dev/null +++ b/nongnu/packages/patches/nvidia-module-open-bsb-dsc-fix.patch @@ -0,0 +1,116 @@ +Source: https://github.com/triple-groove/nvidia-bsb-dsc-fix + +diff --git a/src/common/displayport/src/dp_wardatabase.cpp b/src/common/displayport/src/dp_wardatabase.cpp +index a205fab..04f1c62 100644 +--- a/src/common/displayport/src/dp_wardatabase.cpp ++++ b/src/common/displayport/src/dp_wardatabase.cpp +@@ -542,6 +542,19 @@ void Edid::applyEdidWorkArounds(NvU32 warFlag, const DpMonitorDenylistData *pDen + } + break; + ++ // Bigscreen Beyond VR headset ++ case 0x2709: ++ if (ProductID == 0x1234) ++ { ++ // ++ // The Bigscreen Beyond connects via a link box (DP -> optical). ++ // Force 4 lanes HBR2 to ensure sufficient bandwidth. ++ // ++ this->WARFlags.forceMaxLinkConfig = true; ++ DP_PRINTF(DP_NOTICE, "DP-WAR> Force maximum link config for Bigscreen Beyond VR headset."); ++ } ++ break; ++ + // CMN + case 0xAE0D: + if (ProductID == 0x1747) +diff --git a/src/common/modeset/timing/nvt_dsc_pps.c b/src/common/modeset/timing/nvt_dsc_pps.c +index 0f6ba54..94e33b4 100644 +--- a/src/common/modeset/timing/nvt_dsc_pps.c ++++ b/src/common/modeset/timing/nvt_dsc_pps.c +@@ -191,12 +191,12 @@ static const NvU8 minqp444_8b[15][37]={ + ,{ 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0} + ,{ 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} + ,{ 5, 5, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0} +- ,{ 6, 5, 5, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0} ++ ,{ 6, 5, 5, 4, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0} // [9] col4: 4->3 (VESA DSC 1.1) + ,{ 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0} + ,{ 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0} + ,{ 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0} +- ,{ 9, 9, 9, 9, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1} +- ,{14,14,13,13,12,12,12,12,11,11,10,10,10,10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3} ++ ,{ 9, 9, 9, 9, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1} // [13] col4: 8->7 (VESA DSC 1.1) ++ ,{14,14,13,13,13,12,12,12,11,11,10,10,10,10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3} // [14] col4: 12->13 (VESA DSC 1.1) + }; + + static const NvU8 maxqp444_8b[15][37]={ +@@ -210,11 +210,11 @@ static const NvU8 maxqp444_8b[15][37]={ + ,{10,10, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, 6, 5, 5, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1} + ,{11,11,10,10, 9, 9, 9, 9, 9, 9, 8, 8, 8, 7, 7, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1} + ,{12,11,11,10,10,10, 9, 9, 9, 9, 9, 9, 9, 8, 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1} +- ,{12,12,11,11,10,10,10,10,10,10, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1} +- ,{12,12,12,11,11,11,10,10,10,10, 9, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1} +- ,{12,12,12,12,11,11,11,11,11,10,10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1} +- ,{13,13,13,13,12,12,11,11,11,11,10,10,10,10, 9, 9, 8, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2} +- ,{15,15,14,14,13,13,13,13,12,12,11,11,11,11,10,10,10, 9, 9, 9, 8, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 5, 5, 4, 4, 4, 4} ++ ,{12,12,11,11,11,10,10,10,10,10, 9, 9, 9, 8, 8, 7, 7, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1} // [10] col4: 10->11 (VESA DSC 1.1) ++ ,{12,12,12,11,12,11,10,10,10,10, 9, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1} // [11] col4: 11->12 (VESA DSC 1.1) ++ ,{12,12,12,12,13,11,11,11,11,10,10, 9, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 5, 5, 5, 5, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1} // [12] col4: 11->13 (VESA DSC 1.1) ++ ,{13,13,13,13,13,12,11,11,11,11,10,10,10,10, 9, 9, 8, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 5, 4, 4, 4, 4, 3, 3, 2, 2, 2} // [13] col4: 12->13 (VESA DSC 1.1) ++ ,{15,15,14,14,15,13,13,13,12,12,11,11,11,11,10,10,10, 9, 9, 9, 8, 8, 8, 8, 7, 7, 6, 6, 6, 6, 5, 5, 5, 4, 4, 4, 4} // [14] col4: 13->15 (VESA DSC 1.1) + }; + + static const NvU8 minqp444_10b[15][49]={ +@@ -938,7 +938,7 @@ DSC_PpsCalcRcParam + //else + { + const NvU32 ofs_und6[] = { 0, -2, -2, -4, -6, -6, -8, -8, -8, -10, -10, -12, -12, -12, -12 }; +- const NvU32 ofs_und8[] = { 2, 0, 0, -2, -4, -6, -8, -8, -8, -10, -10, -10, -12, -12, -12 }; ++ const NvU32 ofs_und8[] = { 2, 0, 0, -2, -4, -6, -8, -8, -8, -10, -10, -12, -12, -12, -12 }; // [11]: -10->-12 (VESA DSC 1.1) + const NvU32 ofs_und12[] = { 2, 0, 0, -2, -4, -6, -8, -8, -8, -10, -10, -10, -12, -12, -12 }; + const NvU32 ofs_und15[] = { 10, 8, 6, 4, 2, 0, -2, -4, -6, -8, -10, -10, -12, -12, -12 }; + +diff --git a/src/nvidia-modeset/src/nvkms-evo3.c b/src/nvidia-modeset/src/nvkms-evo3.c +index 27e533a..3b76261 100644 +--- a/src/nvidia-modeset/src/nvkms-evo3.c ++++ b/src/nvidia-modeset/src/nvkms-evo3.c +@@ -7816,10 +7816,13 @@ static void EvoSetDpDscParams(const NVDispEvoRec *pDispEvo, + + nvAssert(pDscInfo->type == NV_DSC_INFO_EVO_TYPE_DP); + +- // XXX: I'm pretty sure that this is wrong. +- // BitsPerPixelx16 is something like (24 * 16) = 384, and 2 << (384 - 8) is +- // an insanely large number. +- flatnessDetThresh = (2 << (pDscInfo->dp.bitsPerPixelX16 - 8)); /* ??? */ ++ // Fix: use bits_per_component from PPS byte 3 [7:4], not bitsPerPixelX16. ++ // DSC spec: flatness_det_thresh = 2 << (bpc - 8). ++ // PPS DW[0] packs bytes [3][2][1][0] as [31:24][23:16][15:8][7:0]. ++ { ++ NvU32 bpc = (pDscInfo->dp.pps[0] >> 28) & 0xF; // PPS byte 3 bits[7:4] ++ flatnessDetThresh = (bpc >= 8) ? (2 << (bpc - 8)) : 2; ++ } + + nvAssert((pDscInfo->dp.dscMode == NV_DSC_EVO_MODE_DUAL) || + (pDscInfo->dp.dscMode == NV_DSC_EVO_MODE_SINGLE)); +diff --git a/src/nvidia-modeset/src/nvkms-evo4.c b/src/nvidia-modeset/src/nvkms-evo4.c +index 3159086..bd498a5 100644 +--- a/src/nvidia-modeset/src/nvkms-evo4.c ++++ b/src/nvidia-modeset/src/nvkms-evo4.c +@@ -1409,10 +1409,13 @@ static void EvoSetDpDscParamsC9(const NVDispEvoRec *pDispEvo, + + nvAssert(pDscInfo->type == NV_DSC_INFO_EVO_TYPE_DP); + +- // XXX: I'm pretty sure that this is wrong. +- // BitsPerPixelx16 is something like (24 * 16) = 384, and 2 << (384 - 8) is +- // an insanely large number. +- flatnessDetThresh = (2 << (pDscInfo->dp.bitsPerPixelX16 - 8)); /* ??? */ ++ // Fix: use bits_per_component from PPS byte 3 [7:4], not bitsPerPixelX16. ++ // DSC spec: flatness_det_thresh = 2 << (bpc - 8). ++ // PPS DW[0] packs bytes [3][2][1][0] as [31:24][23:16][15:8][7:0]. ++ { ++ NvU32 bpc = (pDscInfo->dp.pps[0] >> 28) & 0xF; ++ flatnessDetThresh = (bpc >= 8) ? (2 << (bpc - 8)) : 2; ++ } + + nvAssert((pDscInfo->dp.dscMode == NV_DSC_EVO_MODE_DUAL) || + (pDscInfo->dp.dscMode == NV_DSC_EVO_MODE_SINGLE)); -- cgit v1.3