/** @file
  Provides CPU architecture specific functions that can not be defined
  in the Base Library due to dependencies on the PAL Library

  The CPU Library provides services to flush CPU TLBs and place the CPU in a sleep state.
  The implementation of these services on Itanium processors requires the use of PAL Calls.
  PAL Calls require PEI and DXE specific mechanisms to look up PAL Entry Point.
  As a result, these services could not be defined in the Base Library.

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2024, Loongson Technology Corporation Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

/**
  Places the CPU in a sleep state until an interrupt is received.

  Places the CPU in a sleep state until an interrupt is received. If interrupts
  are disabled prior to calling this function, then the CPU will be placed in a
  sleep state indefinitely.

**/
VOID
EFIAPI
CpuSleep (
  VOID
  );

/**
  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.

  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.

**/
VOID
EFIAPI
CpuFlushTlb (
  VOID
  );

#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) || defined (MDE_CPU_LOONGARCH64) || defined (MDE_CPU_RISCV64)

/**
  Initialize the CPU floating point units.

  Initializes floating point units for requirement of UEFI specification.
  For IA32 and X64, this function initializes floating-point control word to 0x027F
  (all exceptions masked,double-precision, round-to-nearest) and multimedia-extensions
  control word (if supported) to 0x1F80 (all exceptions masked, round-to-nearest,
  flush to zero for masked underflow).
**/
VOID
EFIAPI
InitializeFloatingPointUnits (
  VOID
  );

#endif

#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)

/**
  Determine if the standard CPU signature is "AuthenticAMD".
  @retval TRUE  The CPU signature matches.
  @retval FALSE The CPU signature does not match.
**/
BOOLEAN
EFIAPI
StandardSignatureIsAuthenticAMD (
  VOID
  );

/**
  Return the 32bit CPU family and model value.
  @return CPUID[01h].EAX with Processor Type and Stepping ID cleared.
**/
UINT32
EFIAPI
GetCpuFamilyModel (
  VOID
  );

/**
  Return the CPU stepping ID.
  @return CPU stepping ID value in CPUID[01h].EAX.
**/
UINT8
EFIAPI
GetCpuSteppingId (
  VOID
  );

#endif

#if defined (MDE_CPU_LOONGARCH64)

/**
  Enable the CPU floating point units.

  Enable the CPU floating point units.
**/
VOID
EFIAPI
EnableFloatingPointUnits (
  VOID
  );

/**
  Disable the CPU floating point units.

  Disable the CPU floating point units.
**/
VOID
EFIAPI
DisableFloatingPointUnits (
  VOID
  );

#endif
