public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Guo Dong" <guo.dong@intel.com>
To: devel@edk2.groups.io
Cc: ray.ni@intel.com, maurice.ma@intel.com, benjamin.you@intel.com,
	Guo Dong <guo.dong@intel.com>
Subject: [`edk2-devel][PATCH 5/8] UefiPayloadPkg: Add FlashDeviceLib
Date: Sat, 25 Sep 2021 16:05:27 -0700	[thread overview]
Message-ID: <20210925230530.861-6-guo.dong@intel.com> (raw)
In-Reply-To: <20210925230530.861-1-guo.dong@intel.com>

From: Guo Dong <guo.dong@intel.com>

This library provides FlashDeviceLib APIs based on
SpiFlashLib and consumed by FVB driver.

Signed-off-by: Guo Dong <guo.dong@intel.com>
---
 .../Include/Library/FlashDeviceLib.h          | 108 ++++++++++++
 .../Library/FlashDeviceLib/FlashDeviceLib.c   | 165 ++++++++++++++++++
 .../Library/FlashDeviceLib/FlashDeviceLib.inf |  38 ++++
 3 files changed, 311 insertions(+)
 create mode 100644 UefiPayloadPkg/Include/Library/FlashDeviceLib.h
 create mode 100644 UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.c
 create mode 100644 UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.inf

diff --git a/UefiPayloadPkg/Include/Library/FlashDeviceLib.h b/UefiPayloadPkg/Include/Library/FlashDeviceLib.h
new file mode 100644
index 0000000000..32694b317e
--- /dev/null
+++ b/UefiPayloadPkg/Include/Library/FlashDeviceLib.h
@@ -0,0 +1,108 @@
+/** @file
+  Flash device library class header file.
+
+  Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+
+#ifndef __FLASHDEVICE_LIB_H__
+#define __FLASHDEVICE_LIB_H__
+
+/**
+  Read NumBytes bytes of data from the address specified by
+  PAddress into Buffer.
+
+  @param[in]      PAddress    The starting physical address of the read.
+  @param[in,out]  NumBytes    On input, the number of bytes to read. On output, the number
+                              of bytes actually read.
+  @param[out]     Buffer      The destination data buffer for the read.
+
+  @retval EFI_SUCCESS.        Opertion is successful.
+  @retval EFI_DEVICE_ERROR    If there is any device errors.
+
+**/
+EFI_STATUS
+EFIAPI
+LibFvbFlashDeviceRead (
+  IN      UINTN                           PAddress,
+  IN  OUT UINTN                           *NumBytes,
+      OUT UINT8                           *Buffer
+  );
+
+
+/**
+  Write NumBytes bytes of data from Buffer to the address specified by
+  PAddresss.
+
+  @param[in]      PAddress The starting physical address of the write.
+  @param[in,out]  NumBytes On input, the number of bytes to write. On output,
+                           the actual number of bytes written.
+  @param[in]      Buffer   The source data buffer for the write.
+
+  @retval EFI_SUCCESS.            Opertion is successful.
+  @retval EFI_DEVICE_ERROR        If there is any device errors.
+
+**/
+EFI_STATUS
+EFIAPI
+LibFvbFlashDeviceWrite (
+  IN        UINTN                           PAddress,
+  IN OUT    UINTN                           *NumBytes,
+  IN        UINT8                           *Buffer
+  );
+
+
+/**
+  Erase the block staring at PAddress.
+
+  @param[in]  PAddress The starting physical address of the region to be erased.
+  @param[in]  LbaLength   The length of the region to be erased. This parameter is necessary
+                       as the physical block size on a flash device could be different than
+                       the logical block size of Firmware Volume Block protocol. Erase on
+                       flash chip is always performed block by block. Therefore, the ERASE
+                       operation to a logical block is converted a number of ERASE operation
+                       (or a partial erase) on the hardware.
+
+  @retval EFI_SUCCESS.            Opertion is successful.
+  @retval EFI_DEVICE_ERROR        If there is any device errors.
+
+**/
+EFI_STATUS
+EFIAPI
+LibFvbFlashDeviceBlockErase (
+  IN    UINTN                      PAddress,
+  IN    UINTN                      LbaLength
+);
+
+
+/**
+  Lock or unlock the block staring at PAddress.
+
+  @param[in]  PAddress The starting physical address of region to be (un)locked.
+  @param[in]  LbaLength   The length of the region to be (un)locked. This parameter is necessary
+                       as the physical block size on a flash device could be different than
+                       the logical block size of Firmware Volume Block protocol. (Un)Lock on
+                       flash chip is always performed block by block. Therefore, the (Un)Lock
+                       operation to a logical block is converted a number of (Un)Lock operation
+                       (or a partial erase) on the hardware.
+  @param[in]  Lock     TRUE to lock. FALSE to unlock.
+
+  @retval EFI_SUCCESS. Opertion is successful.
+
+**/
+EFI_STATUS
+EFIAPI
+LibFvbFlashDeviceBlockLock (
+  IN    UINTN                          PAddress,
+  IN    UINTN                          LbaLength,
+  IN    BOOLEAN                        Lock
+);
+
+PHYSICAL_ADDRESS
+EFIAPI
+LibFvbFlashDeviceMemoryMap (
+);
+
+#endif
diff --git a/UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.c b/UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.c
new file mode 100644
index 0000000000..efefd53466
--- /dev/null
+++ b/UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.c
@@ -0,0 +1,165 @@
+/** @file
+  Flash Device Library based on SPI Flash library.
+
+Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved. <BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <PiDxe.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/SpiFlashLib.h>
+
+/**
+  Initialize spi flash device.
+
+  @retval EFI_SUCCESS              The tested spi flash device is supported.
+  @retval EFI_UNSUPPORTED          The tested spi flash device is not supported.
+
+**/
+EFI_STATUS
+EFIAPI
+LibFvbFlashDeviceInit (
+  VOID
+  )
+{
+  return SpiConstructor ();
+}
+
+
+/**
+  Read NumBytes bytes of data from the address specified by
+  PAddress into Buffer.
+
+  @param[in]      PAddress      The starting physical address of the read.
+  @param[in,out]  NumBytes      On input, the number of bytes to read. On output, the number
+                                of bytes actually read.
+  @param[out]     Buffer        The destination data buffer for the read.
+
+  @retval         EFI_SUCCESS.      Opertion is successful.
+  @retval         EFI_DEVICE_ERROR  If there is any device errors.
+
+**/
+EFI_STATUS
+EFIAPI
+LibFvbFlashDeviceRead (
+  IN      UINTN                           PAddress,
+  IN  OUT UINTN                           *NumBytes,
+      OUT UINT8                           *Buffer
+  )
+{
+  EFI_STATUS                              Status;
+  UINT32                                  ByteCount;
+  UINT32                                  RgnSize;
+  UINT32                                  AddrOffset;
+
+  Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  // BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize))
+  // which equal (PAddress + RgnSize) here.
+  AddrOffset = (UINT32)((UINT32)PAddress + RgnSize);
+  ByteCount  = (UINT32)*NumBytes;
+  return SpiFlashRead (FlashRegionBios, AddrOffset, ByteCount, Buffer);
+}
+
+
+/**
+  Write NumBytes bytes of data from Buffer to the address specified by
+  PAddresss.
+
+  @param[in]      PAddress        The starting physical address of the write.
+  @param[in,out]  NumBytes        On input, the number of bytes to write. On output,
+                                  the actual number of bytes written.
+  @param[in]      Buffer          The source data buffer for the write.
+
+  @retval         EFI_SUCCESS.      Opertion is successful.
+  @retval         EFI_DEVICE_ERROR  If there is any device errors.
+
+**/
+EFI_STATUS
+EFIAPI
+LibFvbFlashDeviceWrite (
+  IN        UINTN                           PAddress,
+  IN OUT    UINTN                           *NumBytes,
+  IN        UINT8                           *Buffer
+  )
+{
+  EFI_STATUS                                Status;
+  UINT32                                    ByteCount;
+  UINT32                                    RgnSize;
+  UINT32                                    AddrOffset;
+
+  Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  // BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize))
+  // which equal (PAddress + RgnSize) here.
+  AddrOffset = (UINT32)((UINT32)PAddress + RgnSize);
+  ByteCount  = (UINT32)*NumBytes;
+  return SpiFlashWrite (FlashRegionBios, AddrOffset, ByteCount, Buffer);
+}
+
+
+/**
+  Erase the block staring at PAddress.
+
+  @param[in]  PAddress        The starting physical address of the block to be erased.
+                              This library assume that caller garantee that the PAddress
+                              is at the starting address of this block.
+  @param[in]  LbaLength       The length of the logical block to be erased.
+
+  @retval     EFI_SUCCESS.      Opertion is successful.
+  @retval     EFI_DEVICE_ERROR  If there is any device errors.
+
+**/
+EFI_STATUS
+EFIAPI
+LibFvbFlashDeviceBlockErase (
+  IN    UINTN                     PAddress,
+  IN    UINTN                     LbaLength
+  )
+{
+  EFI_STATUS                      Status;
+  UINT32                          RgnSize;
+  UINT32                          AddrOffset;
+
+  Status = SpiGetRegionAddress (FlashRegionBios, NULL, &RgnSize);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  // BIOS region offset can be calculated by (PAddress - (0x100000000 - RgnSize))
+  // which equal (PAddress + RgnSize) here.
+  AddrOffset = (UINT32)((UINT32)PAddress + RgnSize);
+  return SpiFlashErase (FlashRegionBios, AddrOffset, (UINT32)LbaLength);
+}
+
+
+/**
+  Lock or unlock the block staring at PAddress.
+
+  @param[in]  PAddress        The starting physical address of region to be (un)locked.
+  @param[in]  LbaLength       The length of the logical block to be erased.
+  @param[in]  Lock            TRUE to lock. FALSE to unlock.
+
+  @retval     EFI_SUCCESS.      Opertion is successful.
+  @retval     EFI_DEVICE_ERROR  If there is any device errors.
+
+**/
+EFI_STATUS
+EFIAPI
+LibFvbFlashDeviceBlockLock (
+  IN    UINTN                          PAddress,
+  IN    UINTN                          LbaLength,
+  IN    BOOLEAN                        Lock
+  )
+{
+  return EFI_SUCCESS;
+}
+
diff --git a/UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.inf b/UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.inf
new file mode 100644
index 0000000000..0ad22cffba
--- /dev/null
+++ b/UefiPayloadPkg/Library/FlashDeviceLib/FlashDeviceLib.inf
@@ -0,0 +1,38 @@
+## @file
+# Library instace of Flash Device Library Class
+#
+# This library implement the flash device library class for the lakeport platform.
+#@copyright
+# Copyright (c) 2014 - 2021 Intel Corporation. All rights reserved
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = FlashDeviceLib
+  FILE_GUID                      = BA7CA537-1C65-4a90-9379-622A24A08141
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = FlashDeviceLib | DXE_SMM_DRIVER DXE_RUNTIME_DRIVER
+
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64
+#
+
+[Sources]
+  FlashDeviceLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  UefiPayloadPkg/UefiPayloadPkg.dec
+
+[LibraryClasses]
+  DebugLib
+  BaseMemoryLib
+  SpiFlashLib
+
-- 
2.32.0.windows.2


  parent reply	other threads:[~2021-09-25 23:05 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-25 23:05 [`edk2-devel][PATCH 0/8] Add SMM variable support for UEFI payload Guo Dong
2021-09-25 23:05 ` [`edk2-devel][PATCH 1/8] UefiPayloadPkg: Add a common SmmAccessDxe module Guo Dong
2021-09-25 23:05 ` [`edk2-devel][PATCH 2/8] UefiPayloadPkg: Add a common SMM control Runtime DXE module Guo Dong
2021-09-25 23:05 ` [`edk2-devel][PATCH 3/8] UefiPayloadPkg: Add bootloader SMM support module Guo Dong
2021-09-25 23:05 ` [`edk2-devel][PATCH 4/8] UefiPayloadPkg: Add SpiFlashLib Guo Dong
2021-09-25 23:05 ` Guo Dong [this message]
2021-09-25 23:05 ` [`edk2-devel][PATCH 6/8] UefiPayloadPkg: Add a common FVB SMM module Guo Dong
2021-09-25 23:05 ` [`edk2-devel][PATCH 7/8] UefiPayloadPkg: Add a SMM dispatch module Guo Dong
2021-09-25 23:05 ` [`edk2-devel][PATCH 8/8] UefiPayloadPkg: Add SMM support and SMM variable support Guo Dong
2021-09-30  0:11 ` [`edk2-devel][PATCH 0/8] Add SMM variable support for UEFI payload Ni, Ray

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210925230530.861-6-guo.dong@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox