# 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"

  # Users of the filesystem may know required minimum load (total number of
  # data bytes and total number of files) on the fs. Following parameters
  # help to reserve the space needed for the load.

  # 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_minimum_inodes = ""
  minfs_minimum_inodes = ""

  # For build/images:fvm.blob.sparse.blk, use this argument.
  blob_blobfs_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_minimum_data_bytes = ""
  minfs_minimum_data_bytes = ""

  # For build/images:fvm.blob.sparse.blk, use this argument.
  blob_blobfs_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_maximum_bytes = ""
  minfs_maximum_bytes = ""

  # For build/images:fvm.blob.sparse.blk, use this argument.
  blob_blobfs_maximum_bytes = ""

  # 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)
#
#   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,
                           [
                             "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,
  ]
}
