# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/zbi/kernel_cmdline.gni")

# This serves as an anchor point. By expressing a dependency on
# //boards/kernel_cmdline, build arguments declared in this file
# (e.g. pmm_checker_from_board) are brought into scope.
group("kernel_cmdline") {
}

kernel_cmdline("serial-legacy") {
  args = [ "kernel.serial=legacy" ]
  deps = [ "//build/validate:non_production_tag" ]
}

kernel_cmdline("disable-blobfs-compression") {
  args = [ "blobfs.write-compression-algorithm=UNCOMPRESSED" ]
  deps = [ "//build/validate:non_production_tag" ]
}

kernel_cmdline("pmm-checker") {
  args = [
    # Enable PMM checker to detect certain kinds of buffer overrun and
    # use-after-free bugs.
    "kernel.pmm-checker.enable=true",

    # Use a small fill size to minimize performance impact.  In practice,
    # corruption tends to happen at the start of a page so filling/checking only
    # the first 16 bytes provides decent coverage without sacrificing
    # performance.
    "kernel.pmm-checker.fill-size=16",
  ]
}

declare_args() {
  # Used to control whether board definitions include PMM checker options.
  pmm_checker_from_board = true
}

group("pmm-checker-from-board") {
  if (pmm_checker_from_board) {
    deps = [ ":pmm-checker" ]
  }
}

kernel_cmdline("toulouse") {
  args = [
    # Fuchsia does not have a deterministic ordering for bringing up PCI devices, so the
    # /dev/class/ethernet/xxx paths have no well-defined mapping to the ports on the front of the
    # device.
    # In order for netbooting and loglistener to work, we need to let netsvc know which path corresponds
    # to the left-most ethernet port.
    "kernel.serial=legacy",
    "netsvc.interface=/dev/sys/platform/pci/00:1f.6/e1000/ethernet",
  ]
}

# This collects settings not specific to any particular machine that are
# recommended to minimize unintended effects on timing data.  Note that this
# does not (as yet) include settings that may reduce overall performance, which
# x64-reduced-perf-variation (below) does (see x64-reduced-perf-variation.gni).
group("reduced-perf-variation") {
  deps = [
    ":disable-page-scanner",
    ":quiet-early-boot",
  ]
}

# This collects settings not specific to any particular machine that are
# recommended to make the system's performance highly representative of a
# production setup.
group("perf-realistic") {
  deps = [ ":quiet-early-boot" ]
}

kernel_cmdline("quiet-early-boot") {
  args = [
    # Disable serial console printing during early boot, a phase during which
    # UART communication is single-threaded and synchronous. In production,
    # the serial console will be disabled, and so early boot benchmarks that
    # include this work is sensibly avoided.
    "kernel.phys.verbose=false",
  ]
}

kernel_cmdline("disable-page-scanner") {
  args = [
    # Disable page scanning in all its forms. Page scanning is intended to
    # provide a memory benefit to final systems, but the operation of the
    # scanner and its unpredictable de-duplication or eviction of memory in use
    # by benchmarks could cause noticeable variation.
    "kernel.page-scanner.start-at-boot=false",
    "kernel.page-scanner.zero-page-scans-per-second=0",
    "kernel.page-scanner.enable-eviction=false",
  ]
}

kernel_cmdline("x64-reduced-perf-variation") {
  deps = [ ":reduced-perf-variation" ]
  args = [
    # Disable Intel Turbo Boost. Turbo Boost provides a significant speed-up to
    # many workloads, but — because CPU frequencies vary based on previous work,
    # work in other cores, system temperature, etc — makes performance of systems
    # less predictable. We prefer stability in our performance comparison
    # benchmarks.
    "kernel.x86.turbo=false",

    # Set the Intel HWP performance profile to be "stable", trying to keep the
    # CPU clock rate stable. With turbo boost disabled, this has only a small
    # effect, but helps ensure that wake ups from idle are fixed.
    "kernel.x86.hwp_policy=stable-performance",

    # Disable hyper-threading. Hyper-threading reduces predictability of
    # benchmarks, because the performance of a thread is significantly affected
    # by other threads on the core.
    "kernel.smp.ht=false",

    # Disable spectre mitigations. Spectre mitigations have significant
    # performance impact, but are currently only carried out on a subset of the
    # NUC fleet. This means that different devices have significantly different
    # performance characteristics, meaning that benchmark results vary
    # significantly based on the device running it.
    #
    # TODO(fxbug.dev/33161): Ideally, we should load microcode during Zircon boot,
    # which should bring all devices to the same patch level, removing the
    # performance differences when spectre mitigations are in place.
    "kernel.x86.disable_spec_mitigations=true",
  ]
}

kernel_cmdline("gce") {
  args = [ "kernel.serial=legacy" ]
}

kernel_cmdline("vim3") {
  deps = [ ":pmm-checker-from-board" ]
  args = [
    # Prefer using the built-in NIC to the CDC-ether interface.
    "netsvc.interface=/dev/dwmac/dwmac/Designware-MAC/ethernet",
  ]
}

kernel_cmdline("chromebook-x64") {
  deps = [ ":pmm-checker-from-board" ]
  args = [
    # Depthcharge will fill this in.
    "zvb.boot-partition-uuid=%U",
  ]
}

# Copy from vim3
kernel_cmdline("av400") {
  deps = [ ":pmm-checker-from-board" ]
  args = [
    # Prefer using the built-in NIC to the CDC-ether interface.
    "netsvc.interface=/dev/dwmac/dwmac/Designware-MAC/ethernet",
  ]
}
