/*++

Copyright (c) 2004, 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:

  SalDriverLib.h
  
Abstract:

  SAL Driver Lib

Revision History

--*/

#ifndef _SAL_DRIVER_LIB_H_
#define _SAL_DRIVER_LIB_H_

#include "Tiano.h"
#include "EfiDriverLib.h"
#include "SalApi.h"

#include EFI_PROTOCOL_DEFINITION (ExtendedSalBootService)
#include EFI_PROTOCOL_DEFINITION (ExtendedSalGuid)

//
//  Assembly Functions
//
SAL_RETURN_REGS
LibGetEsalPhyData (
  VOID
  )
/*++

Routine Description:

  Get Esal global data in physical mode.

Arguments:

  None

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
LibGetEsalVirtData (
  VOID
  )
/*++

Routine Description:

  Get Esal global data in virtual mode.

Arguments:

  None

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
LibSetEsalPhyData (
  IN  VOID                        *Ptr,
  IN  UINT64                      GP
  )
/*++

Routine Description:

  Set Esal global data in physical mode.

Arguments:

  Ptr            - Pointer to the data
  GP             - Global pointer

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
LibSetEsalVirtData (
  IN  VOID                        *Ptr,
  IN  UINT64                      GP
  )
/*++

Routine Description:

  Set Esal global data in virtual mode.

Arguments:

  Ptr            - Pointer to the data
  GP             - Global pointer

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
LibGetGlobalPhyData (
  VOID
  )
/*++

Routine Description:

  Get Esal global data in physical mode.

Arguments:

  None

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
LibGetGlobalVirtData (
  VOID
  )
/*++

Routine Description:

  Get Esal global data in virtual mode.

Arguments:

  None

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
LibSetGlobalPhyData (
  IN  VOID                        *Ptr,
  IN  UINT64                      GP
  )
/*++

Routine Description:

  Set Esal global data in physical mode.

Arguments:

  Ptr            - Pointer to the data
  GP             - Global pointer

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
LibSetGlobalVirtData (
  IN  VOID                        *Ptr,
  IN  UINT64                      GP
  )
/*++

Routine Description:

  Set Esal global data in virtual mode.

Arguments:

  Ptr            - Pointer to the data
  GP             - Global pointer

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
GetIrrData (
  VOID
  )
/*++

Routine Description:

  Get interrupt request register.

Arguments:

  None

Returns:

  Output regs

--*/
;

VOID
PrepareApsForHandOverToOS (
  VOID
  )
/*++

Routine Description:

  Prepare AP info for hand over to OS.

Arguments:

  None

Returns:

  None

--*/
;

VOID
HandOverApsToOS (
  IN UINT64  a1,
  IN UINT64  a2,
  IN UINT64  a3
  )
/*++

Routine Description:

  Hand over AP info to OS.

Arguments:

  a1    - Address to call into
  
  a2    - GP
  
  a3    - Undefined

Returns:

  None

--*/
;

SAL_RETURN_REGS
GetPsrData (
  VOID
  )
/*++

Routine Description:

  Get PSR register.

Arguments:

  None

Returns:

  Output regs.

--*/
;

SAL_RETURN_REGS
GetProcIdData (
  VOID
  )
/*++

Routine Description:

  Get LID

Arguments:

  None

Returns:

  Output regs

--*/
;

VOID
SwitchCpuStack (
  IN  UINT64  NewBsp,
  IN  UINT64  OldBsp
  )
/*++

Routine Description:

  Switch BSP

Arguments:

  NewBsp    - New BSP index
  OldBsp    - Old BSP index

Returns:

  None

--*/
;

//
//  SAL Reset Class
//
VOID
SalResetSystem (
  IN EFI_RESET_TYPE                ResetType,
  IN EFI_STATUS                    ResetStatus,
  IN UINTN                         DataSize,
  IN CHAR16                        *ResetData
  )
/*++

Routine Description:

  Reset system

Arguments:

  ResetType     - Reset type
  ResetStatus   - Reset status
  DataSize      - Size of ResetData
  ResetData     - Description string

Returns:

  None

--*/
;

//
//  PAL PROC Class
//
SAL_RETURN_REGS
SalPalProc (
  IN  UINT64            Arg1,
  IN  UINT64            Arg2,
  IN  UINT64            Arg3,
  IN  UINT64            Arg4
  )
/*++

Routine Description:

  Call pal proc.

Arguments:

  Arg1          - Pal call index
  Arg2          - First arg
  Arg3          - Second arg
  Arg4          - Third arg

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
SalRegisterNewPalEntry (
  IN  BOOLEAN                     PhysicalPalAddress,
  IN  EFI_PHYSICAL_ADDRESS        NewPalAddress
  )
/*++

Routine Description:

  Register Pal entry.

Arguments:

  PhysicalPalAddress      - The address is physical or virtual
  NewPalAddress           - New Pal entry address

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
SalGetPalEntryPointer (
  IN  BOOLEAN                     PhysicalPalAddress
  )
/*++

Routine Description:

  Get Pal entry.

Arguments:

  PhysicalPalAddress      - The address is physical or virtual

Returns:

  Output regs

--*/
;

//
//  SAL MTC Class
//
EFI_STATUS
SalGetNextHighMonotonicCount (
  OUT UINT32                      *HighCount
  )
/*++

Routine Description:

  Get next high 32 bits of monotonic count.

Arguments:

  HighCount     - High 32 bits of monotonic count.

Returns:

  Status code

--*/
;

//
//  SAL BASE Class
//
SAL_RETURN_REGS
SalProcSetVectors (
  IN  UINT64                      SalVectorType,
  IN  UINT64                      PhyAddr1,
  IN  UINT64                      Gp1,
  IN  UINT64                      LengthCs1,
  IN  UINT64                      PhyAddr2,
  IN  UINT64                      Gp2,
  IN  UINT64                      LengthCs2
  )
/*++

Routine Description:

  Set vectors.

Arguments:

  SalVectorType     - Vector type
  PhyAddr1          - OS MCA entry point
  Gp1               - GP for OS MCA entry
  LengthCs1         - Length of OS MCA 
  PhyAddr2          - OS INIT entry point
  Gp2               - GP for OS Init entry
  LengthCs2         - Length of OS INIT

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
SalProcMcRendez (
  VOID
  )
/*++

Routine Description:

  Mc rendezvous function.

Arguments:

  None

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
SalProcMcSetParams (
  IN  UINT64                      ParamType,
  IN  UINT64                      IntOrMem,
  IN  UINT64                      IntOrMemVal,
  IN  UINT64                      Timeout,
  IN  UINT64                      McaOpt
  )
/*++

Routine Description:

  Set MCA parameters.

Arguments:

  ParamType     - Parameter type
  IntOrMem      - Interrupt or memory address
  IntOrMemVal   - Interrupt number or memory address value
  Timeout       - Time out value
  McaOpt        - Option for MCA

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
EsalProcGetVectors (
  IN  UINT64                      VectorType
  )
/*++

Routine Description:

  Get OS MCA vector.

Arguments:

  VectorType      - Vector type

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
EsalProcMcGetParams (
  IN  UINT64                      ParamInfoType
  )
/*++

Routine Description:

  Get MCA parameter.

Arguments:

  ParamInfoType     - Parameter info type

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
EsalProcMcGetMcParams (
  VOID
  )
/*++

Routine Description:

  Get MCA parameter.

Arguments:

  
Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
EsalProcGetMcCheckinFlags (
  IN  UINT64                      ProcessorUnit
  )
/*++

Routine Description:

  Get process status.

Arguments:

  ProcessorUnit     - Processor Index

Returns:

  Output regs

--*/
;

//
//  Sal Base Class enums
//
typedef enum {
  McaVector,
  BspInitVector,
  BootRendezVector,
  ApInitVector
} ESAL_GET_VECTOR_TYPE;

//
//  Sal RTC Class
//
EFI_STATUS
SalGetTime (
  OUT EFI_TIME                     *Time,
  OUT EFI_TIME_CAPABILITIES        *Capabilities
  )
/*++

Routine Description:

  Returns the current time and date information, and the time-keeping 
  capabilities of the hardware platform.

Arguments:

  Time          - A pointer to storage to receive a snapshot of the current time.
  Capabilities  - An optional pointer to a buffer to receive the real time clock device's
                  capabilities.

Returns:

  Status code

--*/
;

EFI_STATUS
SalSetTime (
  OUT EFI_TIME                    *Time
  )
/*++

Routine Description:

  Sets the current local time and date information.

Arguments:

  Time  - A pointer to the current time.

Returns:

  Status code

--*/
;

EFI_STATUS
SalGetWakeupTime (
  OUT BOOLEAN                      *Enabled,
  OUT BOOLEAN                      *Pending,
  OUT EFI_TIME                     *Time
  )
/*++

Routine Description:

  Returns the current wakeup alarm clock setting.

Arguments:

  Enabled - Indicates if the alarm is currently enabled or disabled.
  Pending - Indicates if the alarm signal is pending and requires acknowledgement.
  Time    - The current alarm setting.

Returns:

  Status code

--*/
;

EFI_STATUS
SalSetWakeupTime (
  IN BOOLEAN                      Enable,
  IN EFI_TIME                     *Time
  )
/*++

Routine Description:

  Sets the system wakeup alarm clock time.

Arguments:

  Enable  - Enable or disable the wakeup alarm.
  Time    - If Enable is TRUE, the time to set the wakeup alarm for.
            If Enable is FALSE, then this parameter is optional, and may be NULL.

Returns:

  Status code

--*/
;

SAL_RETURN_REGS
SalInitializeThreshold (
  IN  VOID                        *ThresholdStruct,
  IN  UINT64                      Count,
  IN  UINT64                      Duration
  )
/*++

Routine Description:

  Init threshold structure.

Arguments:

  ThresholdStruct     - Threshold structure
  Count               - Threshold count
  Duration            - Duration

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
SalBumpThresholdCount (
  IN  VOID                        *ThresholdStruct,
  IN  UINT64                      Count,
  IN  UINT64                      Duration
  )
/*++

Routine Description:

  Bump threshold count.

Arguments:

  ThresholdStruct     - Threshold structure
  Count               - Threshold count
  Duration            - Duration

Returns:

  Output regs

--*/
;

SAL_RETURN_REGS
SalGetThresholdCount (
  IN  VOID                        *ThresholdStruct,
  IN  UINT64                      Count,
  IN  UINT64                      Duration
  )
/*++

Routine Description:

  Get threshold structure.

Arguments:

  ThresholdStruct     - Threshold structure
  Count               - Threshold count
  Duration            - Duration

Returns:

  Output regs

--*/
;

//
//  Common Lib Function
//
EFI_STATUS
RegisterEsalFunction (
  IN  UINT64                                    FunctionId,
  IN  EFI_GUID                                  *ClassGuid,
  IN  SAL_INTERNAL_EXTENDED_SAL_PROC            Function,
  IN  VOID                                      *ModuleGlobal
  )
/*++

Routine Description:

  Register ESAL Class Function and it's asociated global.
  This function is boot service only!

Arguments:
  FunctionId    - ID of function to register
  ClassGuid     - GUID of function class 
  Function      - Function to register under ClassGuid/FunctionId pair
  ModuleGlobal  - Module global for Function.

Returns: 
  EFI_SUCCESS - If ClassGuid/FunctionId Function was registered.

--*/
;

EFI_STATUS
EfiInitializeSalDriverLib (
  IN  BOOLEAN   Runtime
  )
/*++

Routine Description:

  Initialize Sal driver lib.

Arguments:
  Runtime     - At runtime or not?

Returns: 
  Status code

--*/
;

//
// MCA PMI INIT Registeration Functions.
//
EFI_STATUS
LibRegisterMcaFunction (
  IN  EFI_SAL_MCA_HANDLER                   McaHandler,
  IN  VOID                                  *ModuleGlobal,
  IN  BOOLEAN                               MakeFirst,
  IN  BOOLEAN                               MakeLast
  )
/*++

Routine Description:

  Register MCA handler.

Arguments:
  McaHandler      - MCA handler
  ModuleGlobal    - Module global for function
  MakeFirst       - Make it as first?
  MakeLast        - Make it as last?

Returns: 
  Status code

--*/
;

EFI_STATUS
LibRegisterPmiFunction (
  IN  EFI_SAL_PMI_HANDLER                   PmiHandler,
  IN  VOID                                  *ModuleGlobal,
  IN  BOOLEAN                               MakeFirst,
  IN  BOOLEAN                               MakeLast
  )
/*++

Routine Description:

  Register PMI handler.

Arguments:
  PmiHandler      - PMI handler
  ModuleGlobal    - Module global for function
  MakeFirst       - Make it as first?
  MakeLast        - Make it as last?

Returns: 
  Status code

--*/
;

EFI_STATUS
LibRegisterInitFunction (
  IN  EFI_SAL_INIT_HANDLER                  InitHandler,
  IN  VOID                                  *ModuleGlobal,
  IN  BOOLEAN                               MakeFirst,
  IN  BOOLEAN                               MakeLast
  )
/*++

Routine Description:

  Register INIT handler.

Arguments:
  InitHandler     - INIT handler
  ModuleGlobal    - Module global for function
  MakeFirst       - Make it as first?
  MakeLast        - Make it as last?

Returns: 
  Status code

--*/
;

//
//  Base IO Class Functions
//
EFI_STATUS
ESalIoRead (
  IN     EFI_CPU_IO_PROTOCOL_WIDTH  Width,
  IN     UINT64                     Address,
  IN     UINTN                      Count,
  IN OUT VOID                       *Buffer
  )
/*++

Routine Description:

  Io read operation.

Arguments:

  Width   - Width of read operation
  Address - Start IO address to read
  Count   - Read count
  Buffer  - Buffer to store result

Returns:

  Status code

--*/
;

EFI_STATUS
ESalIoWrite (
  IN     EFI_CPU_IO_PROTOCOL_WIDTH  Width,
  IN     UINT64                     Address,
  IN     UINTN                      Count,
  IN OUT VOID                       *Buffer
  )
/*++

Routine Description:

  Io write operation.

Arguments:

  Width   - Width of write operation
  Address - Start IO address to write
  Count   - Write count
  Buffer  - Buffer to write to the address

Returns:

  Status code

--*/
;

EFI_STATUS
ESalMemRead (
  IN     EFI_CPU_IO_PROTOCOL_WIDTH   Width,
  IN     UINT64                      Address,
  IN     UINTN                       Count,
  IN  OUT VOID                       *Buffer
  )
/*++

Routine Description:
  Perform a Memory mapped IO read into Buffer.

Arguments:
  Width   - Width of each read transaction.
  Address - Memory mapped IO address to read
  Count   - Number of Width quanta to read
  Buffer  - Buffer to read data into. size is Width * Count

Returns: 
  Status code

--*/
;

EFI_STATUS
ESalMemWrite (
  IN     EFI_CPU_IO_PROTOCOL_WIDTH   Width,
  IN     UINT64                      Address,
  IN     UINTN                       Count,
  IN OUT VOID                        *Buffer
  )
/*++

Routine Description:
  Perform a memory mapped IO write into Buffer.

Arguments:
  Width   - Width of write transaction, and repeat operation to use
  Address - IO address to write
  Count   - Number of times to write the IO address.
  Buffer  - Buffer to write data from. size is Width * Count

Returns: 
  Status code

--*/
;

//
//  PCI Class Functions
//
SAL_RETURN_REGS
SalPCIConfigRead (
  IN  UINT64              Address,
  IN  UINT64              Size
  )
/*++

Routine Description:
  Pci config space read.

Arguments:
  Address - PCI address to read
  Size    - Size to read

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
SalPCIConfigWrite (
  IN  UINT64              Address,
  IN  UINT64              Size,
  IN  UINT64              Value
  )
/*++

Routine Description:
  Pci config space write.

Arguments:
  Address - PCI address to write
  Size    - Size to write
  Value   - Value to write

Returns: 
  Output regs

--*/
;

//
//  MP Class Functions
//
SAL_RETURN_REGS
LibMPAddCpuData (
  IN    UINT64      CpuGlobalId,
  IN    BOOLEAN     Enabled,
  IN    UINT64      PalCompatability
  )
/*++

Routine Description:
  Add CPU data.

Arguments:
  CpuGlobalId         - CPU ID
  Enabled             - Enabled or not
  PalCompatability    - Pal compatability

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
LibMPRemoveCpuData (
  IN    UINT64      CpuGlobalId
  )
/*++

Routine Description:
  Remove CPU data.

Arguments:
  CpuGlobalId         - CPU ID

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
LibMPModifyCpuData (
  IN    UINT64      CpuGlobalId,
  IN    BOOLEAN     Enabled,
  IN    UINT64      PalCompatability
  )
/*++

Routine Description:
  Modify CPU data.

Arguments:
  CpuGlobalId         - CPU ID
  Enabled             - Enabled or not
  PalCompatability    - Pal compatability

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
LibMPGetCpuDataByID (
  IN    UINT64      CpuGlobalId,
  IN    BOOLEAN     IndexByEnabledCpu
  )
/*++

Routine Description:
  Get CPU data.

Arguments:
  CpuGlobalId         - CPU ID
  IndexByEnabledCpu   - Whether indexed by enabled CPU

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
LibMPGetCpuDataByIndex (
  IN    UINT64      Index,
  IN    BOOLEAN     IndexByEnabledCpu
  )
/*++

Routine Description:
  Get CPU data.

Arguments:
  Index               - CPU index
  IndexByEnabledCpu   - Whether indexed by enabled CPU

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
LibMPSendIpi (
  IN  UINT64                ProcessorNumber,
  IN  UINT64                VectorNumber,
  IN  EFI_DELIVERY_MODE     DeliveryMode,
  IN  BOOLEAN               IRFlag
  )
/*++

Routine Description:
  Send IPI.

Arguments:
  ProcessorNumber         - Processor number
  VectorNumber            - Vector number
  DeliveryMode            - Delivery mode
  IRFlag                  - Interrupt Redirection flag

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
LibMpCurrentProcessor (
  IN    BOOLEAN     IndexByEnabledCpu
  )
/*++

Routine Description:
  Get current processor index.

Arguments:
  IndexByEnabledCpu       - Whether indexed by enabled CPU

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
LibGetNumProcessors (
  VOID
  )
/*++

Routine Description:
  Get number of processors.

Arguments:
  None

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
LibMpSaveMinStatePointer (
  IN    UINT64                CpuGlobalId,
  IN    EFI_PHYSICAL_ADDRESS  MinStatePointer
  )
/*++

Routine Description:
  Register pointer to save min state.

Arguments:
  CpuGlobalId       - CPU global ID
  MinStatePointer   - Pointer to save min state

Returns: 
  Output regs

--*/
;

SAL_RETURN_REGS
LibMpRestoreMinStatePointer (
  IN    UINT64                CpuGlobalId
  )
/*++

Routine Description:
  Restore pointer to save min state.

Arguments:
  CpuGlobalId       - CPU global ID

Returns: 
  Output regs

--*/
;

//
//  MCA Class Functions
//
EFI_STATUS
LibMcaGetStateInfo (
  IN  UINT64                                      CpuId,
  OUT EFI_PHYSICAL_ADDRESS                        *StateBufferPointer,
  OUT UINT64                                      *RequiredStateBufferSize
  )
/*++

Routine Description:
  MCA get state info.

Arguments:
  CpuId                   - CPU ID
  StateBufferPointer      - Pointer of state buffer
  RequiredStateBufferSize - Size of required state buffer

Returns: 
  Status code

--*/
;

EFI_STATUS
LibMcaRegisterCpu (
  IN  UINT64                                      CpuId,
  IN  EFI_PHYSICAL_ADDRESS                        StateBufferAddress
  )
/*++

Routine Description:
  MCA register CPU state info.

Arguments:
  CpuId                   - CPU ID
  StateBufferAddress      - Pointer of state buffer

Returns: 
  Status code

--*/
;

//
// SAL ELOG Functions
//
EFI_STATUS
LibSalGetStateInfo (
  IN  UINT64                                      McaType,
  IN  UINT8                                       *McaBuffer,
  OUT UINTN                                       *Size
  )
/*++

Routine Description:
  Get state info.

Arguments:
  McaType                 - MCA type
  McaBuffer               - Info buffer provided by caller
  Size                    - Size of info

Returns: 
  Status code

--*/
;

EFI_STATUS
LibSalGetStateInfoSize (
  IN  UINT64                                      McaType,
  OUT UINTN                                       *Size
  )
/*++

Routine Description:
  Get state info size.

Arguments:
  McaType                   - MCA type
  Size                      - Size required

Returns: 
  Status code

--*/
;

EFI_STATUS
LibSalClearStateInfo (
  IN  UINT64                                      McaType
  )
/*++

Routine Description:
  Clear state info.

Arguments:
  McaType                   - MCA type

Returns: 
  Status code

--*/
;

EFI_STATUS
LibEsalGetStateBuffer (
  IN  UINT64                                      McaType,
  OUT UINT8                                       **McaBuffer,
  OUT UINTN                                       *Index
  )
/*++

Routine Description:
  Get state buffer.

Arguments:
  McaType                   - MCA type
  McaBuffer                 - MCA buffer
  Index                     - CPU index

Returns: 
  Status code

--*/
;

EFI_STATUS
LibEsalSaveStateBuffer (
  IN  UINT64                                      McaType
  )
/*++

Routine Description:
  Save state buffer.

Arguments:
  McaType                   - MCA type

Returns: 
  Status code

--*/
;

#endif
