/*++

Copyright (c) 2006, Intel Corporation                                                         
All rights reserved. This program and the accompanying materials                          
are licensed and made available under the terms and conditions of the BSD License         
which accompanies this distribution.  The full text of the license may be found at        
http://opensource.org/licenses/bsd-license.php                                            
                                                                                          
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             

Module Name:

  ExtendedSalBootService.h

Abstract:

--*/

#ifndef _EXTENDED_SAL_PROTOCOL_H_
#define _EXTENDED_SAL_PROTOCOL_H_

#define EXTENDED_SAL_BOOT_SERVICE_PROTOCOL_GUID   \
  {0xde0ee9a4,0x3c7a,0x44f2, {0xb7,0x8b,0xe3,0xcc,0xd6,0x9c,0x3a,0xf7}}

#define EXTENDED_SAL_SIGNATURE  EFI_SIGNATURE_32('e', 's', 'a', 'l')

#define SAL_MIN_STATE_SIZE    0x400 * 1
#define PAL_SCARTCH_SIZE      0x400 * 3
#define ALIGN_MINSTATE_SIZE   512
#define MAX_SAL_RECORD_SIZE   8*1024

#define SAL_RUNTIMESERVICE

typedef UINT16    EFI_SAL_PROCESSOR_ID;

typedef struct _EXTENDED_SAL_BOOT_SERVICE_PROTOCOL EXTENDED_SAL_BOOT_SERVICE_PROTOCOL;

typedef
SAL_RUNTIMESERVICE
SAL_RETURN_REGS
(EFIAPI *SAL_EXTENDED_SAL_PROC) (
  IN  EFI_GUID                                    *ClassGuid,
  IN   UINT64                                      FunctionId,
  IN  UINT64                                      Arg2,
  IN  UINT64                                      Arg3,
  IN  UINT64                                      Arg4,
  IN  UINT64                                      Arg5,
  IN  UINT64                                      Arg6,
  IN  UINT64                                      Arg7,
  IN  UINT64                                      Arg8
  );

typedef
SAL_RUNTIMESERVICE
SAL_RETURN_REGS
(EFIAPI *SAL_INTERNAL_EXTENDED_SAL_PROC) (
  IN  UINT64                                      FunctionId,
  IN  UINT64                                      Arg2,
  IN  UINT64                                      Arg3,
  IN  UINT64                                      Arg4,
  IN  UINT64                                      Arg5,
  IN  UINT64                                      Arg6,
  IN  UINT64                                      Arg7,
  IN  UINT64                                      Arg8,
  IN  SAL_EXTENDED_SAL_PROC                       ExtendedSalProc,
  IN   BOOLEAN                                     VirtualMode,
  IN  VOID                                        *ModuleGlobal
  ); 

typedef
EFI_STATUS
(EFIAPI *EXTENDED_SAL_ADD_SST_INFO) (
  IN EXTENDED_SAL_BOOT_SERVICE_PROTOCOL  *This,
  IN  UINT16                                      SalAVersion,
  IN   UINT16                                      SalBVersion,
  IN  CHAR8                                        *OemId,
  IN  CHAR8                                        *ProductId
  );

typedef
EFI_STATUS
(EFIAPI *EXTENDED_SAL_ADD_SST_ENTRY) (
  IN EXTENDED_SAL_BOOT_SERVICE_PROTOCOL  *This,
  IN  UINT8                                        EntryType,
  IN   UINT8                                        *TableEntry,
  IN  UINTN                                        EntrySize
  );

typedef
EFI_STATUS
(EFIAPI *EXTENDED_SAL_REGISTER_INTERNAL_PROC) (
  IN EXTENDED_SAL_BOOT_SERVICE_PROTOCOL  *This,
  IN  EFI_GUID                                    *ClassGuid,
  IN   UINT64                                      FunctionId,
  IN  SAL_INTERNAL_EXTENDED_SAL_PROC              InternalSalProc,
  IN  VOID                                        *PhysicalModuleGlobal
  );

//
// Extended Sal Boot Service Protocol Interface
//
struct _EXTENDED_SAL_BOOT_SERVICE_PROTOCOL{
  EXTENDED_SAL_ADD_SST_INFO                       AddSalSystemTableInfo;
  EXTENDED_SAL_ADD_SST_ENTRY                      AddSalSystemTableEntry;
  EXTENDED_SAL_REGISTER_INTERNAL_PROC             AddExtendedSalProc;   
  SAL_EXTENDED_SAL_PROC                           ExtendedSalProc;
  SAL_PROC                                        SalProc;
};

extern EFI_GUID   gEfiExtendedSalBootServiceProtocolGuid;

#endif
