# Copyright 2018 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/compiled_action.gni")

declare_args() {
  # The size in bytes of the FVM partition image to create. Normally this is
  # computed to be just large enough to fit the blob and data images. The
  # default value is "", which means to size based on inputs. Specifying a size
  # that is too small will result in build failure.
  fvm_image_size = ""

  # The size in bytes of the FVM partition on the target eMMC devices.
  # Specifying this parameter will lead build to generate a fvm.fastboot.blk
  # suitable for flashing through fastboot for eMMC devices.
  fvm_emmc_partition_size = ""

  # The max size of the disk where the FVM is written. This is used for
  # preallocating metadata to determine how much the FVM can expand on disk.
  # Only applies to sparse FVM images. At sparse image construction time, the
  # build fails if the inputs are larger than `fvm_max_disk_size`. At paving
  # time, the FVM will be sized to the target's disk size up to
  # `fvm_max_disk_size`. If the size of the disk increases after initial paving,
  # the FVM will resize up to `fvm_max_disk_size`. During paving, if the target
  # FVM has declared a smaller size than `fvm_max_disk_size`, the FVM is
  # reinitialized to the larger size.
  # The default value is "" which sets the max disk size to the size of the disk
  # at pave/format time.
  fvm_max_disk_size = ""

  # The size of the FVM partition images "slice size". The FVM slice size is a
  # minimum size of a particular chunk of a partition that is stored within
  # FVM. A very small slice size may lead to decreased throughput. A very large
  # slice size may lead to wasted space. The selected default size of 8mb is
  # selected for conservation of space, rather than performance.
  fvm_slice_size = "8388608"

  # Number of slices reserved by FVM for internal usage. A reservation
  # partition will be added to the FVM image, containing this many slices.
  # If set to the empty string, then no reservation partition will be added.
  # Set to 1 by default so that we exercise this feature on all product
  # configurations.
  fvm_reserved_slices = "1"

  # The following blobfs_* and minfs_* arguments are used to determine the
  # initial dimensions of the blobfs and minfs partitions added to an FVM
  # image. If they are unset, the sizes of the input blobfs/minfs images will
  # determine the dimensions of the respective partition within FVM.
  #
  # These dimensions cannot make a partition smaller than the image provided
  # to the FVM tool; in that case, the partition dimensions would be expanded
  # to fit the input image.
  #
  # There are both board-level overrides and product-level dimensions. The
  # product-level overrides, if set, will take precedence.

  # minimum_inodes is the number of inodes to reserve for the fs
  # An empty string does not reserve any additional space than minimum
  # required for the filesystem.
  blobfs_board_minimum_inodes = ""
  blobfs_product_minimum_inodes = ""
  minfs_board_minimum_inodes = ""
  minfs_product_minimum_inodes = ""

  # Number of bytes to reserve for data in the fs. This is in addition
  # to what is reserved, if any, for the inodes. Data bytes constitutes
  # "usable" space of the fs.
  # An empty string does not reserve any additional space than minimum
  # required for the filesystem.
  blobfs_board_minimum_data_bytes = ""
  blobfs_product_minimum_data_bytes = ""
  minfs_board_minimum_data_bytes = ""
  minfs_product_minimum_data_bytes = ""

  # In addition to reserving space for inodes and data, fs needs additional
  # space for maintaining some internal data structures. So the
  # space required to reserve inodes and data may exceed sum of the space
  # needed for inodes and data.
  # maximum_bytes puts an upper bound on the total bytes reserved for inodes,
  # data bytes and reservation for all other internal fs metadata.
  # An empty string does not put any upper bound. A filesystem may
  # reserve few blocks required for its operations.
  blobfs_board_maximum_bytes = ""
  blobfs_product_maximum_bytes = ""
  minfs_board_maximum_bytes = ""
  minfs_product_maximum_bytes = ""

  # End of variables for blobfs/minfs dimensions

  # Specifying these variables will generate a NAND FVM image suitable for
  # directly flashing via fastboot. The NAND characteristics are required
  # in order to properly initialize the FTL metadata in the OOB area.
  # `max_fvm_size` should also be nonzero or else minfs will not have any
  # room to initialize on boot.
  fvm_ftl_nand_page_size = ""
  fvm_ftl_nand_oob_size = ""
  fvm_ftl_nand_pages_per_block = ""
  fvm_ftl_nand_block_count = ""
}

# Build an FVM partition
#
# Parameters
#
#   args (optional)
#     [list of strings] Additional arguments to pass to the FVM tool.
#
#   output_name (required)
#     [string] The filename to produce.
#
#   partitions (required)
#     [list of scopes] a list of partitions to be included
#       dep (required)
#         [label] The label must be defined earlier in the same file.
#       type (required)
#         [string] A partition type accepted by fvm (e.g. blob, data, data-unsafe)
#
#   inputs (optional)
#   deps (optional)
#   testonly (optional)
#   visibility (optional)
#   metadata (optional)
#     Same as for any GN `action()` target.
template("generate_fvm") {
  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "inputs",
                             "deps",
                             "metadata",
                             "testonly",
                             "visibility",
                           ])
    tool = "//src/storage/bin/fvm"
    outputs = [ invoker.output_name ]
    args = rebase_path(outputs, root_build_dir)
    if (defined(invoker.args)) {
      args += invoker.args
    }
    sources = []
    if (!defined(deps)) {
      deps = []
    }
    if (defined(invoker.with_empty_minfs) && invoker.with_empty_minfs) {
      args += [ "--with-empty-minfs" ]
    }
    if (fvm_reserved_slices != "") {
      args += [
        "--reserve-slices",
        fvm_reserved_slices,
      ]
    }
    if (defined(invoker.partitions)) {
      foreach(part, invoker.partitions) {
        args += [ "--${part.type}" ]
        deps += [ part.dep ]
        dep_outputs = []  # Reset after last iteration.
        dep_outputs = get_target_outputs(part.dep)
        sources += [ dep_outputs[0] ]
        args += [ rebase_path(dep_outputs[0], root_build_dir) ]
        if (defined(part.minimum_inodes) && "${part.minimum_inodes}" != "") {
          args += [
            "--minimum-inodes",
            "${part.minimum_inodes}",
          ]
        }
        if (defined(part.minimum_data_bytes) &&
            "${part.minimum_data_bytes}" != "") {
          args += [
            "--minimum-data-bytes",
            "${part.minimum_data_bytes}",
          ]
        }
        if (defined(part.maximum_bytes) && "${part.maximum_bytes}" != "") {
          args += [
            "--maximum-bytes",
            "${part.maximum_bytes}",
          ]
        }
      }
    }
  }
}

fvm_slice_args = [
  "--slice",
  fvm_slice_size,
]

fvm_create_args = [ "create" ] + fvm_slice_args

fvm_sparse_args = [
                    "sparse",
                    "--compress",
                    "lz4",
                  ] + fvm_slice_args

if (fvm_max_disk_size != "") {
  fvm_sparse_args += [
    "--max-disk-size",
    fvm_max_disk_size,
  ]
}
