#!/bin/sh

set -e

sudo sed -i 's/deb$/deb deb-src/g' /etc/apt/sources.list.d/ubuntu.sources

sudo apt update
sudo apt build-dep linux linux-image-unsigned-$(uname -r)
sudo apt install libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf llvm

rm -rf kernel-patch
mkdir kernel-patch
cd kernel-patch

apt source linux-image-unsigned-6.17.0-5-generic

cat <<EOF >patch.diff
--- linux-6.17.0/drivers/gpu/drm/amd/display/dc/core/dc.c	2025-09-15 13:53:57.000000000 +0200
+++ ../kernel_shutdown_failure/linux-6.17.0/drivers/gpu/drm/amd/display/dc/core/dc.c	2025-10-18 23:29:10.918224279 +0200
@@ -5416,26 +5416,11 @@
 	return true;
 }
 
-static void clear_update_flags(struct dc_surface_update *srf_updates,
-	int surface_count, struct dc_stream_state *stream)
-{
-	int i;
-
-	if (stream)
-		stream->update_flags.raw = 0;
-
-	for (i = 0; i < surface_count; i++)
-		if (srf_updates[i].surface)
-			srf_updates[i].surface->update_flags.raw = 0;
-}
-
 bool dc_update_planes_and_stream(struct dc *dc,
 		struct dc_surface_update *srf_updates, int surface_count,
 		struct dc_stream_state *stream,
 		struct dc_stream_update *stream_update)
 {
-	bool ret = false;
-
 	dc_exit_ips_for_hw_access(dc);
 	/*
 	 * update planes and stream version 3 separates FULL and FAST updates
@@ -5452,16 +5437,10 @@
 	 * features as they are now transparent to the new sequence.
 	 */
 	if (dc->ctx->dce_version >= DCN_VERSION_4_01)
-		ret = update_planes_and_stream_v3(dc, srf_updates,
+		return update_planes_and_stream_v3(dc, srf_updates,
 				surface_count, stream, stream_update);
-	else
-		ret = update_planes_and_stream_v2(dc, srf_updates,
+	return update_planes_and_stream_v2(dc, srf_updates,
 			surface_count, stream, stream_update);
-	if (ret && (dc->ctx->dce_version >= DCN_VERSION_3_2 ||
-		dc->ctx->dce_version == DCN_VERSION_3_01))
-		clear_update_flags(srf_updates, surface_count, stream);
-
-	return ret;
 }
 
 void dc_commit_updates_for_stream(struct dc *dc,
@@ -5471,8 +5450,6 @@
 		struct dc_stream_update *stream_update,
 		struct dc_state *state)
 {
-	bool ret = false;
-
 	dc_exit_ips_for_hw_access(dc);
 	/* TODO: Since change commit sequence can have a huge impact,
 	 * we decided to only enable it for DCN3x. However, as soon as
@@ -5480,17 +5457,17 @@
 	 * the new sequence for all ASICs.
 	 */
 	if (dc->ctx->dce_version >= DCN_VERSION_4_01) {
-		ret = update_planes_and_stream_v3(dc, srf_updates, surface_count,
+		update_planes_and_stream_v3(dc, srf_updates, surface_count,
 				stream, stream_update);
-	} else if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
-		ret = update_planes_and_stream_v2(dc, srf_updates, surface_count,
+		return;
+	}
+	if (dc->ctx->dce_version >= DCN_VERSION_3_2) {
+		update_planes_and_stream_v2(dc, srf_updates, surface_count,
 				stream, stream_update);
-	} else
-		ret = update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,
+		return;
+	}
+	update_planes_and_stream_v1(dc, srf_updates, surface_count, stream,
 				stream_update, state);
-
-	if (ret && dc->ctx->dce_version >= DCN_VERSION_3_2)
-		clear_update_flags(srf_updates, surface_count, stream);
 }
 
 uint8_t dc_get_current_stream_count(struct dc *dc)
EOF

cd linux-6.17.0

patch -p1 < ../patch.diff

fakeroot debian/rules clean
fakeroot debian/rules binary-headers binary-generic binary-perarch