/** @file
*
*  Copyright (c) 2011-2013, ARM Limited. All rights reserved.
*
*  SPDX-License-Identifier: BSD-2-Clause-Patent
*
**/

#include "Mmc.h"

#if !defined(MDEPKG_NDEBUG)
CONST CHAR8* mStrUnit[] = { "100kbit/s", "1Mbit/s", "10Mbit/s", "100MBit/s",
                            "Unknown", "Unknown", "Unknown", "Unknown" };
CONST CHAR8* mStrValue[] = { "1.0", "1.2", "1.3", "1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "5.0",
                             "Unknown", "Unknown", "Unknown", "Unknown" };
#endif

VOID
PrintCID (
  IN UINT32* Cid
  )
{
  DEBUG ((EFI_D_ERROR, "- PrintCID\n"));
  DEBUG ((EFI_D_ERROR, "\t- Manufacturing date: %d/%d\n", (Cid[0] >> 8) & 0xF, (Cid[0] >> 12) & 0xFF));
  DEBUG ((EFI_D_ERROR, "\t- Product serial number: 0x%X%X\n", Cid[1] & 0xFFFFFF, (Cid[0] >> 24) & 0xFF));
  DEBUG ((EFI_D_ERROR, "\t- Product revision: %d\n", Cid[1] >> 24));
  //DEBUG ((EFI_D_ERROR, "\t- Product name: %s\n", (char*)(Cid + 2)));
  DEBUG ((EFI_D_ERROR, "\t- OEM ID: %c%c\n", (Cid[3] >> 8) & 0xFF, (Cid[3] >> 16) & 0xFF));
}


VOID
PrintCSD (
  IN UINT32* Csd
  )
{
  UINTN Value;

  if (((Csd[2] >> 30) & 0x3) == 0) {
    DEBUG ((EFI_D_ERROR, "- PrintCSD Version 1.01-1.10/Version 2.00/Standard Capacity\n"));
  } else if (((Csd[2] >> 30) & 0x3) == 1) {
    DEBUG ((EFI_D_ERROR, "- PrintCSD Version 2.00/High Capacity\n"));
  } else {
    DEBUG ((EFI_D_ERROR, "- PrintCSD Version Higher than v3.3\n"));
  }

  DEBUG ((EFI_D_ERROR, "\t- Supported card command class: 0x%X\n", MMC_CSD_GET_CCC (Csd)));
  DEBUG ((EFI_D_ERROR, "\t- Speed: %a %a\n",mStrValue[(MMC_CSD_GET_TRANSPEED (Csd) >> 3) & 0xF],mStrUnit[MMC_CSD_GET_TRANSPEED (Csd) & 7]));
  DEBUG ((EFI_D_ERROR, "\t- Maximum Read Data Block: %d\n",2 << (MMC_CSD_GET_READBLLEN (Csd)-1)));
  DEBUG ((EFI_D_ERROR, "\t- Maximum Write Data Block: %d\n",2 << (MMC_CSD_GET_WRITEBLLEN (Csd)-1)));

  if (!MMC_CSD_GET_FILEFORMATGRP (Csd)) {
    Value = MMC_CSD_GET_FILEFORMAT (Csd);
    if (Value == 0) {
      DEBUG ((EFI_D_ERROR, "\t- Format (0): Hard disk-like file system with partition table\n"));
    } else if (Value == 1) {
      DEBUG ((EFI_D_ERROR, "\t- Format (1): DOS FAT (floppy-like) with boot sector only (no partition table)\n"));
    } else if (Value == 2) {
      DEBUG ((EFI_D_ERROR, "\t- Format (2): Universal File Format\n"));
    } else {
      DEBUG ((EFI_D_ERROR, "\t- Format (3): Others/Unknown\n"));
    }
  } else {
    DEBUG ((EFI_D_ERROR, "\t- Format: Reserved\n"));
  }
}

VOID
PrintRCA (
  IN UINT32 Rca
  )
{
  DEBUG ((EFI_D_ERROR, "- PrintRCA: 0x%X\n", Rca));
  DEBUG ((EFI_D_ERROR, "\t- Status: 0x%X\n", Rca & 0xFFFF));
  DEBUG ((EFI_D_ERROR, "\t- RCA: 0x%X\n", (Rca >> 16) & 0xFFFF));
}

VOID
PrintOCR (
  IN UINT32 Ocr
  )
{
  UINTN MinV;
  UINTN MaxV;
  UINTN Volts;
  UINTN Loop;

  MinV  = 36;  // 3.6
  MaxV  = 20;  // 2.0
  Volts = 20;  // 2.0

  // The MMC register bits [23:8] indicate the working range of the card
  for (Loop = 8; Loop < 24; Loop++) {
    if (Ocr & (1 << Loop)) {
      if (MinV > Volts) {
        MinV = Volts;
      }
      if (MaxV < Volts) {
        MaxV = Volts + 1;
      }
    }
    Volts++;
  }

  DEBUG ((EFI_D_ERROR, "- PrintOCR Ocr (0x%X)\n",Ocr));
  DEBUG ((EFI_D_ERROR, "\t- Card operating voltage: %d.%d to %d.%d\n", MinV/10, MinV % 10, MaxV/10, MaxV % 10));
  if (((Ocr >> 29) & 3) == 0) {
    DEBUG ((EFI_D_ERROR, "\t- AccessMode: Byte Mode\n"));
  } else {
    DEBUG ((EFI_D_ERROR, "\t- AccessMode: Block Mode (0x%X)\n", ((Ocr >> 29) & 3)));
  }

  if (Ocr & MMC_OCR_POWERUP) {
    DEBUG ((EFI_D_ERROR, "\t- PowerUp\n"));
  } else {
    DEBUG ((EFI_D_ERROR, "\t- Voltage Not Supported\n"));
  }
}

VOID
PrintResponseR1 (
  IN  UINT32 Response
  )
{
  DEBUG ((EFI_D_INFO, "Response: 0x%X\n", Response));
  if (Response & MMC_R0_READY_FOR_DATA) {
    DEBUG ((EFI_D_INFO, "\t- READY_FOR_DATA\n"));
  }

  switch ((Response >> 9) & 0xF) {
  case 0:
    DEBUG ((EFI_D_INFO, "\t- State: Idle\n"));
    break;
  case 1:
    DEBUG ((EFI_D_INFO, "\t- State: Ready\n"));
    break;
  case 2:
    DEBUG ((EFI_D_INFO, "\t- State: Ident\n"));
    break;
  case 3:
    DEBUG ((EFI_D_INFO, "\t- State: StandBy\n"));
    break;
  case 4:
    DEBUG ((EFI_D_INFO, "\t- State: Tran\n"));
    break;
  case 5:
    DEBUG ((EFI_D_INFO, "\t- State: Data\n"));
    break;
  case 6:
    DEBUG ((EFI_D_INFO, "\t- State: Rcv\n"));
    break;
  case 7:
    DEBUG ((EFI_D_INFO, "\t- State: Prg\n"));
    break;
  case 8:
    DEBUG ((EFI_D_INFO, "\t- State: Dis\n"));
    break;
  default:
    DEBUG ((EFI_D_INFO, "\t- State: Reserved\n"));
    break;
  }
}
