project-lakitu: add open source TPU drivers

BUG=b/214598029
TEST=presubmit
RELEASE_NOTE=Added TPU driver v20220117.

Change-Id: Ic95e03d1ec78b9d59c2f8e8fe2dafb54dc557d01
Reviewed-on: https://cos-review.googlesource.com/c/cos/overlays/board-overlays/+/32942
Tested-by: Cusky Presubmit Bot <presubmit@cos-infra-prod.iam.gserviceaccount.com>
Reviewed-by: Meena Shanmugam <meenashanmugam@google.com>
diff --git a/project-lakitu/profiles/platform/gcp/make.defaults b/project-lakitu/profiles/platform/gcp/make.defaults
index b492e3c..7f1da71 100644
--- a/project-lakitu/profiles/platform/gcp/make.defaults
+++ b/project-lakitu/profiles/platform/gcp/make.defaults
@@ -15,3 +15,6 @@
 
 # Enable GCP-specific settings
 USE="${USE} platform_gcp"
+
+# Enable TPU kernel driver
+USE="${USE} tpu"
diff --git a/project-lakitu/sys-apps/tpu-drivers/Manifest b/project-lakitu/sys-apps/tpu-drivers/Manifest
new file mode 100644
index 0000000..4e5674b
--- /dev/null
+++ b/project-lakitu/sys-apps/tpu-drivers/Manifest
@@ -0,0 +1 @@
+DIST cb119a8607ee9bb70542867579dc9b6e69a85c5a.tar.gz 41950206 BLAKE2B 9a686a59186f6735729fda7d1735671ea1e3adf15d594996132235cf9e904424b48471ee6cb5400e1fb1b56fccd5d3579743db01ddaaad57e1092a5d52fe5491 SHA512 61c077557525ea9d539fa33e916de0392e216884bba7d3bc540ea4fd77adb82a0f4e7fbb3a6bb73ee8390227869c6d6a56a336659903b77adc70e8c3e31d2b20
diff --git a/project-lakitu/sys-apps/tpu-drivers/files/99-tpu.rules b/project-lakitu/sys-apps/tpu-drivers/files/99-tpu.rules
new file mode 100644
index 0000000..70f89f5
--- /dev/null
+++ b/project-lakitu/sys-apps/tpu-drivers/files/99-tpu.rules
@@ -0,0 +1 @@
+KERNEL=="accel*", MODE="0666"
diff --git a/project-lakitu/sys-apps/tpu-drivers/files/tpu-drivers-5.10-include-fix.patch b/project-lakitu/sys-apps/tpu-drivers/files/tpu-drivers-5.10-include-fix.patch
new file mode 100644
index 0000000..2697e6d
--- /dev/null
+++ b/project-lakitu/sys-apps/tpu-drivers/files/tpu-drivers-5.10-include-fix.patch
@@ -0,0 +1,12 @@
+diff --git a/drivers/accel/accel.c b/drivers/accel/accel.c
+index afeabe1..6d1c75a 100644
+--- a/drivers/accel/accel.c
++++ b/drivers/accel/accel.c
+@@ -7,6 +7,7 @@
+ #include <linux/kdev_t.h>
+ #include <linux/slab.h>
+ #include <linux/types.h>
++#include <linux/genhd.h>
+ #define ACCEL_MAX_DEVICES 512
+ static bool accel_class_registered;
+ static struct class accel_class;
diff --git a/project-lakitu/sys-apps/tpu-drivers/tpu-drivers-20220117.ebuild b/project-lakitu/sys-apps/tpu-drivers/tpu-drivers-20220117.ebuild
new file mode 100644
index 0000000..9dc6805
--- /dev/null
+++ b/project-lakitu/sys-apps/tpu-drivers/tpu-drivers-20220117.ebuild
@@ -0,0 +1,115 @@
+#
+# Copyright 2022 Google LLC
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# version 2 as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+
+EAPI=7
+
+inherit eutils linux-mod udev
+
+DESCRIPTION="Snaggletooth kernel drivers"
+HOMEPAGE="https://cloud.google.com/tpu"
+GIT_COMMIT="cb119a8607ee9bb70542867579dc9b6e69a85c5a"
+SRC_URI="https://github.com/tensorflow/tpu/archive/${GIT_COMMIT}.tar.gz"
+
+LICENSE="BSD-Google"
+SLOT="0"
+KEYWORDS="*"
+IUSE="+clang kernel-5_10 kernel-5_15"
+# Prevent kernel module signature being striped.
+RESTRICT="mirror strip"
+
+COMMON=""
+DEPEND="
+	${COMMON}
+	kernel-5_10? ( sys-kernel/lakitu-kernel-5_10[kernel_sources] )
+	kernel-5_15? ( sys-kernel/lakitu-kernel-5_15[kernel_sources] )
+"
+RDEPEND="
+	${COMMON}"
+
+PATCHES=(
+	"${FILESDIR}"/${PN}-5.10-include-fix.patch
+)
+
+S="${WORKDIR}/tpu-${GIT_COMMIT}/tools/driver/"
+
+KBUILD_OUTPUT=${KERNEL_DIR}/build
+
+MODULE_NAMES="
+	accel-class(kernel/drivers/accel:${S})
+	asic_sw(kernel/drivers/asic_sw:${S})
+	gasket(kernel/drivers/gasket:${S})
+	tpu_common(kernel/drivers/tpu_common:${S})
+	tpu_v2_core(kernel/drivers/tpu_common:${S})
+	tpu_v2(kernel/drivers/tpu_common:${S})
+	tpu_v3(kernel/drivers/tpu_common:${S})
+	tpuv4common_common(kernel/drivers/tpu_common:${S})
+	tpu_v4(kernel/drivers/tpu_common:${S})
+	tpu_v4_lite(kernel/drivers/tpu_common:${S})"
+
+sign_module() {
+	local module_file="$1"
+
+	"${KBUILD_OUTPUT}"/scripts/sign-file \
+		sha256 \
+		"${KBUILD_OUTPUT}"/certs/signing_key.pem \
+		"${KBUILD_OUTPUT}"/certs/signing_key.x509 \
+		${module_file}
+}
+
+src_prepare() {
+	use clang || cros_use_gcc
+	default
+}
+
+src_compile() {
+	local kernel_arch=${CHROMEOS_KERNEL_ARCH:-$(tc-arch-kernel)}
+	LIBELF="$("${CBUILD}-pkg-config" libelf --libs 2>/dev/null || echo -lelf)"
+	eval "emake -C ${S} HOSTCC=\"$(tc-getBUILD_CC)\" \
+				CROSS_COMPILE=${CHOST}- \
+				CC=${CC} \
+				LD=${LD} \
+				LDFLAGS=\"$(get_abi_LDFLAGS)\" \
+				ARCH=${kernel_arch} \
+				HOST_LIBELF_LIBS=${LIBELF} \
+				KERNELDIR=\"${KBUILD_OUTPUT}\" \
+				-f Makefile.tpu_kernel_modules \
+				all" \
+		|| die "Unable to emake -C ${S} HOSTCC=\"$(tc-getBUILD_CC)\" \
+				CROSS_COMPILE=${CHOST}- \
+				CC=${CC} \
+				LD=${LD} \
+				LDFLAGS=\"$(get_abi_LDFLAGS)\" \
+				ARCH=${kernel_arch} \
+				KERNELDIR=\"${KBUILD_OUTPUT}\" \
+				-f Makefile.tpu_kernel_modules \
+				all"
+}
+
+src_install() {
+	for i in ${MODULE_NAMES}
+	do
+		unset libdir srcdir objdir
+		for n in $(find_module_params ${i})
+		do
+			eval ${n/:*}=${n/*:/}
+		done
+		libdir=${libdir:-misc}
+		srcdir=${srcdir:-${S}}
+		objdir=${objdir:-${srcdir}}
+
+		einfo "Signing ${modulename} module"
+		sign_module ${objdir}/${modulename}.${KV_OBJ}
+	done
+	linux-mod_src_install
+	udev_dorules "${FILESDIR}/99-tpu.rules"
+}
diff --git a/project-lakitu/virtual/target-lakitu/target-lakitu-1.5-r15.ebuild b/project-lakitu/virtual/target-lakitu/target-lakitu-1.5-r16.ebuild
similarity index 100%
rename from project-lakitu/virtual/target-lakitu/target-lakitu-1.5-r15.ebuild
rename to project-lakitu/virtual/target-lakitu/target-lakitu-1.5-r16.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 bc9d6ab..ffb55da 100644
--- a/project-lakitu/virtual/target-lakitu/target-lakitu-1.5.ebuild
+++ b/project-lakitu/virtual/target-lakitu/target-lakitu-1.5.ebuild
@@ -10,7 +10,7 @@
 LICENSE="BSD-Google"
 SLOT="0"
 KEYWORDS="*"
-IUSE="bootchart +crash_reporting +pam readahead systemd watchdog apparmor criu uefi_bootloaders module_sign lockdown lakitu_kdump update_engine +npd +toolbox +kubernetes +cri_tools iscsi_initiator +xemu"
+IUSE="bootchart +crash_reporting +pam readahead systemd watchdog apparmor criu uefi_bootloaders module_sign lockdown lakitu_kdump update_engine +npd +toolbox +kubernetes +cri_tools iscsi_initiator +xemu tpu"
 
 LAKITU_RDEPEND="
 	bootchart? ( app-benchmarks/bootchart )
@@ -77,6 +77,7 @@
 	sys-apps/ethtool
 	>=sys-apps/iproute2-3.19.0
 	sys-apps/loadpin-trigger
+	tpu? ( sys-apps/tpu-drivers )
 	xemu? ( sys-apps/xemu )
 	iscsi_initiator? ( sys-block/open-iscsi )
 	module_sign? ( sys-apps/keyutils )