# Copyright 2021 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/components.gni")

declare_args() {
  # blobfs_maximum_runtime_bytes is an upper bound on the partition size on the device. Partitions
  # can grow as needed if there are extra slices available in FVM. This limit prevents the blobfs
  # partition from taking too much space away from other uses.
  #
  # Pass the empty string for no limit.
  blobfs_maximum_runtime_bytes = ""

  # minfs_maximum_runtime_bytes is an upper bound on the partition size on the device. Partitions
  # can grow as needed if there are extra slices available in FVM. This limit prevents the minfs
  # partition from taking too much space away from other uses.
  #
  # Pass the empty string for no limit.
  minfs_maximum_runtime_bytes = ""

  # If format_minfs_on_corruption is true (the default), fshost formats minfs partition on finding
  # it corrupted.  Set to false to keep the devices in a corrupted state which might be of help to
  # debug issues.
  format_minfs_on_corruption = true

  # If extract_minfs_metadata_on_corruption is true, fshost extracts minfs metadata on finding it
  # corrupted. Setting this flag to true helps debugging corruptions.
  extract_minfs_metadata_on_corruption = false

  # Set to one of "minfs", "fxfs", "f2fs" (unstable).
  # If set to anything other than "minfs", any existing minfs partition will be
  # migrated in-place to the specified format when fshost mounts it.
  data_filesystem_format = "minfs"

  # Set to true to enable legacy data partition names.
  allow_legacy_data_partition_names = false

  # Make fshost watch for NAND devices.
  fshost_watch_for_nand = false
}

# Generates a structured config value file for fshost.
#
# Some of the configuration settings are build args, and some are parameters passed in to the
# template by the invoker. A few allow overriding by the invoker but fall back to the global build
# arg.
#
# Parameters:
#
#   component_name (optional)
#     [string] The name of the component for which to produce config, defaults to "fshost".
#
#   options (optional)
#     [scope] A block of fshost configuration options to include in the config file.
#     Unrecognized options cause errors. Later options override earlier options. The provided
#     values override the defaults and template args but are overridden by global build args.
#
#   no_minfs_zxcrypt (optional; default: false)
#     [boolean] If set, fshost will look for a data partition that doesn't have zxcrypt set up, and
#     instead has minfs directly on the device. This option will cause production builds to fail.
#
#   fvm_ramdisk (optional; default: false)
#     [boolean] If set, fshost will bind the fvm driver to the first ramdisk it finds that looks
#     like an fvm partition, and uses it to back the system blobfs and minfs partitions. It will
#     still look for and bind an on-disk fvm, but it doesn't use it for anything.
#
#   gpt_all (optional; default: false)
#     [boolean] If set, fshost will bind gpt to every block device it finds that looks like gpt,
#     instead of just the first one it finds. This option will cause production builds to fail.
#
#   minfs_maximum_runtime_bytes_override (optional)
#     [string] If set, this option overrides the global build arg for minfs_maximum_runtime_bytes.
#     See the related global build arg for more information.
#
#   sandbox_decompression (optional; default: true)
#     [boolean] Use the sandboxed decompressor for blobfs decompression, instead of doing
#     decompression in-process.
#
#   apply_limits_to_ramdisk (optional; default: false)
#     [boolean] If set, apply the global build args for blobfs_maximum_runtime_bytes and
#     minfs_maximum_runtime_bytes to filesystems in ramdisks. By default, these limits only apply
#     to on-disk filesystems.
#
#   check_filesystems (optional; default: true)
#     [boolean] If set, run a filesystem check on minfs before mounting it. fshost never performs
#     checks on any other filesystem. If not provided, this check can also be enabled by a kernel
#     command line argument (it can't be disabled via one).
#
template("generated_fshost_config") {
  _manifest_target = "${target_name}_manifest"
  _component_name = "fshost"
  if (defined(invoker.component_name)) {
    _component_name = invoker.component_name
  }

  fuchsia_component_manifest(_manifest_target) {
    component_name = _component_name
    manifest = "//src/storage/fshost/meta/config.cml"
    restricted_features = [ "structured_config" ]
    metadata = {
      # we don't want this in the packaged output, it's just to give cmc something to work with
      distribution_entries_barrier = []
    }
  }

  fuchsia_structured_config_values(target_name) {
    cm_label = ":$_manifest_target"
    values = {
      # Defaults
      blobfs = true
      blobfs_max_bytes = 0
      bootpart = true
      data = true
      data_filesystem_format = ""
      data_max_bytes = 0
      durable = false
      factory = false
      format_data_on_corruption = true
      fvm = true
      gpt = true
      mbr = false
      nand = false
      netboot = false

      # Template arguments
      allow_legacy_data_partition_names =
          defined(invoker.allow_legacy_data_partition_names) &&
          invoker.allow_legacy_data_partition_names
      apply_limits_to_ramdisk = defined(invoker.apply_limits_to_ramdisk) &&
                                invoker.apply_limits_to_ramdisk
      check_filesystems =
          !defined(invoker.check_filesystems) || invoker.check_filesystems
      gpt_all = defined(invoker.gpt_all) && invoker.gpt_all
      no_zxcrypt = defined(invoker.no_minfs_zxcrypt) && invoker.no_minfs_zxcrypt
      fvm_ramdisk = defined(invoker.fvm_ramdisk) && invoker.fvm_ramdisk
      sandbox_decompression = !defined(invoker.sandbox_decompression) ||
                              invoker.sandbox_decompression
      zxcrypt_non_ramdisk = fvm_ramdisk

      # Final template argument allows setting arbitrary values which need to override
      # template arguments but be overridden by build arguments.
      if (defined(invoker.options)) {
        forward_variables_from(invoker.options, "*")
      }

      # Build args
      if (blobfs_maximum_runtime_bytes != "") {
        blobfs_max_bytes = blobfs_maximum_runtime_bytes
      }
      if (defined(invoker.minfs_maximum_runtime_bytes_override)) {
        # This can be overridden by the invoker but defaults to the file one if undefined.
        data_max_bytes = invoker.minfs_maximum_runtime_bytes_override
      } else if (minfs_maximum_runtime_bytes != "") {
        data_max_bytes = minfs_maximum_runtime_bytes
      }
      if (!format_minfs_on_corruption) {
        format_data_on_corruption = false
      }
      data_filesystem_format = invoker.data_filesystem_format
      if (fshost_watch_for_nand) {
        nand = true
      }
    }

    # Don't allow these configurations into production.
    if (values.no_zxcrypt || values.gpt_all) {
      if (!defined(deps)) {
        deps = []
      }
      deps += [ "//build/validate:non_production_tag" ]
    }
  }
}
