{ buildLinux, fetchFromGitHub, kernelPatches, lib, ... } @ args:

let
  modDirVersion = "6.6.20";
in
buildLinux (args // {
  inherit kernelPatches modDirVersion;
  version = "${modDirVersion}-milkv-pioneer";
  src = fetchFromGitHub {
    owner = "sophgo";
    repo = "linux-riscv";
    rev = "caa949e3690fe8a4656313b2b56f52666fa880db";
    hash = "sha256-qJpR3KMgvP4tfPfBfQ/MiEWg/uuuxHYuACK8taKKK3E=";
  };

  defconfig = "sophgo_mango_normal_defconfig";
  structuredExtraConfig = let inherit (lib.kernel) freeform module yes; in {
    # LinuxBoot will override the console bootparams which will result
    # in the distro kernel to be booted with e.g. console=tty1 only.
    # https://github.com/sophgo/bootloader-riscv/issues/71
    # Force output on serial console through the config. This is also
    # needed to get the forced serial-getty to be started.
    # We also list tty1 again because according to
    # https://docs.kernel.org/admin-guide/serial-console.html and
    # https://0pointer.de/blog/projects/serial-console.html
    # this will be the main console.
    CMDLINE = freeform "console=ttyS0,115200 console=tty1";
    CMDLINE_EXTEND = yes;

    # Enable these explicitly because they are not enabled by the defconfig.
    # The all-hardware profile expects these to be built.
    VIRTIO_MENU = yes;
    VIRTIO_PCI = module;

    # There is an i2c mcu driver (drivers/soc/sophgo/umcu) which is always
    # compiled into the kernel. Hence some of the i2c support also needs to
    # be compiled in instead of being compiled as a module.
    I2C = yes;
    I2C_CHARDEV = yes;
    I2C_DESIGNWARE_PLATFORM = yes;
  };

  extraMeta.branch = "sg2042-dev-6.6";
} // (args.argsOverride or { }))