// 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 SRC_FIRMWARE_GIGABOOT_SRC_DISKIO_H_
#define SRC_FIRMWARE_GIGABOOT_SRC_DISKIO_H_

#include <zircon/compiler.h>
#include <zircon/hw/gpt.h>

#include <efi/protocol/disk-io.h>
#include <efi/system-table.h>

__BEGIN_CDECLS

typedef struct {
  efi_disk_io_protocol* io;
  efi_handle h;
  efi_boot_services* bs;
  efi_handle img;
  uint64_t first;
  uint64_t last;
  uint32_t blksz;
  uint32_t id;
} disk_t;

efi_status read_partition(efi_handle img, efi_system_table* sys, const uint8_t* guid_value,
                          const char* guid_name, uint64_t offset, unsigned char* data, size_t size);

efi_status write_partition(efi_handle img, efi_system_table* sys, const uint8_t* guid_value,
                           const char* guid_name, uint64_t offset, const unsigned char* data,
                           size_t size);

void* image_load_from_disk(efi_handle img, efi_system_table* sys, size_t* sz,
                           const uint8_t* guid_value, const char* guid_name);

// Returns true if the disk device that was used to load the bootloader
// is connected via USB.
bool is_booting_from_usb(efi_handle img, efi_system_table* sys);

// Find the disk device that was used to load the boot loader.
// Returns 0 on success and fills in the disk pointer, -1 otherwise.
int disk_find_boot(efi_handle img, efi_system_table* sys, bool verbose, disk_t* disk);

// Reads the GPT from the front of |disk| and finds the requested partition.
//
// The matcher will find a partition which satisfies all of the given |type|,
// |guid|, and |name| parameters.
//
// disk: the disk to search.
// verbose: true to print additional debug info.
// type: partition type GUID, or NULL to match any.
// guid: partition GUID, or NULL to match any.
// name: UTF-8 partition name, or NULL to match any.
// partition: on success, filled with the resulting GPT partition entry. Note
//            that .first and .last are in block units, and .name is UTF-16.
//
// Returns 0 on success, -1 if no partitions or multiple partitions match.
int disk_find_partition(const disk_t* disk, bool verbose, const uint8_t* type, const uint8_t* guid,
                        const char* name, gpt_entry_t* partition);

efi_status disk_write(disk_t* disk, size_t offset, void* data, size_t length);

// Converts a user-facing partition name into a type GUID.
//
// Accepts both legacy and new partition names, but always returns the legacy
// type GUID since that's what all Gigaboot devices use at the moment. Accepting
// both names will allow us to start moving over to the new partition scheme in
// the future if we want.
//
// name: partition name.
//
// Returns the matching partition type GUID, or NULL if no match was found.
const uint8_t* partition_type_guid(const char* name);

__END_CDECLS

#endif  // SRC_FIRMWARE_GIGABOOT_SRC_DISKIO_H_
