From 9d86c7f65537b27077ba746c23c393be84a1dd25 Mon Sep 17 00:00:00 2001 From: Nico Berlee Date: Sat, 18 Nov 2023 16:15:18 +0100 Subject: [PATCH] feat: adds board Turing RK1 Adds board Turing RK1 (rk3588) board support Add kernel module check for 6.6 Temporary alternative u-boot & kernel image Signed-off-by: Nico Berlee --- .github/workflows/ci.yaml | 1 + Dockerfile | 2 +- Makefile | 6 +- README.md | 41 +++++++- hack/modules-amd64.txt | 18 +--- hack/modules-arm64.txt | 13 +-- hack/release.toml | 22 ++++- .../pkg/runtime/v1alpha1/board/board.go | 3 + .../v1alpha1/board/turing_rk1/turing_rk1.go | 94 +++++++++++++++++++ pkg/imager/profile/default.go | 14 +++ pkg/machinery/constants/constants.go | 5 +- 11 files changed, 187 insertions(+), 32 deletions(-) create mode 100644 internal/app/machined/pkg/runtime/v1alpha1/board/turing_rk1/turing_rk1.go diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 617834f983..864c69bc39 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -65,6 +65,7 @@ jobs: USERNAME: ${{ github.actor }} PLATFORM: linux/arm64 PROGRESS: plain + IMAGER_ARGS: "--system-extension-image ghcr.io/nberlee/rk3588:v1.6.0" - uses: actions/upload-artifact@v3 with: diff --git a/Dockerfile b/Dockerfile index 23fa0263e2..99aab09668 100644 --- a/Dockerfile +++ b/Dockerfile @@ -82,7 +82,7 @@ FROM ${PKG_KERNEL} AS pkg-kernel FROM --platform=amd64 ${PKG_KERNEL} AS pkg-kernel-amd64 FROM --platform=arm64 ${PKG_KERNEL} AS pkg-kernel-arm64 -FROM --platform=arm64 ghcr.io/siderolabs/u-boot:${PKGS} AS pkg-u-boot-arm64 +FROM --platform=arm64 ghcr.io/nberlee/u-boot:v1.6.0-7-g9acbe68-dirty AS pkg-u-boot-arm64 FROM --platform=arm64 ghcr.io/siderolabs/raspberrypi-firmware:${PKGS} AS pkg-raspberrypi-firmware-arm64 # Resolve package images using ${EXTRAS} to be used later in COPY --from=. diff --git a/Makefile b/Makefile index e356315627..64ebf62e07 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ CLOUD_IMAGES_EXTRA_ARGS ?= "" ARTIFACTS := _out TOOLS ?= ghcr.io/siderolabs/tools:v1.6.0-1-g336d248 PKGS ?= v1.6.0-5-g3ae2450 -PKG_KERNEL ?= ghcr.io/siderolabs/kernel:$(PKGS) +PKG_KERNEL ?= ghcr.io/nberlee/kernel:v1.6.0-7-g9acbe68 EXTRAS ?= v1.6.0-1-g113887a # renovate: datasource=github-tags depName=golang/go GO_VERSION ?= 1.21 @@ -317,11 +317,11 @@ images-essential: image-aws image-gcp image-metal secureboot-installer ## Builds images: image-aws image-azure image-digital-ocean image-exoscale image-gcp image-hcloud image-iso image-metal image-nocloud image-openstack image-oracle image-scaleway image-upcloud image-vmware image-vultr ## Builds all known images (AWS, Azure, DigitalOcean, Exoscale, GCP, HCloud, Metal, NoCloud, Openstack, Oracle, Scaleway, UpCloud, Vultr and VMware). -sbc-%: ## Builds the specified SBC image. Valid options are rpi_generic, rock64, bananapi_m64, libretech_all_h3_cc_h5, rockpi_4, rockpi_4c, pine64, jetson_nano and nanopi_r4s (e.g. sbc-rpi_generic) +sbc-%: ## Builds the specified SBC image. Valid options are rpi_generic, rock64, bananapi_m64, libretech_all_h3_cc_h5, rockpi_4, rockpi_4c, pine64, jetson_nano, nanopi_r4s and turing_rk1 (e.g. sbc-rpi_generic) @docker pull $(REGISTRY_AND_USERNAME)/imager:$(IMAGE_TAG) @docker run --rm -t -v /dev:/dev -v $(PWD)/$(ARTIFACTS):/out --network=host --privileged $(REGISTRY_AND_USERNAME)/imager:$(IMAGE_TAG) $* --arch arm64 $(IMAGER_ARGS) -sbcs: sbc-rpi_generic sbc-rock64 sbc-bananapi_m64 sbc-libretech_all_h3_cc_h5 sbc-rockpi_4 sbc-rockpi_4c sbc-pine64 sbc-jetson_nano sbc-nanopi_r4s ## Builds all known SBC images (Raspberry Pi 4, Rock64, Banana Pi M64, Radxa ROCK Pi 4, Radxa ROCK Pi 4c, Pine64, Libre Computer Board ALL-H3-CC, Jetson Nano and Nano Pi R4S). +sbcs: sbc-rpi_generic sbc-rock64 sbc-bananapi_m64 sbc-libretech_all_h3_cc_h5 sbc-rockpi_4 sbc-rockpi_4c sbc-pine64 sbc-jetson_nano sbc-nanopi_r4s sbc-turing_rk1 ## Builds all known SBC images (Raspberry Pi 4, Rock64, Banana Pi M64, Radxa ROCK Pi 4, Radxa ROCK Pi 4c, Pine64, Libre Computer Board ALL-H3-CC, Jetson Nano and Nano Pi R4S). .PHONY: iso iso: image-iso ## Builds the ISO and outputs it to the artifact directory. diff --git a/README.md b/README.md index 359dee9e0a..ed80c803a3 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,46 @@

--- - +# Friendly fork +This is a friendly fork of [siderolabs/talos](siderolabs/talos). It is only here to support [SBC Turing RK1](https://turingpi.com/product/turing-rk1/). And it will be integrated in some way using [community managed SBCs](https://github.com/siderolabs/talos/issues/8065) in Talos 1.7. + +## Using this fork + +### Download the latest release on the right + +This describes the CLI commands, you may use the Turing PI webgui. Always first unpack the image yourself. Version 2.06 supports xz images, but it is slower. +```sh +xz -d metal-turing_rk1-arm64.raw.xz +tpi flash -n -i metal-turing_rk1-arm64.raw +tpi power on -n +``` + +To check bootmessages: +```sh +tpi uart -n get +``` + +Make sure when you use talosctl apply-config to have in this config the [rk3588](https://github.com/nberlee/extensions/tree/release-1.6/sbcs/rk3588) extension. +```yaml +machine: + install: + extensions: + - image: ghcr.io/nberlee/rk3588:v1.6.x + kernel: + modules: + - name: rockchip-cpufreq +``` + +### Updating + +Updating can also be done faster using the `talosctl upgrade` command. + +Before updating, make sure to edit the machine config and change the extension tag above to the correct new version. +```sh +talosctl upgrade -i ghcr.io/nberlee/installer:v1.6.x +``` + +# Talos **Talos** is a modern OS for running Kubernetes: secure, immutable, and minimal. Talos is fully open source, production-ready, and supported by the people at [Sidero Labs](https://www.SideroLabs.com/) All system management is done via an API - there is no shell or interactive console. diff --git a/hack/modules-amd64.txt b/hack/modules-amd64.txt index a343f5b4c6..8d976d2a70 100644 --- a/hack/modules-amd64.txt +++ b/hack/modules-amd64.txt @@ -22,12 +22,8 @@ kernel/drivers/md/persistent-data/dm-persistent-data.ko kernel/drivers/md/raid456.ko kernel/drivers/net/ethernet/aquantia/atlantic/atlantic.ko kernel/drivers/net/ethernet/atheros/alx/alx.ko -kernel/drivers/net/ethernet/broadcom/bnx2.ko -kernel/drivers/net/ethernet/broadcom/bnx2x/bnx2x.ko -kernel/drivers/net/ethernet/broadcom/bnxt/bnxt_en.ko kernel/drivers/net/ethernet/cisco/enic/enic.ko kernel/drivers/net/ethernet/emulex/benet/be2net.ko -kernel/drivers/net/ethernet/google/gve/gve.ko kernel/drivers/net/ethernet/intel/e100.ko kernel/drivers/net/ethernet/intel/e1000/e1000.ko kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko @@ -37,19 +33,9 @@ kernel/drivers/net/ethernet/intel/ice/ice.ko kernel/drivers/net/ethernet/intel/igb/igb.ko kernel/drivers/net/ethernet/intel/igbvf/igbvf.ko kernel/drivers/net/ethernet/intel/igc/igc.ko -kernel/drivers/net/ethernet/intel/ixgb/ixgb.ko kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko kernel/drivers/net/ethernet/intel/ixgbevf/ixgbevf.ko kernel/drivers/net/ethernet/marvell/sky2.ko -kernel/drivers/net/ethernet/mellanox/mlx4/mlx4_core.ko -kernel/drivers/net/ethernet/mellanox/mlx4/mlx4_en.ko -kernel/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko -kernel/drivers/net/ethernet/mellanox/mlxfw/mlxfw.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_core.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_i2c.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_minimal.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_pci.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_spectrum.ko kernel/drivers/net/ethernet/qlogic/qed/qed.ko kernel/drivers/net/ethernet/qlogic/qede/qede.ko kernel/drivers/net/ethernet/qlogic/qlcnic/qlcnic.ko @@ -57,6 +43,8 @@ kernel/drivers/net/ethernet/realtek/8139too.ko kernel/drivers/net/ethernet/realtek/r8169.ko kernel/drivers/net/ethernet/sfc/siena/sfc-siena.ko kernel/drivers/net/mdio.ko +kernel/drivers/net/phy/ax88796b.ko +kernel/drivers/net/phy/smsc.ko kernel/drivers/net/vmxnet3/vmxnet3.ko kernel/drivers/scsi/aacraid/aacraid.ko kernel/drivers/scsi/hpsa.ko @@ -67,9 +55,9 @@ kernel/drivers/scsi/vmw_pvscsi.ko kernel/drivers/virtio/virtio_balloon.ko kernel/drivers/virtio/virtio_input.ko kernel/drivers/virtio/virtio_mmio.ko +kernel/drivers/virtio/virtio_pci.ko kernel/drivers/virtio/virtio_pci_legacy_dev.ko kernel/drivers/virtio/virtio_pci_modern_dev.ko -kernel/drivers/virtio/virtio_pci.ko kernel/lib/objagg.ko kernel/lib/parman.ko kernel/lib/raid6/raid6_pq.ko diff --git a/hack/modules-arm64.txt b/hack/modules-arm64.txt index 2061b9e62d..3362063b85 100644 --- a/hack/modules-arm64.txt +++ b/hack/modules-arm64.txt @@ -1,12 +1,14 @@ modules.order modules.builtin modules.builtin.modinfo +kernel/arch/arm64/lib/xor-neon.ko kernel/crypto/async_tx/async_memcpy.ko kernel/crypto/async_tx/async_pq.ko kernel/crypto/async_tx/async_raid6_recov.ko kernel/crypto/async_tx/async_tx.ko kernel/crypto/async_tx/async_xor.ko kernel/crypto/xor.ko +kernel/drivers/dma/bcm-sba-raid.ko kernel/drivers/hwmon/i5k_amb.ko kernel/drivers/infiniband/sw/rxe/rdma_rxe.ko kernel/drivers/irqchip/irq-imx-mu-msi.ko @@ -19,17 +21,8 @@ kernel/drivers/md/dm-thin-pool.ko kernel/drivers/md/persistent-data/dm-persistent-data.ko kernel/drivers/md/raid456.ko kernel/drivers/net/ethernet/atheros/alx/alx.ko -kernel/drivers/net/ethernet/google/gve/gve.ko -kernel/drivers/net/ethernet/mellanox/mlx4/mlx4_core.ko -kernel/drivers/net/ethernet/mellanox/mlx4/mlx4_en.ko -kernel/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko -kernel/drivers/net/ethernet/mellanox/mlxfw/mlxfw.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_core.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_i2c.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_minimal.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_pci.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_spectrum.ko kernel/drivers/net/ethernet/sfc/siena/sfc-siena.ko +kernel/drivers/net/mdio/mdio-mux-meson-gxl.ko kernel/lib/objagg.ko kernel/lib/parman.ko kernel/lib/raid6/raid6_pq.ko diff --git a/hack/release.toml b/hack/release.toml index d5c29b11d1..7730fcbfb7 100644 --- a/hack/release.toml +++ b/hack/release.toml @@ -14,6 +14,24 @@ preface = """\ """ [notes] + [notes.kernel] + title = "New LTS Kernel" + description = """\ +This fork comes with a new LTS Kernel v6.6. +It was needed to upgrade it because of the support for the RK3588. It also has some upstream patches from 6.7-rc. +""" + [notes.board] + title = "Turing RK1 support" + description = """\ +This fork has Turing RK1 board support. Everything should work except for HDMI and UART2 serial console. +Make sure to add the extension `ghcr.io/nberlee/rk3588:v1.6.x` to the machine config and add `rockchip-cpyfreq` to machine.kernel.module: +```yaml +machine: + kernel: + modules: + - name: rockchip-cpufreq +``` +""" [notes.firmware] title = "Linux Firmware" description = """\ @@ -55,13 +73,15 @@ Any kernel argument that starts with a `-` is dropped. Kernel arguments to be dr [notes.updates] title = "Component Updates" description = """\ -Linux: 6.1.67 +Linux: 6.6.7 containerd: 1.7.10 CoreDNS: 1.11.1 Kubernetes: 1.29.0 Flannel: 0.23.0 etcd: 3.5.11 runc: 1.1.10 +u-boot: 2024.01-rc4 +arm-trusted-firmware: 2.10.0 Talos is built with Go 1.21.5. """ diff --git a/internal/app/machined/pkg/runtime/v1alpha1/board/board.go b/internal/app/machined/pkg/runtime/v1alpha1/board/board.go index 743655caa7..3fd3fe0788 100644 --- a/internal/app/machined/pkg/runtime/v1alpha1/board/board.go +++ b/internal/app/machined/pkg/runtime/v1alpha1/board/board.go @@ -22,6 +22,7 @@ import ( rockpi4 "github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board/rockpi4" rockpi4c "github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board/rockpi4c" rpigeneric "github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board/rpi_generic" + turingrk1 "github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board/turing_rk1" "github.com/siderolabs/talos/pkg/machinery/constants" ) @@ -70,6 +71,8 @@ func newBoard(board string) (b runtime.Board, err error) { b = &jetsonnano.JetsonNano{} case constants.BoardNanoPiR4S: b = &nanopir4s.NanoPiR4S{} + case constants.BoardTuringRK1: + b = &turingrk1.TuringRK1{} default: return nil, fmt.Errorf("unsupported board: %q", board) } diff --git a/internal/app/machined/pkg/runtime/v1alpha1/board/turing_rk1/turing_rk1.go b/internal/app/machined/pkg/runtime/v1alpha1/board/turing_rk1/turing_rk1.go new file mode 100644 index 0000000000..11938785a4 --- /dev/null +++ b/internal/app/machined/pkg/runtime/v1alpha1/board/turing_rk1/turing_rk1.go @@ -0,0 +1,94 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package TuringRK1 provides the Turing RK1 implementation. +package TuringRK1 + +import ( + "os" + "path/filepath" + + "github.com/siderolabs/go-procfs/procfs" + "golang.org/x/sys/unix" + + "github.com/siderolabs/talos/internal/app/machined/pkg/runtime" + "github.com/siderolabs/talos/pkg/copy" + "github.com/siderolabs/talos/pkg/machinery/constants" +) + +var ( + bin = constants.BoardTuringRK1 + "/u-boot-rockchip.bin" + off int64 = 512 * 64 + dtb = "rockchip/rk3588-turing-rk1.dtb" +) + +// TuringRK1 represents the Rockchip RK3588 based SoM from Turing Machines. +// +// Reference: https://rockpi.org/ +type TuringRK1 struct{} + +// Name implements the runtime.Board. +func (r *TuringRK1) Name() string { + return constants.BoardTuringRK1 +} + +// Install implements the runtime.Board. +func (r *TuringRK1) Install(options runtime.BoardInstallOptions) (err error) { + var f *os.File + + if f, err = os.OpenFile(options.InstallDisk, os.O_RDWR|unix.O_CLOEXEC, 0o666); err != nil { + return err + } + + defer f.Close() //nolint:errcheck + + uboot, err := os.ReadFile(filepath.Join(options.UBootPath, bin)) + if err != nil { + return err + } + + options.Printf("writing %s at offset %d", bin, off) + + var n int + + n, err = f.WriteAt(uboot, off) + if err != nil { + return err + } + + options.Printf("wrote %d bytes", n) + + // NB: In the case that the block device is a loopback device, we sync here + // to esure that the file is written before the loopback device is + // unmounted. + err = f.Sync() + if err != nil { + return err + } + + src := filepath.Join(options.DTBPath, dtb) + dst := filepath.Join("/boot/EFI/dtb", dtb) + + err = os.MkdirAll(filepath.Dir(dst), 0o600) + if err != nil { + return err + } + + return copy.File(src, dst) +} + +// KernelArgs implements the runtime.Board. +func (r *TuringRK1) KernelArgs() procfs.Parameters { + return []*procfs.Parameter{ + procfs.NewParameter("console").Append("tty0").Append("ttyS9,115200").Append("ttyS2,115200"), + procfs.NewParameter("sysctl.kernel.kexec_load_disabled").Append("1"), + procfs.NewParameter(constants.KernelParamDashboardDisabled).Append("1"), + procfs.NewParameter("irqchip.gicv3_pseudo_nmi").Append("0"), + } +} + +// PartitionOptions implements the runtime.Board. +func (r *TuringRK1) PartitionOptions() *runtime.PartitionOptions { + return &runtime.PartitionOptions{PartitionsOffset: 2048 * 10} +} diff --git a/pkg/imager/profile/default.go b/pkg/imager/profile/default.go index a08401291c..1137064e2e 100644 --- a/pkg/imager/profile/default.go +++ b/pkg/imager/profile/default.go @@ -367,4 +367,18 @@ var Default = map[string]Profile{ }, }, }, + constants.BoardTuringRK1: { + Arch: "arm64", + Platform: constants.PlatformMetal, + Board: constants.BoardTuringRK1, + SecureBoot: pointer.To(false), + Output: Output{ + Kind: OutKindImage, + OutFormat: OutFormatXZ, + ImageOptions: &ImageOptions{ + DiskSize: MinRAWDiskSize, + DiskFormat: DiskFormatRaw, + }, + }, + }, } diff --git a/pkg/machinery/constants/constants.go b/pkg/machinery/constants/constants.go index 150ce39b43..16965feb01 100644 --- a/pkg/machinery/constants/constants.go +++ b/pkg/machinery/constants/constants.go @@ -16,7 +16,7 @@ import ( const ( // DefaultKernelVersion is the default Linux kernel version. - DefaultKernelVersion = "6.1.67-talos" + DefaultKernelVersion = "6.6.7-talos" // KernelModulesPath is the default path to the kernel modules without the kernel version. KernelModulesPath = "/lib/modules" @@ -112,6 +112,9 @@ const ( // BoardNanoPiR4S is the name of the Friendlyelec Nano Pi R4S. BoardNanoPiR4S = "nanopi_r4s" + // BoardTuringRK1 is the name of the Turing Pi RK1 board. + BoardTuringRK1 = "turing_rk1" + // KernelParamHostname is the kernel parameter name for specifying the // hostname. KernelParamHostname = "talos.hostname"