// Copyright 2016 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#ifndef ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_FILE_H_
#define ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_FILE_H_

#include <zircon/compiler.h>

#include <efi/boot-services.h>
#include <efi/runtime-services.h>
#include <efi/types.h>

__BEGIN_CDECLS

#define EFI_FILE_PROTOCOL_REVISION 0x00010000
#define EFI_FILE_PROTOCOL_REVISION2 0x00020000
#define EFI_FILE_PROTOCOL_LATEST_REVISION EFI_FILE_PROTOCOL_REVISION2

#define EFI_FILE_MODE_READ 0x0000000000000001
#define EFI_FILE_MODE_WRITE 0x0000000000000002
#define EFI_FILE_MODE_CREATE 0x8000000000000000

#define EFI_FILE_READ_ONLY 0x0000000000000001
#define EFI_FILE_HIDDEN 0x0000000000000002
#define EFI_FILE_SYSTEM 0x0000000000000004
#define EFI_FILE_RESERVED 0x0000000000000008
#define EFI_FILE_DIRECTORY 0x0000000000000010
#define EFI_FILE_ARCHIVE 0x0000000000000020
#define EFI_FILE_VALID_ATTR 0x0000000000000037

typedef struct {
  efi_event Event;
  efi_status Status;
  size_t BufferSize;
  void* Buffer;
} efi_file_io_token;

#define EFI_FILE_INFO_GUID                                                         \
  {                                                                                \
    0x09576e92, 0x6d3f, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
  }
extern const efi_guid FileInfoGuid;

typedef struct {
  uint64_t Size;
  uint64_t FileSize;
  uint64_t PhysicalSize;
  efi_time CreateTime;
  efi_time LastAccessTime;
  efi_time ModificationTime;
  uint64_t Attribute;
  char16_t FileName[];
} efi_file_info;

#define EFI_FILE_SYSTEM_INFO_GUID                                                  \
  {                                                                                \
    0x09576e93, 0x6d3f, 0x11d2, { 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b } \
  }
extern const efi_guid FileSystemInfoGuid;

typedef struct {
  uint64_t Size;
  bool ReadOnly;
  uint64_t VolumeSize;
  uint64_t FreeSpace;
  uint32_t BlockSize;
  char16_t* VolumeLabel[];
} efi_file_system_info;

typedef struct efi_file_protocol {
  uint64_t Revision;

  efi_status (*Open)(struct efi_file_protocol* self, struct efi_file_protocol** new_handle,
                     const char16_t* filename, uint64_t open_mode, uint64_t attributes) EFIAPI;

  efi_status (*Close)(struct efi_file_protocol* self) EFIAPI;

  efi_status (*Delete)(struct efi_file_protocol* self) EFIAPI;

  efi_status (*Read)(struct efi_file_protocol* self, size_t* len, void* buf) EFIAPI;

  efi_status (*Write)(struct efi_file_protocol* self, size_t* len, const void* buf) EFIAPI;

  efi_status (*GetPosition)(struct efi_file_protocol* self, uint64_t* position) EFIAPI;

  efi_status (*SetPosition)(struct efi_file_protocol* self, uint64_t position) EFIAPI;

  efi_status (*GetInfo)(struct efi_file_protocol* self, const efi_guid* info_type, size_t* buf_size,
                        void* buf) EFIAPI;

  efi_status (*SetInfo)(struct efi_file_protocol* self, const efi_guid* info_type, size_t buf_size,
                        void* buf) EFIAPI;

  efi_status (*Flush)(struct efi_file_protocol* self) EFIAPI;

  efi_status (*OpenEx)(struct efi_file_protocol* self, struct efi_file_protocol* new_handle,
                       char16_t* filename, uint64_t open_mode, uint64_t attributes,
                       efi_file_io_token* token) EFIAPI;

  efi_status (*ReadEx)(struct efi_file_protocol* self, efi_file_io_token* token) EFIAPI;

  efi_status (*WriteEx)(struct efi_file_protocol* self, efi_file_io_token* token) EFIAPI;

  efi_status (*FlushEx)(struct efi_file_protocol* self, efi_file_io_token* token) EFIAPI;
} efi_file_protocol;

__END_CDECLS

#endif  // ZIRCON_KERNEL_LIB_EFI_INCLUDE_EFI_PROTOCOL_FILE_H_
