// 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.

#ifndef GARNET_BIN_HWSTRESS_FLASH_STRESS_H_
#define GARNET_BIN_HWSTRESS_FLASH_STRESS_H_

#include <fuchsia/hardware/block/cpp/fidl.h>
#include <lib/zx/fifo.h>
#include <lib/zx/time.h>
#include <lib/zx/vmo.h>

#include <string>

#include <src/lib/uuid/uuid.h>

#include "args.h"
#include "status.h"

namespace hwstress {

// The GPT partition type used for partitions created by the flash test.
constexpr uuid::Uuid kTestPartGUID = uuid::Uuid({0xC6, 0x24, 0xF5, 0xDD, 0x9D, 0x88, 0x4C, 0x81,
                                                 0x99, 0x87, 0xCA, 0x92, 0xD1, 0x1B, 0x28, 0x89});

// Creates and manages the lifetime of a new partition backed by a
// Fuchsia Volume Manager instance.
class TemporaryFvmPartition {
 public:
  ~TemporaryFvmPartition();

  // Create a new partition.
  //
  // |fvm_path| should be the path to an FVM instance, such as
  // "/dev/sys/pci/00:00.0/ahci/sata0/block/fvm".
  //
  // |bytes_requested| is the maximum number of bytes callers will be able to use on the partition.
  // The returned partition may have greater than the requested number of bytes due to rounding and
  // overheads, or it may have less as space is lazily allocated by FVM, so the requested number of
  // bytes may not actually be available.
  //
  // Returns nullptr on failure.
  static std::unique_ptr<TemporaryFvmPartition> Create(int fvm_fd, uint64_t slices_requested);

  // Get the path to the created partition.
  std::string GetPartitionPath();

 private:
  std::string partition_path_;
  uuid::Uuid unique_guid_;

  TemporaryFvmPartition(std::string partition_path, uuid::Uuid unique_guid);
};

// Start a stress test.
bool StressFlash(StatusLine* status, const CommandLineArgs& args, zx::duration duration);

// Delete any persistent flash test partitions
void DestroyFlashTestPartitions(StatusLine* status);

// Exposed for testing only.

struct BlockDevice {
  fuchsia::hardware::block::BlockSyncPtr device;  // Connection to the block device.
  zx::fifo fifo;                                  // FIFO used to read/write to the block device.
  fuchsia::hardware::block::BlockInfo info;       // Details about the block device.
  zx::vmo vmo;                                    // Shared VMO with the block device.
  zx_vaddr_t vmo_addr;                            // Where |vmo| is mapped into our address space.
  size_t vmo_size;                                // Size of |vmo| in bytes.
  fuchsia::hardware::block::VmoId vmoid;          // Identifier the used to refer to the VMO
                                                  // when communicating with the block device.
};

zx_status_t SetupBlockFifo(const std::string& path, BlockDevice* device);

zx_status_t FlashIo(const BlockDevice& device, size_t bytes_to_test, size_t transfer_size,
                    bool is_write_test);

}  // namespace hwstress

#endif  // GARNET_BIN_HWSTRESS_FLASH_STRESS_H_
