/** @file
*
*  Copyright (c) 2012-2014, ARM Limited. All rights reserved.
*
*  SPDX-License-Identifier: BSD-2-Clause-Patent
*
**/

#ifndef __BOOTMONFS_INTERNAL_H__
#define __BOOTMONFS_INTERNAL_H__

#include <PiDxe.h>
#include <Library/UefiLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>

#include <Protocol/BlockIo.h>
#include <Protocol/DiskIo.h>
#include <Protocol/FirmwareVolumeBlock.h>
#include <Protocol/SimpleFileSystem.h>

#include <Guid/BootMonFsFileInfo.h>
#include <Guid/FileInfo.h>
#include <Guid/FileSystemInfo.h>
#include <Guid/FileSystemVolumeLabelInfo.h>

#include "BootMonFsHw.h"

#define BOOTMON_FS_VOLUME_LABEL   L"NOR Flash"

typedef struct _BOOTMON_FS_INSTANCE BOOTMON_FS_INSTANCE;

typedef struct {
  LIST_ENTRY            Link;
  VOID*                 Buffer;
  UINTN                 Size;
  UINT64                Offset; // Offset from the start of the file
} BOOTMON_FS_FILE_REGION;

typedef struct {
  UINT32                Signature;
  LIST_ENTRY            Link;
  BOOTMON_FS_INSTANCE   *Instance;

  UINTN                 HwDescAddress;
  HW_IMAGE_DESCRIPTION  HwDescription;

  EFI_FILE_PROTOCOL     File;

  //
  // The following fields are relevant only if the file is open.
  //

  EFI_FILE_INFO         *Info;
  UINT64                Position;
  // If the file needs to be flushed then this list contain the memory
  // buffer that creates this file
  LIST_ENTRY            RegionToFlushLink;
  UINT64                OpenMode;
} BOOTMON_FS_FILE;

#define BOOTMON_FS_FILE_SIGNATURE              SIGNATURE_32('b', 'o', 't', 'f')
#define BOOTMON_FS_FILE_FROM_FILE_THIS(a)      CR (a, BOOTMON_FS_FILE, File, BOOTMON_FS_FILE_SIGNATURE)
#define BOOTMON_FS_FILE_FROM_LINK_THIS(a)      CR (a, BOOTMON_FS_FILE, Link, BOOTMON_FS_FILE_SIGNATURE)

struct _BOOTMON_FS_INSTANCE {
  UINT32                               Signature;
  EFI_HANDLE                           ControllerHandle;

  LIST_ENTRY                           Link;

  EFI_DRIVER_BINDING_PROTOCOL         *Binding;
  EFI_DISK_IO_PROTOCOL                *DiskIo;
  EFI_BLOCK_IO_PROTOCOL               *BlockIo;
  EFI_BLOCK_IO_MEDIA                  *Media;
  EFI_DEVICE_PATH_PROTOCOL            *DevicePath;

  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL      Fs;

  EFI_FILE_SYSTEM_INFO                 FsInfo;
  CHAR16                               Label[20];

  BOOTMON_FS_FILE                     *RootFile; // All the other files are linked to this root
  BOOLEAN                              Initialized;
};

#define BOOTMON_FS_SIGNATURE            SIGNATURE_32('b', 'o', 't', 'm')
#define BOOTMON_FS_FROM_FS_THIS(a)      CR (a, BOOTMON_FS_INSTANCE, Fs, BOOTMON_FS_SIGNATURE)
#define BOOTMON_FS_FROM_LINK(a)         CR (a, BOOTMON_FS_INSTANCE, Link, BOOTMON_FS_SIGNATURE)

#include "BootMonFsApi.h"

#endif

