public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "xianglai" <lixianglai@loongson.cn>
To: devel@edk2.groups.io
Subject: [edk2-platforms][PATCH V1 05/15] Platform/Loongson: Add BpiLib.
Date: Wed,  2 Mar 2022 03:44:37 -0500	[thread overview]
Message-ID: <20220302084447.2991355-6-lixianglai@loongson.cn> (raw)
In-Reply-To: <20220302084447.2991355-1-lixianglai@loongson.cn>

This library provides interfaces for creating kernel boot parameters.

Signed-off-by: xianglai li <lixianglai@loongson.cn>
---
 .../LoongArchQemuPkg/Include/Library/Bpi.h    |  77 +++
 .../LoongArchQemuPkg/Library/BpiLib/Bpi.c     | 492 ++++++++++++++++++
 .../Library/BpiLib/BpiLib.inf                 |  38 ++
 3 files changed, 607 insertions(+)
 create mode 100644 Platform/Loongson/LoongArchQemuPkg/Include/Library/Bpi.h
 create mode 100644 Platform/Loongson/LoongArchQemuPkg/Library/BpiLib/Bpi.c
 create mode 100644 Platform/Loongson/LoongArchQemuPkg/Library/BpiLib/BpiLib.inf

diff --git a/Platform/Loongson/LoongArchQemuPkg/Include/Library/Bpi.h b/Platform/Loongson/LoongArchQemuPkg/Include/Library/Bpi.h
new file mode 100644
index 0000000000..cb2585ccb7
--- /dev/null
+++ b/Platform/Loongson/LoongArchQemuPkg/Include/Library/Bpi.h
@@ -0,0 +1,77 @@
+/** @file
+
+  Copyright (c) 2021 Loongson Technology Corporation Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Glossary:
+    - BPI or Bpi    - Boot Parameter Interface
+    - MEM or Mem    - Memory
+    - info or INFO  - Information
+    - SINFO    - Screen information
+**/
+#ifndef BPI_H_
+#define BPI_H_
+
+#include <IndustryStandard/LinuxBzimage.h>
+#define SYSTEM_RAM              1
+#define SYSTEM_RAM_RESERVED     2
+#define ACPI_TABLE              3
+#define ACPI_NVS                4
+#define SYSTEM_PMEM             5
+
+#define MAX_MEM_MAP             128
+
+#define DEBUG_BPI
+
+#define MAP_ENTRY(Entry, Type, Start, Size)  \
+   MemMap->Map[(Entry)].MemType = (Type),   \
+   MemMap->Map[(Entry)].MemStart = (Start), \
+   MemMap->Map[(Entry)].MemSize = (Size),   \
+   Entry++
+
+#pragma pack(1)
+typedef struct _extension_list_hdr{
+  UINT64  Signature;
+  UINT32  Length;
+  UINT8   Revision;
+  UINT8   CheckSum;
+  struct  _extension_list_hdr *next;
+}EXT_LIST;
+
+typedef struct _BootParams_Interface {
+  UINT64           Signature;   //{'B', 'P', 'I', '0', '1', '0', '0', '1'}
+  EFI_SYSTEM_TABLE *SystemTable;
+  EXT_LIST         *ExtList;
+}BootParamsInterface;
+
+typedef struct _MEMMAP_ {
+  UINT32 MemType;
+  UINT64 MemStart;
+  UINT64 MemSize;
+}MEMMAP;
+
+typedef struct _MEM_MAP_ {
+  EXT_LIST Header;         //  {'M', 'E', 'M'}
+  UINT8    MapCount;
+  MEMMAP   Map[MAX_MEM_MAP];
+} MEM_MAP;
+
+typedef struct {
+  EXT_LIST Header;          // {SI}
+  struct screen_info si;
+}SINFO;
+
+typedef struct {
+  UINT64  BaseAddr;
+  UINT64  Length;
+  UINT32  Type;
+  UINT32  Reserved;
+} LOONGARCH_MEMMAP_ENTRY;
+
+#pragma pack()
+
+typedef struct screen_info SCREEN_INFO;
+
+#endif
+
diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/BpiLib/Bpi.c b/Platform/Loongson/LoongArchQemuPkg/Library/BpiLib/Bpi.c
new file mode 100644
index 0000000000..c36ade6be9
--- /dev/null
+++ b/Platform/Loongson/LoongArchQemuPkg/Library/BpiLib/Bpi.c
@@ -0,0 +1,492 @@
+/** @file
+
+  Copyright (c) 2021 Loongson Technology Corporation Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Glossary:
+    - Bpi    - Boot Parameter Interface
+    - Calc   - Calculation
+    - Mem   - memory
+    - Ext   - Exist
+    - FwCfg   - firmWare  Configure
+    - si   - Screen Information
+    - pos   - Position
+**/
+#include "Uefi.h"
+#include <Base.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Protocol/GraphicsOutput.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/QemuFwCfgLib.h>
+#include <Library/Bpi.h>
+
+/*
+  Calculates the checksum and saves the result at the end of the data.
+
+  @param  Buffer A pointer to the data to calculate the checksum.
+  @param  Size   The number of data involved in calculating the checksum.
+
+  @retval  VOID
+ */
+VOID
+BpiChecksum (
+  IN UINT8      *Buffer,
+  IN UINTN      Size
+  )
+{
+  UINTN ChecksumOffset;
+
+  //
+  // CheckSum's offset in EXT_LIST is the same as in EXT_LIST's container (Buffer).
+  //
+  ChecksumOffset = OFFSET_OF (EXT_LIST, CheckSum);
+
+  //
+  // set checksum to 0 first
+  //
+  Buffer[ChecksumOffset] = 0;
+
+  //
+  // Update checksum value
+  //
+  Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Size);
+}
+
+/*
+   Add a linked list node to the linked list.
+
+  @param  Bpi    A pointer to the structure that holds the header of the linked list.
+  @param  Header The address of the node to join the linked list.
+
+  @retval  VOID
+ */
+VOID
+EFIAPI
+AddToList (
+  IN BootParamsInterface *Bpi,
+  OUT EXT_LIST *Header
+  )
+{
+  EXT_LIST *LastHeader;
+
+  if (Bpi->ExtList == NULL) {
+    Bpi->ExtList = Header;
+  } else {
+    for (LastHeader = Bpi->ExtList; LastHeader->next; LastHeader = LastHeader->next) {
+    }
+    LastHeader->next = Header;
+    BpiChecksum ((UINT8 *)LastHeader, LastHeader->Length);
+  }
+  Header->next = NULL;
+  BpiChecksum ((UINT8 *)Header, Header->Length);
+}
+
+#ifdef DEBUG_BPI
+/*
+   Iterates through the linked list and prints the data in all linked list nodes.
+
+  @param  Bpi    A pointer to the structure that holds the header of the linked list.
+
+  @retval  VOID
+ */
+VOID
+EFIAPI
+ShowList (
+  IN BootParamsInterface *Bpi
+  )
+{
+  EXT_LIST *LastHeader;
+
+  if (Bpi->ExtList == NULL) {
+    DEBUG ((DEBUG_INFO, "List is null\n"));
+  } else {
+    for (LastHeader = Bpi->ExtList; LastHeader; LastHeader = LastHeader->next) {
+      DEBUG ((DEBUG_INFO, "Header: 0x%llx, Legth: 0x%x, CheckSum: 0x%x\n", LastHeader, LastHeader->Length,
+            LastHeader->CheckSum));
+    }
+  }
+}
+#endif
+/*
+  Read fwCfg to get the memory-mapped information and add it to the linked list.
+
+  @param  Bpi    A pointer to the structure that holds the header of the linked list.
+  @param  MemMap  A pointer to a memory-mapped struct.
+
+  @retval  VOID
+ */
+VOID
+EFIAPI
+InitMemMap (
+  IN OUT BootParamsInterface *Bpi,
+  OUT MEM_MAP *MemMap
+  )
+{
+  UINT64   RamSize;
+  UINT8    Data[8] = {'M', 'E', 'M'};
+  INTN      i = 0;
+  EFI_STATUS           Status;
+  FIRMWARE_CONFIG_ITEM FwCfgItem;
+  UINTN                FwCfgSize;
+  LOONGARCH_MEMMAP_ENTRY  MemMapEntry;
+  LOONGARCH_MEMMAP_ENTRY  *StartEntry;
+  LOONGARCH_MEMMAP_ENTRY  *pEntry;
+  UINTN                Processed;
+
+  SetMem (&MemMap->Header, sizeof (EXT_LIST), 0);
+
+  CopyMem (&MemMap->Header.Signature, Data, sizeof (EXT_LIST));
+  MemMap->Header.Revision = 0;
+  MemMap->Header.Length = sizeof (MEM_MAP);
+
+  RamSize = PcdGet64 (PcdRamSize); //in Byte
+
+  ASSERT (RamSize != 0);
+  DEBUG ((DEBUG_INFO, "RamSize %lld Byte\n", RamSize));
+
+  /*
+   * 1. The lowest 2M region cannot record in MemMap, cause Linux ram region should begin with usable ram.
+   *    MAP_ENTRY (i, SYSTEM_RAM_RESERVED, 0x0, 0x200000);  // 0x0-0x200000
+   */
+
+  /* 2. Available SYSTEM_RAM area. */
+  MAP_ENTRY (i, SYSTEM_RAM, 0x200000, 0xf000000 - 0x200000);  // 0x200000~0xf000000
+
+  /* 3. Reserved low memory highest 16M. */
+  MAP_ENTRY (i, SYSTEM_RAM_RESERVED, 0xf000000, 0x1000000);  // 0xf000000~0x10000000
+  /*
+   * 0x90000000 -- 0xC0000000 is used by uefi bios
+   */
+  //MAP_ENTRY (i, SYSTEM_RAM, 0x90000000, 0x30000000);
+
+
+  /* Read memmap from QEMU when RamSize is larger than 1G */
+  if (RamSize > SIZE_1GB) {
+    Status = QemuFwCfgFindFile ("etc/memmap", &FwCfgItem, &FwCfgSize);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "fw read etc/la_memmap error Status %d \n", Status));
+    }
+    if (FwCfgSize % sizeof MemMapEntry != 0) {
+      DEBUG ((DEBUG_ERROR, "no MemMapEntry FwCfgSize:%d\n", FwCfgSize));
+    }
+
+    QemuFwCfgSelectItem (FwCfgItem);
+    StartEntry = AllocateZeroPool (FwCfgSize);
+    QemuFwCfgReadBytes (FwCfgSize, StartEntry);
+    for (Processed = 0; Processed < (FwCfgSize / sizeof MemMapEntry); Processed++) {
+      pEntry = StartEntry + Processed;
+      DEBUG ((
+        DEBUG_INFO,
+        "%a:%d Base=0x%Lx Length=0x%Lx Type=%u sizeof (MemMapEntry):%d, Processed:%d, FwCfgSize:%d\n",
+        __FUNCTION__,
+        __LINE__,
+        pEntry->BaseAddr,
+        pEntry->Length,
+        pEntry->Type,
+        sizeof MemMapEntry,
+        Processed,
+        FwCfgSize
+        ));
+      MAP_ENTRY (i, pEntry->Type, pEntry->BaseAddr, pEntry->Length);
+    }
+  }
+
+  MemMap->MapCount = i;
+  AddToList (Bpi, &MemMap->Header);
+#ifdef DEBUG_BPI
+  INTN j;
+  for (j = 0; j < i; j++) {
+    DEBUG ((DEBUG_INFO, "%d: type: 0x%x, start: 0x%llx, size: 0x%llx\n", j, MemMap->Map[j].MemType,
+           MemMap->Map[j].MemStart, MemMap->Map[j].MemSize));
+  }
+#endif
+}
+/*
+  Find the first bit field with 1 and get its starting position and length.
+
+  @param  Mask   To find data for the bit field.
+  @param  Pos    Find the starting location of the bit domain.
+  @param  Size   The length of the bit domain found.
+
+  @retval  VOID
+ */
+VOID
+FindBits (
+  IN UINT64 Mask,
+  OUT UINT8 *Pos,
+  OUT UINT8 *Size
+  )
+{
+  UINT8 First;
+  UINT8 Len;
+
+  First = 0;
+  Len = 0;
+
+  if (Mask) {
+    while (!(Mask & 0x1)) {
+      Mask = Mask >> 1;
+      First++;
+    }
+
+    while (Mask & 0x1) {
+      Mask = Mask >> 1;
+      Len++;
+    }
+  }
+  *Pos = First;
+  *Size = Len;
+}
+
+/*
+  Establish graph-related parameters by EFI_GRAPHICS_OUTPUT_PROTOCOL.
+
+  @param  Si    A pointer to the SCREEN_INFO struct.
+  @param  Gop   A pointer to the EFI_GRAPHICS_OUTPUT_PROTOCOL structure.
+
+  @retval  VOID
+ */
+EFI_STATUS
+SetupGraphicsFromGop (
+  OUT SCREEN_INFO           *Si,
+  IN EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop
+  )
+{
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
+  EFI_STATUS                           Status;
+  UINTN                                Size;
+
+  Status = Gop->QueryMode (Gop, Gop->Mode->Mode, &Size, &Info);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  /* We found a GOP */
+
+  /* EFI framebuffer */
+  Si->orig_video_isVGA = 0x70;
+
+  Si->orig_x = 0;
+  Si->orig_y = 0;
+  Si->orig_video_page = 0;
+  Si->orig_video_mode = 0;
+  Si->orig_video_cols = 0;
+  Si->orig_video_lines = 0;
+  Si->orig_video_ega_bx = 0;
+  Si->orig_video_points = 0;
+
+  Si->lfb_base = (UINT32) Gop->Mode->FrameBufferBase;
+  Si->lfb_size = (UINT32) Gop->Mode->FrameBufferSize;
+  Si->lfb_width = (UINT16) Info->HorizontalResolution;
+  Si->lfb_height = (UINT16) Info->VerticalResolution;
+  Si->pages = 1;
+  Si->vesapm_seg = 0;
+  Si->vesapm_off = 0;
+
+  if (Info->PixelFormat == PixelRedGreenBlueReserved8BitPerColor) {
+    Si->lfb_depth = 32;
+    Si->red_size = 8;
+    Si->red_pos = 0;
+    Si->green_size = 8;
+    Si->green_pos = 8;
+    Si->blue_size = 8;
+    Si->blue_pos = 16;
+    Si->rsvd_size = 8;
+    Si->rsvd_pos = 24;
+    Si->lfb_linelength = (UINT16) (Info->PixelsPerScanLine * 4);
+  } else if (Info->PixelFormat == PixelBlueGreenRedReserved8BitPerColor) {
+    Si->lfb_depth = 32;
+    Si->red_size = 8;
+    Si->red_pos = 16;
+    Si->green_size = 8;
+    Si->green_pos = 8;
+    Si->blue_size = 8;
+    Si->blue_pos = 0;
+    Si->rsvd_size = 8;
+    Si->rsvd_pos = 24;
+    Si->lfb_linelength = (UINT16) (Info->PixelsPerScanLine * 4);
+  } else if (Info->PixelFormat == PixelBitMask) {
+    FindBits (Info->PixelInformation.RedMask,
+      &Si->red_pos, &Si->red_size);
+    FindBits (Info->PixelInformation.GreenMask,
+      &Si->green_pos, &Si->green_size);
+    FindBits (Info->PixelInformation.BlueMask,
+      &Si->blue_pos, &Si->blue_size);
+    FindBits (Info->PixelInformation.ReservedMask,
+      &Si->rsvd_pos, &Si->rsvd_size);
+    Si->lfb_depth = Si->red_size + Si->green_size +
+      Si->blue_size + Si->rsvd_size;
+    Si->lfb_linelength = (UINT16) ((Info->PixelsPerScanLine * Si->lfb_depth) / 8);
+  } else {
+    Si->lfb_depth = 4;
+    Si->red_size = 0;
+    Si->red_pos = 0;
+    Si->green_size = 0;
+    Si->green_pos = 0;
+    Si->blue_size = 0;
+    Si->blue_pos = 0;
+    Si->rsvd_size = 0;
+    Si->rsvd_pos = 0;
+    Si->lfb_linelength = Si->lfb_width / 2;
+  }
+
+  return Status;
+}
+/*
+  Get graph-related parameters.
+
+  @param  Si    A pointer to the SCREEN_INFO struct.
+
+  @retval  VOID
+ */
+EFI_STATUS
+SetupGraphics (
+  IN OUT SCREEN_INFO *si
+  )
+{
+  EFI_STATUS                      Status;
+  EFI_HANDLE                      *HandleBuffer;
+  UINTN                           HandleCount;
+  UINTN                           Index;
+  EFI_GRAPHICS_OUTPUT_PROTOCOL    *Gop;
+
+  ZeroMem ((VOID*)si, sizeof (SCREEN_INFO));
+
+  Status = gBS->LocateHandleBuffer (
+                  ByProtocol,
+                  &gEfiGraphicsOutputProtocolGuid,
+                  NULL,
+                  &HandleCount,
+                  &HandleBuffer
+                  );
+  if (!EFI_ERROR (Status)) {
+    for (Index = 0; Index < HandleCount; Index++) {
+      Status = gBS->HandleProtocol (
+                      HandleBuffer[Index],
+                      &gEfiGraphicsOutputProtocolGuid,
+                      (VOID*) &Gop
+                      );
+      if (EFI_ERROR (Status)) {
+        continue;
+      }
+
+      Status = SetupGraphicsFromGop (si, Gop);
+      if (!EFI_ERROR (Status)) {
+        FreePool (HandleBuffer);
+        return EFI_SUCCESS;
+      }
+    }
+    FreePool (HandleBuffer);
+  }
+  return EFI_NOT_FOUND;
+}
+/*
+  Initialize screen information.
+
+  @param  Bpi    A pointer to the BootParamsInterface struct.
+  @param  si     A pointer to the SCREEN_INFO struct.
+
+  @retval  VOID
+ */
+VOID
+EFIAPI
+InitScreenInfo (
+  IN BootParamsInterface *Bpi,
+  OUT SINFO *si
+  )
+{
+
+//  UINTN   Addr;
+  UINT8   Data[8] = {'S', 'I', 'N', 'F', 'O'};
+
+  SetMem (&si->Header, sizeof (EXT_LIST), 0);
+
+  CopyMem (&si->Header.Signature, Data, sizeof (UINT64));
+  si->Header.Revision = 0;
+  si->Header.Length = sizeof (SINFO);
+
+  SetupGraphics (&si->si);
+  AddToList (Bpi, &si->Header);
+}
+/*
+  Initialize the boot parameter interface.
+
+  @param  Bpi    A pointer to the BootParamsInterface struct.
+  @param  SystemTable     A pointer to the EFI_SYSTEM_TABLE struct.
+
+  @retval  VOID
+ */
+VOID
+EFIAPI
+InitializeBpi (
+  IN BootParamsInterface *Bpi,
+  IN EFI_SYSTEM_TABLE   *SystemTable
+  )
+{
+  DEBUG ((DEBUG_INFO, "New BPI addr: 0x%llx\n", (UINTN)Bpi));
+  UINT8 Data[8] = {'B', 'P', 'I', '0', '1', '0', '0', '1'};
+  CopyMem (&Bpi->Signature, Data, sizeof (UINT64));
+  Bpi->SystemTable = SystemTable;
+  Bpi->ExtList = NULL;
+}
+/*
+  Setup the boot parameter.
+
+  @param  VOID
+
+  @retval  EFI_SUCCESS               The boot parameter was established successfully.
+  @retval  EFI_INVALID_PARAMETER     Input GUID is NULL.
+  @retval  EFI_NOT_FOUND             Attempted to delete non-existant entry
+  @retval  EFI_OUT_OF_RESOURCES      Not enough memory available
+ */
+EFI_STATUS
+EFIAPI
+SetBootParams (VOID)
+{
+  EFI_STATUS                 Status;
+  UINTN                      Size;
+  VOID                       *BufferAddress;
+  BootParamsInterface        *Bpi;
+  MEM_MAP                    *MemMap;
+  SINFO                      *si;
+  EFI_SYSTEM_TABLE           *SystemTable;
+
+  SystemTable = gST;
+  Size  = sizeof (BootParamsInterface);
+  Size += sizeof (MEM_MAP);
+  Size += sizeof (SINFO);
+
+  Status = SystemTable->BootServices->AllocatePool (
+                                        EfiRuntimeServicesData,
+                                        Size,
+                                        &BufferAddress
+                                        );
+  if (EFI_ERROR (Status)) {
+   return EFI_OUT_OF_RESOURCES;
+  }
+
+  ZeroMem (BufferAddress, Size);
+  Bpi = (BootParamsInterface *) BufferAddress;
+  InitializeBpi (Bpi, SystemTable);
+
+  MemMap = (MEM_MAP *) (Bpi + 1);
+  InitMemMap (Bpi, MemMap);
+
+  si = (SINFO*) (MemMap + 1);
+  InitScreenInfo (Bpi, si);
+
+#ifdef DEBUG_BPI
+  ShowList (Bpi);
+#endif
+  Status = SystemTable->BootServices->InstallConfigurationTable (
+                                        &gEfiLoongsonBootparamsTableGuid,
+                                        Bpi
+                                        );
+
+  return Status;
+}
diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/BpiLib/BpiLib.inf b/Platform/Loongson/LoongArchQemuPkg/Library/BpiLib/BpiLib.inf
new file mode 100644
index 0000000000..c00a2e24fb
--- /dev/null
+++ b/Platform/Loongson/LoongArchQemuPkg/Library/BpiLib/BpiLib.inf
@@ -0,0 +1,38 @@
+## @file
+#
+#  Copyright (c) 2021 Loongson Technology Corporation Limited. All rights reserved.<BR>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = BpiLib
+  FILE_GUID                      = e15244d6-6df0-485f-9deb-190e21c57020
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = BpiLib
+
+[Sources]
+  Bpi.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  Platform/Loongson/LoongArchQemuPkg/Loongson.dec
+  OvmfPkg/OvmfPkg.dec
+
+[LibraryClasses]
+  UefiBootServicesTableLib
+  MemoryAllocationLib
+  BaseMemoryLib
+  BaseLib
+  UefiLib
+  UefiDriverEntryPoint
+  DebugLib
+
+[Pcd]
+  gLoongArchQemuPkgTokenSpaceGuid.PcdRamSize
+
+[Guids]
+  gEfiLoongsonBootparamsTableGuid                               ## SOMETIMES_PRODUCES ## SystemTable
-- 
2.27.0


  parent reply	other threads:[~2022-03-02  8:45 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-02  8:44 [edk2-platforms][PATCH V1 00/15] Platform: Add Loongson support xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 01/15] Platform/Loongson: Add Serial Port library xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 02/15] Platform/Loongson: Support SEC And Add Readme.md xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 03/15] Platform/Loongson: Add PeiServicesTablePointerLib xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 04/15] Platform/Loongson: Add QemuFwCfgLib xianglai
2022-03-02  8:44 ` xianglai [this message]
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 06/15] Platform/Loongson: Add MmuLib xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 07/15] Platform/Loongson: Add StableTimerLib xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 08/15] Platform/Loongson: Support PEI phase xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 09/15] Platform/Loongson: Add CPU DXE driver xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 10/15] Platform/Loongson: Add PciCpuIoDxe driver xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 11/15] Platform/Loongson: Add timer Dxe driver xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 12/15] Platform/Loongson: Add RealTime Clock lib xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 13/15] Platform/Loongson: Add Platform Boot Manager Lib xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 14/15] Platform/Loongson: Add Reset System Lib xianglai
2022-03-02  8:44 ` [edk2-platforms][PATCH V1 15/15] Platform/Loongson: Support Dxe xianglai

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=20220302084447.2991355-6-lixianglai@loongson.cn \
    --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