/** @file

  Fetch the Tdx info.

  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <IndustryStandard/Tdx.h>
#include <Uefi/UefiBaseType.h>
#include <Library/TdxLib.h>
#include <Library/BaseMemoryLib.h>

UINT64   mTdSharedPageMask = 0;
UINT32   mTdMaxVCpuNum     = 0;
UINT32   mTdVCpuNum        = 0;
BOOLEAN  mTdDataReturned   = FALSE;

/**
  This function call TDCALL_TDINFO to get the TD_RETURN_DATA.
  If the TDCALL is successful, populate below variables:
   - mTdSharedPageMask
   - mTdMaxVCpunum
   - mTdVCpuNum
   - mTdDataReturned

  @return TRUE  The TDCALL is successful and above variables are populated.
  @return FALSE The TDCALL is failed. Above variables are not set.
**/
BOOLEAN
GetTdInfo (
  VOID
  )
{
  UINT64          Status;
  TD_RETURN_DATA  TdReturnData;
  UINT8           Gpaw;

  Status = TdCall (TDCALL_TDINFO, 0, 0, 0, &TdReturnData);
  if (Status == TDX_EXIT_REASON_SUCCESS) {
    Gpaw              = (UINT8)(TdReturnData.TdInfo.Gpaw & 0x3f);
    mTdSharedPageMask = 1ULL << (Gpaw - 1);
    mTdMaxVCpuNum     = TdReturnData.TdInfo.MaxVcpus;
    mTdVCpuNum        = TdReturnData.TdInfo.NumVcpus;
    mTdDataReturned   = TRUE;
  } else {
    DEBUG ((DEBUG_ERROR, "Failed call TDCALL_TDINFO. %llx\n", Status));
    mTdDataReturned = FALSE;
  }

  return mTdDataReturned;
}

/**
  This function gets the Td guest shared page mask.

  The guest indicates if a page is shared using the Guest Physical Address
  (GPA) Shared (S) bit. If the GPA Width(GPAW) is 48, the S-bit is bit-47.
  If the GPAW is 52, the S-bit is bit-51.

  @return Shared page bit mask
**/
UINT64
EFIAPI
TdSharedPageMask (
  VOID
  )
{
  if (mTdDataReturned) {
    return mTdSharedPageMask;
  }

  return GetTdInfo () ? mTdSharedPageMask : 0;
}

/**
  This function gets the maximum number of Virtual CPUs that are usable for
  Td Guest.

  @return maximum Virtual CPUs number
**/
UINT32
EFIAPI
TdMaxVCpuNum (
  VOID
  )
{
  if (mTdDataReturned) {
    return mTdMaxVCpuNum;
  }

  return GetTdInfo () ? mTdMaxVCpuNum : 0;
}

/**
  This function gets the number of Virtual CPUs that are usable for Td
  Guest.

  @return Virtual CPUs number
**/
UINT32
EFIAPI
TdVCpuNum (
  VOID
  )
{
  if (mTdDataReturned) {
    return mTdVCpuNum;
  }

  return GetTdInfo () ? mTdVCpuNum : 0;
}
