project-lakitu: enable NVIDIA open kernel module builds for ARM64

- add parameter for ARM64 / X86 kernel module source
- add manifest entries for ARM64 sources
- enable arm64 NVIDIA driver builds by passing C++ cross compiler to
  build
- extend utils.mk patch to ARM64 by passing target architecture values for '-m'
- include x11-drivers/nvidia-drivers-open* in lakitu-arm64 pkg list

BUG=b/349468635

Change-Id: I1b8817325eaade8e073591ecae046206373af7b9
Reviewed-on: https://cos-review.googlesource.com/c/cos/overlays/board-overlays/+/75074
Tested-by: RBE-prod-presubmit <service-269995278450@remotebuildexecution.iam.gserviceaccount.com>
Tested-by: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
Reviewed-by: Oleksandr Tymoshenko <ovt@google.com>
diff --git a/project-lakitu/virtual/feature-base-lakitu/feature-base-lakitu-1.5-r9.ebuild b/project-lakitu/virtual/feature-base-lakitu/feature-base-lakitu-1.5-r10.ebuild
similarity index 100%
rename from project-lakitu/virtual/feature-base-lakitu/feature-base-lakitu-1.5-r9.ebuild
rename to project-lakitu/virtual/feature-base-lakitu/feature-base-lakitu-1.5-r10.ebuild
diff --git a/project-lakitu/virtual/feature-base-lakitu/feature-base-lakitu-1.5.ebuild b/project-lakitu/virtual/feature-base-lakitu/feature-base-lakitu-1.5.ebuild
index 4b8d586..fd26690 100644
--- a/project-lakitu/virtual/feature-base-lakitu/feature-base-lakitu-1.5.ebuild
+++ b/project-lakitu/virtual/feature-base-lakitu/feature-base-lakitu-1.5.ebuild
@@ -139,16 +139,18 @@
 			x11-drivers/nvidia-drivers550:0=
 			x11-drivers/nvidia-drivers550:1=
 			x11-drivers/nvidia-drivers550:2=
-			x11-drivers/nvidia-drivers-open535:0=
-			x11-drivers/nvidia-drivers-open535:1=
-			x11-drivers/nvidia-drivers-open535:2=
-			x11-drivers/nvidia-drivers-open535:3=
-			x11-drivers/nvidia-drivers-open535:4=
-			x11-drivers/nvidia-drivers-open535:5=
-			x11-drivers/nvidia-drivers-open535:6=
-			x11-drivers/nvidia-drivers-open550:0=
-			x11-drivers/nvidia-drivers-open550:1=
-			x11-drivers/nvidia-drivers-open550:2=
 		)
 	)
+	nvidia_slots? (
+		x11-drivers/nvidia-drivers-open535:0=
+		x11-drivers/nvidia-drivers-open535:1=
+		x11-drivers/nvidia-drivers-open535:2=
+		x11-drivers/nvidia-drivers-open535:3=
+		x11-drivers/nvidia-drivers-open535:4=
+		x11-drivers/nvidia-drivers-open535:5=
+		x11-drivers/nvidia-drivers-open535:6=
+		x11-drivers/nvidia-drivers-open550:0=
+		x11-drivers/nvidia-drivers-open550:1=
+		x11-drivers/nvidia-drivers-open550:2=
+	)
 "
diff --git a/project-lakitu/virtual/target-lakitu/target-lakitu-1.5-r34.ebuild b/project-lakitu/virtual/target-lakitu/target-lakitu-1.5-r35.ebuild
similarity index 100%
rename from project-lakitu/virtual/target-lakitu/target-lakitu-1.5-r34.ebuild
rename to project-lakitu/virtual/target-lakitu/target-lakitu-1.5-r35.ebuild
diff --git a/project-lakitu/virtual/target-lakitu/target-lakitu-1.5.ebuild b/project-lakitu/virtual/target-lakitu/target-lakitu-1.5.ebuild
index bd66107..740aa72 100644
--- a/project-lakitu/virtual/target-lakitu/target-lakitu-1.5.ebuild
+++ b/project-lakitu/virtual/target-lakitu/target-lakitu-1.5.ebuild
@@ -129,16 +129,18 @@
 			x11-drivers/nvidia-drivers550:0=
 			x11-drivers/nvidia-drivers550:1=
 			x11-drivers/nvidia-drivers550:2=
-			x11-drivers/nvidia-drivers-open535:0=
-			x11-drivers/nvidia-drivers-open535:1=
-			x11-drivers/nvidia-drivers-open535:2=
-			x11-drivers/nvidia-drivers-open535:3=
-			x11-drivers/nvidia-drivers-open535:4=
-			x11-drivers/nvidia-drivers-open535:5=
-			x11-drivers/nvidia-drivers-open535:6=
-			x11-drivers/nvidia-drivers-open550:0=
-			x11-drivers/nvidia-drivers-open550:1=
-			x11-drivers/nvidia-drivers-open550:2=
 		)
 	)
+	nvidia_slots? (
+		x11-drivers/nvidia-drivers-open535:0=
+		x11-drivers/nvidia-drivers-open535:1=
+		x11-drivers/nvidia-drivers-open535:2=
+		x11-drivers/nvidia-drivers-open535:3=
+		x11-drivers/nvidia-drivers-open535:4=
+		x11-drivers/nvidia-drivers-open535:5=
+		x11-drivers/nvidia-drivers-open535:6=
+		x11-drivers/nvidia-drivers-open550:0=
+		x11-drivers/nvidia-drivers-open550:1=
+		x11-drivers/nvidia-drivers-open550:2=
+	)
 "
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open535/Manifest b/project-lakitu/x11-drivers/nvidia-drivers-open535/Manifest
index d01837f..96e7fa1 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open535/Manifest
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open535/Manifest
@@ -1,3 +1,10 @@
+DIST NVIDIA-Linux-aarch64-535.104.05.run 268930052 BLAKE2B 2ad8d0c8e490be857f4f9389c6e84ca241b5950e1ae91960128c0dee3043c7796a12e8b5e3d8e3d6b0c35421822f363b31d98ec84495276c3e7722fec12ba169 SHA512 1282d5f494af5ca0f9df55213f74c810dd78b154814ab29fbc9719fa3addf2523b82d41f034fbf1a7ec030af39b4c568d5648ea052405c5af98a5ee3aa4ae253
+DIST NVIDIA-Linux-aarch64-535.104.12.run 268912917 BLAKE2B 467bcee057c8a06eb2208bbe216f0ec904cef93699c862f644770e465124cdcaba415a487a7658648561bfaf1081a415b67806e482cc69217e85c6b68aea9d2b SHA512 d67d3ec64ed8a21b5f6a9716f64e173f2588725af1cb34c70e73badfd6158353e3d1a7dd4b4e89c1fd974dbdd1c6139c41efa016411784ba084be887b2121b3c
+DIST NVIDIA-Linux-aarch64-535.129.03.run 269691457 BLAKE2B b621d0347cacde195b7c4710e1260bc5e134d214c821be10de3cb36e69eb0c8aea0d1fb0bf7b7d109afd7ae38080abc10069f8032b411606db2f37b87fad799c SHA512 706de7e53b81f909d8bc6a12a39c594754a164c49f5d23c7939dc3abcfc04f5d5b12b7d65762ae574582149a098f06ee5fe95be4f8ad1056a3307a6ce93f3c00
+DIST NVIDIA-Linux-aarch64-535.154.05.run 269669314 BLAKE2B e5d8c74304d9e555dc9c867455b7e7d6157eab38316f79d233b5528a23f91ddbaf41e693168faf67af94a1c0d8aa8b0e5686bad31f2ea9f999fe5e72de176da9 SHA512 78ba2e9a0112d80f019d272c464d2b9e4cf735edbe80de33c97bab5d6dba6f29aed271113edbde95def984ebbddea4f1f80da533337cd94561f620ecdfc3a4ef
+DIST NVIDIA-Linux-aarch64-535.161.07.run 269759554 BLAKE2B 1f2fa0b9b4d535198778cc443dc262add2f9071a60e39714fb9e35b73db34f50043b55eb9cf645a50f55191abc81825c0e733e2bd7bfa8753a1668f9d5f7c607 SHA512 bb96a28b45197003480ae223c71a5426ef5258a31eaa485cab0cf4b86bed166482734784f20c6370a1155f3ff991652cac15f1b1083d2fb056677e6881b219e2
+DIST NVIDIA-Linux-aarch64-535.161.08.run 269749513 BLAKE2B 9716754e65a2f4ecff5f35d53bd1991b320ff9779a3adb44b63c07de14aab435bd3f3446e6871ecd3e58be0bc0cbee1556a56f31c456591786ae9111c8af3f6f SHA512 283f2f220b3f09685923f0d460cf3d8ce7ab4c0b89252cbe7206263d28cfc7a4beaa743999daa15e085938ebd53a05c3ccfccaac495468ac49fed9a442b6a5ac
+DIST NVIDIA-Linux-aarch64-535.183.01.run 269908911 BLAKE2B 93665bfd2c66391b232c0db7faa2b7929048f4eb0ac660726bc45fcee21bcf9b255da5f4fbdc14c281092f31e7603b5b112fc42b3c7d6e4769cdbedf8d0f16b0 SHA512 d2ac1be8c19b359023c31941374911f3adfe1be34aa2821ef582df4c854ac4eefbbcb10aa22583ac8c9d5caf9326bda12ed1ce6343d67479ed37a4887bd17b5e
 DIST NVIDIA-Linux-x86_64-535.104.05.run 340936244 BLAKE2B b549d84df020291180c2dd08f42abd806c01091ccc976932ed35d5ce0c3fe629adb892dfb48837b57f1eb2aefe13c6a06c7d3a05a490bf4de3c6d5315cf40114 SHA512 9aba3bada23b41acf7420da57cfced8bf883ef9210bbca5db9882e6e682e9755e0bc48fa12bb2ed114d4d68ba99443f26c22c94d3063d0daf8e9c1e21b369bb5
 DIST NVIDIA-Linux-x86_64-535.104.12.run 340891704 BLAKE2B 571e28b236eef516519d36cd96275bd6618c15c73d47744432b4eb812681f0af00ea8971613b56deb0e980d4e4e2fb9ae38c33288a707181841f32163c74203d SHA512 109cba805617aa309abb13256a2a70d9c36cb9bfbec8a423bc4301d8c2e8059e0b06b619fde4395c8cad17b9d09e07a318514ec59205e4a02ba620382029effd
 DIST NVIDIA-Linux-x86_64-535.129.03.run 341660534 BLAKE2B 46c79bad145524098b246e70294a9f9a513a8f0890b7ea57d9fb9dc761ae858bb69b9dd9308075ce80081e4dd28fb9ce9b336a2bf6280393b7d4c903f808d38c SHA512 3d7142658fe836e1debf7786857bdb293490ef33351e9b7d39face245fe8596b0f46052b86fae08350fcda1e2a9fd68d7309b94e107d1b016bd529d8fc37e31f
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open535/files/nvidia-drivers-525.60.13-utils.patch b/project-lakitu/x11-drivers/nvidia-drivers-open535/files/nvidia-drivers-525.60.13-utils.patch
index 1b1be0e..e4175dc 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open535/files/nvidia-drivers-525.60.13-utils.patch
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open535/files/nvidia-drivers-525.60.13-utils.patch
@@ -2,12 +2,30 @@
 index 17421ba9f840..749d09da8ec1 100644
 --- a/kernel-module-source/utils.mk
 +++ b/kernel-module-source/utils.mk
-@@ -569,7 +569,7 @@ define READ_ONLY_OBJECT_FROM_FILE_RULE
-  $$(OUTPUTDIR)/$$(notdir $(1)).o: $(1)
-	$(at_if_quiet)$$(MKDIR) $$(OUTPUTDIR)
-	$(at_if_quiet)cd $$(dir $(1)); \
--	$$(call quiet_cmd_no_at,LD) -r -z noexecstack --format=binary \
-+	$$(call quiet_cmd_no_at,LD) -r -z noexecstack -m elf_x86_64 --format=binary \
-	    $$(notdir $(1)) -o $$(OUTPUTDIR_ABSOLUTE)/$$(notdir $$@)
-	$$(call quiet_cmd,OBJCOPY) \
-	    --rename-section .data=.rodata,contents,alloc,load,data,readonly \
+@@ -565,11 +565,26 @@ endef
+ #  $(1): Path to the file to convert
+ ##############################################################################
+ 
++LD_TARGET_EMULATION_FLAG =
++LD_TARGET_EMULATION_FLAG_Linux_x86_64   = elf_x86_64
++LD_TARGET_EMULATION_FLAG_Linux_aarch64  = aarch64elf
++
++# Different linkers (GNU ld versus ld.lld versus ld.gold) expect different
++# target architecture values for '-m'.  Empirically, only ld.lld appears to
++# actually need it, so only add the option when linking with ld.lld.  Example
++# `ld.lld -v` output: "LLD 15.0.7 (compatible with GNU linkers)".
++LD_IS_LLD := $(if $(filter LLD,$(shell $(LD) -v)),1)
++
++ifdef LD_TARGET_EMULATION_FLAG_$(TARGET_OS)_$(TARGET_ARCH)
++  LD_TARGET_EMULATION_FLAG = $(if $(LD_IS_LLD), -m $(LD_TARGET_EMULATION_FLAG_$(TARGET_OS)_$(TARGET_ARCH)))
++endif
++
+ define READ_ONLY_OBJECT_FROM_FILE_RULE
+   $$(OUTPUTDIR)/$$(notdir $(1)).o: $(1)
+ 	$(at_if_quiet)$$(MKDIR) $$(OUTPUTDIR)
+ 	$(at_if_quiet)cd $$(dir $(1)); \
+ 	$$(call quiet_cmd_no_at,LD) -r -z noexecstack --format=binary \
++	    $$(LD_TARGET_EMULATION_FLAG) \
+ 	    $$(notdir $(1)) -o $$(OUTPUTDIR_ABSOLUTE)/$$(notdir $$@)
+ 	$$(call quiet_cmd,OBJCOPY) \
+ 	    --rename-section .data=.rodata,contents,alloc,load,data,readonly \
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.104.05.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.104.05.ebuild
index 75f8263..691fc63 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.104.05.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.104.05.ebuild
@@ -23,8 +23,14 @@
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
 SRC_URI="${NV_URI}/NVIDIA-kernel-module-source/NVIDIA-kernel-module-source-${PV}.tar.xz
-${NV_URI}/Linux-x86_64/${PV}/NVIDIA-Linux-x86_64-${PV}.run"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+	amd64? ( ${NV_URI}/Linux-x86_64/${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}Linux-aarch64/${PV}/NVIDIA-Linux-aarch64-${PV}.run )"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +66,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }
 
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.104.12.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.104.12.ebuild
index 77728d9..5f7549f 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.104.12.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.104.12.ebuild
@@ -22,9 +22,16 @@
 
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
-SRC_URI="${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run
+SRC_URI="
+	amd64? ( ${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}${PV}/NVIDIA-Linux-aarch64-${PV}.run )
 https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/${PV}.tar.gz -> open-gpu-kernel-modules-${PV}.tar.gz"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +67,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }
 
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.129.03.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.129.03.ebuild
index c70b1fb..23cd78a 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.129.03.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.129.03.ebuild
@@ -22,9 +22,16 @@
 
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
-SRC_URI="${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run
+SRC_URI="
+	amd64? ( ${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}${PV}/NVIDIA-Linux-aarch64-${PV}.run )
 https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/${PV}.tar.gz -> open-gpu-kernel-modules-${PV}.tar.gz"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +67,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }
 
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.154.05.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.154.05.ebuild
index cfd6b82..001bb3a 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.154.05.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.154.05.ebuild
@@ -22,9 +22,16 @@
 
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
-SRC_URI="${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run
+SRC_URI="
+	amd64? ( ${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}${PV}/NVIDIA-Linux-aarch64-${PV}.run )
 https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/${PV}.tar.gz -> open-gpu-kernel-modules-${PV}.tar.gz"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +67,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }
 
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.161.07.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.161.07.ebuild
index bd0b9c5..36c015b 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.161.07.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.161.07.ebuild
@@ -22,9 +22,16 @@
 
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
-SRC_URI="${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run
+SRC_URI="
+	amd64? ( ${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}${PV}/NVIDIA-Linux-aarch64-${PV}.run )
 https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/${PV}.tar.gz -> open-gpu-kernel-modules-${PV}.tar.gz"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +67,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }
 
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.161.08.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.161.08.ebuild
index 8e7d25d..1c83d1a 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.161.08.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.161.08.ebuild
@@ -22,9 +22,16 @@
 
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
-SRC_URI="${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run
+SRC_URI="
+	amd64? ( ${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}${PV}/NVIDIA-Linux-aarch64-${PV}.run )
 https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/${PV}.tar.gz -> open-gpu-kernel-modules-${PV}.tar.gz"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +67,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }
 
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.183.01.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.183.01.ebuild
index 388317c..0b89789 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.183.01.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open535/nvidia-drivers-open535-535.183.01.ebuild
@@ -22,9 +22,16 @@
 
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
-SRC_URI="${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run
+SRC_URI="
+	amd64? ( ${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}${PV}/NVIDIA-Linux-aarch64-${PV}.run )
 https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/${PV}.tar.gz -> open-gpu-kernel-modules-${PV}.tar.gz"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +67,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }
 
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open550/Manifest b/project-lakitu/x11-drivers/nvidia-drivers-open550/Manifest
index 1fe1c34..06b89f8 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open550/Manifest
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open550/Manifest
@@ -1,3 +1,6 @@
+DIST NVIDIA-Linux-aarch64-550.54.14.run 236034202 BLAKE2B cdeb8dd56a09bda3c72ed20c2ee266ea12c1c6e84d458c458dbf18addf7fbf9900431961db51424bfd9bad27fbd65dad5f8b2a9db26415c59faa17b4b1b2c225 SHA512 b1d6716b56d05fc0a9a20e567ae4160ebac66330f3f279779ca75be6d6b5d6153daeb5d3f1902f89432a86a8bbbda0a1b775a30be6715af1f8b8fc142e42a45f
+DIST NVIDIA-Linux-aarch64-550.54.15.run 236139802 BLAKE2B f54e8b841905a80e2e43fac5a6896544c64cba579830e81f4fa861374256fd3913cc9c486093f9988723d59cb98ec93f1b74b3d61510020de206fb04b2ca5283 SHA512 039e23ae6768bc926ce729f63eff2f4e3a05a97612c494b0fe410aa17d24c08b29a26ccc8c2dd0ca6b4c167dc709a9d7c811b880754c185a90c9dd91e435e0aa
+DIST NVIDIA-Linux-aarch64-550.90.07.run 236478345 BLAKE2B dba3321c10e14afcf95a7d97173635b066881e56bcbaff3e9ba1ef4dafa132342f3ad39f4ffe0359259f9f3e1b2fd95746a84be09f6d30de5effde1c7fcd4731 SHA512 79b956ad890a096bfb00c9dd996cba0673200b1d61f702ea6c5c64ca3fe2cefdd61e2bc844fdb7b4668c2796af5399be51e6f511565c3799cf731de2a7e9efaa
 DIST NVIDIA-Linux-x86_64-550.54.14.run 306861083 BLAKE2B 13ebc9f2900c4300687a2806dc12c2fc14b516097e279511b64c6f7a321223fabe408887378ba08ec2a28b9af37f8adb2d3b689b0f8a7ca44e47c731e50f497a SHA512 65fe0a3498e1b46368cfc7995fea720e4ba6373b0a74f4fc6280fbf75b2697948adf5b52b7d068b8df5ddbd347df7c0361db7e1a1fdc0d9fcfc6f478888936be
 DIST NVIDIA-Linux-x86_64-550.54.15.run 306858135 BLAKE2B b96625f1af45376276c9f704fb11a70a590d0962ede098db2c59f9535a780a7fe126a2dbf27255f2f91579e409c9a11891199251ff1552be4bc20a8e5518b437 SHA512 2be92c30b4f1ac0f65d97a4de5521eb5cab81a0a651a75adf458c86041eac7a93bdfd2e6f621f4905bef7ad989d4f0e3f1f811c4f0cfd7a273ec1906f3f6ffad
 DIST NVIDIA-Linux-x86_64-550.90.07.run 307583808 BLAKE2B 2bb4c03d4df42c0f6847bb0b088e9f0094382acac4a87204721dfe09a4b555373b4a9f0e6984ad65bdf98ade7cc70b316222413a94824bdc89926bb9b46db0a4 SHA512 b8c2cdc918ec74b44517fc181f9eb08ea44d0d9a53f221c0aa243e34872203721a9a7fb27628d35e3028a6aa68917abd2962cc13d5d4b09e92866e14678567a4
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.54.14.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.54.14.ebuild
index 2ae846c..93e472e 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.54.14.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.54.14.ebuild
@@ -22,9 +22,16 @@
 
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
-SRC_URI="${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run
+SRC_URI="
+	amd64? ( ${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}${PV}/NVIDIA-Linux-aarch64-${PV}.run )
 https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/${PV}.tar.gz -> open-gpu-kernel-modules-${PV}.tar.gz"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +67,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }
 
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.54.15.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.54.15.ebuild
index 599eeee..d613e99 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.54.15.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.54.15.ebuild
@@ -22,9 +22,16 @@
 
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
-SRC_URI="${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run
+SRC_URI="
+	amd64? ( ${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}${PV}/NVIDIA-Linux-aarch64-${PV}.run )
 https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/${PV}.tar.gz -> open-gpu-kernel-modules-${PV}.tar.gz"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +67,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }
 
diff --git a/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.90.07.ebuild b/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.90.07.ebuild
index 989c7df..f9982ef 100644
--- a/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.90.07.ebuild
+++ b/project-lakitu/x11-drivers/nvidia-drivers-open550/nvidia-drivers-open550-550.90.07.ebuild
@@ -22,9 +22,16 @@
 
 DESCRIPTION="NVIDIA Accelerated Graphics Driver"
 HOMEPAGE="https://www.nvidia.com/download/index.aspx"
-SRC_URI="${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run
+SRC_URI="
+	amd64? ( ${NV_URI}${PV}/NVIDIA-Linux-x86_64-${PV}.run )
+	arm64? ( ${NV_URI}${PV}/NVIDIA-Linux-aarch64-${PV}.run )
 https://github.com/NVIDIA/open-gpu-kernel-modules/archive/refs/tags/${PV}.tar.gz -> open-gpu-kernel-modules-${PV}.tar.gz"
-INSTALLER_NAME="NVIDIA-Linux-x86_64-${PV}"
+declare -A arch_map=(
+	[amd64]="x86_64"
+	[arm64]="aarch64"
+)
+NV_ARCH="${arch_map[$ARCH]:-x86_64}"
+INSTALLER_NAME="NVIDIA-Linux-${NV_ARCH}-${PV}"
 RUNFILE="${INSTALLER_NAME}.run"
 
 S="${WORKDIR}"
@@ -60,8 +67,12 @@
 		nvidia-uvm(nvidia/${PV}:kernel-module-source:kernel-module-source/kernel-open)"
 	KBUILD_OUTPUT="${KERNEL_DIR}/build"
 	linux-mod_pkg_setup
-	CXX="${CBUILD}-gcc"
-	BUILD_PARAMS="CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
+	if [[ "$ARCH" == "arm64" ]]; then
+		CXX="aarch64-cros-linux-gnu-gcc"  # Cross-compiler for x86->ARM64
+	else
+		CXX="${CBUILD}-gcc"  # default to host compiler
+	fi
+	BUILD_PARAMS="TARGET_ARCH=${NV_ARCH} CXX=${CXX} KERNEL_SOURCES=${KV_DIR} KBUILD_OUTPUT=${KBUILD_OUTPUT} NV_VERBOSE=1 IGNORE_CC_MISMATCH=yes SYSSRC=${KV_DIR} SYSOUT=${KV_OUT_DIR}"
 	BUILD_TARGETS="modules"
 }