/** @file
This file contains the relevant declarations required to generate Option Rom File
Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef __EFI_ROM_H__
#define __EFI_ROM_H__
#include 
#include 
#include 
#include 
#include  // for PE32 structure definitions
#include   // for option ROM header structures
#include 
#include "Compress.h"
#include "CommonLib.h"
//
// Version of this utility
//
#define UTILITY_NAME "EfiRom"
#define UTILITY_MAJOR_VERSION 0
#define UTILITY_MINOR_VERSION 1
//
// Define the max length of a filename
//
#define MAX_PATH                  200
//
// Define the default file extension name
//
#define DEFAULT_OUTPUT_EXTENSION  ".rom"
//
// Max size for an option ROM image
//
#define MAX_OPTION_ROM_SIZE (1024 * 1024 * 16)  // 16MB
//
// Values for the indicator field in the PCI data structure
//
#define INDICATOR_LAST  0x80  // last file in series of files
//
// Masks for the FILE_LIST.FileFlags field
//
#define FILE_FLAG_BINARY    0x01
#define FILE_FLAG_EFI       0x02
#define FILE_FLAG_COMPRESS  0x04
//
// Use this linked list structure to keep track of all the filenames
// specified on the command line.
//
typedef struct _FILE_LIST {
  struct _FILE_LIST *Next;
  CHAR8             *FileName;
  UINT32            FileFlags;
  UINT32            ClassCode;
  UINT16            CodeRevision;
} FILE_LIST;
//
// Use this to track our command-line options
//
typedef struct {
  CHAR8     OutFileName[MAX_PATH];
  INT8      NoLast;
  UINT16    ClassCode;
  UINT16    PciRevision;
  UINT16    VendId;
  UINT16    *DevIdList;
  UINT32    DevIdCount;
  UINT8     VendIdValid;
  INT8      Verbose;
  INT8      Quiet;
  INT8      Debug;
  INT8      Pci23;
  INT8      Pci30;
  INT8      DumpOption;
//  INT8      Help;
//  INT8      Version;
  FILE_LIST *FileList;
} OPTIONS;
//
// Make a global structure to keep track of command-line options
//
static OPTIONS  mOptions;
//
// Use these to convert from machine type value to a named type
//
typedef struct {
  UINT16  Value;
  CHAR8   *Name;
} STRING_LOOKUP;
//
// Machine Types
//
static STRING_LOOKUP  mMachineTypes[] = {
  { IMAGE_FILE_MACHINE_I386, "IA32" },
  { IMAGE_FILE_MACHINE_X64, "X64" },
  { IMAGE_FILE_MACHINE_EBC, "EBC" },
  { IMAGE_FILE_MACHINE_ARMTHUMB_MIXED, "ARM" },
  { IMAGE_FILE_MACHINE_ARM64, "AA64" },
  { 0, NULL }
};
//
// Subsystem Types
//
static STRING_LOOKUP  mSubsystemTypes[] = {
  { EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION, "EFI application" },
  { EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER, "EFI boot service driver" },
  { EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER, "EFI runtime driver" },
  { 0, NULL }
};
//
//  Function prototypes
//
static
void
Version (
  VOID
  )
/*++
Routine Description:
  Displays the utility version to STDOUT
Arguments:
  None
Returns:
  None
--*/
;
static
void
Usage (
  VOID
  )
/*++
Routine Description:
  Displays the utility usage syntax to STDOUT
Arguments:
  None
Returns:
  None
--*/
;
static
int
ParseCommandLine (
  int       Argc,
  char      *Argv[],
  OPTIONS   *Options
  )
/*++
Routine Description:
  Given the Argc/Argv program arguments, and a pointer to an options structure,
  parse the command-line options and check their validity.
Arguments:
  Argc            - standard C main() argument count
  Argv[]          - standard C main() argument list
  Options         - pointer to a structure to store the options in
Returns:
  STATUS_SUCCESS    success
  non-zero          otherwise
--*/
;
static
int
CheckPE32File (
  FILE      *Fptr,
  UINT16    *MachineType,
  UINT16    *SubSystem
  )
/*++
Routine Description:
  Given the Argc/Argv program arguments, and a pointer to an options structure,
  parse the command-line options and check their validity.
Arguments:
  Argc            - standard C main() argument count
  Argv[]          - standard C main() argument list
  Options         - pointer to a structure to store the options in
Returns:
  STATUS_SUCCESS    success
  non-zero          otherwise
--*/
;
static
int
ProcessEfiFile (
  FILE      *OutFptr,
  FILE_LIST *InFile,
  UINT16    VendId,
  UINT16    DevId,
  UINT32    *Size
  )
/*++
Routine Description:
  Process a PE32 EFI file.
Arguments:
  OutFptr     - file pointer to output binary ROM image file we're creating
  InFile      - structure contains information on the PE32 file to process
  VendId      - vendor ID as required in the option ROM header
  DevId       - device ID as required in the option ROM header
  Size        - pointer to where to return the size added to the output file
Returns:
  0 - successful
--*/
;
static
int
ProcessBinFile (
  FILE      *OutFptr,
  FILE_LIST *InFile,
  UINT32    *Size
  )
/*++
Routine Description:
  Process a binary input file.
Arguments:
  OutFptr     - file pointer to output binary ROM image file we're creating
  InFile      - structure contains information on the binary file to process
  Size        - pointer to where to return the size added to the output file
Returns:
  0 - successful
--*/
;
static
void
DumpImage (
  FILE_LIST *InFile
  )
/*++
Routine Description:
  Dump the headers of an existing option ROM image
Arguments:
  InFile  - the file name of an existing option ROM image
Returns:
  none
--*/
;
char                  *
GetMachineTypeStr (
  UINT16    MachineType
  )
/*++
Routine Description:
  GC_TODO: Add function description
Arguments:
  MachineType - GC_TODO: add argument description
Returns:
  GC_TODO: add return values
--*/
;
static
char                  *
GetSubsystemTypeStr (
  UINT16  SubsystemType
  )
/*++
Routine Description:
  GC_TODO: Add function description
Arguments:
  SubsystemType - GC_TODO: add argument description
Returns:
  GC_TODO: add return values
--*/
;
#endif