summaryrefslogtreecommitdiffstats
path: root/core/modules/nvidia_kernel/module.build
blob: 3c8baa8dd0708d4c69b3d20e0c804a827296438a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/bin/bash
fetch_source() {
	local url="$REQUIRED_URL_BASE/$REQUIRED_VERSION/$REQUIRED_NVIDIA"
	mkdir -p src 2>/dev/null
	cd src || perror "Could not change into src directory."
	download "$REQUIRED_URL_BASE/$REQUIRED_VERSION/README/supportedchips.html"
	download "$url"
}

build() {
	local ROOTUPPERDIR="$MODULE_WORK_DIR/rootupper"

	local NVIDIA="$MODULE_WORK_DIR/src/$REQUIRED_NVIDIA"
	local NVIDIAEXTRACTDIR="$ROOTUPPERDIR/NVIDIA"

	[ -d "$NVIDIAEXTRACTDIR" ] && rm -rf "$NVIDIAEXTRACTDIR"
	pinfo "Unpacking NVidia archive ($NVIDIA) ..."
	sh "$NVIDIA" --extract-only --target "$NVIDIAEXTRACTDIR" ||	perror "Could not extract $NVIDIA to $NVIDIAEXTRACTDIR."

	pinfo "Ready to chroot - compiling may take some time."
	pdebug "--- chroot ---------------------------------------------------------------------"
	pdebug "-                                                                              -"
	pdebug "-   Notice: This may take a while!                                             -"
	pdebug "-                                                                              -"
	pdebug "-      Please keep note the Nvidia installer _will_ complain about             -"
	pdebug "-      several warnings and errors. It will do this in any case.               -"
	pdebug "-                                                                              -"
	pdebug "-      This does _not_ mean the kernel module compilation was unsuccessful!    -"
	pdebug "-                                                                              -"
	pdebug "--------------------------------------------------------------------------------"

	
	chroot_run "$ROOTUPPERDIR" <<-EOF
	/NVIDIA/nvidia-installer --no-nouveau-check --no-network --no-backup --no-rpms --no-runlevel-check --no-distro-scripts --no-cc-version-check --no-x-check --no-precompiled-interface --silent --kernel-source-path /"$KERNEL_HEADERS_DIR"	# Do the work!
	# fake success since the installer will exit with an error due to the module not loading properly.
	exit 0
	EOF
	pinfo "chroot terminated."

	local file
	local RESULT
	local NVIDIA_MODULES="$MODULE_BUILD_DIR/lib/modules/nvidia/"
	mkdir -p "$NVIDIA_MODULES"
	pinfo "Copying kernel modules..."
	for file in nvidia.ko nvidia-uvm.ko nvidia-modeset.ko nvidia-drm.ko; do
		RESULT=$(find "$ROOTUPPERDIR/NVIDIA/kernel" -name "$file" | head -n 1)
		[ -z "$RESULT" ] && perror "Could not find built module $file in ./NVIDIA/kernel"
		pinfo "Fetching ${file}..."
		strip -g "$RESULT" || pwarning "Could not strip $file"
		cp "$RESULT" "$NVIDIA_MODULES" || perror "Could not copy $file"
	done

	rm -rf "$MODULE_BUILD_DIR/NVIDIA"

	mkdir -p "$MODULE_BUILD_DIR/drm.cfg.d"
	local drmfile="$MODULE_BUILD_DIR/drm.cfg.d/00-nvidia"
	cat > "$drmfile" <<-BLOFF
		@nvidia            acpi_ipmi nvidia/nvidia.ko nvidia/nvidia-uvm.ko nvidia/nvidia-modeset.ko nvidia/nvidia-drm.ko
		@nvidia_fallback   nouveau
BLOFF
	if ! [ -s "$MODULE_WORK_DIR/src/supportedchips.html" ]; then
		pwarning "No supportedchips.html -- using wildcard drm.cfg"
		echo "10de         @nvidia" >> "$drmfile"
	else
		local mode line name dev version
		pinfo "Creating drm.cfg"
		mode=0
		version=
		while read -r line; do
			if [[ "$line" =~ '<a name="legacy_' ]]; then
				version=$(echo "$line" | sed -r 's/^.*name="legacy_([^"]+)".*$/\1/')
				break # For now, we stop here; later on we could support legacy drivers
				# By appending $version below and then having different locations for
				# the modules, and in stage3.2 load different sqfs containers
			elif [[ "$mode" = 0 ]] && [[ "$line" =~ ^'<tr' ]]; then
				mode=1
			elif [[ "$mode" = 1 ]] && [[ "$line" =~ ^'<td' ]]; then
				mode=2
				name=$(echo "$line" | sed -r 's/^.*<td[^>]*>([^<]+)<.*$/\1/')
			elif [[ "$mode" = 2 ]] && [[ "$line" =~ ^'<td'[^'>']*'>'[0-9A-F]{4}'<' ]]; then
				mode=0
				dev=$(echo "$line" | sed -r 's/^.*<td[^>]*>([0-9A-Fa-f]{4})<.*$/\1/' | tr 'A-Z' 'a-z')
				echo "10de:$dev          @nvidia$version"
			else
				mode=0
				name=
				dev=
			fi
		done < "$MODULE_WORK_DIR/src/supportedchips.html" >> "$drmfile"
	fi

}

post_copy() {
	:
}