public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH edk2-platforms v2 00/43] Upload for D06 platform
@ 2018-08-14  8:08 Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 01/43] Silicon/Hisilicon: Modify the MRC interface for other module Ming Huang
                   ` (43 more replies)
  0 siblings, 44 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

The major features of this patchset include:
1 D06 source code;
2 Unify some D0x modules;

This patch set is base on pcihostbridage-v2.
For compiling D06, add below hunk to edk2-platforms.config
[d06]
LONGNAME=HiSilicon D06
DSC=Platform/Hisilicon/D06/D06.dsc
ARCH=AARCH64

Code can also be found in github: https://github.com/hisilicon/OpenPlatformPkg.git
branch: d06-platform-v2


Heyi Guo (3):
  Hisilicon/D06: Add Debug Serial Port Init Driver
  Hisilicon/Hi1620: Add ACPI PPTT table
  Platform/Hisilicon/D06: Enable ACPI PPTT

Luqi Jiang (1):
  Hisilicon/D06: add apei driver

Ming Huang (32):
  Silicon/Hisilicon: Modify the MRC interface for other module
  Silicon/Hisilicon: Separate PlatformArch.h
  Silicon/Hisilicon/Acpi: Move some macro to PlatformArch.h
  Hisilicon/D0x: Move CustomData.Fv to common path of Hisilicon
  Hisilicon/D0x: Move IpmiCmdLib to common path of Hisilicon
  Hisilicon/D0x: Unify FlashFvbDxe driver
  Hisilicon/D0X: Rename the global variable gDS3231RtcDevice
  Hisilicon/D06: Add several base file for D06
  Platform/Hisilicon/D06: Add M41T83RealTimeClockLib
  Platform/Hisilicon/D06: Add edk2-non-osi components for D06
  Hisilicon/D06: Add OemMiscLibD06
  Silicon/Hisilicon/D06: Wait for all disk ready
  Silicon/Hisilicon/Acpi: Unify HisiAcipPlatformDxe
  Hisilicon/D06: Add ACPI Tables for D06
  Silicon/Hisilicon/D06: Stop watchdog
  Hisilicon/I2C: Modify I2CLib.c for coding style
  Silicon/Hisilicon/I2C: Refactor I2C library
  Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06
  Silicon/Hisilicon/D06: Add I2C delay for HNS auto config
  Hisilicon/I2C: Fix a typo issue
  Platform/Hisilicon/D06: Add OemNicLib
  Platform/Hisilicon/D06: Add OemNicConfig2P Driver
  Platform/Hisilicon/D06: Add EarlyConfigPeim peim
  Platform/Hisilicon/D06: Add PciHostBridgeLib
  Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h
  Platform/Hisilicon/D06: Add capsule upgrade support
  Silicon/Hisilicon/D06: Add I2C Bus Exception handle function
  Silicon/Hisilicon/Setup: Support SPCR table switch
  Silicon/Hisilicon/setup: Support SMMU switch
  Hisilicon/D06: Add PciPlatformLib
  Hisilicon/D06: Add edk2-non-osi Shell components
  Platform/Hisilicon/D0x: Update version string to 18.08

Sun Yuanchen (3):
  Silicon/Hisilicon/D0x: Move dimm size definition to PlatformArch.h
  Silicon/Hisilicon/D0x: Move RAS macro to PlatformArch.h
  Hisilicon/D0x: Update SMBIOS type9 info

Yang XinYi (2):
  Hisilicon/D06: Add Hi1620OemConfigUiLib
  Silicon/Hisilicon/Setup: Add Setup Item "EnableGOP"

ZhenYao (1):
  Silicon/Hisilicon/D06: Modify for close slave core clock.

shaochangliang (1):
  Silicon/Hisilicon/D06: Optimize HNS config CDR post time

 Platform/Hisilicon/D06/D06.dec                |   29 +
 Silicon/Hisilicon/HisiPkg.dec                 |    6 +
 Platform/Hisilicon/D03/D03.dsc                |    4 +-
 Platform/Hisilicon/D05/D05.dsc                |    4 +-
 Platform/Hisilicon/D06/D06.dsc                |  490 ++++
 Platform/Hisilicon/D03/D03.fdf                |    8 +-
 Platform/Hisilicon/D05/D05.fdf                |    8 +-
 Platform/Hisilicon/D06/D06.fdf                |  444 ++++
 .../OemMiscLib2P/OemMiscLib2PHi1610.inf       |    1 +
 .../Library/OemMiscLibD05/OemMiscLibD05.inf   |    1 +
 .../OemNicConfig2PHi1620/OemNicConfig2P.inf   |   43 +
 .../SystemFirmwareDescriptor.inf              |   50 +
 .../EarlyConfigPeim/EarlyConfigPeimD06.inf    |   50 +
 .../Library/OemMiscLibD06/OemMiscLibD06.inf   |   51 +
 .../D06/Library/OemNicLib/OemNicLib.inf       |   35 +
 .../PciHostBridgeLib/PciHostBridgeLib.inf     |   36 +
 .../Drivers/FlashFvbDxe/FlashFvbDxe.inf       |    7 +-
 .../HisiAcpiPlatformDxe/AcpiPlatformDxe.inf   |    3 +-
 .../ProcessorSubClassDxe.inf                  |    2 +
 .../Hisilicon/Hi1620/Drivers/Apei/Apei.inf    |   64 +
 .../Pl011DebugSerialPortInitDxe.inf           |   48 +
 .../Hi1620AcpiTables/AcpiTablesHi1620.inf     |   59 +
 .../Hi1620OemConfigUiLib/OemConfigUiLib.inf   |   68 +
 .../Hi1620PciPlatformLib.inf                  |   30 +
 Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf        |   48 +
 .../M41T83RealTimeClockLib.inf                |   46 +
 .../PlatformBootManagerLib.inf                |    4 +
 .../OemNicConfig2PHi1620/OemNicConfig.h       |   25 +
 .../Hisilicon/D06/Include/Library/CpldD06.h   |   39 +
 .../Smbios/MemorySubClassDxe/MemorySubClass.h |    2 -
 .../Hi1610/Hi1610AcpiTables/Hi1610Platform.h  |   27 +-
 .../Hisilicon/Hi1610/Include/PlatformArch.h   |   71 +
 .../Hi1616/D05AcpiTables/Hi1616Platform.h     |   24 +-
 .../Hisilicon/Hi1616/Include/PlatformArch.h   |   71 +
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h  |   41 +
 .../Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h |   43 +
 .../Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h |  146 ++
 .../Hi1620/Drivers/Apei/ErrorSource/Ghes.h    |  110 +
 .../Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h |  146 ++
 .../Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h |   59 +
 .../Hi1620/Drivers/Apei/OemApeiHi1620.h       |   43 +
 .../Hi1620/Hi1620AcpiTables/Hi1620Platform.h  |   27 +
 .../Hi1620/Hi1620OemConfigUiLib/OemConfig.h   |  142 ++
 .../Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h |   64 +
 .../Hi1620/Include/Library/SerdesLib.h        |   85 +
 .../Hisilicon/Hi1620/Include/PlatformArch.h   |   67 +
 Silicon/Hisilicon/Hi1620/Pptt/Pptt.h          |   68 +
 .../Hisilicon/Include/Library/AcpiNextLib.h   |   31 +-
 .../Hisilicon/Include/Library/HwMemInitLib.h  |  356 +--
 .../Hisilicon/Include/Library/IpmiCmdLib.h    |   16 +
 Silicon/Hisilicon/Include/Library/LpcLib.h    |   51 +-
 .../Include/Library/OemAddressMapLib.h        |    8 +
 .../Hisilicon/Include/Library/OemConfigData.h |   85 +
 .../Hisilicon/Include/Library/OemMiscLib.h    |    9 +-
 Silicon/Hisilicon/Include/Library/OemNicLib.h |   57 +
 .../Include/Library/PlatformSysCtrlLib.h      |    6 +
 Silicon/Hisilicon/Include/PlatformArch.h      |   35 -
 Silicon/Hisilicon/Library/I2CLib/I2CHw.h      |    9 +-
 .../M41T83RealTimeClock.h                     |  158 ++
 .../DS3231RealTimeClockLib.c                  |    8 +-
 .../OemMiscLib2P/BoardFeature2PHi1610.c       |    2 +-
 .../Library/OemMiscLib2P/OemMiscLib2PHi1610.c |   24 +
 .../Library/OemMiscLibD05/BoardFeatureD05.c   |    2 +-
 .../D05/Library/OemMiscLibD05/OemMiscLibD05.c |   27 +-
 .../OemNicConfig2PHi1620/OemNicConfig2P.c     |   71 +
 .../SystemFirmwareDescriptorPei.c             |   70 +
 .../D06/EarlyConfigPeim/EarlyConfigPeimD06.c  |  107 +
 .../Library/OemMiscLibD06/BoardFeatureD06.c   |  432 ++++
 .../D06/Library/OemMiscLibD06/OemMiscLibD06.c |  222 ++
 .../D06/Library/OemNicLib/OemNicLib.c         |  570 +++++
 .../PciHostBridgeLib/PciHostBridgeLib.c       |  635 ++++++
 .../Drivers/FlashFvbDxe/FlashFvbDxe.c         |   22 +-
 .../HisiAcpiPlatformDxe/UpdateAcpiTable.c     |  118 +-
 .../Smbios/AddSmbiosType9/AddSmbiosType9.c    |   14 +-
 .../Smbios/MemorySubClassDxe/MemorySubClass.c |   26 +-
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c  |  108 +
 .../Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c |   92 +
 .../Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c |  349 +++
 .../Hi1620/Drivers/Apei/ErrorSource/Ghes.c    |  330 +++
 .../Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c |  374 ++++
 .../Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c |  119 +
 .../Hi1620/Drivers/Apei/OemApeiHi1620.c       |  337 +++
 .../Pl011DebugSerialPortInitDxe.c             |   64 +
 .../Hi1620/Hi1620OemConfigUiLib/OemConfig.c   |  364 +++
 .../Hi1620PciPlatformLib.c                    |   67 +
 Silicon/Hisilicon/Hi1620/Pptt/Pptt.c          |  543 +++++
 .../DS3231RealTimeClockLib.c                  |    8 +-
 Silicon/Hisilicon/Library/I2CLib/I2CLib.c     |  975 ++++----
 .../M41T83RealTimeClockLib.c                  |  564 +++++
 .../PlatformBootManagerLib/PlatformBm.c       |   65 +
 .../SystemFirmwareUpdateConfig.ini            |   46 +
 .../SystemFirmwareDescriptor.aslc             |   81 +
 .../OemMiscLibD06/BoardFeatureD06Strings.uni  |   64 +
 .../Hi1620/Hi1620AcpiTables/Dsdt/CPU.asl      |  409 ++++
 .../Hi1620/Hi1620AcpiTables/Dsdt/Com.asl      |   30 +
 .../Hi1620AcpiTables/Dsdt/DsdtHi1620.asl      |   35 +
 .../Hi1620AcpiTables/Dsdt/Hi1620Apei.asl      |   93 +
 .../Hi1620AcpiTables/Dsdt/Hi1620Ged.asl       |   58 +
 .../Hi1620AcpiTables/Dsdt/Hi1620Mbig.asl      | 1459 ++++++++++++
 .../Hi1620AcpiTables/Dsdt/Hi1620Mctp.asl      |   41 +
 .../Hi1620AcpiTables/Dsdt/Hi1620Pci.asl       | 1216 ++++++++++
 .../Hi1620AcpiTables/Dsdt/Hi1620Power.asl     |   28 +
 .../Hi1620AcpiTables/Dsdt/Hi1620Rde.asl       |   47 +
 .../Hi1620AcpiTables/Dsdt/Hi1620Sec.asl       |   57 +
 .../Dsdt/Hi1620Socip4_i2c100k.asl             |  249 +++
 .../Dsdt/Hi1620Socip4_i2c400k.asl             |  249 +++
 .../Hi1620AcpiTables/Dsdt/LpcUart_clk.asl     |   49 +
 .../Hi1620AcpiTables/Dsdt/Pv680UncorePmu.asl  | 1658 ++++++++++++++
 .../Hi1620/Hi1620AcpiTables/Dsdt/ipmi.asl     |   49 +
 .../Hi1620/Hi1620AcpiTables/Facs.aslc         |   67 +
 .../Hi1620/Hi1620AcpiTables/Fadt.aslc         |   91 +
 .../Hi1620/Hi1620AcpiTables/Gtdt.aslc         |   86 +
 .../Hi1620/Hi1620AcpiTables/Hi1620Dbg2.aslc   |   86 +
 .../Hi1620/Hi1620AcpiTables/Hi1620Iort.asl    | 1989 +++++++++++++++++
 .../Hi1620AcpiTables/Hi1620IortNoSmmu.asl     | 1736 ++++++++++++++
 .../Hi1620/Hi1620AcpiTables/Hi1620Mcfg.aslc   |   64 +
 .../Hi1620/Hi1620AcpiTables/Hi1620Slit.aslc   |   64 +
 .../Hi1620/Hi1620AcpiTables/Hi1620Spcr.aslc   |   81 +
 .../Hi1620/Hi1620AcpiTables/Hi1620Srat.aslc   |  166 ++
 .../Hi1620/Hi1620AcpiTables/MadtHi1620.aslc   |  375 ++++
 .../Hi1620OemConfigUiLib/MemoryConfig.hfr     |  154 ++
 .../Hi1620OemConfigUiLib/MemoryConfig.uni     |  103 +
 .../Hi1620OemConfigUiLib/MiscConfig.hfr       |   48 +
 .../Hi1620OemConfigUiLib/MiscConfig.uni       |   27 +
 .../Hi1620OemConfigUiLib/OemConfigUiLib.uni   |   24 +
 .../OemConfigUiLibStrings.uni                 |   42 +
 .../Hi1620OemConfigUiLib/OemConfigVfr.Vfr     |   89 +
 .../Hi1620OemConfigUiLib/PcieConfig.hfr       |  219 ++
 .../PcieConfigStrings.uni                     |  111 +
 .../Hi1620OemConfigUiLib/PciePortConfig.hfr   |  167 ++
 .../Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr |  172 ++
 .../Hi1620/Hi1620OemConfigUiLib/RasConfig.uni |   85 +
 .../Hi1620OemConfigUiLib/iBMCConfig.hfr       |   81 +
 .../Hi1620OemConfigUiLib/iBMCConfig.uni       |   34 +
 134 files changed, 21578 insertions(+), 970 deletions(-)
 create mode 100644 Platform/Hisilicon/D06/D06.dec
 create mode 100644 Platform/Hisilicon/D06/D06.dsc
 create mode 100644 Platform/Hisilicon/D06/D06.fdf
 create mode 100644 Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
 create mode 100644 Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
 create mode 100644 Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
 create mode 100644 Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
 create mode 100644 Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.inf
 create mode 100644 Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.inf
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
 create mode 100644 Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf
 create mode 100644 Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
 create mode 100644 Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
 create mode 100644 Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h
 create mode 100644 Platform/Hisilicon/D06/Include/Library/CpldD06.h
 create mode 100644 Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
 create mode 100644 Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Platform.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Include/Library/SerdesLib.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
 create mode 100644 Silicon/Hisilicon/Hi1620/Pptt/Pptt.h
 create mode 100644 Silicon/Hisilicon/Include/Library/OemConfigData.h
 create mode 100644 Silicon/Hisilicon/Include/Library/OemNicLib.h
 delete mode 100644 Silicon/Hisilicon/Include/PlatformArch.h
 create mode 100644 Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h
 create mode 100644 Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c
 create mode 100644 Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
 create mode 100644 Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c
 create mode 100644 Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06.c
 create mode 100644 Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
 create mode 100644 Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.c
 create mode 100644 Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c
 create mode 100644 Silicon/Hisilicon/Hi1620/Pptt/Pptt.c
 create mode 100644 Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c
 create mode 100644 Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
 create mode 100644 Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
 create mode 100644 Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/CPU.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Com.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/DsdtHi1620.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Apei.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Ged.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mbig.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mctp.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Pci.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Power.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Rde.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Sec.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c100k.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c400k.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/LpcUart_clk.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Pv680UncorePmu.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/ipmi.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Facs.aslc
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Fadt.aslc
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Gtdt.aslc
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Dbg2.aslc
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Iort.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620IortNoSmmu.asl
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Mcfg.aslc
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Slit.aslc
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Spcr.aslc
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Srat.aslc
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/MadtHi1620.aslc
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.hfr
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.uni
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.uni
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLibStrings.uni
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigVfr.Vfr
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfig.hfr
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfigStrings.uni
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PciePortConfig.hfr
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.uni
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.hfr
 create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.uni

-- 
2.17.0



^ permalink raw reply	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 01/43] Silicon/Hisilicon: Modify the MRC interface for other module
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-21 17:50   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 02/43] Silicon/Hisilicon: Separate PlatformArch.h Ming Huang
                   ` (42 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

This patch is to unify D0x. Add pGBL_INTERFACE struct define
and remove useless interfece. Replace DMRC pGblData with pGblInterface;

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Include/Library/HwMemInitLib.h                    | 356 ++++----------------
 Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c     |   4 +-
 Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.c |  26 +-
 3 files changed, 78 insertions(+), 308 deletions(-)

diff --git a/Silicon/Hisilicon/Include/Library/HwMemInitLib.h b/Silicon/Hisilicon/Include/Library/HwMemInitLib.h
index 2663cad836..e1310e854c 100644
--- a/Silicon/Hisilicon/Include/Library/HwMemInitLib.h
+++ b/Silicon/Hisilicon/Include/Library/HwMemInitLib.h
@@ -50,48 +50,6 @@ typedef enum {
     DDR_FREQ_MAX
 } DDR_FREQUENCY_INDEX;
 
-typedef struct _DDR_FREQ_TCK
-{
-    UINT32      ddrFreq;
-    UINT32      ddrCk;
-}DDR_FREQ_TCK;
-
-typedef struct _GBL_CFG{
-
-
-}GBL_CFG;
-
-typedef struct _GBL_VAR{
-
-
-}GBL_VAR;
-
-typedef struct _GBL_NVDATA{
-
-
-}GBL_NVDATA;
-
-typedef struct _GOBAL {
-    const GBL_CFG Config;  // constant input data
-    GBL_VAR       Variable;    // variable, volatile data
-    GBL_NVDATA    NvData;  // variable, non-volatile data for S3, warm boot path
-    UINT32        PreBootFailed;
-}GOBAL, *PGOBAL;
-
-struct DDR_RANK {
-    BOOLEAN     Status;
-    UINT16      RttNom;
-    UINT16      RttPark;
-    UINT16      RttWr;
-    UINT16      MR0;
-    UINT16      MR1;
-    UINT16      MR2;
-    UINT16      MR3;
-    UINT16      MR4;
-    UINT16      MR5;
-    UINT16      MR6[9];
-};
-
 struct baseMargin {
   INT16 n;
   INT16 p;
@@ -101,171 +59,7 @@ struct rankMargin {
   struct baseMargin rank[MAX_CHANNEL][MAX_RANK_CH];
 };
 
-typedef struct _DDR_DIMM{
-    BOOLEAN     Status;
-    UINT8       mapout;
-    UINT8       DramType;           //Byte 2
-    UINT8       ModuleType;         //Byte 3
-    UINT8       ExtendModuleType;
-    UINT8       SDRAMCapacity;      //Byte 4
-    UINT8       BankNum;
-    UINT8       BGNum;              //Byte 4 For DDR4
-    UINT8       RowBits;            //Byte 5
-    UINT8       ColBits;            //Byte 5
-    UINT8       SpdVdd;             //Byte 6
-    UINT8       DramWidth;          //Byte 7
-    UINT8       RankNum;            //Byte 7
-    UINT8       PrimaryBusWidth;    //Byte 8
-    UINT8       ExtensionBusWidth;  //Byte 8
-    UINT32      Mtb;
-    UINT32      Ftb;
-    UINT32      minTck;
-    UINT8       MtbDividend;
-    UINT8       MtbDivsor;
-    UINT8       nCL;
-    UINT32      nRCD;
-    UINT32      nRP;
-    UINT8       SPDftb;
-    UINT8       SpdMinTCK;
-    UINT8       SpdMinTCKFtb;
-    UINT8       SpdMaxTCK;
-    UINT8       SpdMinTCL;
-    UINT8       SpdMinTCLFtb;
-    UINT8       SpdMinTWR;
-    UINT8       SpdMinTRCD;
-    UINT8       SpdMinTRCDFtb;
-    UINT8       SpdMinTRRD;
-    UINT8       SpdMinTRRDL;
-    UINT16      SpdMinTRAS;
-    UINT16      SpdMinTRC;
-    UINT16      SpdMinTRCFtb;
-    UINT16      SpdMinTRFC;
-    UINT8       SpdMinTWTR;
-    UINT8       SpdMinTRTP;
-    UINT8       SpdMinTAA;
-    UINT8       SpdMinTAAFtb;
-    UINT8       SpdMinTFAW;
-    UINT8       SpdMinTRP;
-    UINT8       SpdMinTRPFtb;
-    UINT8       SpdMinTCCDL;
-    UINT8       SpdMinTCCDLFtb;
-    UINT8       SpdAddrMap;
-    UINT8       SpdModuleAttr;
-
-    UINT8       SpdModPart[SPD_MODULE_PART];         // Module Part Number
-    UINT8       SpdModPartDDR4[SPD_MODULE_PART_DDR4];     // Module Part Number DDR4
-    UINT16      SpdMMfgId;              // Module Mfg Id from SPD
-    UINT16      SpdRMId;              // Register Manufacturer Id
-    UINT16      SpdMMDate;              // Module Manufacturing Date
-    UINT32      SpdSerialNum;
-    UINT16      DimmSize;
-    UINT16      DimmSpeed;
-    UINT32      RankSize;
-    UINT8       SpdMirror; //Denote the dram address mapping is standard mode or mirrored mode
-    struct DDR_RANK  Rank[MAX_RANK_DIMM];
-}DDR_DIMM;
-
-typedef struct {
-    UINT32      ddrcTiming0;
-    UINT32      ddrcTiming1;
-    UINT32      ddrcTiming2;
-    UINT32      ddrcTiming3;
-    UINT32      ddrcTiming4;
-    UINT32      ddrcTiming5;
-    UINT32      ddrcTiming6;
-    UINT32      ddrcTiming7;
-    UINT32      ddrcTiming8;
-}DDRC_TIMING;
-
-typedef struct _MARGIN_RESULT{
-    UINT32 OptimalDramVref[12];
-    UINT32 optimalPhyVref[18];
-}MARGIN_RESULT;
-
-typedef struct _DDR_Channel{
-    BOOLEAN     Status;
-    UINT8       CurrentDimmNum;
-    UINT8       CurrentRankNum;
-    UINT16      RankPresent;
-    UINT8       DramType;
-    UINT8       DramWidth;
-    UINT8       ModuleType;
-    UINT32      MemSize;
-    UINT32      tck;
-    UINT32      ratio;
-    UINT32      CLSupport;
-    UINT32      minTck;
-    UINT32      taref;
-    UINT32      nAA;
-    UINT32      nAOND;
-    UINT32      nCKE;
-    UINT32      nCL;
-    UINT32      nCCDL;
-    UINT32      nCKSRX;
-    UINT32      nCKSRE;
-    UINT32      nCCDNSW;
-    UINT32      nCCDNSR;
-    UINT32      nFAW;
-    UINT32      nMRD;
-    UINT32      nMOD;
-    UINT32      nRCD;
-    UINT32      nRRD;
-    UINT32      nRRDL;
-    UINT32      nRAS;
-    UINT32      nRC;
-    UINT32      nRFC;
-    UINT32      nRFCAB;
-    UINT32      nRTP;
-    UINT32      nRTW;
-    UINT32      nRP;
-    UINT32      nSRE;
-    UINT32      nWL;
-    UINT32      nWR;
-    UINT32      nWTR;
-    UINT32      nWTRL;
-    UINT32      nXARD;
-    UINT32      nZQPRD;
-    UINT32      nZQINIT;
-    UINT32      nZQCS;
-    UINT8       cwl;  //tWL?
-    UINT8       pl;     //parity latency
-    UINT8       wr_pre_2t_en;
-    UINT8       rd_pre_2t_en;
-    UINT8       cmd_2t_en;
-    UINT8       parity_en;
-    UINT8       wr_dbi_en;
-    UINT8       wr_dm_en;
-    UINT8       ddr4_crc_en;
-    UINT16      emrs0;
-    UINT16      emrs1;
-    UINT16      emrs1Wr;
-    UINT16      emrs2;
-    UINT16      emrs3;
-    UINT16      emrs4;
-    UINT16      emrs5;
-    UINT16      emrs5Wr;
-    UINT16      emrs6;
-    UINT16      emrs7;
-    UINT8       phy_rddata_set;
-    UINT8       phyif_tim_rdcs;
-    UINT8       phyif_tim_rden;
-    UINT8       phyif_tim_wden;
-    UINT8       phyif_tim_wdda;
-    UINT8       phyif_tim_wdcs;
-    UINT8       per_cs_training_en;
-    UINT32      phyRdDataEnIeDly;
-    UINT32      phyPadCalConfig;
-    UINT32      phyDqsFallRiseDelay;
-    UINT32      ddrcCfgDfiLat0;
-    UINT32      ddrcCfgDfiLat1;
-    UINT32      parityLatency;
-    UINT32      dimm_parity_en;
-    DDRC_TIMING ddrcTiming;
-    DDR_DIMM    Dimm[MAX_DIMM];
-    MARGIN_RESULT sMargin;
-}DDR_CHANNEL;
-
-typedef struct _NVRAM_RANK{
+typedef struct _NVRAM_RANK_DATA {
     UINT16      MR0;
     UINT16      MR1;
     UINT16      MR2;
@@ -273,15 +67,15 @@ typedef struct _NVRAM_RANK{
     UINT16      MR4;
     UINT16      MR5;
     UINT16      MR6[9];
-}NVRAM_RANK;
+} NVRAM_RANK_DATA;
 
-typedef struct _NVRAM_DIMM{
-    NVRAM_RANK      Rank[MAX_RANK_DIMM];
-}NVRAM_DIMM;
+typedef struct _NVRAM_DIMM_DATA {
+    NVRAM_RANK_DATA      Rank[MAX_RANK_DIMM];
+} NVRAM_DIMM_DATA;
 
 
-typedef struct _NVRAM_CHANNEL{
-    NVRAM_DIMM      Dimm[MAX_DIMM];
+typedef struct _NVRAM_CHANNEL_DATA {
+    NVRAM_DIMM_DATA      Dimm[MAX_DIMM];
     UINT32          DDRC_CFG_ECC;
     UINT32          DDRC_CFG_WORKMODE;
     UINT32          DDRC_CFG_WORKMODE1;
@@ -325,94 +119,70 @@ typedef struct _NVRAM_CHANNEL{
     UINT32          DDRC_CFG_DDRPHY;
     UINT32          Config[24];
     BOOLEAN         Status;
-}NVRAM_CHANNEL;
+} NVRAM_CHANNEL_DATA;
 
-typedef struct _NVRAM{
-    UINT32          NvramCrc;
-    NVRAM_CHANNEL   Channel[MAX_SOCKET][MAX_CHANNEL];
-    UINT32          DdrFreqIdx;
+typedef struct _NVRAM_DATA {
+    UINT32              NvramCrc;
+    NVRAM_CHANNEL_DATA  Channel[MAX_SOCKET][MAX_CHANNEL];
+    UINT32              DdrFreqIdx;
 
-}NVRAM;
+} NVRAM_DATA;
 
-typedef struct _MEMORY{
-    UINT8           Config0;
-    UINT8           marginTest;
-    UINT8           Config1[5];
-    UINT8           ErrorBypass; //register of spd mirror mode
-    UINT32          Config2;
-}MEMORY;
+struct DDR_RANK_DATA {
+    BOOLEAN     Enabled;
+};
 
-typedef struct _NUMAINFO{
+typedef struct _DDR_DIMM_DATA {
+    BOOLEAN         Enabled;
+    UINT8           DramType;           //Byte 2
+    UINT8           ModuleType;         //Byte 3
+    UINT8           BankNum;            //Byte 4
+    UINT8           RowBits;            //Byte 5
+    UINT8           ColBits;            //Byte 5
+    UINT8           SpdVdd;             //Byte 6
+    UINT8           RankNum;            //Byte 7
+    UINT8           PrimaryBusWidth;    //Byte 8
+    UINT8           ExtensionBusWidth;  //Byte 8
+    UINT8           SpdModPart[SPD_MODULE_PART];                // Module Part Number
+    UINT8           SpdModPartDDR4[SPD_MODULE_PART_DDR4];       // Module Part Number DDR4
+    UINT16          SpdMMfgId;              // Module Mfg Id from SPD
+    UINT32          SpdSerialNum;
+    UINT32          RankSize;
+    UINT16          DimmSize;
+    UINT16          DimmSpeed;
+    UINT16          SpdMMDate;
+    struct DDR_RANK_DATA    Rank[MAX_RANK_DIMM];
+} DDR_DIMM_DATA;
+
+typedef struct _DDR_CHANNEL_DATA {
+    BOOLEAN         Enabled;
+    DDR_DIMM_DATA   Dimm[MAX_DIMM];
+    UINT8           CurrentDimmNum;
+} DDR_CHANNEL_DATA;
+
+typedef struct _MEMORY_DATA {
+    UINT8           RascBypass;
+} MEMORY_DATA;
+
+typedef struct _NUMAINFO_DATA {
     UINT8           NodeId;
     UINT64          Base;
     UINT64          Length;
     UINT32          ScclInterleaveEn;
-}NUMAINFO;
-
-
-typedef struct _GBL_DATA
-{
-    DDR_CHANNEL Channel[MAX_SOCKET][MAX_CHANNEL];
-    UINT8       DramType;
-    UINT8       CurrentDimmNum;
-    UINT8       CurrentRankNum;
-    UINT8       MaxSPCNum;
-    UINT32      Freq;
-    UINT32      SpdTckMtb;
-    UINT32      SpdTckFtb;
-    UINT32      SpdTck;
-    UINT32      Tck;
-    UINT32      DdrFreqIdx;
-    UINT32      DevParaFreqIdx; //Maximum frequency of DDR device
-    UINT32      MemSize;
-    UINT32      EccEn;
-
-    BOOLEAN     SetupExist;
-    UINT8       warmReset;
-    UINT8       needColdReset;
-
-    UINT8       cl;
-    UINT8       cwl;
-    UINT8       pl;
-    UINT8       wr_pre_2t_en;
-    UINT8       rd_pre_2t_en;
-    UINT8       cmd_2t_en;
-    UINT8       ddr4_parity_en;
-    UINT8       wr_dbi_en;
-    UINT8       wr_dm_en;
-    UINT8       ddr4_crc_en;
-    UINT16      emrs0;
-    UINT16      emrs1;
-    UINT16      emrs2;
-    UINT16      emrs3;
-    UINT16      emrs4;
-    UINT16      emrs5;
-    UINT16      emrs6;
-    UINT16      emrs7;
-    UINT8       phy_rddata_set;
-    UINT8       phyif_tim_rdcs;
-    UINT8       phyif_tim_rden;
-    UINT8       phyif_tim_wden;
-    UINT8       phyif_tim_wdda;
-    UINT8       phyif_tim_wdcs;
-    UINT8       dimm_trtr;
-    UINT8       dimm_twtw;
-    UINT8       rnk_trtr;
-    UINT8       rnk_twtw;
-    UINT8       rnk_trtw;
-    UINT8       rnk_twtr;
-    UINT8       per_cs_training_en;
-    UINT8       scale;
-    UINT8       ddrFreq;
-    UINT8       debugNeed;
-    UINT8       ddr3OdtEnable;
-    double      fprd;
-    BOOLEAN     chipIsEc;
-    NVRAM       nvram;
-    MEMORY      mem;
-    NUMAINFO    NumaInfo[MAX_SOCKET][MAX_NUM_PER_TYPE];
-
-}GBL_DATA, *pGBL_DATA;
+} NUMAINFO_DATA;
+
+
+typedef struct _GBL_DATA_INTERFACE {
+    DDR_CHANNEL_DATA        Channel[MAX_SOCKET][MAX_CHANNEL];
+    UINT32                  DdrFreqIdx;
+    UINT32                  Freq;
+    UINT32                  EccEn;
+    UINT32                  MemSize;
+    BOOLEAN                 SetupExist;
+    NVRAM_DATA              NvRamData;
+    MEMORY_DATA             MemData;
+    NUMAINFO_DATA           NumaInfo[MAX_SOCKET][MAX_NUM_PER_TYPE];
+} GBL_INTERFACE;
 
 typedef union {
     struct {
diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
index 7d06fccc2b..f5869841dc 100644
--- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
+++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
@@ -56,7 +56,7 @@ UpdateSrat (
   UINT8               Skt = 0;
   UINTN               Index = 0;
   VOID                *HobList;
-  GBL_DATA            *Gbl_Data;
+  GBL_INTERFACE       *Gbl_Data;
   UINTN               Base;
   UINTN               Size;
   UINT8               NodeId;
@@ -69,7 +69,7 @@ UpdateSrat (
   if (HobList == NULL) {
     return EFI_UNSUPPORTED;
   }
-  Gbl_Data = (GBL_DATA*)GetNextGuidHob(&gHisiEfiMemoryMapGuid, HobList);
+  Gbl_Data = (GBL_INTERFACE*)GetNextGuidHob(&gHisiEfiMemoryMapGuid, HobList);
   if (Gbl_Data == NULL) {
     DEBUG((DEBUG_ERROR, "Get next Guid HOb fail.\n"));
     return EFI_NOT_FOUND;
diff --git a/Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.c b/Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.c
index da714c9e22..7d3005eb14 100644
--- a/Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.c
+++ b/Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.c
@@ -45,7 +45,7 @@ SmbiosGetManufacturer (
 
 VOID
 SmbiosGetPartNumber (
-  IN pGBL_DATA          pGblData,
+  IN GBL_INTERFACE      *pGblData,
   IN UINT8              Skt,
   IN UINT8              Ch,
   IN UINT8              Dimm,
@@ -78,7 +78,7 @@ SmbiosGetPartNumber (
 
 VOID
 SmbiosGetSerialNumber (
-  IN pGBL_DATA          pGblData,
+  IN GBL_INTERFACE      *pGblData,
   IN UINT8              Skt,
   IN UINT8              Ch,
   IN UINT8              Dimm,
@@ -96,14 +96,14 @@ SmbiosGetSerialNumber (
 
 BOOLEAN
 IsDimmPresent (
-  IN  pGBL_DATA          pGblData,
+  IN  GBL_INTERFACE      *pGblData,
   IN  UINT8              Skt,
   IN  UINT8              Ch,
   IN  UINT8              Dimm
 )
 {
-    if (pGblData->Channel[Skt][Ch].Status == FALSE ||
-          pGblData->Channel[Skt][Ch].Dimm[Dimm].Status == FALSE)
+    if (pGblData->Channel[Skt][Ch].Enabled == FALSE ||
+        pGblData->Channel[Skt][Ch].Dimm[Dimm].Enabled == FALSE)
     {
         return FALSE;
     }
@@ -115,7 +115,7 @@ IsDimmPresent (
 
 UINT8
 SmbiosGetMemoryType (
-  IN  pGBL_DATA          pGblData,
+  IN  GBL_INTERFACE      *pGblData,
   IN  UINT8              Skt,
   IN  UINT8              Ch,
   IN  UINT8              Dimm
@@ -146,7 +146,7 @@ SmbiosGetMemoryType (
 
 VOID
 SmbiosGetTypeDetail (
-  IN  pGBL_DATA             pGblData,
+  IN  GBL_INTERFACE         *pGblData,
   IN  UINT8                 Skt,
   IN  UINT8                 Ch,
   IN  UINT8                 Dimm,
@@ -186,7 +186,7 @@ SmbiosGetTypeDetail (
 
 VOID
 SmbiosGetDimmVoltageInfo (
-  IN     pGBL_DATA             pGblData,
+  IN     GBL_INTERFACE         *pGblData,
   IN     UINT8                 Skt,
   IN     UINT8                 Ch,
   IN     UINT8                 Dimm,
@@ -281,7 +281,7 @@ SmbiosGetPartitionWidth (
 
 EFI_STATUS
 SmbiosAddType16Table (
-  IN  pGBL_DATA          pGblData,
+  IN  GBL_INTERFACE      *pGblData,
   OUT EFI_SMBIOS_HANDLE  *MemArraySmbiosHandle
   )
 {
@@ -345,7 +345,7 @@ SmbiosAddType16Table (
 
 EFI_STATUS
 SmbiosAddType19Table (
-  IN pGBL_DATA          pGblData,
+  IN GBL_INTERFACE      *pGblData,
   IN EFI_SMBIOS_HANDLE  MemArraySmbiosHandle
   )
 {
@@ -397,7 +397,7 @@ SmbiosAddType19Table (
 
 EFI_STATUS
 SmbiosAddType17Table (
-  IN pGBL_DATA          pGblData,
+  IN GBL_INTERFACE      *pGblData,
   IN UINT8              Skt,
   IN UINT8              Ch,
   IN UINT8              Dimm,
@@ -692,7 +692,7 @@ MemorySubClassEntryPoint(
     EFI_STATUS                      Status;
     EFI_SMBIOS_PROTOCOL             *Smbios;
     EFI_HOB_GUID_TYPE               *GuidHob;
-    pGBL_DATA                       pGblData;
+    GBL_INTERFACE                   *pGblData;
     EFI_SMBIOS_HANDLE               MemArraySmbiosHandle;
     UINT8                           Skt, Ch, Dimm;
 
@@ -702,7 +702,7 @@ MemorySubClassEntryPoint(
         DEBUG((EFI_D_ERROR, "Could not get MemoryMap Guid hob.  %r\n"));
         return EFI_NOT_FOUND;
     }
-    pGblData = (pGBL_DATA) GET_GUID_HOB_DATA(GuidHob);
+    pGblData = (GBL_INTERFACE*) GET_GUID_HOB_DATA(GuidHob);
 
     //
     // Locate dependent protocols
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 02/43] Silicon/Hisilicon: Separate PlatformArch.h
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 01/43] Silicon/Hisilicon: Modify the MRC interface for other module Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 03/43] Silicon/Hisilicon/Acpi: Move some macro to PlatformArch.h Ming Huang
                   ` (41 subsequent siblings)
  43 siblings, 0 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

As the macro of PlatformArch.h is platform specific, so separate
PlatformArch.h to Hi1610,Hi1616 for unifying D0x.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/{ => Hi1610}/Include/PlatformArch.h |  0
 Silicon/Hisilicon/Hi1616/Include/PlatformArch.h       | 35 ++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/Silicon/Hisilicon/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
similarity index 100%
rename from Silicon/Hisilicon/Include/PlatformArch.h
rename to Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
diff --git a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
new file mode 100644
index 0000000000..bf0994a5e9
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
@@ -0,0 +1,35 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+
+
+#ifndef _PLATFORM_ARCH_H_
+#define _PLATFORM_ARCH_H_
+
+#define MAX_SOCKET      2
+#define MAX_DIE         4
+#define MAX_DDRC        2
+#define MAX_NODE        (MAX_SOCKET * MAX_DIE)
+#define MAX_CHANNEL     4
+#define MAX_DIMM        3
+#define MAX_RANK_CH     12
+#define MAX_RANK_DIMM   4
+// Max NUMA node number for each node type
+#define MAX_NUM_PER_TYPE 8
+
+#define S1_BASE               0x40000000000
+
+#endif
+
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 03/43] Silicon/Hisilicon/Acpi: Move some macro to PlatformArch.h
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 01/43] Silicon/Hisilicon: Modify the MRC interface for other module Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 02/43] Silicon/Hisilicon: Separate PlatformArch.h Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-17 13:23   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 04/43] Silicon/Hisilicon/D0x: Move dimm size definition " Ming Huang
                   ` (40 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

ARM_ACPI_HEADER is used by a unify module in HwPkg,
so move some macro to PlatformArch.h for unify D0x.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h | 27 +++-----------------
 Silicon/Hisilicon/Hi1610/Include/PlatformArch.h            | 24 +++++++++++++++++
 Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h    | 24 +----------------
 Silicon/Hisilicon/Hi1616/Include/PlatformArch.h            | 23 +++++++++++++++++
 4 files changed, 51 insertions(+), 47 deletions(-)

diff --git a/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h b/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h
index 5a95b02055..28546bea99 100644
--- a/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h
+++ b/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h
@@ -1,8 +1,8 @@
 /** @file
 *
 *  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
-*  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
-*  Copyright (c) 2015, Linaro Limited. All rights reserved.
+*  Copyright (c) 2015-2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2015-2018, Linaro Limited. All rights reserved.
 *
 *  This program and the accompanying materials
 *  are licensed and made available under the terms and conditions of the BSD License
@@ -20,28 +20,7 @@
 #ifndef _HI1610_PLATFORM_H_
 #define _HI1610_PLATFORM_H_
 
-//
-// ACPI table information used to initialize tables.
-//
-#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
-#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64('H','I','P','0','6',' ',' ',' ') // OEM table id 8 bytes long
-#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
-#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32('I','N','T','L')
-#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
-
-// A macro to initialise the common header part of EFI ACPI tables as defined by
-// EFI_ACPI_DESCRIPTION_HEADER structure.
-#define ARM_ACPI_HEADER(Signature, Type, Revision) {              \
-    Signature,                      /* UINT32  Signature */       \
-    sizeof (Type),                  /* UINT32  Length */          \
-    Revision,                       /* UINT8   Revision */        \
-    0,                              /* UINT8   Checksum */        \
-    { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
-    EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
-    EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
-    EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
-    EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
-  }
+#include <../Include/PlatformArch.h>
 
 #define HI1610_WATCHDOG_COUNT  2
 
diff --git a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
index 45995c5893..8e5913447c 100644
--- a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
+++ b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
@@ -31,5 +31,29 @@
 
 #define S1_BASE               0x40000000000
 
+
+//
+// ACPI table information used to initialize tables.
+//
+#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
+#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64 ('H','I','P','0','6',' ',' ',' ') // OEM table id 8 bytes long
+#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
+#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32 ('I','N','T','L')
+#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
+
+// A macro to initialise the common header part of EFI ACPI tables as defined by
+// EFI_ACPI_DESCRIPTION_HEADER structure.
+#define ARM_ACPI_HEADER(Signature, Type, Revision) {            \
+  Signature,                      /* UINT32  Signature */       \
+  sizeof (Type),                  /* UINT32  Length */          \
+  Revision,                       /* UINT8   Revision */        \
+  0,                              /* UINT8   Checksum */        \
+  { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
+  EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
+  EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
+  EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
+  EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
+  }
+
 #endif
 
diff --git a/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h b/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h
index ad73aa2668..04f9e34a14 100644
--- a/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h
+++ b/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h
@@ -21,29 +21,7 @@
 #define _HI1610_PLATFORM_H_
 
 #include <IndustryStandard/Acpi.h>
-
-//
-// ACPI table information used to initialize tables.
-//
-#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
-#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64('H','I','P','0','7',' ',' ',' ') // OEM table id 8 bytes long
-#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
-#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32('I','N','T','L')
-#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
-
-// A macro to initialise the common header part of EFI ACPI tables as defined by
-// EFI_ACPI_DESCRIPTION_HEADER structure.
-#define ARM_ACPI_HEADER(Signature, Type, Revision) {              \
-    Signature,                      /* UINT32  Signature */       \
-    sizeof (Type),                  /* UINT32  Length */          \
-    Revision,                       /* UINT8   Revision */        \
-    0,                              /* UINT8   Checksum */        \
-    { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
-    EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
-    EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
-    EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
-    EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
-  }
+#include <../Include/PlatformArch.h>
 
 #define HI1616_WATCHDOG_COUNT  2
 #define HI1616_GIC_STRUCTURE_COUNT  64
diff --git a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
index bf0994a5e9..24167d1633 100644
--- a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
+++ b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
@@ -31,5 +31,28 @@
 
 #define S1_BASE               0x40000000000
 
+//
+// ACPI table information used to initialize tables.
+//
+#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
+#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64 ('H','I','P','0','7',' ',' ',' ') // OEM table id 8 bytes long
+#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
+#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32 ('I','N','T','L')
+#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
+
+// A macro to initialise the common header part of EFI ACPI tables as defined by
+// EFI_ACPI_DESCRIPTION_HEADER structure.
+#define ARM_ACPI_HEADER(Signature, Type, Revision) {            \
+  Signature,                      /* UINT32  Signature */       \
+  sizeof (Type),                  /* UINT32  Length */          \
+  Revision,                       /* UINT8   Revision */        \
+  0,                              /* UINT8   Checksum */        \
+  { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
+  EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
+  EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
+  EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
+  EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
+  }
+
 #endif
 
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 04/43] Silicon/Hisilicon/D0x: Move dimm size definition to PlatformArch.h
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (2 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 03/43] Silicon/Hisilicon/Acpi: Move some macro to PlatformArch.h Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 05/43] Silicon/Hisilicon/D0x: Move RAS macro " Ming Huang
                   ` (39 subsequent siblings)
  43 siblings, 0 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Sun Yuanchen

From: Sun Yuanchen <sunyuanchen@huawei.com>

Unify MemorySubClassDxe by Moving dimm size macro definition
to PlatformArch.h

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Sun Yuanchen <sunyuanchen@huawei.com>
---
 Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.h | 2 --
 Silicon/Hisilicon/Hi1610/Include/PlatformArch.h                     | 1 +
 Silicon/Hisilicon/Hi1616/Include/PlatformArch.h                     | 1 +
 3 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.h b/Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.h
index c35ce39d61..0c201b4870 100644
--- a/Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.h
+++ b/Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.h
@@ -44,8 +44,6 @@
 
 extern UINT8 MemorySubClassStrings[];
 
-#define MAX_DIMM_SIZE       32  // In GB
-
 struct SPD_JEDEC_MANUFACTURER
 {
     UINT8  MfgIdLSB;
diff --git a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
index 8e5913447c..2ff076901e 100644
--- a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
+++ b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
@@ -26,6 +26,7 @@
 #define MAX_DIMM        3
 #define MAX_RANK_CH     12
 #define MAX_RANK_DIMM   4
+#define MAX_DIMM_SIZE   32  // In GB
 // Max NUMA node number for each node type
 #define MAX_NUM_PER_TYPE 8
 
diff --git a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
index 24167d1633..60a60593be 100644
--- a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
+++ b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
@@ -26,6 +26,7 @@
 #define MAX_DIMM        3
 #define MAX_RANK_CH     12
 #define MAX_RANK_DIMM   4
+#define MAX_DIMM_SIZE   32  // In GB
 // Max NUMA node number for each node type
 #define MAX_NUM_PER_TYPE 8
 
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 05/43] Silicon/Hisilicon/D0x: Move RAS macro to PlatformArch.h
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (3 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 04/43] Silicon/Hisilicon/D0x: Move dimm size definition " Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-21 17:48   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 06/43] Hisilicon/D0x: Move CustomData.Fv to common path of Hisilicon Ming Huang
                   ` (38 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Sun Yuanchen

From: Sun Yuanchen <sunyuanchen@huawei.com>

Move some RAS macros definition to PlatformArch.h for
unifying D0x

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Sun Yuanchen <sunyuanchen@huawei.com>
---
 Silicon/Hisilicon/Hi1610/Include/PlatformArch.h |  9 +++++++--
 Silicon/Hisilicon/Hi1616/Include/PlatformArch.h | 12 ++++++++++++
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
index 2ff076901e..f39ae0748c 100644
--- a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
+++ b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
@@ -1,7 +1,7 @@
 /** @file
 *
-*  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
-*  Copyright (c) 2015, Linaro Limited. All rights reserved.
+*  Copyright (c) 2015 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2015 - 2018, Linaro Limited. All rights reserved.
 *
 *  This program and the accompanying materials
 *  are licensed and made available under the terms and conditions of the BSD License
@@ -32,6 +32,11 @@
 
 #define S1_BASE               0x40000000000
 
+#define RASC_BASE                (0x5000)
+/* configuration register for Rank statistical information */
+#define RASC_CFG_INFOIDX_REG     (RASC_BASE + 0x5C)
+/* configuration register for Sparing level */
+#define RASC_CFG_SPLVL_REG       (RASC_BASE + 0xB8)
 
 //
 // ACPI table information used to initialize tables.
diff --git a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
index 60a60593be..e02e4bdabd 100644
--- a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
+++ b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
@@ -30,6 +30,18 @@
 // Max NUMA node number for each node type
 #define MAX_NUM_PER_TYPE 8
 
+#define RASC_BASE                (0x5000)
+/* configuration register for Rank statistical information */
+#define RASC_CFG_INFOIDX_REG     (RASC_BASE + 0x5C)
+/* configuration register for Sparing level */
+#define RASC_CFG_SPLVL_REG       (RASC_BASE + 0xB8)
+
+// for acpi
+#define NODE_IN_SOCKET                                  2
+#define CORE_NUM_PER_SOCKET                             32
+#define EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT        10
+#define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT       8
+
 #define S1_BASE               0x40000000000
 
 //
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 06/43] Hisilicon/D0x: Move CustomData.Fv to common path of Hisilicon
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (4 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 05/43] Silicon/Hisilicon/D0x: Move RAS macro " Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 07/43] Hisilicon/D0x: Move IpmiCmdLib " Ming Huang
                   ` (37 subsequent siblings)
  43 siblings, 0 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

The CustomData.Fv is moved to Platform/Hisilicon in edk2-non-osi,
so update D0x fdf to reflect this.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D03/D03.fdf | 2 +-
 Platform/Hisilicon/D05/D05.fdf | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Platform/Hisilicon/D03/D03.fdf b/Platform/Hisilicon/D03/D03.fdf
index cf11aeccc8..4591f7b5b1 100644
--- a/Platform/Hisilicon/D03/D03.fdf
+++ b/Platform/Hisilicon/D03/D03.fdf
@@ -113,7 +113,7 @@ DATA = {
 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 
 0x002F0000|0x00010000
-FILE = Platform/Hisilicon/D03/CustomData.Fv
+FILE = Platform/Hisilicon/D0x-CustomData.Fv
 
 ################################################################################
 #
diff --git a/Platform/Hisilicon/D05/D05.fdf b/Platform/Hisilicon/D05/D05.fdf
index 701804360e..6227607ffe 100644
--- a/Platform/Hisilicon/D05/D05.fdf
+++ b/Platform/Hisilicon/D05/D05.fdf
@@ -113,7 +113,7 @@ DATA = {
 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 
 0x002F0000|0x00010000
-FILE = Platform/Hisilicon/D03/CustomData.Fv
+FILE = Platform/Hisilicon/D0x-CustomData.Fv
 
 ################################################################################
 #
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 07/43] Hisilicon/D0x: Move IpmiCmdLib to common path of Hisilicon
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (5 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 06/43] Hisilicon/D0x: Move CustomData.Fv to common path of Hisilicon Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-15 13:58   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 08/43] Hisilicon/D0x: Unify FlashFvbDxe driver Ming Huang
                   ` (36 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

The IpmiCmdLib is moved to Silicon/Hisilicon in edk2-non-osi,
so update D0x dsc to reflect this.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D03/D03.dsc | 2 +-
 Platform/Hisilicon/D05/D05.dsc | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Platform/Hisilicon/D03/D03.dsc b/Platform/Hisilicon/D03/D03.dsc
index 38548a0f23..c12790ba59 100644
--- a/Platform/Hisilicon/D03/D03.dsc
+++ b/Platform/Hisilicon/D03/D03.dsc
@@ -38,7 +38,7 @@
   I2CLib|Silicon/Hisilicon/Library/I2CLib/I2CLib.inf
   TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
 
-  IpmiCmdLib|Silicon/Hisilicon/Hi1610/Library/IpmiCmdLib/IpmiCmdLib.inf
+  IpmiCmdLib|Silicon/Hisilicon/Library/IpmiCmdLib/IpmiCmdLib.inf
 
   NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
   DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
diff --git a/Platform/Hisilicon/D05/D05.dsc b/Platform/Hisilicon/D05/D05.dsc
index f2bbf27639..94d386582e 100644
--- a/Platform/Hisilicon/D05/D05.dsc
+++ b/Platform/Hisilicon/D05/D05.dsc
@@ -41,7 +41,7 @@
   I2CLib|Silicon/Hisilicon/Library/I2CLib/I2CLib.inf
   TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
 
-  IpmiCmdLib|Silicon/Hisilicon/Hi1610/Library/IpmiCmdLib/IpmiCmdLib.inf
+  IpmiCmdLib|Silicon/Hisilicon/Library/IpmiCmdLib/IpmiCmdLib.inf
 
   NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
   DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 08/43] Hisilicon/D0x: Unify FlashFvbDxe driver
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (6 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 07/43] Hisilicon/D0x: Move IpmiCmdLib " Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 09/43] Hisilicon/D0X: Rename the global variable gDS3231RtcDevice Ming Huang
                   ` (35 subsequent siblings)
  43 siblings, 0 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Add PcdSFCMEM0BaseAddress and switch three 32-bit macro
PcdFlashNvStorage of D05/D03 to 64-bit for unifying FlashFvbDxe
driver.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D03/D03.fdf                        |  6 +++---
 Platform/Hisilicon/D05/D05.fdf                        |  6 +++---
 Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf |  7 ++++---
 Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.c   | 22 ++++++++++----------
 4 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/Platform/Hisilicon/D03/D03.fdf b/Platform/Hisilicon/D03/D03.fdf
index 4591f7b5b1..b23765020d 100644
--- a/Platform/Hisilicon/D03/D03.fdf
+++ b/Platform/Hisilicon/D03/D03.fdf
@@ -69,7 +69,7 @@ FILE = Platform/Hisilicon/D03/bl1.bin
 FILE = Platform/Hisilicon/D03/fip.bin
 
 0x002D0000|0x0000E000
-gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
 DATA = {
   ## This is the EFI_FIRMWARE_VOLUME_HEADER
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -97,7 +97,7 @@ DATA = {
 }
 
 0x002DE000|0x00002000
-gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
 #NV_FTW_WORKING
 DATA = {
   # EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER->Signature = gEdkiiWorkingBlockSignatureGuid          =
@@ -110,7 +110,7 @@ DATA = {
 }
 
 0x002E0000|0x00010000
-gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 
 0x002F0000|0x00010000
 FILE = Platform/Hisilicon/D0x-CustomData.Fv
diff --git a/Platform/Hisilicon/D05/D05.fdf b/Platform/Hisilicon/D05/D05.fdf
index 6227607ffe..6fa5b5e6c8 100644
--- a/Platform/Hisilicon/D05/D05.fdf
+++ b/Platform/Hisilicon/D05/D05.fdf
@@ -69,7 +69,7 @@ FILE = Platform/Hisilicon/D05/bl1.bin
 FILE = Platform/Hisilicon/D05/fip.bin
 
 0x002D0000|0x0000E000
-gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
 DATA = {
   ## This is the EFI_FIRMWARE_VOLUME_HEADER
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -97,7 +97,7 @@ DATA = {
 }
 
 0x002DE000|0x00002000
-gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
 #NV_FTW_WORKING
 DATA = {
   # EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER->Signature = gEdkiiWorkingBlockSignatureGuid          =
@@ -110,7 +110,7 @@ DATA = {
 }
 
 0x002E0000|0x00010000
-gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 
 0x002F0000|0x00010000
 FILE = Platform/Hisilicon/D0x-CustomData.Fv
diff --git a/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf b/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf
index 09ec7ce08b..f8be4741ef 100644
--- a/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf
+++ b/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf
@@ -54,14 +54,15 @@
   gHisiSpiFlashProtocolGuid
 
 [Pcd.common]
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
-  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase
+  gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64
   gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
 
   gArmPlatformTokenSpaceGuid.PcdNorFlashCheckBlockLocked
+  gHisiTokenSpaceGuid.PcdSFCMEM0BaseAddress
 
 [Depex]
   gHisiSpiFlashProtocolGuid
diff --git a/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.c b/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.c
index 7c6b64c33e..e18cc9e06e 100644
--- a/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.c
+++ b/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.c
@@ -28,8 +28,8 @@ FLASH_DESCRIPTION mFlashDevices[FLASH_DEVICE_COUNT] =
 {
     {
         // UEFI Variable Services non-volatile storage
-        0xa4000000,
-        FixedPcdGet32(PcdFlashNvStorageVariableBase),
+        FixedPcdGet64 (PcdSFCMEM0BaseAddress),
+        FixedPcdGet64 (PcdFlashNvStorageVariableBase64),
         0x20000,
         SIZE_64KB,
         {0xCC2CBF29, 0x1498, 0x4CDD, {0x81, 0x71, 0xF8, 0xB6, 0xB4, 0x1D, 0x09, 0x09}}
@@ -145,8 +145,8 @@ InitializeFvAndVariableStoreHeaders (
     Headers = AllocateZeroPool(HeadersLength);
 
     // FirmwareVolumeHeader->FvLength is declared to have the Variable area AND the FTW working area AND the FTW Spare contiguous.
-    ASSERT(PcdGet32(PcdFlashNvStorageVariableBase) + PcdGet32(PcdFlashNvStorageVariableSize) == PcdGet32(PcdFlashNvStorageFtwWorkingBase));
-    ASSERT(PcdGet32(PcdFlashNvStorageFtwWorkingBase) + PcdGet32(PcdFlashNvStorageFtwWorkingSize) == PcdGet32(PcdFlashNvStorageFtwSpareBase));
+    ASSERT(PcdGet64(PcdFlashNvStorageVariableBase64) + PcdGet32(PcdFlashNvStorageVariableSize) == PcdGet64(PcdFlashNvStorageFtwWorkingBase64));
+    ASSERT(PcdGet64(PcdFlashNvStorageFtwWorkingBase64) + PcdGet32(PcdFlashNvStorageFtwWorkingSize) == PcdGet64(PcdFlashNvStorageFtwSpareBase64));
 
     // Check if the size of the area is at least one block size
     ASSERT((PcdGet32(PcdFlashNvStorageVariableSize) > 0) && ((UINT32)PcdGet32(PcdFlashNvStorageVariableSize) / Instance->Media.BlockSize > 0));
@@ -154,9 +154,9 @@ InitializeFvAndVariableStoreHeaders (
     ASSERT((PcdGet32(PcdFlashNvStorageFtwSpareSize) > 0) && ((UINT32)PcdGet32(PcdFlashNvStorageFtwSpareSize) / Instance->Media.BlockSize > 0));
 
     // Ensure the Variable area Base Addresses are aligned on a block size boundaries
-    ASSERT((UINT32)PcdGet32(PcdFlashNvStorageVariableBase) % Instance->Media.BlockSize == 0);
-    ASSERT((UINT32)PcdGet32(PcdFlashNvStorageFtwWorkingBase) % Instance->Media.BlockSize == 0);
-    ASSERT((UINT32)PcdGet32(PcdFlashNvStorageFtwSpareBase) % Instance->Media.BlockSize == 0);
+    ASSERT((UINT32)PcdGet64(PcdFlashNvStorageVariableBase64) % Instance->Media.BlockSize == 0);
+    ASSERT((UINT32)PcdGet64(PcdFlashNvStorageFtwWorkingBase64) % Instance->Media.BlockSize == 0);
+    ASSERT((UINT32)PcdGet64(PcdFlashNvStorageFtwSpareBase64) % Instance->Media.BlockSize == 0);
 
     //
     // EFI_FIRMWARE_VOLUME_HEADER
@@ -855,10 +855,10 @@ FvbInitialize (
     UINT32      FvbNumLba;
 
     Instance->Initialized = TRUE;
-    mFlashNvStorageVariableBase = FixedPcdGet32 (PcdFlashNvStorageVariableBase);
+    mFlashNvStorageVariableBase = FixedPcdGet64 (PcdFlashNvStorageVariableBase64);
 
     // Set the index of the first LBA for the FVB
-    Instance->StartLba = (PcdGet32 (PcdFlashNvStorageVariableBase) - Instance->RegionBaseAddress) / Instance->Media.BlockSize;
+    Instance->StartLba = (PcdGet64 (PcdFlashNvStorageVariableBase64) - Instance->RegionBaseAddress) / Instance->Media.BlockSize;
 
     // Determine if there is a valid header at the beginning of the Flash
     Status = ValidateFvHeader (Instance);
@@ -1208,8 +1208,8 @@ FlashFvbInitialize (
     {
         // Check if this Flash device contain the variable storage region
         ContainVariableStorage =
-            (FlashDevices[Index].RegionBaseAddress <= (UINT32)PcdGet32 (PcdFlashNvStorageVariableBase)) &&
-            ((UINT32)(PcdGet32 (PcdFlashNvStorageVariableBase) + PcdGet32 (PcdFlashNvStorageVariableSize)) <= FlashDevices[Index].RegionBaseAddress + FlashDevices[Index].Size);
+             (FlashDevices[Index].RegionBaseAddress <= PcdGet64 (PcdFlashNvStorageVariableBase64)) &&
+             ((PcdGet64 (PcdFlashNvStorageVariableBase64) + PcdGet32 (PcdFlashNvStorageVariableSize)) <= FlashDevices[Index].RegionBaseAddress + FlashDevices[Index].Size);
 
         Status = FlashCreateInstance (
                      FlashDevices[Index].DeviceBaseAddress,
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 09/43] Hisilicon/D0X: Rename the global variable gDS3231RtcDevice
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (7 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 08/43] Hisilicon/D0x: Unify FlashFvbDxe driver Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-21 17:59   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 10/43] Hisilicon/D06: Add several base file for D06 Ming Huang
                   ` (34 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

The global variable gDS3231RtcDevice is used by several
modules included common module in HwPkg. Renaming it
with a general name is proper.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Include/Library/OemMiscLib.h                                 | 2 +-
 Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c | 8 ++++----
 Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c             | 2 +-
 Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c                 | 2 +-
 Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c      | 8 ++++----
 5 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/Silicon/Hisilicon/Include/Library/OemMiscLib.h b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
index 6f18c0fa72..87cb498dd7 100644
--- a/Silicon/Hisilicon/Include/Library/OemMiscLib.h
+++ b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
@@ -34,7 +34,7 @@ extern REPORT_PCIEDIDVID2BMC PcieDeviceToReport[PCIEDEVICE_REPORT_MAX];
 BOOLEAN OemIsSocketPresent (UINTN Socket);
 VOID CoreSelectBoot(VOID);
 VOID OemPcieResetAndOffReset(void);
-extern I2C_DEVICE gDS3231RtcDevice;
+extern I2C_DEVICE gRtcDevice;
 
 UINTN OemGetSocketNumber(VOID);
 UINTN OemGetDdrChannel (VOID);
diff --git a/Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c b/Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
index 07fa52aa78..f6dbcf6b75 100644
--- a/Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
+++ b/Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
@@ -41,7 +41,7 @@
 #include <Library/CpldD03.h>
 #include <Library/CpldIoLib.h>
 
-extern I2C_DEVICE gDS3231RtcDevice;
+extern I2C_DEVICE gRtcDevice;
 
 STATIC BOOLEAN       mDS3231Initialized = FALSE;
 
@@ -117,7 +117,7 @@ InitializeDS3231 (
   // Prepare the hardware
   (VOID)IdentifyDS3231();
 
-  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
+  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
 
   Status = I2CInit(Dev.Socket,Dev.Port,Normal);
   if (EFI_ERROR (Status)) {
@@ -199,7 +199,7 @@ LibGetTime (
     }
   }
 
-  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
+  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
 
   Status |= I2CRead(&Dev,DS3231_REGADDR_MONTH,1,&Temp);
 
@@ -299,7 +299,7 @@ LibSetTime (
     }
   }
 
-  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
+  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
 
   Temp = ((Time->Second/10)<<4) | (Time->Second%10);
   MicroSecondDelay(1000);
diff --git a/Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c b/Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c
index 66d62895a6..4771cb900c 100644
--- a/Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c
+++ b/Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c
@@ -25,7 +25,7 @@
 #include <Library/I2CLib.h>
 #include <Library/HiiLib.h>
 
-I2C_DEVICE gDS3231RtcDevice = {
+I2C_DEVICE gRtcDevice = {
     .Socket = 0,
     .Port = 6,
     .DeviceType = DEVICE_TYPE_SPD,
diff --git a/Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c b/Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c
index 15a509be5d..ae4c194070 100644
--- a/Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c
+++ b/Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c
@@ -26,7 +26,7 @@
 #include <Protocol/Smbios.h>
 
 
-I2C_DEVICE gDS3231RtcDevice = {
+I2C_DEVICE gRtcDevice = {
   .Socket = 0,
   .Port = 4,
   .DeviceType = DEVICE_TYPE_SPD,
diff --git a/Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c b/Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
index 02d6d7f14d..105eb15635 100644
--- a/Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
+++ b/Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
@@ -39,7 +39,7 @@
 #include <Library/I2CLib.h>
 #include "DS3231RealTimeClock.h"
 
-extern I2C_DEVICE gDS3231RtcDevice;
+extern I2C_DEVICE gRtcDevice;
 
 STATIC BOOLEAN       mDS3231Initialized = FALSE;
 
@@ -67,7 +67,7 @@ InitializeDS3231 (
   // Prepare the hardware
   (VOID)IdentifyDS3231();
 
-  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
+  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
 
   Status = I2CInit(Dev.Socket,Dev.Port,Normal);
   if (EFI_ERROR (Status)) {
@@ -143,7 +143,7 @@ LibGetTime (
     }
   }
 
-  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
+  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
 
 
   Status |= I2CRead(&Dev,DS3231_REGADDR_MONTH,1,&Temp);
@@ -233,7 +233,7 @@ LibSetTime (
     }
   }
 
-  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
+  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
 
   Temp = ((Time->Second/10)<<4) | (Time->Second%10);
   MicroSecondDelay(1000);
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 10/43] Hisilicon/D06: Add several base file for D06
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (8 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 09/43] Hisilicon/D0X: Rename the global variable gDS3231RtcDevice Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-21 21:56   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 11/43] Platform/Hisilicon/D06: Add M41T83RealTimeClockLib Ming Huang
                   ` (33 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Add several base head files and add several build
files for D06.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dec                       |  29 ++
 Platform/Hisilicon/D06/D06.dsc                       | 455 ++++++++++++++++++++
 Platform/Hisilicon/D06/D06.fdf                       | 351 +++++++++++++++
 Platform/Hisilicon/D06/Include/Library/CpldD06.h     |  37 ++
 Silicon/Hisilicon/Hi1620/Include/Library/SerdesLib.h |  85 ++++
 Silicon/Hisilicon/Hi1620/Include/PlatformArch.h      |  61 +++
 Silicon/Hisilicon/Include/Library/OemAddressMapLib.h |   6 +
 Silicon/Hisilicon/Include/Library/OemNicLib.h        |  57 +++
 8 files changed, 1081 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dec b/Platform/Hisilicon/D06/D06.dec
new file mode 100644
index 0000000000..710f083eee
--- /dev/null
+++ b/Platform/Hisilicon/D06/D06.dec
@@ -0,0 +1,29 @@
+#/** @file
+#
+#    Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+#    Copyright (c) 2018, Linaro Limited. All rights reserved.
+#
+#    This program and the accompanying materials
+#    are licensed and made available under the terms and conditions of the BSD License
+#    which accompanies this distribution. The full text of the license may be found at
+#    http://opensource.org/licenses/bsd-license.php
+#
+#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#**/
+
+#
+# D06 Package
+#
+#
+#
+
+[Defines]
+  DEC_SPECIFICATION              = 0x0001001A
+  PACKAGE_NAME                   = D06Pkg
+  PACKAGE_GUID                   = B46F75D7-3864-450D-86D9-A0346A882232
+  PACKAGE_VERSION                = 0.1
+
+[Includes]
+  Include
diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
new file mode 100644
index 0000000000..d14fce1159
--- /dev/null
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -0,0 +1,455 @@
+#
+#  Copyright (c) 2011-2012, ARM Limited. All rights reserved.
+#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+#  Copyright (c) 2018, Linaro Limited. All rights reserved.
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+
+################################################################################
+#
+# Defines Section - statements that will be processed to create a Makefile.
+#
+################################################################################
+[Defines]
+  PLATFORM_NAME                  = D06
+  PLATFORM_GUID                  = D0D445F1-B2CA-4101-9986-1B23525CBEA6
+  PLATFORM_VERSION               = 0.1
+  DSC_SPECIFICATION              = 0x0001001A
+  OUTPUT_DIRECTORY               = Build/$(PLATFORM_NAME)
+  SUPPORTED_ARCHITECTURES        = AARCH64
+  BUILD_TARGETS                  = DEBUG|NOOPT|RELEASE
+  SKUID_IDENTIFIER               = DEFAULT
+  FLASH_DEFINITION               = Platform/Hisilicon/$(PLATFORM_NAME)/$(PLATFORM_NAME).fdf
+  DEFINE NETWORK_IP6_ENABLE      = FALSE
+  DEFINE HTTP_BOOT_ENABLE        = FALSE
+  DEFINE SECURE_BOOT_ENABLE      = FALSE
+
+!include Silicon/Hisilicon/Hisilicon.dsc.inc
+
+[LibraryClasses.common]
+  ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
+  ArmPlatformLib|Silicon/Hisilicon/Library/ArmPlatformLibHisilicon/ArmPlatformLib.inf
+
+
+  I2CLib|Silicon/Hisilicon/Library/I2CLib/I2CLib.inf
+  TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
+  NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
+  DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
+  HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
+  UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
+  UdpIoLib|MdeModulePkg/Library/DxeUdpIoLib/DxeUdpIoLib.inf
+  IpIoLib|MdeModulePkg/Library/DxeIpIoLib/DxeIpIoLib.inf
+  OrderedCollectionLib|MdePkg/Library/BaseOrderedCollectionRedBlackTreeLib/BaseOrderedCollectionRedBlackTreeLib.inf
+  ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
+  DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+  FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
+  BootLogoLib|MdeModulePkg/Library/BootLogoLib/BootLogoLib.inf
+  SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
+
+!if $(NETWORK_IP6_ENABLE) == TRUE
+  TcpIoLib|MdeModulePkg/Library/DxeTcpIoLib/DxeTcpIoLib.inf
+!endif
+
+!if $(HTTP_BOOT_ENABLE) == TRUE
+  HttpLib|MdeModulePkg/Library/DxeHttpLib/DxeHttpLib.inf
+!endif
+
+  CpldIoLib|Silicon/Hisilicon/Library/CpldIoLib/CpldIoLib.inf
+
+  TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf
+
+  CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
+  GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
+  BmcConfigBootLib|Silicon/Hisilicon/Library/BmcConfigBootLib/BmcConfigBootLib.inf
+  UefiBootManagerLib|MdeModulePkg/Library/UefiBootManagerLib/UefiBootManagerLib.inf
+  SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
+  ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
+  DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
+  PlatformBootManagerLib|Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+  FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
+  CustomizedDisplayLib|MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.inf
+
+  # USB Requirements
+  UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
+
+  SerialPortLib|ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf
+!if $(SECURE_BOOT_ENABLE) == TRUE
+  FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
+!endif
+  PciExpressLib|MdePkg/Library/BasePciExpressLib/BasePciExpressLib.inf
+
+[LibraryClasses.common.SEC]
+  ArmPlatformLib|Silicon/Hisilicon/Library/ArmPlatformLibHisilicon/ArmPlatformLibSec.inf
+
+
+[LibraryClasses.common.DXE_RUNTIME_DRIVER]
+  I2CLib|Silicon/Hisilicon/Library/I2CLib/I2CLibRuntime.inf
+  SerialPortLib|ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf
+
+[BuildOptions]
+  GCC:*_*_AARCH64_PLATFORM_FLAGS == -I$(WORKSPACE)/Silicon/Hisilicon/Hi1620/Include
+
+################################################################################
+#
+# Pcd Section - list of all EDK II PCD Entries defined by this Platform
+#
+################################################################################
+
+[PcdsFeatureFlag.common]
+
+  ## If TRUE, Graphics Output Protocol will be installed on virtual handle created by ConsplitterDxe.
+  #  It could be set FALSE to save size.
+  gEfiMdeModulePkgTokenSpaceGuid.PcdConOutGopSupport|TRUE
+  gHisiTokenSpaceGuid.PcdIsItsSupported|TRUE
+  gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE
+  gEfiMdeModulePkgTokenSpaceGuid.PcdHiiOsRuntimeSupport|FALSE
+
+[PcdsFixedAtBuild.common]
+  gArmPlatformTokenSpaceGuid.PcdCoreCount|48
+  gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize|48
+
+  gEfiMdeModulePkgTokenSpaceGuid.PcdMaxVariableSize|0x2000
+
+
+  # Stacks for MPCores in Normal World
+  gArmPlatformTokenSpaceGuid.PcdCPUCoresStackBase|0xA0E88000
+  gArmPlatformTokenSpaceGuid.PcdCPUCorePrimaryStackSize|0x40000
+
+  gArmTokenSpaceGuid.PcdSystemMemoryBase|0x00000000
+  gArmTokenSpaceGuid.PcdSystemMemorySize|0x3FC00000
+
+  # Size of the region used by UEFI in permanent memory (Reserved 64MB)
+  gArmPlatformTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x10000000
+
+  gHisiTokenSpaceGuid.PcdSerDesFlowCtrlFlag|1
+
+  gHisiTokenSpaceGuid.PcdSlotPerChannelNum|0x2
+
+  ## Serial Terminal
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x94080000
+  gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase|0x400094080000
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate|115200
+
+  gArmPlatformTokenSpaceGuid.PL011UartClkInHz|200000000
+
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits|8
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity|1
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits|1
+
+  gHisiTokenSpaceGuid.PcdIsMPBoot|1
+  gHisiTokenSpaceGuid.PcdSocketMask|0x3
+  !ifdef $(FIRMWARE_VER)
+    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"$(FIRMWARE_VER)"
+  !else
+    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Hisilicon D06 UEFI RC0 - B308 (V0.38)"
+  !endif
+
+  gHisiTokenSpaceGuid.PcdBiosVersionString|L"10.01.01T18"
+
+  gHisiTokenSpaceGuid.PcdBiosVersionForBmc|L"0.38"
+
+  gHisiTokenSpaceGuid.PcdSystemProductName|L"D06"
+  gHisiTokenSpaceGuid.PcdSystemVersion|L"VER.A"
+  gHisiTokenSpaceGuid.PcdBaseBoardProductName|L"D06"
+  gHisiTokenSpaceGuid.PcdBaseBoardVersion|L"Estuary"
+
+  gHisiTokenSpaceGuid.PcdCPUInfo|L"Hisilicon 1620"
+
+  # TA
+  gHisiTokenSpaceGuid.PcdArmPrimaryCoreTemp|0x80010000
+  gArmTokenSpaceGuid.PcdGicDistributorBase|0xAE000000
+  gArmTokenSpaceGuid.PcdGicRedistributorsBase|0xAE100000
+  gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0xFE000000
+
+
+
+  #
+  # ARM Architectual Timer Frequency
+  #
+  # Set it to 0 so that the code will read frequency from register and be
+  # adapted to 100M and 50M boards
+  gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|0
+  gEmbeddedTokenSpaceGuid.PcdTimerPeriod|10000
+
+
+  gEfiMdeModulePkgTokenSpaceGuid.PcdResetOnMemoryTypeInformationChange|FALSE
+  gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 }
+  gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21, 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66, 0x23, 0x31 }
+  gHisiTokenSpaceGuid.PcdSysControlBaseAddress|0x94010000
+  gHisiTokenSpaceGuid.PcdMailBoxAddress|0x0000FFF8
+
+  gHisiTokenSpaceGuid.PcdCpldBaseAddress|0x80000000
+  gHisiTokenSpaceGuid.PcdSFCMEM0BaseAddress|0x204000000
+
+  gHisiTokenSpaceGuid.PcdPeriSubctrlAddress|0x94000000
+
+  ## 2+1
+  gHisiTokenSpaceGuid.PcdPlatformDefaultPackageType|0x1
+
+  gHisiTokenSpaceGuid.PcdTopOfLowMemory|0x40000000
+
+  gHisiTokenSpaceGuid.PcdBottomOfHighMemory|0x1000000000
+
+  gHisiTokenSpaceGuid.PcdNORFlashBase|0x80000000
+  gHisiTokenSpaceGuid.PcdNORFlashCachableSize|0x8000000
+
+  gHisiTokenSpaceGuid.PcdTrustedFirmwareEnable|0x1
+  gHisiTokenSpaceGuid.PcdMacAddress|0xA47E0000
+
+  # PCIe ECAM Access BaseAddress
+  gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xD0000000
+  gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize|16
+
+  gHisiTokenSpaceGuid.Pcdsoctype|0x1620
+
+  # SMBIOS 3.0 only
+  #  BIT0 set indicates 32-bit entry point and table are produced.<BR>
+  #  BIT1 set indicates 64-bit entry point and table are produced.<BR>
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSmbiosEntryPointProvideMethod|0x2
+
+  #
+  # ACPI Table Version
+  #
+  #   BIT 1 - EFI_ACPI_TABLE_VERSION_1_0B.<BR>
+  #   BIT 2 - EFI_ACPI_TABLE_VERSION_2_0.<BR>
+  #   BIT 3 - EFI_ACPI_TABLE_VERSION_3_0.<BR>
+  #   BIT 4 - EFI_ACPI_TABLE_VERSION_4_0.<BR>
+  #   BIT 5 - EFI_ACPI_TABLE_VERSION_5_0.<BR>
+  gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x20
+
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSrIovSupport|FALSE
+  gArmTokenSpaceGuid.PcdPciIoTranslation|0x0
+
+################################################################################
+#
+# Components Section - list of all EDK II Modules needed by this Platform
+#
+################################################################################
+[Components.common]
+
+  #
+  # SEC
+  #
+
+  #
+  # PEI Phase modules
+  #
+  ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf
+  MdeModulePkg/Core/Pei/PeiMain.inf
+  MdeModulePkg/Universal/PCD/Pei/Pcd.inf
+
+  ArmPlatformPkg/PlatformPei/PlatformPeim.inf
+
+  ArmPkg/Drivers/CpuPei/CpuPei.inf
+  IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
+  MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
+  MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
+
+  Silicon/Hisilicon/Drivers/VersionInfoPeim/VersionInfoPeim.inf
+
+  MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
+  }
+
+  #
+  # DXE
+  #
+  MdeModulePkg/Core/Dxe/DxeMain.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/DxeCrc32GuidedSectionExtractLib/DxeCrc32GuidedSectionExtractLib.inf
+  }
+  MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
+
+
+  #
+  # Architectural Protocols
+  #
+  ArmPkg/Drivers/CpuDxe/CpuDxe.inf
+  MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
+
+
+!if $(SECURE_BOOT_ENABLE) == TRUE
+  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf {
+    <LibraryClasses>
+      NULL|SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf
+  }
+  SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
+!else
+  MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
+!endif
+  Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf
+  MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf
+      BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
+  }
+  MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
+  MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
+
+  MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
+  MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf
+  EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf {
+    <LibraryClasses>
+      CpldIoLib|Silicon/Hisilicon/Library/CpldIoLib/CpldIoLibRuntime.inf
+  }
+  EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
+
+  MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
+  MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
+  MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
+  MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
+  MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
+
+  MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+  ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
+
+  ArmPkg/Drivers/TimerDxe/TimerDxe.inf
+
+  MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
+  IntelFrameworkModulePkg/Universal/StatusCode/RuntimeDxe/StatusCodeRuntimeDxe.inf
+  #
+  #ACPI
+  #
+  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
+  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
+
+  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
+
+  #
+  # Usb Support
+  #
+  MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
+  MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf
+  MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
+  MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf
+  MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouseDxe.inf
+  MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf
+
+  #
+  #network
+  #
+  MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
+
+  MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf
+  MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
+  MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
+  MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
+  MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
+  MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
+  MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf
+!if $(NETWORK_IP6_ENABLE) == TRUE
+  NetworkPkg/Ip6Dxe/Ip6Dxe.inf
+  NetworkPkg/TcpDxe/TcpDxe.inf
+  NetworkPkg/Udp6Dxe/Udp6Dxe.inf
+  NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf
+  NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf
+  NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
+!else
+  MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
+  MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
+!endif
+  MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
+!if $(HTTP_BOOT_ENABLE) == TRUE
+  NetworkPkg/DnsDxe/DnsDxe.inf
+  NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf
+  NetworkPkg/HttpDxe/HttpDxe.inf
+  NetworkPkg/HttpBootDxe/HttpBootDxe.inf
+!endif
+
+  MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
+  MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
+  MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
+  #
+  # FAT filesystem + GPT/MBR partitioning
+  #
+
+  MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
+  MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
+  FatPkg/EnhancedFatDxe/Fat.inf
+  MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
+
+  MdeModulePkg/Application/UiApp/UiApp.inf {
+    <LibraryClasses>
+      NULL|MdeModulePkg/Library/BootManagerUiLib/BootManagerUiLib.inf
+      NULL|MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
+      NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf
+  }
+  #
+  # Bds
+  #
+  MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
+
+  MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  Silicon/Hisilicon/Drivers/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
+  Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClassDxe.inf
+  Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
+  Silicon/Hisilicon/Drivers/Smbios/AddSmbiosType9/AddSmbiosType9.inf
+
+  #PCIe Support
+  Silicon/Hisilicon/Drivers/PciPlatform/PciPlatform.inf
+  ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf
+  MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf {
+    <LibraryClasses>
+      PciSegmentLib|MdePkg/Library/BasePciSegmentLibPci/BasePciSegmentLibPci.inf
+      PciLib|MdePkg/Library/BasePciLibPciExpress/BasePciLibPciExpress.inf
+      PciHostBridgeLib|MdeModulePkg/Library/PciHostBridgeLibNull/PciHostBridgeLibNull.inf
+  }
+
+  MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
+
+  MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf
+
+  #
+  # Memory test
+  #
+  MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
+  MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
+  MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
+  MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+
+  #
+  # UEFI application (Shell Embedded Boot Loader)
+  #
+  ShellPkg/Application/Shell/Shell.inf {
+    <LibraryClasses>
+      ShellCommandLib|ShellPkg/Library/UefiShellCommandLib/UefiShellCommandLib.inf
+      NULL|ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellLevel3CommandsLib/UefiShellLevel3CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf
+      NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
+      HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
+      PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
+      BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf
+!if $(NETWORK_IP6_ENABLE) == TRUE
+      NULL|ShellPkg/Library/UefiShellNetwork2CommandsLib/UefiShellNetwork2CommandsLib.inf
+!endif
+
+!if $(INCLUDE_DP) == TRUE
+      NULL|ShellPkg/Library/UefiDpLib/UefiDpLib.inf
+!endif #$(INCLUDE_DP)
+
+    <PcdsFixedAtBuild>
+      gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0xFF
+      gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
+      gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|8000
+  }
+!if $(INCLUDE_TFTP_COMMAND) == TRUE
+  ShellPkg/DynamicCommand/TftpDynamicCommand/TftpDynamicCommand.inf {
+    <PcdsFixedAtBuild>
+      gEfiShellPkgTokenSpaceGuid.PcdShellLibAutoInitialize|FALSE
+  }
+!endif #$(INCLUDE_TFTP_COMMAND)
+
diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
new file mode 100644
index 0000000000..9567ede0ad
--- /dev/null
+++ b/Platform/Hisilicon/D06/D06.fdf
@@ -0,0 +1,351 @@
+#
+#  Copyright (c) 2011, 2012, ARM Limited. All rights reserved.
+#  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+#  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+[DEFINES]
+
+################################################################################
+#
+# FD Section
+# The [FD] Section is made up of the definition statements and a
+# description of what goes into  the Flash Device Image.  Each FD section
+# defines one flash "device" image.  A flash device image may be one of
+# the following: Removable media bootable image (like a boot floppy
+# image,) an Option ROM image (that would be "flashed" into an add-in
+# card,) a System "Flash"  image (that would be burned into a system's
+# flash) or an Update ("Capsule") image that will be used to update and
+# existing system flash.
+#
+################################################################################
+[FD.D06]
+
+BaseAddress   = 0x204100000|gArmTokenSpaceGuid.PcdFdBaseAddress  # The base address of the Firmware in NOR Flash.
+
+Size          = 0x00400000|gArmTokenSpaceGuid.PcdFdSize         # The size in bytes of the FLASH Device
+ErasePolarity = 1
+
+# This one is tricky, it must be: BlockSize * NumBlocks = Size
+BlockSize     = 0x00010000
+NumBlocks     = 0x40
+
+################################################################################
+#
+# Following are lists of FD Region layout which correspond to the locations of different
+# images within the flash device.
+#
+# Regions must be defined in ascending order and may not overlap.
+#
+# A Layout Region start with a eight digit hex offset (leading "0x" required) followed by
+# the pipe "|" character, followed by the size of the region, also in hex with the leading
+# "0x" characters. Like:
+# Offset|Size
+# PcdOffsetCName|PcdSizeCName
+# RegionType <FV, DATA, or FILE>
+#
+################################################################################
+
+0x00000000|0x00100000
+gArmTokenSpaceGuid.PcdSecureFvBaseAddress|gArmTokenSpaceGuid.PcdSecureFvSize
+
+0x00100000|0x00280000
+gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
+FV = FVMAIN_COMPACT
+
+0x00380000|0x00020000
+gHisiTokenSpaceGuid.PcdTrustedFirmwareBL1Base
+FILE = Platform/Hisilicon/D06/bl1.bin
+0x003A0000|0x00020000
+FILE = Platform/Hisilicon/D06/fip.bin
+
+0x003C0000|0x0000e000
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize
+DATA = {
+  ## This is the EFI_FIRMWARE_VOLUME_HEADER
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  # FileSystemGuid: gEfiSystemNvDataFvGuid         =
+  0x8D, 0x2B, 0xF1, 0xFF, 0x96, 0x76, 0x8B, 0x4C,
+  0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50,
+  # FvLength: 0x20000
+  0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+  #Signature "_FVH"       #Attributes
+  0x5f, 0x46, 0x56, 0x48, 0xff, 0xfe, 0x04, 0x00,
+  #HeaderLength #CheckSum #ExtHeaderOffset #Reserved #Revision
+  0x48, 0x00, 0x36, 0x09, 0x00, 0x00, 0x00, 0x02,
+  #Blockmap[0]: 2 Blocks * 0x10000 Bytes / Block
+  0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+  #Blockmap[1]: End
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  ## This is the VARIABLE_STORE_HEADER
+!if $(SECURE_BOOT_ENABLE) == TRUE
+  #Signature: gEfiAuthenticatedVariableGuid =
+  #  { 0xaaf32c78, 0x947b, 0x439a, { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 }}
+  0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43,
+  0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92,
+!else
+  #Signature: gEfiVariableGuid =
+  #  { 0xddcf3616, 0x3275, 0x4164, { 0x98, 0xb6, 0xfe, 0x85, 0x70, 0x7f, 0xfe, 0x7d }}
+  0x16, 0x36, 0xcf, 0xdd, 0x75, 0x32, 0x64, 0x41,
+  0x98, 0xb6, 0xfe, 0x85, 0x70, 0x7f, 0xfe, 0x7d,
+!endif
+  #Size: 0xe000 (gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize) - 0x48 (size of EFI_FIRMWARE_VOLUME_HEADER) = 0xdFB8
+  0xB8, 0xdF, 0x00, 0x00,
+  #FORMATTED: 0x5A #HEALTHY: 0xFE #Reserved: UINT16 #Reserved1: UINT32
+  0x5A, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+}
+
+0x003CE000|0x00002000
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize
+#NV_FTW_WORKING
+DATA = {
+  # EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER->Signature = gEdkiiWorkingBlockSignatureGuid          =
+  0x2B, 0x29, 0x58, 0x9E, 0x68, 0x7C, 0x7D, 0x49,
+  0xA0, 0xCE, 0x65, 0x0 , 0xFD, 0x9F, 0x1B, 0x95,
+  # Crc:UINT32            #WorkingBlockValid:1, WorkingBlockInvalid:1, Reserved
+  0xE2, 0x33, 0xF2, 0x03, 0xFE, 0xFF, 0xFF, 0xFF,
+  # WriteQueueSize: UINT64 #Size: 0x2000 - 0x20 (FTW_WORKING_HEADER) = 0x1FE0
+  0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+}
+
+0x003D0000|0x00010000
+gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize
+
+0x003E0000|0x00010000
+
+0x003F0000|0x00010000
+FILE = Platform/Hisilicon/D0x-CustomData.Fv
+
+################################################################################
+#
+# FV Section
+#
+# [FV] section is used to define what components or modules are placed within a flash
+# device file.  This section also defines order the components and modules are positioned
+# within the image.  The [FV] section consists of define statements, set statements and
+# module statements.
+#
+################################################################################
+
+[FV.FvMain]
+BlockSize          = 0x40
+NumBlocks          = 0         # This FV gets compressed so make it just big enough
+FvAlignment        = 16        # FV alignment and FV attributes setting.
+ERASE_POLARITY     = 1
+MEMORY_MAPPED      = TRUE
+STICKY_WRITE       = TRUE
+LOCK_CAP           = TRUE
+LOCK_STATUS        = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP  = TRUE
+WRITE_STATUS       = TRUE
+WRITE_LOCK_CAP     = TRUE
+WRITE_LOCK_STATUS  = TRUE
+READ_DISABLED_CAP  = TRUE
+READ_ENABLED_CAP   = TRUE
+READ_STATUS        = TRUE
+READ_LOCK_CAP      = TRUE
+READ_LOCK_STATUS   = TRUE
+
+  APRIORI DXE {
+    INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
+  }
+
+  INF MdeModulePkg/Core/Dxe/DxeMain.inf
+  INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
+
+  #
+  # PI DXE Drivers producing Architectural Protocols (EFI Services)
+  #
+  INF ArmPkg/Drivers/CpuDxe/CpuDxe.inf
+  INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
+
+  INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
+
+
+  INF Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf
+  INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
+  INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
+
+  INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf
+  INF MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
+
+!if $(SECURE_BOOT_ENABLE) == TRUE
+  INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
+!endif
+
+  INF MdeModulePkg/Universal/ResetSystemRuntimeDxe/ResetSystemRuntimeDxe.inf
+  INF EmbeddedPkg/RealTimeClockRuntimeDxe/RealTimeClockRuntimeDxe.inf
+  INF EmbeddedPkg/MetronomeDxe/MetronomeDxe.inf
+
+  INF MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabaseDxe.inf
+
+  #
+  # Multiple Console IO support
+  #
+  INF MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf
+  INF MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
+  INF MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsoleDxe.inf
+  INF MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf
+  INF MdeModulePkg/Universal/SerialDxe/SerialDxe.inf
+
+  INF ArmPkg/Drivers/ArmGic/ArmGicDxe.inf
+  INF ArmPkg/Drivers/TimerDxe/TimerDxe.inf
+
+  INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
+
+  #
+  # FAT filesystem + GPT/MBR partitioning
+  #
+  INF MdeModulePkg/Universal/Disk/DiskIoDxe/DiskIoDxe.inf
+  INF MdeModulePkg/Universal/Disk/PartitionDxe/PartitionDxe.inf
+  INF FatPkg/EnhancedFatDxe/Fat.inf
+  INF MdeModulePkg/Universal/Disk/UnicodeCollation/EnglishDxe/EnglishDxe.inf
+  INF IntelFrameworkModulePkg/Universal/StatusCode/RuntimeDxe/StatusCodeRuntimeDxe.inf
+
+  #
+  # Usb Support
+  #
+
+
+  INF MdeModulePkg/Bus/Pci/EhciDxe/EhciDxe.inf
+
+  INF MdeModulePkg/Bus/Pci/XhciDxe/XhciDxe.inf
+  INF MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf
+  INF MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf
+  INF MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouseDxe.inf
+  INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf
+
+  INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
+  INF Silicon/Hisilicon/Drivers/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
+  INF Silicon/Hisilicon/Drivers/Smbios/AddSmbiosType9/AddSmbiosType9.inf
+
+
+
+  INF Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClassDxe.inf
+
+  INF Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
+
+  #
+  #ACPI
+  #
+  INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
+  INF Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
+
+  INF Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
+
+  #
+  #Network
+  #
+
+  INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
+  INF MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf
+  INF MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Dxe.inf
+  INF MdeModulePkg/Universal/Network/DpcDxe/DpcDxe.inf
+  INF MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Dxe.inf
+  INF MdeModulePkg/Universal/Network/MnpDxe/MnpDxe.inf
+  INF MdeModulePkg/Universal/Network/Mtftp4Dxe/Mtftp4Dxe.inf
+  INF MdeModulePkg/Universal/Network/Udp4Dxe/Udp4Dxe.inf
+!if $(NETWORK_IP6_ENABLE) == TRUE
+  INF NetworkPkg/Ip6Dxe/Ip6Dxe.inf
+  INF NetworkPkg/TcpDxe/TcpDxe.inf
+  INF NetworkPkg/Udp6Dxe/Udp6Dxe.inf
+  INF NetworkPkg/Dhcp6Dxe/Dhcp6Dxe.inf
+  INF NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf
+  INF NetworkPkg/UefiPxeBcDxe/UefiPxeBcDxe.inf
+!else
+  INF MdeModulePkg/Universal/Network/Tcp4Dxe/Tcp4Dxe.inf
+  INF MdeModulePkg/Universal/Network/UefiPxeBcDxe/UefiPxeBcDxe.inf
+!endif
+  INF MdeModulePkg/Universal/Network/IScsiDxe/IScsiDxe.inf
+!if $(HTTP_BOOT_ENABLE) == TRUE
+  INF NetworkPkg/DnsDxe/DnsDxe.inf
+  INF NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf
+  INF NetworkPkg/HttpDxe/HttpDxe.inf
+  INF NetworkPkg/HttpBootDxe/HttpBootDxe.inf
+!endif
+
+
+  #
+  # PCI Support
+  #
+  INF Silicon/Hisilicon/Drivers/PciPlatform/PciPlatform.inf
+  INF ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf
+  INF MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf
+  INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
+
+  INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf
+  INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
+  INF MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
+  INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
+
+  INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
+  #
+  # Build Shell from latest source code instead of prebuilt binary
+  #
+  INF ShellPkg/Application/Shell/Shell.inf
+
+  INF MdeModulePkg/Application/UiApp/UiApp.inf
+  #
+  # Bds
+  #
+  INF MdeModulePkg/Universal/DevicePathDxe/DevicePathDxe.inf
+
+  INF MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
+  INF MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
+  INF MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
+  INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+
+[FV.FVMAIN_COMPACT]
+FvAlignment        = 16
+ERASE_POLARITY     = 1
+MEMORY_MAPPED      = TRUE
+STICKY_WRITE       = TRUE
+LOCK_CAP           = TRUE
+LOCK_STATUS        = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP  = TRUE
+WRITE_STATUS       = TRUE
+WRITE_LOCK_CAP     = TRUE
+WRITE_LOCK_STATUS  = TRUE
+READ_DISABLED_CAP  = TRUE
+READ_ENABLED_CAP   = TRUE
+READ_STATUS        = TRUE
+READ_LOCK_CAP      = TRUE
+READ_LOCK_STATUS   = TRUE
+
+  APRIORI PEI {
+    INF  MdeModulePkg/Universal/PCD/Pei/Pcd.inf
+  }
+  INF ArmPlatformPkg/PrePeiCore/PrePeiCoreMPCore.inf
+  INF MdeModulePkg/Core/Pei/PeiMain.inf
+  INF ArmPlatformPkg/PlatformPei/PlatformPeim.inf
+
+  INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
+  INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
+
+  INF Silicon/Hisilicon/Drivers/VersionInfoPeim/VersionInfoPeim.inf
+
+  INF ArmPkg/Drivers/CpuPei/CpuPei.inf
+  INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
+  INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
+
+  INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
+
+  FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
+    SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
+      SECTION FV_IMAGE = FVMAIN
+    }
+  }
+
+!include Silicon/Hisilicon/Hisilicon.fdf.inc
+
diff --git a/Platform/Hisilicon/D06/Include/Library/CpldD06.h b/Platform/Hisilicon/D06/Include/Library/CpldD06.h
new file mode 100644
index 0000000000..be3548c8d1
--- /dev/null
+++ b/Platform/Hisilicon/D06/Include/Library/CpldD06.h
@@ -0,0 +1,37 @@
+/** @file
+
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __CPLDD06_H__
+#define __CPLDD06_H__
+
+#define CPLD_BASE_ADDRESS                 0x80000000
+
+#define CPLD_BIOSINDICATE_FLAG            0x09
+#define CPLD_I2C_SWITCH_FLAG              0x17
+#define CPU_GET_I2C_CONTROL               BIT2
+#define BMC_I2C_STATUS                    BIT3
+
+#define CPLD_LOGIC_VERSION                (0x4)
+#define CPLD_LOGIC_COMPILE_YEAR          (0x1)
+#define CPLD_LOGIC_COMPILE_MONTH         (0x2)
+#define CPLD_LOGIC_COMPILE_DAY           (0x3)
+
+#define CPLD_RISER_PRSNT_FLAG             0x40
+#define CPLD_RISER2_BOARD_ID              0x44
+
+#define CPLD_X8_X8_X8_BOARD_ID            0x92
+#define CPLD_X16_X8_BOARD_ID              0x93
+
+#endif /* __CPLDD06_H__ */
diff --git a/Silicon/Hisilicon/Hi1620/Include/Library/SerdesLib.h b/Silicon/Hisilicon/Hi1620/Include/Library/SerdesLib.h
new file mode 100644
index 0000000000..05f0f7020e
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Include/Library/SerdesLib.h
@@ -0,0 +1,85 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef _SERDES_LIB_H_
+#define _SERDES_LIB_H_
+
+typedef enum {
+  EmHilink0Hccs1X8 = 0,
+  EmHilink0Pcie1X8 = 2,
+  EmHilink0Pcie1X4Pcie2X4 = 3,
+  EmHilink0Sas2X8 = 4,
+  EmHilink0Hccs1X8Width16,
+  EmHilink0Hccs1X8Width32,
+  EmHilink0Hccs1X8Speed5G,
+} HILINK0_MODE_TYPE;
+
+typedef enum {
+  EmHilink1Sas2X1 = 0,
+  EmHilink1Hccs0X8 = 1,
+  EmHilink1Pcie0X8 = 2,
+  EmHilink1Hccs0X8Width16,
+  EmHilink1Hccs0X8Width32,
+  EmHilink1Hccs0X8Speed5G,
+} HILINK1_MODE_TYPE;
+
+typedef enum {
+  EmHilink2Pcie2X8 = 0,
+  EmHilink2Hccs2X8 = 1,
+  EmHilink2Sas0X8 = 2,
+  EmHilink2Hccs2X8Width16,
+  EmHilink2Hccs2X8Width32,
+  EmHilink2Hccs2X8Speed5G,
+} HILINK2_MODE_TYPE;
+
+typedef enum {
+  EmHilink5Pcie3X4 = 0,
+  EmHilink5Pcie2X2Pcie3X2 = 1,
+  EmHilink5Sas1X4 = 2,
+} HILINK5_MODE_TYPE;
+
+
+typedef struct {
+  HILINK0_MODE_TYPE Hilink0Mode;
+  HILINK1_MODE_TYPE Hilink1Mode;
+  HILINK2_MODE_TYPE Hilink2Mode;
+  UINT32 Hilink3Mode;
+  UINT32 Hilink4Mode;
+  HILINK5_MODE_TYPE Hilink5Mode;
+  UINT32 Hilink6Mode;
+  UINT32 UseSsc;
+} SERDES_PARAM;
+
+#define SERDES_INVALID_MACRO_ID  0xFFFFFFFF
+#define SERDES_INVALID_LANE_NUM  0xFFFFFFFF
+#define SERDES_INVALID_RATE_MODE  0xFFFFFFFF
+
+typedef struct {
+  UINT32 MacroId;
+  UINT32 DsNum;
+  UINT32 DsCfg;
+} SERDES_POLARITY_INVERT;
+
+EFI_STATUS OemGetSerdesParam (SERDES_PARAM *ParamA, SERDES_PARAM *ParamB, UINT32 SocketId);
+extern SERDES_POLARITY_INVERT gSerdesPolarityTxDesc[];
+extern SERDES_POLARITY_INVERT gSerdesPolarityRxDesc[];
+UINT32 GetEthType (UINT8 EthChannel);
+VOID SerdesEnableCtleDfe (UINT32 NimbusId, UINT32 Macro, UINT32 Lane, UINT32 LaneMode);
+
+EFI_STATUS EfiSerdesInitWrap (UINT32 RateMode);
+INT32 SerdesReset (UINT32 SiclId, UINT32 Macro);
+VOID SerdesLoadFirmware (UINT32 SiclId, UINT32 Macro);
+INT32 h30_serdes_run_firmware (UINT32 nimbus_id, UINT32 macro, UINT8 DsMask, UINT8 ctle_mode);
+#endif
diff --git a/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
new file mode 100644
index 0000000000..9539cfdada
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
@@ -0,0 +1,61 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+
+
+#ifndef _PLATFORM_ARCH_H_
+#define _PLATFORM_ARCH_H_
+
+#define MAX_SOCKET      2
+#define MAX_DIE         4
+#define MAX_DDRC        4
+#define MAX_NODE        (MAX_SOCKET * MAX_DIE)
+#define MAX_CHANNEL     8
+#define MAX_DIMM        2
+#define MAX_RANK_CH     8
+#define MAX_RANK_DIMM   4
+#define MAX_DIMM_SIZE   256  // In GB
+// Max NUMA node number for each node type
+#define MAX_NUM_PER_TYPE 8
+
+#define RASC_BASE                (0x1800)
+#define RASC_CFG_INFOIDX_REG     (RASC_BASE + 0x58)  /* configuration register for Rank statistical information */
+#define RASC_CFG_SPLVL_REG       (RASC_BASE + 0xD4)  /* configuration register for Sparing level */
+
+//
+// ACPI table information used to initialize tables.
+//
+#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
+#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64 ('H','I','P','0','8',' ',' ',' ') // OEM table id 8 bytes long
+#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
+#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32 ('H','I','S','I')
+#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
+
+// A macro to initialise the common header part of EFI ACPI tables as defined by
+// EFI_ACPI_DESCRIPTION_HEADER structure.
+#define ARM_ACPI_HEADER(Signature, Type, Revision) {            \
+  Signature,                      /* UINT32  Signature */       \
+  sizeof (Type),                  /* UINT32  Length */          \
+  Revision,                       /* UINT8   Revision */        \
+  0,                              /* UINT8   Checksum */        \
+  { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
+  EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
+  EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
+  EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
+  EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
+  }
+
+#endif
+
diff --git a/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h b/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h
index 21498b7056..332a79343f 100644
--- a/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h
+++ b/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h
@@ -27,7 +27,13 @@ typedef struct _DDRC_BASE_ID{
 UINTN OemGetPoeSubBase (UINT32 NodeId);
 UINTN OemGetPeriSubBase (UINT32 NodeId);
 UINTN OemGetAlgSubBase (UINT32 NodeId);
+UINTN OemGetCfgbusBase (UINT32 NodeId);
+UINTN OemGetGicSubBase (UINT32 NodeId);
+UINTN OemGetHACSubBase (UINT32 NodeId);
+UINTN OemGetIOMGMTSubBase (UINT32 NodeId);
+UINTN OemGetNetworkSubBase (UINT32 NodeId);
 UINTN OemGetM3SubBase (UINT32 NodeId);
+UINTN OemGetPCIeSubBase (UINT32 NodeId);
 
 VOID OemAddressMapInit(VOID);
 
diff --git a/Silicon/Hisilicon/Include/Library/OemNicLib.h b/Silicon/Hisilicon/Include/Library/OemNicLib.h
new file mode 100644
index 0000000000..66fe9a2e9b
--- /dev/null
+++ b/Silicon/Hisilicon/Include/Library/OemNicLib.h
@@ -0,0 +1,57 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+
+#ifndef _OEM_NIC_LIB_H_
+#define _OEM_NIC_LIB_H_
+
+#define ETH_MAX_PORT          8
+#define ETH_DEBUG_PORT0       6
+#define ETH_DEBUG_PORT1       7
+
+#define ETH_SPEED_10M     6
+#define ETH_SPEED_100M    7
+#define ETH_SPEED_1000M   8
+#define ETH_SPEED_10KM    9
+#define ETH_HALF_DUPLEX   0
+#define ETH_FULL_DUPLEX   1
+
+#define ETH_GDD_ID                          0x001378e0
+#define ETH_PHY_BCM5241_ID                  0x0143bc30
+#define ETH_PHY_MVL88E1145_ID               0x01410cd0
+#define ETH_PHY_MVL88E1119_ID               0x01410e80
+#define ETH_PHY_MVL88E1512_ID               0x01410dd0
+#define ETH_PHY_MVL88E1543_ID               0x01410ea0
+#define ETH_PHY_NLP3142_ID                  0x00000412
+
+#define ETH_INVALID                         0xffffffff
+
+typedef struct {
+  UINT32 Valid;
+  UINT32 Speed;
+  UINT32 Duplex;
+  UINT32 PhyId;
+  UINT32 PhyAddr;
+} ETH_PRODUCT_DESC;
+
+BOOLEAN OemIsInitEth (UINT32 Port);
+UINT32 OemEthFindFirstSP ();
+ETH_PRODUCT_DESC *OemEthInit (UINT32 port);
+UINT32 GetCpu1FiberType (UINT8 *Fiber1Type, UINT8 *Fiber2Type);
+UINT32 GetCpu2FiberType (UINT8 *Fiber1Type, UINT8 *Fiber2Type, UINT8 *Fiber100Ge);
+EFI_STATUS EFIAPI OemGetMac (IN OUT EFI_MAC_ADDRESS *Mac, IN UINTN Port);
+EFI_STATUS EFIAPI OemSetMac (IN EFI_MAC_ADDRESS *Mac, IN UINTN Port);
+
+#endif
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 11/43] Platform/Hisilicon/D06: Add M41T83RealTimeClockLib
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (9 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 10/43] Hisilicon/D06: Add several base file for D06 Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-21 22:57   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 12/43] Platform/Hisilicon/D06: Add edk2-non-osi components for D06 Ming Huang
                   ` (32 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Add M41T83RealTimeClockLib for RTC.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                              |   1 +
 Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf |  46 ++
 Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h      | 158 ++++++
 Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c   | 564 ++++++++++++++++++++
 4 files changed, 769 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index d14fce1159..27358f8c78 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -65,6 +65,7 @@
   CpldIoLib|Silicon/Hisilicon/Library/CpldIoLib/CpldIoLib.inf
 
   TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf
+  RealTimeClockLib|Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
 
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
new file mode 100644
index 0000000000..e0bf6b3f24
--- /dev/null
+++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
@@ -0,0 +1,46 @@
+#/** @file
+#
+#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+#  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = M41T83RealTimeClockLib
+  FILE_GUID                      = 470DFB96-E205-4515-A75E-2E60F853E79D
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = RealTimeClockLib
+
+[Sources.common]
+  M41T83RealTimeClockLib.c
+
+[Packages]
+  EmbeddedPkg/EmbeddedPkg.dec
+  MdePkg/MdePkg.dec
+  Platform/Hisilicon/D06/D06.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[LibraryClasses]
+  BaseMemoryLib
+  CpldIoLib
+  DebugLib
+  I2CLib
+  IoLib
+  PcdLib
+  TimeBaseLib
+  TimerLib
+  UefiLib
+  UefiRuntimeLib        # Use EFiAtRuntime to check stage
+
+[Depex]
+  gEfiCpuArchProtocolGuid
diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h
new file mode 100644
index 0000000000..ed10099bf3
--- /dev/null
+++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h
@@ -0,0 +1,158 @@
+/** @file
+
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __M41T83_REAL_TIME_CLOCK_H__
+#define __M41T83_REAL_TIME_CLOCK_H__
+
+// The delay is need for cpld and I2C. This is a empirical value. MemoryFance is no need.
+#define RTC_DELAY_30_MS            30000
+// The delay is need for cpld and I2C. This is a empirical value. MemoryFance is no need.
+#define RTC_DELAY_1000_MACROSECOND 1000
+// The delay is need for cpld and I2C. This is a empirical value. MemoryFance is no need.
+#define RTC_DELAY_2_MACROSECOND    2
+
+#define M41T83_REGADDR_DOTSECONDS       0x00
+#define M41T83_REGADDR_SECONDS          0x01
+#define M41T83_REGADDR_MINUTES          0x02
+#define M41T83_REGADDR_HOURS            0x03
+#define M41T83_REGADDR_WEEK_DAY         0x04
+#define M41T83_REGADDR_DAY              0x05
+#define M41T83_REGADDR_MONTH            0x06
+#define M41T83_REGADDR_YEAR             0x07
+#define M41T83_REGADDR_ALARM1SEC        0x0E
+#define M41T83_REGADDR_ALARM1MIN        0x0D
+#define M41T83_REGADDR_ALARM1HOUR       0x0C
+#define M41T83_REGADDR_ALARM1DATE       0x0B
+#define M41T83_REGADDR_ALARM1MONTH      0x0A
+
+#define M41T83_REGADDR_TIMERCONTROL     0x11
+
+#define M41T83_REGADDR_ALARM2SEC        0x18
+#define M41T83_REGADDR_ALARM2MIN        0x17
+#define M41T83_REGADDR_ALARM2HOUR       0x16
+#define M41T83_REGADDR_ALARM2DATE       0x15
+#define M41T83_REGADDR_ALARM2MONTH      0x14
+
+typedef union {
+  struct {
+    UINT8 TD0:1;
+    UINT8 TD1:1;
+    UINT8 RSV:3;
+    UINT8 TIE:1;
+    UINT8 TITP:1;
+    UINT8 TE:1;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_TIMERCONTROL;
+
+typedef union {
+  struct {
+    UINT8 MicroSeconds;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_DOTSECOND;
+
+typedef union {
+  struct{
+    UINT8 Seconds:7;
+    UINT8 ST:1;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_SECOND;
+
+typedef union {
+  struct {
+    UINT8 Minutes:7;
+    UINT8 Rsv:1;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_MINUTE;
+
+typedef union {
+  struct {
+    UINT8 Hours:6;
+    UINT8 CB:2;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_HOUR;
+
+typedef union {
+  struct{
+    UINT8 Days:3;
+    UINT8 Rsv:5;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_WEEK_DAY;
+
+typedef union {
+  struct{
+    UINT8 Days:6;
+    UINT8 Rsv:2;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_MONTH_DAY;
+
+typedef union {
+  struct {
+    UINT8 Months:5;
+    UINT8 Rsv:3;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_MONTH;
+
+typedef union {
+  struct {
+    UINT8 Years:8;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_YEAR;
+
+typedef union {
+  struct {
+    UINT8 Second:7;
+    UINT8 RPT11:1;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_ALARM1SEC;
+
+typedef union {
+  struct {
+    UINT8 Minute:7;
+    UINT8 RPT12:1;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_ALARM1MIN;
+
+typedef union {
+  struct {
+    UINT8 Hour:6;
+    UINT8 HT:1;
+    UINT8 RPT13:1;
+  } Bits;
+  UINT8 Uint8;
+} RTC_M41T83_ALARM1HOUR;
+
+typedef struct {
+  RTC_M41T83_DOTSECOND  DotSecond;
+  RTC_M41T83_SECOND     Second;
+  RTC_M41T83_MINUTE     Minute;
+  RTC_M41T83_HOUR       Hour;
+  RTC_M41T83_WEEK_DAY   WeekDay;
+  RTC_M41T83_MONTH_DAY  Day;
+  RTC_M41T83_MONTH      Month;
+  RTC_M41T83_YEAR       Year;
+} RTC_M41T83_TIME;
+
+#endif
diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c
new file mode 100644
index 0000000000..eabe8dc0f3
--- /dev/null
+++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c
@@ -0,0 +1,564 @@
+/** @file
+
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Uefi.h>
+#include <PiDxe.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/CpldD06.h>
+#include <Library/CpldIoLib.h>
+#include <Library/DebugLib.h>
+#include <Library/I2CLib.h>
+#include <Library/IoLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PcdLib.h>
+#include <Library/TimeBaseLib.h>
+#include <Library/TimerLib.h>
+#include <Library/UefiLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiRuntimeLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Protocol/RealTimeClock.h>
+#include "M41T83RealTimeClock.h"
+
+extern I2C_DEVICE gRtcDevice;
+
+STATIC EFI_LOCK  mRtcLock;
+
+EFI_STATUS
+SwitchRtcI2cChannelAndLock (
+  VOID
+  )
+{
+  UINT8   Temp;
+  UINT8   Count;
+
+  for (Count = 0; Count < 100; Count++) {
+    // To get the other side's state is idle first
+    Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+    if ((Temp & BIT3) != 0) {
+      (VOID) MicroSecondDelay (RTC_DELAY_30_MS);
+      // Try 100 times, if BMC has not released the bus, return preemption failed
+      if (Count == 99) {
+        if (!EfiAtRuntime ()) {
+          DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Clear cpu_i2c_rtc_state 100 times fail!\n",
+            __FUNCTION__, __LINE__));
+        }
+        return EFI_DEVICE_ERROR;
+      }
+      continue;
+    }
+
+    // if BMC free the bus, can be set 1 preemption
+    Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+    Temp = Temp | CPU_GET_I2C_CONTROL;
+    // CPU occupied RTC I2C State
+    WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp);
+    (VOID) MicroSecondDelay (RTC_DELAY_2_MACROSECOND);
+    Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+    // Is preempt success
+    if(CPU_GET_I2C_CONTROL == (Temp & CPU_GET_I2C_CONTROL)) {
+      break;
+    }
+    if (Count == 99) {
+      if (!EfiAtRuntime ()) {
+        DEBUG((DEBUG_ERROR, "[%a]:[%dL]  Clear cpu_i2c_rtc_state fail !!! \n",
+          __FUNCTION__, __LINE__));
+      }
+      return EFI_DEVICE_ERROR;
+    }
+    (VOID) MicroSecondDelay (RTC_DELAY_30_MS);
+  }
+
+  //Polling BMC RTC I2C status
+  for (Count = 0; Count < 100; Count++) {
+    Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+    if ((Temp & BIT3) == 0) {
+      return EFI_SUCCESS;
+    }
+    (VOID) MicroSecondDelay (RTC_DELAY_30_MS);
+  }
+
+  //If the BMC occupies the RTC I2C Channel, write back the CPU side is idle
+  // or the subsequent BMC will not preempt
+  Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+  Temp = Temp & (~CPU_GET_I2C_CONTROL);
+  WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp);
+
+  return EFI_NOT_READY;
+}
+
+
+/**
+  Read RTC content through its registers.
+
+  @param  Address   Address offset of RTC data.
+  @param  Size      Size of RTC data to read.
+  @param  Data      The data of UINT8 type read from RTC.
+
+  @return EFI_STATUS
+**/
+EFI_STATUS
+RtcRead (
+  IN  UINT8   Address,
+  IN  UINT8   Size,
+  OUT UINT8   *Data
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = I2CRead (&gRtcDevice, Address, Size, Data);
+  MicroSecondDelay (RTC_DELAY_1000_MACROSECOND);
+  return Status;
+}
+
+/**
+  Write RTC through its registers.
+
+  @param  Address   Address offset of RTC data.
+  @param  Size      Size of RTC data to write.
+  @param  Data      The data of UINT8 type write from RTC.
+
+  @return EFI_STATUS
+**/
+EFI_STATUS
+RtcWrite (
+  IN  UINT8   Address,
+  IN  UINT8   Size,
+  UINT8       *Data
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = I2CWrite (&gRtcDevice, Address, Size, Data);
+  MicroSecondDelay (RTC_DELAY_1000_MACROSECOND);
+  return Status;
+}
+
+VOID
+ReleaseOwnershipOfRtc (
+  VOID
+  )
+{
+  UINT8   Temp;
+
+  Temp = ReadCpldReg (CPLD_I2C_SWITCH_FLAG);
+  Temp = Temp & ~CPU_GET_I2C_CONTROL;
+  WriteCpldReg (CPLD_I2C_SWITCH_FLAG, Temp);
+}
+
+
+EFI_STATUS
+InitializeM41T83 (
+  VOID
+  )
+{
+  EFI_STATUS                Status;
+  RTC_M41T83_ALARM1HOUR     Alarm1Hour;
+  RTC_M41T83_SECOND         Second;
+
+  // Acquire RTC Lock to make access to RTC atomic
+  if (!EfiAtRuntime ()) {
+    EfiAcquireLock (&mRtcLock);
+  }
+
+  Status = I2CInit (gRtcDevice.Socket, gRtcDevice.Port, Normal);
+  MicroSecondDelay (RTC_DELAY_1000_MACROSECOND);
+  if (EFI_ERROR (Status)) {
+    if (!EfiAtRuntime ()) {
+      EfiReleaseLock (&mRtcLock);
+    }
+    return Status;
+  }
+
+  Status = SwitchRtcI2cChannelAndLock ();
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Get i2c preemption failed: %r\n", Status));
+    if (!EfiAtRuntime ()) {
+      EfiReleaseLock (&mRtcLock);
+    }
+    return Status;
+  }
+
+  MicroSecondDelay(RTC_DELAY_1000_MACROSECOND);
+
+  // Set ST at Power up to clear Oscillator fail detection(OF)
+  Status = RtcRead (M41T83_REGADDR_SECONDS, 1, &Second.Uint8);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n",
+      __FUNCTION__, __LINE__, Status));
+  }
+  Second.Bits.ST= 1;
+  Status = RtcWrite (M41T83_REGADDR_SECONDS, 1, &Second.Uint8);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n",
+      __FUNCTION__, __LINE__, Status));
+    goto Exit;
+  }
+  Status = RtcRead (M41T83_REGADDR_SECONDS, 1, &Second.Uint8);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n",
+      __FUNCTION__, __LINE__, Status));
+  }
+  Second.Bits.ST= 0;
+  Status = RtcWrite (M41T83_REGADDR_SECONDS, 1, &Second.Uint8);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n",
+      __FUNCTION__, __LINE__, Status));
+    goto Exit;
+  }
+
+  // Clear HT bit to enanle write to the RTC registers (addresses 0-7)
+  Status = RtcRead (M41T83_REGADDR_ALARM1HOUR, 1, &Alarm1Hour.Uint8);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n",
+      __FUNCTION__, __LINE__, Status));
+  }
+  Alarm1Hour.Bits.HT = 0;
+  Status = RtcWrite (M41T83_REGADDR_ALARM1HOUR, 1, &Alarm1Hour.Uint8);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n",
+      __FUNCTION__, __LINE__, Status));
+    goto Exit;
+  }
+
+Exit:
+  // Release RTC Lock.
+  ReleaseOwnershipOfRtc ();
+  if (!EfiAtRuntime ()) {
+    EfiReleaseLock (&mRtcLock);
+  }
+  return Status;
+}
+
+/**
+  Sets the current local time and date information.
+
+  @param  Time                  A pointer to the current time.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER A time field is out of range.
+  @retval EFI_DEVICE_ERROR      The time could not be set due due to hardware error.
+
+**/
+EFI_STATUS
+EFIAPI
+LibSetTime (
+  IN  EFI_TIME                *Time
+  )
+{
+  EFI_STATUS                  Status = EFI_SUCCESS;
+  RTC_M41T83_TIME             BcdTime;
+  UINT16                      CenturyBase = 2000;
+  UINTN                       LineNum = 0;
+
+  if (NULL == Time) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (!IsTimeValid (Time)) {
+    if (!EfiAtRuntime ()) {
+      DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n",
+        __FUNCTION__, __LINE__, Status));
+      DEBUG ((DEBUG_ERROR, "Now RTC Time is : %04d-%02d-%02d %02d:%02d:%02d\n",
+        Time->Year, Time->Month, Time->Day, Time->Hour, Time->Minute, Time->Second
+      ));
+    }
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = SwitchRtcI2cChannelAndLock ();
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  (VOID)MicroSecondDelay (RTC_DELAY_1000_MACROSECOND);
+
+  SetMem (&BcdTime, sizeof (RTC_M41T83_TIME), 0);
+
+  // Acquire RTC Lock to make access to RTC atomic
+  if (!EfiAtRuntime ()) {
+    EfiAcquireLock (&mRtcLock);
+  }
+
+  BcdTime.Second.Bits.Seconds = DecimalToBcd8 (Time->Second);
+  BcdTime.Minute.Bits.Minutes = DecimalToBcd8 (Time->Minute);
+  BcdTime.Hour.Bits.Hours = DecimalToBcd8 (Time->Hour);
+  BcdTime.Day.Bits.Days = DecimalToBcd8 (Time->Day);
+  BcdTime.Month.Bits.Months = DecimalToBcd8 (Time->Month);
+  BcdTime.Year.Bits.Years = DecimalToBcd8 (Time->Year % 100);
+  BcdTime.Hour.Bits.CB = (Time->Year - CenturyBase) / 100 % 10;
+
+  Status = RtcWrite (M41T83_REGADDR_DOTSECONDS, 1, &BcdTime.DotSecond.Uint8);
+  if (EFI_ERROR (Status)) {
+    LineNum = __LINE__;
+    goto Exit;
+  }
+  Status = RtcWrite (M41T83_REGADDR_SECONDS, 1, &BcdTime.Second.Uint8);
+  if (EFI_ERROR (Status)) {
+    LineNum = __LINE__;
+    goto Exit;
+  }
+  Status = RtcWrite (M41T83_REGADDR_MINUTES, 1, &BcdTime.Minute.Uint8);
+  if (EFI_ERROR (Status)) {
+    LineNum = __LINE__;
+    goto Exit;
+  }
+  Status = RtcWrite (M41T83_REGADDR_HOURS, 1, &BcdTime.Hour.Uint8);
+  if (EFI_ERROR (Status)) {
+    LineNum = __LINE__;
+    goto Exit;
+  }
+  Status = RtcWrite (M41T83_REGADDR_DAY, 1, &BcdTime.Day.Uint8);
+  if (EFI_ERROR (Status)) {
+    LineNum = __LINE__;
+    goto Exit;
+  }
+  Status = RtcWrite (M41T83_REGADDR_MONTH, 1, &BcdTime.Month.Uint8);
+  if (EFI_ERROR (Status)) {
+    LineNum = __LINE__;
+    goto Exit;
+  }
+  Status = RtcWrite (M41T83_REGADDR_YEAR, 1, &BcdTime.Year.Uint8);
+  if (EFI_ERROR (Status)) {
+    LineNum = __LINE__;
+    goto Exit;
+  }
+
+Exit:
+  ReleaseOwnershipOfRtc ();
+  // Release RTC Lock.
+  if (!EfiAtRuntime ()) {
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n",
+        __FUNCTION__, LineNum, Status));
+    }
+    EfiReleaseLock (&mRtcLock);
+  }
+  return Status;
+}
+
+
+/**
+  Returns the current time and date information, and the time-keeping capabilities
+  of the hardware platform.
+
+  @param  Time                   A pointer to storage to receive a snapshot of the current time.
+  @param  Capabilities           An optional pointer to a buffer to receive the real time clock
+                                 device's capabilities.
+
+  @retval EFI_SUCCESS            The operation completed successfully.
+  @retval EFI_INVALID_PARAMETER  Time is NULL.
+  @retval EFI_DEVICE_ERROR       The time could not be retrieved due to hardware error.
+  @retval EFI_SECURITY_VIOLATION The time could not be retrieved due to an authentication failure.
+**/
+EFI_STATUS
+EFIAPI
+LibGetTime (
+  OUT EFI_TIME                *Time,
+  OUT EFI_TIME_CAPABILITIES   *Capabilities
+  )
+{
+  EFI_STATUS                  Status = EFI_SUCCESS;
+  RTC_M41T83_TIME             BcdTime;
+  UINT16                      CenturyBase = 2000;
+  UINTN                       LineNum = 0;
+  BOOLEAN                     IsTimeInvalid = FALSE;
+  UINT8                       TimeTemp[7] = {0};
+
+  // Ensure Time is a valid pointer
+  if (Time == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = SwitchRtcI2cChannelAndLock ();
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  MicroSecondDelay(RTC_DELAY_1000_MACROSECOND);
+
+  SetMem (&BcdTime, sizeof (RTC_M41T83_TIME), 0);
+  SetMem (Time , sizeof (EFI_TIME), 0);
+
+  // Acquire RTC Lock to make access to RTC atomic
+  if (!EfiAtRuntime ()) {
+    EfiAcquireLock (&mRtcLock);
+  }
+
+  Status = RtcRead (M41T83_REGADDR_SECONDS, 7, TimeTemp);
+  if (EFI_ERROR (Status)) {
+    LineNum = __LINE__;
+    goto Exit;
+  }
+
+  BcdTime.Second.Uint8 = TimeTemp[0];  //SECONDS
+  BcdTime.Minute.Uint8 = TimeTemp[1];  //MINUTES
+  BcdTime.Hour.Uint8 = TimeTemp[2];    //HOURS
+  BcdTime.Day.Uint8 = TimeTemp[4];     //DAY
+  BcdTime.Month.Uint8 = TimeTemp[5];   //MONTH
+  BcdTime.Year.Uint8 = TimeTemp[6];    //Year
+
+  Time->Year = BcdToDecimal8 (BcdTime.Year.Bits.Years);
+  Time->Year += CenturyBase + BcdTime.Hour.Bits.CB * 100;
+  Time->Month = BcdToDecimal8 (BcdTime.Month.Bits.Months);
+  Time->Day = BcdToDecimal8 (BcdTime.Day.Bits.Days);
+  Time->Hour = BcdToDecimal8 (BcdTime.Hour.Bits.Hours);
+  Time->Minute = BcdToDecimal8 (BcdTime.Minute.Bits.Minutes);
+  Time->Second = BcdToDecimal8 (BcdTime.Second.Bits.Seconds);
+  Time->TimeZone = EFI_UNSPECIFIED_TIMEZONE;
+
+  if (!IsTimeValid (Time)) {
+      Status = EFI_DEVICE_ERROR;
+      LineNum = __LINE__;
+      IsTimeInvalid = TRUE;
+      goto Exit;
+  }
+
+Exit:
+  ReleaseOwnershipOfRtc ();
+  // Release RTC Lock.
+  if (!EfiAtRuntime ()) {
+    if (EFI_ERROR (Status)) {
+      if (IsTimeInvalid == TRUE) {
+        DEBUG((DEBUG_ERROR, "%a(%d) Time invalid.\r\n",__FUNCTION__, LineNum));
+      } else {
+        DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\n",
+          __FUNCTION__, LineNum, Status));
+      }
+    }
+    EfiReleaseLock (&mRtcLock);
+  }
+  return Status;
+}
+
+
+/**
+  Returns the current wakeup alarm clock setting.
+
+  @param  Enabled               Indicates if the alarm is currently enabled or disabled.
+  @param  Pending               Indicates if the alarm signal is pending and requires acknowledgement.
+  @param  Time                  The current alarm setting.
+
+  @retval EFI_SUCCESS           The alarm settings were returned.
+  @retval EFI_INVALID_PARAMETER Any parameter is NULL.
+  @retval EFI_DEVICE_ERROR      The wakeup time could not be retrieved due to a hardware error.
+
+**/
+EFI_STATUS
+EFIAPI
+LibGetWakeupTime (
+  OUT BOOLEAN     *Enabled,
+  OUT BOOLEAN     *Pending,
+  OUT EFI_TIME    *Time
+  )
+{
+  // Not a required feature
+  return EFI_UNSUPPORTED;
+}
+
+
+/**
+  Sets the system wakeup alarm clock time.
+
+  @param  Enabled               Enable or disable the wakeup alarm.
+  @param  Time                  If Enable is TRUE, the time to set the wakeup alarm for.
+
+  @retval EFI_SUCCESS           If Enable is TRUE, then the wakeup alarm was enabled. If
+                                Enable is FALSE, then the wakeup alarm was disabled.
+  @retval EFI_INVALID_PARAMETER A time field is out of range.
+  @retval EFI_DEVICE_ERROR      The wakeup time could not be set due to a hardware error.
+  @retval EFI_UNSUPPORTED       A wakeup timer is not supported on this platform.
+
+**/
+EFI_STATUS
+EFIAPI
+LibSetWakeupTime (
+  IN  BOOLEAN      Enabled,
+  OUT EFI_TIME     *Time
+  )
+{
+  // Not a required feature
+  return EFI_UNSUPPORTED;
+}
+
+
+/**
+  This is the declaration of an EFI image entry point. This can be the entry point to an application
+  written to this specification, an EFI boot service driver, or an EFI runtime driver.
+
+  @param  ImageHandle           Handle that identifies the loaded image.
+  @param  SystemTable           System Table for this image.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+
+**/
+EFI_STATUS
+EFIAPI
+LibRtcInitialize (
+  IN EFI_HANDLE                            ImageHandle,
+  IN EFI_SYSTEM_TABLE                      *SystemTable
+  )
+{
+  EFI_STATUS    Status = EFI_SUCCESS;
+  EFI_TIME      EfiTime;
+
+  EfiInitializeLock (&mRtcLock, TPL_CALLBACK);
+
+  // Setup the setters and getters
+  gRT->GetTime       = LibGetTime;
+  gRT->SetTime       = LibSetTime;
+  gRT->GetWakeupTime = LibGetWakeupTime;
+  gRT->SetWakeupTime = LibSetWakeupTime;
+
+  Status = InitializeM41T83 ();
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Status : %r\nRTC M41T83 Init Failed !!!\n",
+            __FUNCTION__, __LINE__, Status));
+    /*
+     * Returning ERROR on failure of RTC initilization will cause the system to hang up.
+     * So we add some debug message to indecate the RTC initilization failed,
+     * and continue without returning with error to avoid system hanging up.
+     *
+     *return Status;
+     */
+  }
+
+  LibGetTime (&EfiTime, NULL);
+  if (!IsTimeValid (&EfiTime)) {
+    EfiTime.Year    = 2015;
+    EfiTime.Month   = 1;
+    EfiTime.Day     = 1;
+    EfiTime.Hour    = 0;
+    EfiTime.Minute  = 0;
+    EfiTime.Second  = 0;
+    Status = LibSetTime (&EfiTime);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "[%a]:[%dL] RTC settime Status : %r\n",
+        __FUNCTION__, __LINE__, Status));
+    }
+  }
+
+  DEBUG ((
+    DEBUG_ERROR, "Now RTC Time is : %04d-%02d-%02d %02d:%02d:%02d\n",
+    EfiTime.Year, EfiTime.Month, EfiTime.Day, EfiTime.Hour, EfiTime.Minute,
+    EfiTime.Second
+    ));
+    /*
+     * Returning ERROR on failure of RTC initilization will cause the system to hang up.
+     * So we add some debug message to indecate the RTC initilization failed,
+     * and return success to avoid system hanging up.
+     */
+  return EFI_SUCCESS;
+}
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 12/43] Platform/Hisilicon/D06: Add edk2-non-osi components for D06
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (10 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 11/43] Platform/Hisilicon/D06: Add M41T83RealTimeClockLib Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22  9:49   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 13/43] Hisilicon/D06: Add OemMiscLibD06 Ming Huang
                   ` (31 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Add PcdCoreCount to fix build issue while add binary components.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                                 |  7 +++++++
 Platform/Hisilicon/D06/D06.fdf                                                 | 17 +++++++++++++++++
 Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf |  2 ++
 3 files changed, 26 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 27358f8c78..94454569f6 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -41,6 +41,8 @@
 
   I2CLib|Silicon/Hisilicon/Library/I2CLib/I2CLib.inf
   TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
+  IpmiCmdLib|Silicon/Hisilicon/Library/IpmiCmdLib/IpmiCmdLib.inf
+
   NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
   DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
   HiiLib|MdeModulePkg/Library/UefiHiiLib/UefiHiiLib.inf
@@ -64,8 +66,12 @@
 
   CpldIoLib|Silicon/Hisilicon/Library/CpldIoLib/CpldIoLib.inf
 
+  SerdesLib|Silicon/Hisilicon/Hi1620/Library/Hi1620Serdes/Hi1620SerdesLib.inf
+
   TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf
   RealTimeClockLib|Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
+  OemAddressMapLib|Platform/Hisilicon/D06/Library/OemAddressMapD06/OemAddressMapD06.inf
+  PlatformSysCtrlLib|Silicon/Hisilicon/Hi1620/Library/PlatformSysCtrlLibHi1620/PlatformSysCtrlLibHi1620.inf
 
   CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
   GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
@@ -81,6 +87,7 @@
   # USB Requirements
   UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
 
+  LpcLib|Silicon/Hisilicon/Hi1620/Library/LpcLibHi1620/LpcLib.inf
   SerialPortLib|ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf
 !if $(SECURE_BOOT_ENABLE) == TRUE
   FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
index 9567ede0ad..07fe096f61 100644
--- a/Platform/Hisilicon/D06/D06.fdf
+++ b/Platform/Hisilicon/D06/D06.fdf
@@ -56,6 +56,7 @@ NumBlocks     = 0x40
 
 0x00000000|0x00100000
 gArmTokenSpaceGuid.PcdSecureFvBaseAddress|gArmTokenSpaceGuid.PcdSecureFvSize
+FILE = Platform/Hisilicon/D06/Sec/FVMAIN_SEC.Fv
 
 0x00100000|0x00280000
 gArmTokenSpaceGuid.PcdFvBaseAddress|gArmTokenSpaceGuid.PcdFvSize
@@ -163,6 +164,7 @@ READ_LOCK_STATUS   = TRUE
   INF MdeModulePkg/Core/Dxe/DxeMain.inf
   INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
 
+  INF Platform/Hisilicon/D06/Drivers/IoInitDxe/IoInitDxe.inf
   #
   # PI DXE Drivers producing Architectural Protocols (EFI Services)
   #
@@ -170,6 +172,7 @@ READ_LOCK_STATUS   = TRUE
   INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
 
   INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
+  INF Platform/Hisilicon/D06/Drivers/SFC/SfcDxeDriver.inf
 
 
   INF Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf
@@ -225,10 +228,15 @@ READ_LOCK_STATUS   = TRUE
   INF MdeModulePkg/Bus/Usb/UsbMouseDxe/UsbMouseDxe.inf
   INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf
 
+  INF Platform/Hisilicon/D06/Drivers/Ipmi/IpmiInterfaceDxe/IpmiInterfaceDxe.inf
+  INF Platform/Hisilicon/D06/Drivers/GetInfoFromBmc/GetInfoFromBmc.inf
   INF MdeModulePkg/Universal/SmbiosDxe/SmbiosDxe.inf
   INF Silicon/Hisilicon/Drivers/Smbios/SmbiosMiscDxe/SmbiosMiscDxe.inf
   INF Silicon/Hisilicon/Drivers/Smbios/AddSmbiosType9/AddSmbiosType9.inf
+  INF Platform/Hisilicon/D06/Drivers/TransferSmbiosInfo/TransSmbiosInfo.inf
+  INF Platform/Hisilicon/D06/Drivers/IpmiMiscOpDxe/IpmiMiscOpDxe.inf
 
+  INF Platform/Hisilicon/D06/Drivers/IpmiWatchdogDxe/IpmiWatchdogDxe.inf
 
 
   INF Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClassDxe.inf
@@ -246,6 +254,7 @@ READ_LOCK_STATUS   = TRUE
   #
   #Network
   #
+  INF Platform/Hisilicon/D06/Drivers/Net/SnpHi1620NewDxe/SnpDxe.inf
 
   INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
   INF MdeModulePkg/Universal/Network/ArpDxe/ArpDxe.inf
@@ -282,8 +291,14 @@ READ_LOCK_STATUS   = TRUE
   INF ArmPkg/Drivers/ArmPciCpuIo2Dxe/ArmPciCpuIo2Dxe.inf
   INF MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciHostBridgeDxe.inf
   INF MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
+  INF Platform/Hisilicon/D06/Drivers/PcieRasInitDxe/PcieRasInitDxe.inf
+  INF Platform/Hisilicon/D06/Drivers/RasInitDxe/RasInitDxe.inf
 
+  # VGA Driver
+  #
+  INF Platform/Hisilicon/D06/Drivers/Sm750Dxe/UefiSmi.inf
   INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf
+  INF Platform/Hisilicon/D06/Drivers/Sas/SasDxeDriver.inf
   INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
   INF MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
   INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
@@ -335,6 +350,8 @@ READ_LOCK_STATUS   = TRUE
 
   INF Silicon/Hisilicon/Drivers/VersionInfoPeim/VersionInfoPeim.inf
 
+  INF Platform/Hisilicon/D06/Drivers/Ipmi/IpmiInterfacePei/IpmiInterfacePei.inf
+  INF Platform/Hisilicon/D06/MemoryInitPei/MemoryInitPeim.inf
   INF ArmPkg/Drivers/CpuPei/CpuPei.inf
   INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
   INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
diff --git a/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf b/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
index 2275586ff3..a47806f391 100644
--- a/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
+++ b/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
@@ -28,6 +28,7 @@
 
 [Packages]
   ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
   IntelFrameworkPkg/IntelFrameworkPkg.dec
@@ -52,6 +53,7 @@
   gEfiSmbiosProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
 
 [Pcd]
+  gArmPlatformTokenSpaceGuid.PcdCoreCount
   gHisiTokenSpaceGuid.PcdCPUInfo
   gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz
 
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 13/43] Hisilicon/D06: Add OemMiscLibD06
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (11 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 12/43] Platform/Hisilicon/D06: Add edk2-non-osi components for D06 Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 10:17   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 14/43] Silicon/Hisilicon/D06: Wait for all disk ready Ming Huang
                   ` (30 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

This library include BoardFeatureD06.c and OemMiscLibD06.c c file,
use for several modules like PciHostBridgeLib and Smbios.
Enlarge macro PCIEDEVICE_REPORT_MAX for D06.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                          |   1 +
 Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf          |  47 +++
 Silicon/Hisilicon/Include/Library/OemMiscLib.h                          |   6 +-
 Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06.c          | 432 ++++++++++++++++++++
 Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c            | 132 ++++++
 Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni |  64 +++
 6 files changed, 681 insertions(+), 1 deletion(-)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 94454569f6..9ca7160dad 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -70,6 +70,7 @@
 
   TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf
   RealTimeClockLib|Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
+  OemMiscLib|Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
   OemAddressMapLib|Platform/Hisilicon/D06/Library/OemAddressMapD06/OemAddressMapD06.inf
   PlatformSysCtrlLib|Silicon/Hisilicon/Hi1620/Library/PlatformSysCtrlLibHi1620/PlatformSysCtrlLibHi1620.inf
 
diff --git a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
new file mode 100644
index 0000000000..8f68f7cec5
--- /dev/null
+++ b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
@@ -0,0 +1,47 @@
+#/** @file
+#
+#    Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+#    Copyright (c) 2018, Linaro Limited. All rights reserved.
+#
+#    This program and the accompanying materials
+#    are licensed and made available under the terms and conditions of the BSD License
+#    which accompanies this distribution. The full text of the license may be found at
+#    http://opensource.org/licenses/bsd-license.php
+#
+#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = OemMiscLib
+  FILE_GUID                      = 3002911C-C160-4C46-93BB-782846673EEA
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = OemMiscLib
+
+[Sources.common]
+  BoardFeatureD06.c
+  BoardFeatureD06Strings.uni
+  OemMiscLibD06.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[LibraryClasses]
+  PcdLib
+  SerdesLib
+  TimerLib
+
+[Ppis]
+  gEfiPeiReadOnlyVariable2PpiGuid   ## SOMETIMES_CONSUMES
+
+[Pcd]
+  gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz
+  gHisiTokenSpaceGuid.PcdIsMPBoot
+  gHisiTokenSpaceGuid.PcdSocketMask
+  gHisiTokenSpaceGuid.PcdTrustedFirmwareEnable
diff --git a/Silicon/Hisilicon/Include/Library/OemMiscLib.h b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
index 87cb498dd7..efecb9aa77 100644
--- a/Silicon/Hisilicon/Include/Library/OemMiscLib.h
+++ b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
@@ -22,7 +22,11 @@
 #include <PlatformArch.h>
 #include <Library/I2CLib.h>
 
-#define PCIEDEVICE_REPORT_MAX      4
+#define PCIEDEVICE_REPORT_MAX      8
+#define MAX_PROCESSOR_SOCKETS      MAX_SOCKET
+#define MAX_MEMORY_CHANNELS        MAX_CHANNEL
+#define MAX_DIMM_PER_CHANNEL       MAX_DIMM
+
 typedef struct _REPORT_PCIEDIDVID2BMC{
     UINTN   Bus;
     UINTN   Device;
diff --git a/Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06.c b/Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06.c
new file mode 100644
index 0000000000..7e3f2e2a0e
--- /dev/null
+++ b/Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06.c
@@ -0,0 +1,432 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Uefi.h>
+#include <IndustryStandard/SmBios.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/HiiLib.h>
+#include <Library/I2CLib.h>
+#include <Library/IoLib.h>
+#include <Library/OemMiscLib.h>
+#include <Library/SerdesLib.h>
+#include <Protocol/Smbios.h>
+
+#include <PlatformArch.h>
+
+I2C_DEVICE gRtcDevice = {
+  .Socket = 0,
+  .Port = 5,
+  .DeviceType = DEVICE_TYPE_SPD,
+  .SlaveDeviceAddress = 0x68
+};
+
+SERDES_POLARITY_INVERT gSerdesPolarityTxDesc[] =
+{
+  {SERDES_INVALID_MACRO_ID, SERDES_INVALID_LANE_NUM}
+};
+
+SERDES_POLARITY_INVERT gSerdesPolarityRxDesc[] =
+{
+  {SERDES_INVALID_MACRO_ID, SERDES_INVALID_LANE_NUM}
+};
+
+SERDES_PARAM gSerdesParamNA = {
+  .Hilink0Mode = EmHilink0Hccs1X8Width16,
+  .Hilink1Mode = EmHilink1Hccs0X8Width16,
+  .Hilink2Mode = EmHilink2Pcie2X8,
+  .Hilink3Mode = 0x0,
+  .Hilink4Mode = 0xF,
+  .Hilink5Mode = EmHilink5Sas1X4,
+  .Hilink6Mode = 0x0,
+  .UseSsc      = 0,
+};
+
+SERDES_PARAM gSerdesParamNB = {
+  .Hilink0Mode = EmHilink0Pcie1X8,
+  .Hilink1Mode = EmHilink1Pcie0X8,
+  .Hilink2Mode = EmHilink2Sas0X8,
+  .Hilink3Mode = 0x0,
+  .Hilink4Mode = 0xF,
+  .Hilink5Mode = EmHilink5Pcie2X2Pcie3X2,
+  .Hilink6Mode = 0xF,
+  .UseSsc      = 0,
+};
+
+SERDES_PARAM gSerdesParamS1NA = {
+  .Hilink0Mode = EmHilink0Hccs1X8Width16,
+  .Hilink1Mode = EmHilink1Hccs0X8Width16,
+  .Hilink2Mode = EmHilink2Pcie2X8,
+  .Hilink3Mode = 0x0,
+  .Hilink4Mode = 0xF,
+  .Hilink5Mode = EmHilink5Sas1X4,
+  .Hilink6Mode = 0x0,
+  .UseSsc      = 0,
+};
+
+SERDES_PARAM gSerdesParamS1NB = {
+  .Hilink0Mode = EmHilink0Pcie1X8,
+  .Hilink1Mode = EmHilink1Pcie0X8,
+  .Hilink2Mode = EmHilink2Sas0X8,
+  .Hilink3Mode = 0x0,
+  .Hilink4Mode = 0xF,
+  .Hilink5Mode = EmHilink5Pcie2X2Pcie3X2,
+  .Hilink6Mode = 0xF,
+  .UseSsc      = 0,
+};
+
+
+EFI_STATUS
+OemGetSerdesParam (
+  OUT SERDES_PARAM *ParamA,
+  OUT SERDES_PARAM *ParamB,
+  IN  UINT32       SocketId
+ )
+{
+  if (NULL == ParamA) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Param == NULL!\n", __FUNCTION__, __LINE__));
+    return EFI_INVALID_PARAMETER;
+  } if (NULL == ParamB) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Param == NULL!\n", __FUNCTION__, __LINE__));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (0 == SocketId) {
+    (VOID) CopyMem (ParamA, &gSerdesParamNA, sizeof (*ParamA));
+    (VOID) CopyMem (ParamB, &gSerdesParamNB, sizeof (*ParamB));
+  } else {
+    (VOID) CopyMem (ParamA, &gSerdesParamS1NA, sizeof (*ParamA));
+    (VOID) CopyMem (ParamB, &gSerdesParamS1NB, sizeof (*ParamB));
+  }
+
+  return EFI_SUCCESS;
+}
+
+VOID
+OemPcieResetAndOffReset (
+  VOID
+  )
+{
+  return;
+}
+
+SMBIOS_TABLE_TYPE9 gPcieSlotInfo[] = {
+  // PCIe0 Slot 1
+  {
+    {                                       // Hdr
+        EFI_SMBIOS_TYPE_SYSTEM_SLOTS,       // Type,
+        0,                                  // Length,
+        0                                   // Handle
+    },
+    1,                                      // SlotDesignation
+    SlotTypePciExpressX16,                  // SlotType
+    SlotDataBusWidth16X,                    // SlotDataBusWidth
+    SlotUsageAvailable,                     // SlotUsage
+    SlotLengthOther,                        // SlotLength
+    0x0001,                                 // SlotId
+    {                                       // SlotCharacteristics1
+        0,                                  // CharacteristicsUnknown  :1;
+        0,                                  // Provides50Volts         :1;
+        0,                                  // Provides33Volts         :1;
+        0,                                  // SharedSlot              :1;
+        0,                                  // PcCard16Supported       :1;
+        0,                                  // CardBusSupported        :1;
+        0,                                  // ZoomVideoSupported      :1;
+        0                                   // ModemRingResumeSupported:1;
+    },
+    {                                       // SlotCharacteristics2
+        0,                                  // PmeSignalSupported      :1;
+        0,                                  // HotPlugDevicesSupported :1;
+        0,                                  // SmbusSignalSupported    :1;
+        0                                   // Reserved                :5;
+    },
+    0x00,                                   // SegmentGroupNum
+    0x00,                                   // BusNum
+    0                                       // DevFuncNum
+  },
+  {
+      {                                       // Hdr
+          EFI_SMBIOS_TYPE_SYSTEM_SLOTS,       // Type,
+          0,                                  // Length,
+          0                                   // Handle
+      },
+      1,                                      // SlotDesignation
+      SlotTypePciExpressX8,                   // SlotType
+      SlotDataBusWidth8X,                     // SlotDataBusWidth
+      SlotUsageAvailable,                     // SlotUsage
+      SlotLengthOther,                        // SlotLength
+      0x0002,                                 // SlotId
+      {                                       // SlotCharacteristics1
+          0,                                  // CharacteristicsUnknown  :1;
+          0,                                  // Provides50Volts         :1;
+          0,                                  // Provides33Volts         :1;
+          0,                                  // SharedSlot              :1;
+          0,                                  // PcCard16Supported       :1;
+          0,                                  // CardBusSupported        :1;
+          0,                                  // ZoomVideoSupported      :1;
+          0                                   // ModemRingResumeSupported:1;
+      },
+      {                                       // SlotCharacteristics2
+          0,                                  // PmeSignalSupported      :1;
+          0,                                  // HotPlugDevicesSupported :1;
+          0,                                  // SmbusSignalSupported    :1;
+          0                                   // Reserved                :5;
+      },
+      0x00,                                   // SegmentGroupNum
+      0x00,                                   // BusNum
+      0                                       // DevFuncNum
+  },
+  {
+      {                                       // Hdr
+          EFI_SMBIOS_TYPE_SYSTEM_SLOTS,       // Type,
+          0,                                  // Length,
+          0                                   // Handle
+      },
+      1,                                      // SlotDesignation
+      SlotTypePciExpressX8,                   // SlotType
+      SlotDataBusWidth8X,                     // SlotDataBusWidth
+      SlotUsageAvailable,                     // SlotUsage
+      SlotLengthOther,                        // SlotLength
+      0x0003,                                 // SlotId
+      {                                       // SlotCharacteristics1
+          0,                                  // CharacteristicsUnknown  :1;
+          0,                                  // Provides50Volts         :1;
+          0,                                  // Provides33Volts         :1;
+          0,                                  // SharedSlot              :1;
+          0,                                  // PcCard16Supported       :1;
+          0,                                  // CardBusSupported        :1;
+          0,                                  // ZoomVideoSupported      :1;
+          0                                   // ModemRingResumeSupported:1;
+      },
+      {                                       // SlotCharacteristics2
+          0,                                  // PmeSignalSupported      :1;
+          0,                                  // HotPlugDevicesSupported :1;
+          0,                                  // SmbusSignalSupported    :1;
+          0                                   // Reserved                :5;
+      },
+      0x00,                                   // SegmentGroupNum
+      0x00,                                   // BusNum
+      0                                       // DevFuncNum
+  },
+
+
+  {
+      {                                       // Hdr
+          EFI_SMBIOS_TYPE_SYSTEM_SLOTS,       // Type,
+          0,                                  // Length,
+          0                                   // Handle
+      },
+      1,                                      // SlotDesignation
+      SlotTypePciExpressX8,                   // SlotType
+      SlotDataBusWidth8X,                     // SlotDataBusWidth
+      SlotUsageAvailable,                     // SlotUsage
+      SlotLengthOther,                        // SlotLength
+      0x0004,                                 // SlotId
+      {                                       // SlotCharacteristics1
+          0,                                  // CharacteristicsUnknown  :1;
+          0,                                  // Provides50Volts         :1;
+          0,                                  // Provides33Volts         :1;
+          0,                                  // SharedSlot              :1;
+          0,                                  // PcCard16Supported       :1;
+          0,                                  // CardBusSupported        :1;
+          0,                                  // ZoomVideoSupported      :1;
+          0                                   // ModemRingResumeSupported:1;
+      },
+      {                                       // SlotCharacteristics2
+          0,                                  // PmeSignalSupported      :1;
+          0,                                  // HotPlugDevicesSupported :1;
+          0,                                  // SmbusSignalSupported    :1;
+          0                                   // Reserved                :5;
+      },
+      0x00,                                   // SegmentGroupNum
+      0x00,                                   // BusNum
+      0                                       // DevFuncNum
+  },
+
+  {
+      {                                       // Hdr
+          EFI_SMBIOS_TYPE_SYSTEM_SLOTS,       // Type,
+          0,                                  // Length,
+          0                                   // Handle
+      },
+      1,                                      // SlotDesignation
+      SlotTypePciExpressX16,                  // SlotType
+      SlotDataBusWidth16X,                    // SlotDataBusWidth
+      SlotUsageAvailable,                     // SlotUsage
+      SlotLengthOther,                        // SlotLength
+      0x0005,                                 // SlotId
+      {                                       // SlotCharacteristics1
+          0,                                  // CharacteristicsUnknown  :1;
+          0,                                  // Provides50Volts         :1;
+          0,                                  // Provides33Volts         :1;
+          0,                                  // SharedSlot              :1;
+          0,                                  // PcCard16Supported       :1;
+          0,                                  // CardBusSupported        :1;
+          0,                                  // ZoomVideoSupported      :1;
+          0                                   // ModemRingResumeSupported:1;
+      },
+      {                                       // SlotCharacteristics2
+          0,                                  // PmeSignalSupported      :1;
+          0,                                  // HotPlugDevicesSupported :1;
+          0,                                  // SmbusSignalSupported    :1;
+          0                                   // Reserved                :5;
+      },
+      0x00,                                   // SegmentGroupNum
+      0x00,                                   // BusNum
+      0                                       // DevFuncNum
+  },
+  {
+      {                                       // Hdr
+          EFI_SMBIOS_TYPE_SYSTEM_SLOTS,       // Type,
+          0,                                  // Length,
+          0                                   // Handle
+      },
+      1,                                      // SlotDesignation
+      SlotTypePciExpressX8,                   // SlotType
+      SlotDataBusWidth8X,                     // SlotDataBusWidth
+      SlotUsageAvailable,                     // SlotUsage
+      SlotLengthOther,                        // SlotLength
+      0x0006,                                 // SlotId
+      {                                       // SlotCharacteristics1
+          0,                                  // CharacteristicsUnknown  :1;
+          0,                                  // Provides50Volts         :1;
+          0,                                  // Provides33Volts         :1;
+          0,                                  // SharedSlot              :1;
+          0,                                  // PcCard16Supported       :1;
+          0,                                  // CardBusSupported        :1;
+          0,                                  // ZoomVideoSupported      :1;
+          0                                   // ModemRingResumeSupported:1;
+      },
+      {                                       // SlotCharacteristics2
+          0,                                  // PmeSignalSupported      :1;
+          0,                                  // HotPlugDevicesSupported :1;
+          0,                                  // SmbusSignalSupported    :1;
+          0                                   // Reserved                :5;
+      },
+      0x00,                                   // SegmentGroupNum
+      0x00,                                   // BusNum
+      0                                       // DevFuncNum
+  },
+  {
+      {                                       // Hdr
+          EFI_SMBIOS_TYPE_SYSTEM_SLOTS,       // Type,
+          0,                                  // Length,
+          0                                   // Handle
+      },
+      1,                                      // SlotDesignation
+      SlotTypePciExpressX8,                   // SlotType
+      SlotDataBusWidth8X,                     // SlotDataBusWidth
+      SlotUsageAvailable,                     // SlotUsage
+      SlotLengthOther,                        // SlotLength
+      0x0007,                                 // SlotId
+      {                                       // SlotCharacteristics1
+          0,                                  // CharacteristicsUnknown  :1;
+          0,                                  // Provides50Volts         :1;
+          0,                                  // Provides33Volts         :1;
+          0,                                  // SharedSlot              :1;
+          0,                                  // PcCard16Supported       :1;
+          0,                                  // CardBusSupported        :1;
+          0,                                  // ZoomVideoSupported      :1;
+          0                                   // ModemRingResumeSupported:1;
+      },
+      {                                       // SlotCharacteristics2
+          0,                                  // PmeSignalSupported      :1;
+          0,                                  // HotPlugDevicesSupported :1;
+          0,                                  // SmbusSignalSupported    :1;
+          0                                   // Reserved                :5;
+      },
+      0x00,                                   // SegmentGroupNum
+      0x00,                                   // BusNum
+      0                                       // DevFuncNum
+  },
+  {
+      {                                       // Hdr
+          EFI_SMBIOS_TYPE_SYSTEM_SLOTS,       // Type,
+          0,                                  // Length,
+          0                                   // Handle
+      },
+      1,                                      // SlotDesignation
+      SlotTypePciExpressX8,                   // SlotType
+      SlotDataBusWidth8X,                     // SlotDataBusWidth
+      SlotUsageAvailable,                     // SlotUsage
+      SlotLengthOther,                        // SlotLength
+      0x0008,                                 // SlotId
+      {                                       // SlotCharacteristics1
+          0,                                  // CharacteristicsUnknown  :1;
+          0,                                  // Provides50Volts         :1;
+          0,                                  // Provides33Volts         :1;
+          0,                                  // SharedSlot              :1;
+          0,                                  // PcCard16Supported       :1;
+          0,                                  // CardBusSupported        :1;
+          0,                                  // ZoomVideoSupported      :1;
+          0                                   // ModemRingResumeSupported:1;
+      },
+      {                                       // SlotCharacteristics2
+          0,                                  // PmeSignalSupported      :1;
+          0,                                  // HotPlugDevicesSupported :1;
+          0,                                  // SmbusSignalSupported    :1;
+          0                                   // Reserved                :5;
+      },
+      0x00,                                   // SegmentGroupNum
+      0x00,                                   // BusNum
+      0                                       // DevFuncNum
+  },
+
+  };
+
+UINT8
+OemGetPcieSlotNumber (
+  VOID
+  )
+{
+  return sizeof (gPcieSlotInfo) / sizeof (SMBIOS_TABLE_TYPE9);
+}
+
+EFI_STRING_ID gDimmToDevLocator[MAX_SOCKET][MAX_CHANNEL][MAX_DIMM] = {
+  {{STRING_TOKEN(STR_LEMON_C10_DIMM_000), STRING_TOKEN(STR_LEMON_C10_DIMM_001)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_010), STRING_TOKEN(STR_LEMON_C10_DIMM_011)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_020), STRING_TOKEN(STR_LEMON_C10_DIMM_021)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_030), STRING_TOKEN(STR_LEMON_C10_DIMM_031)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_040), STRING_TOKEN(STR_LEMON_C10_DIMM_041)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_050), STRING_TOKEN(STR_LEMON_C10_DIMM_051)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_060), STRING_TOKEN(STR_LEMON_C10_DIMM_061)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_070), STRING_TOKEN(STR_LEMON_C10_DIMM_071)}},
+
+  {{STRING_TOKEN(STR_LEMON_C10_DIMM_100), STRING_TOKEN(STR_LEMON_C10_DIMM_101)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_110), STRING_TOKEN(STR_LEMON_C10_DIMM_111)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_120), STRING_TOKEN(STR_LEMON_C10_DIMM_121)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_130), STRING_TOKEN(STR_LEMON_C10_DIMM_131)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_140), STRING_TOKEN(STR_LEMON_C10_DIMM_141)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_150), STRING_TOKEN(STR_LEMON_C10_DIMM_151)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_160), STRING_TOKEN(STR_LEMON_C10_DIMM_161)},
+   {STRING_TOKEN(STR_LEMON_C10_DIMM_170), STRING_TOKEN(STR_LEMON_C10_DIMM_171)}}
+};
+
+EFI_HII_HANDLE
+EFIAPI
+OemGetPackages (
+  VOID
+  )
+{
+  return HiiAddPackages (
+           &gEfiCallerIdGuid,
+           NULL,
+           OemMiscLibStrings,
+           NULL,
+           NULL
+           );
+}
+
+
diff --git a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
new file mode 100644
index 0000000000..2cd360d49f
--- /dev/null
+++ b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
@@ -0,0 +1,132 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Uefi.h>
+#include <PlatformArch.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/LpcLib.h>
+#include <Library/OemAddressMapLib.h>
+#include <Library/OemMiscLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PlatformSysCtrlLib.h>
+#include <Library/SerdesLib.h>
+#include <Library/SerialPortLib.h>
+#include <Library/TimerLib.h>
+
+REPORT_PCIEDIDVID2BMC PcieDeviceToReport[PCIEDEVICE_REPORT_MAX] = {
+  {67,0,0,0},
+  {225,0,0,3},
+  {0xFFFF,0xFFFF,0xFFFF,0xFFFF},
+  {0xFFFF,0xFFFF,0xFFFF,0xFFFF}
+};
+
+// Right now we only support 1P
+BOOLEAN
+OemIsSocketPresent (
+  UINTN Socket
+  )
+{
+  UINT32 SocketMask = PcdGet32 (PcdSocketMask);
+  return (BOOLEAN)((SocketMask & (1 << Socket)) ? TRUE : FALSE);
+}
+
+
+UINTN
+OemGetSocketNumber (
+  VOID
+  )
+{
+  if(!OemIsMpBoot ()) {
+    return 1;
+  }
+
+  return MAX_PROCESSOR_SOCKETS;
+}
+
+
+UINTN
+OemGetDdrChannel (
+  VOID
+  )
+{
+  return MAX_MEMORY_CHANNELS;
+}
+
+
+UINTN
+OemGetDimmSlot (
+  UINTN Socket,
+  UINTN Channel
+  )
+{
+  return MAX_DIMM_PER_CHANNEL;
+}
+
+
+VOID
+CoreSelectBoot (
+  VOID
+  )
+{
+  if (!PcdGet64 (PcdTrustedFirmwareEnable))
+  {
+    StartupAp ();
+  }
+
+  return;
+}
+
+BOOLEAN
+OemIsMpBoot (
+  VOID
+  )
+{
+  return PcdGet32 (PcdIsMPBoot);
+}
+
+VOID
+OemLpcInit (
+  VOID
+  )
+{
+  LpcInit ();
+  return;
+}
+
+UINT32
+OemIsWarmBoot (
+  VOID
+  )
+{
+  return 0;
+}
+
+VOID
+OemBiosSwitch (
+  UINT32 Master
+  )
+{
+  (VOID)Master;
+  return;
+}
+
+BOOLEAN
+OemIsNeedDisableExpanderBuffer (
+  VOID
+  )
+{
+  return TRUE;
+}
diff --git a/Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni b/Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni
new file mode 100644
index 0000000000..046fa05dff
--- /dev/null
+++ b/Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni
@@ -0,0 +1,64 @@
+// *++
+//
+// Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+//
+// This program and the accompanying materials
+// are licensed and made available under the terms and conditions of the BSD License
+// which accompanies this distribution.  The full text of the license may be found at
+// http://opensource.org/licenses/bsd-license.php
+//
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+// --*/
+
+/=#
+
+#langdef en-US "English"
+
+//
+// Begin English Language Strings
+//
+#string STR_MEMORY_SUBCLASS_UNKNOWN    #language en-US  "Unknown"
+
+//
+// DIMM Device Locator strings
+
+// D06
+#string STR_LEMON_C10_DIMM_000     #language en-US "J5"
+#string STR_LEMON_C10_DIMM_001     #language en-US "J6"
+#string STR_LEMON_C10_DIMM_010     #language en-US "J7"
+#string STR_LEMON_C10_DIMM_011     #language en-US "J8"
+#string STR_LEMON_C10_DIMM_020     #language en-US "J9"
+#string STR_LEMON_C10_DIMM_021     #language en-US "J10"
+#string STR_LEMON_C10_DIMM_030     #language en-US "J11"
+#string STR_LEMON_C10_DIMM_031     #language en-US "J12"
+#string STR_LEMON_C10_DIMM_040     #language en-US "J13"
+#string STR_LEMON_C10_DIMM_041     #language en-US "J14"
+#string STR_LEMON_C10_DIMM_050     #language en-US "J15"
+#string STR_LEMON_C10_DIMM_051     #language en-US "J16"
+#string STR_LEMON_C10_DIMM_060     #language en-US "J17"
+#string STR_LEMON_C10_DIMM_061     #language en-US "J18"
+#string STR_LEMON_C10_DIMM_070     #language en-US "J19"
+#string STR_LEMON_C10_DIMM_071     #language en-US "J20"
+#string STR_LEMON_C10_DIMM_100     #language en-US "J21"
+#string STR_LEMON_C10_DIMM_101     #language en-US "J22"
+#string STR_LEMON_C10_DIMM_110     #language en-US "J23"
+#string STR_LEMON_C10_DIMM_111     #language en-US "J24"
+#string STR_LEMON_C10_DIMM_120     #language en-US "J25"
+#string STR_LEMON_C10_DIMM_121     #language en-US "J26"
+#string STR_LEMON_C10_DIMM_130     #language en-US "J27"
+#string STR_LEMON_C10_DIMM_131     #language en-US "J28"
+#string STR_LEMON_C10_DIMM_140     #language en-US "J29"
+#string STR_LEMON_C10_DIMM_141     #language en-US "J30"
+#string STR_LEMON_C10_DIMM_150     #language en-US "J31"
+#string STR_LEMON_C10_DIMM_151     #language en-US "J32"
+#string STR_LEMON_C10_DIMM_160     #language en-US "J33"
+#string STR_LEMON_C10_DIMM_161     #language en-US "J34"
+#string STR_LEMON_C10_DIMM_170     #language en-US "J35"
+#string STR_LEMON_C10_DIMM_171     #language en-US "J36"
+
+//
+// End English Language Strings
+//
+
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 14/43] Silicon/Hisilicon/D06: Wait for all disk ready
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (12 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 13/43] Hisilicon/D06: Add OemMiscLibD06 Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 15/43] Silicon/Hisilicon/Acpi: Unify HisiAcipPlatformDxe Ming Huang
                   ` (29 subsequent siblings)
  43 siblings, 0 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

This patch is relative to D06 SasDxe driver. The SasDxe set a
variable to notice this libray. Here Wait for all disk ready
for 15S at most.

D06:
For using straight-through hard disk backboard, some disk need
15 seconds to ready. Actually, wait less 15 seconds here(minus
the time from end of SAS driver to here).
For using expander backboard, wait less 6 seconds here(minus
the time from end of SAS driver to here).

D03/D05:
As Sas driver don't write the SASDiskInfo variable, D03/D05 will
break the loop, so it no waiting here.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/HisiPkg.dec                                               |  1 +
 Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf |  2 +
 Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c               | 43 ++++++++++++++++++++
 3 files changed, 46 insertions(+)

diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec
index 35bea970ec..b56a6a6af7 100644
--- a/Silicon/Hisilicon/HisiPkg.dec
+++ b/Silicon/Hisilicon/HisiPkg.dec
@@ -45,6 +45,7 @@
 
   gHisiEfiMemoryMapGuid  = {0xf8870015, 0x6994, 0x4b98, {0x95, 0xa2, 0xbd, 0x56, 0xda, 0x91, 0xc0, 0x7f}}
   gVersionInfoHobGuid = {0xe13a14c, 0x859c, 0x4f22, {0x82, 0xbd, 0x18, 0xe, 0xe1, 0x42, 0x12, 0xbf}}
+  gHisiOemVariableGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}
   gOemBootVariableGuid = {0xb7784577, 0x5aaf, 0x4557, {0xa1, 0x99, 0xd4, 0xa4, 0x2f, 0x45, 0x06, 0xf8}}
   gEfiHisiSocControllerGuid = {0xee369cc3, 0xa743, 0x5382, {0x75, 0x64, 0x53, 0xe4, 0x31, 0x19, 0x38, 0x35}}
 
diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
index 7a53befc44..a093f13fb0 100644
--- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
@@ -49,6 +49,7 @@
   MemoryAllocationLib
   PcdLib
   PrintLib
+  TimerLib
   UefiBootManagerLib
   UefiBootServicesTableLib
   UefiLib
@@ -67,6 +68,7 @@
 [Guids]
   gEfiEndOfDxeEventGroupGuid
   gEfiTtyTermGuid
+  gHisiOemVariableGuid
 
 [Protocols]
   gEfiGenericMemTestProtocolGuid
diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
index 7dd5ba615c..d5f6d78fa4 100644
--- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
+++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
@@ -20,6 +20,7 @@
 #include <Library/BmcConfigBootLib.h>
 #include <Library/DevicePathLib.h>
 #include <Library/PcdLib.h>
+#include <Library/TimerLib.h>
 #include <Library/UefiBootManagerLib.h>
 #include <Library/UefiLib.h>
 #include <Protocol/DevicePath.h>
@@ -554,6 +555,47 @@ PlatformBootManagerBeforeConsole (
   PlatformRegisterOptionsAndKeys ();
 }
 
+STATIC
+VOID
+WaitForDiskReady (
+  )
+{
+  EFI_STATUS                Status;
+  UINT32                    Index;
+  UINTN                     DataSize;
+  UINT32                    DiskInfo;
+  UINT8                     IsFinished;
+
+  Status = EFI_NOT_FOUND;
+  DataSize = sizeof (UINT32);
+  // Wait for 15 seconds at most.
+  for (Index = 0; Index < 15; Index++) {
+    Status = gRT->GetVariable (
+                    L"SASDiskInfo",
+                    &gHisiOemVariableGuid,
+                    NULL,
+                    &DataSize,
+                    &DiskInfo
+                    );
+    if (EFI_ERROR(Status)) {
+      DEBUG ((DEBUG_ERROR, "Get DiskInfo:%r\n", Status));
+      break;
+    }
+
+    IsFinished = (UINT8)(DiskInfo >> 24);
+    if (IsFinished) {
+      break;
+    }
+    DEBUG ((DEBUG_ERROR, "%a", Index == 0 ? "Wait for disk." : "."));
+    MicroSecondDelay(1000 * 1000);
+  }
+
+  if (!EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "DiskInfo:%x\n", DiskInfo));
+    EfiBootManagerConnectAll ();
+  }
+}
+
 /**
   Do the platform specific action after the console is ready
   Possible things that can be done in PlatformBootManagerAfterConsole:
@@ -583,6 +625,7 @@ PlatformBootManagerAfterConsole (
   // Connect the rest of the devices.
   //
   EfiBootManagerConnectAll ();
+  WaitForDiskReady ();
 
   //
   // Enumerate all possible boot options.
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 15/43] Silicon/Hisilicon/Acpi: Unify HisiAcipPlatformDxe
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (13 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 14/43] Silicon/Hisilicon/D06: Wait for all disk ready Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 10:29   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 16/43] Hisilicon/D06: Add Debug Serial Port Init Driver Ming Huang
                   ` (28 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

The EFI_ACPI_STATIC_RESOURCE_AFFINITY_TABLE struct is used by
UpdateAcpiTable.c and Srat aslc. The struct may be different
according to chips, so move some macro to PlatformArch.h.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Hi1610/Include/PlatformArch.h                 |  6 ++++
 Silicon/Hisilicon/Hi1620/Include/PlatformArch.h                 |  6 ++++
 Silicon/Hisilicon/Include/Library/AcpiNextLib.h                 | 31 ++++++++++++++------
 Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c |  2 --
 4 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
index f39ae0748c..1ebddca4e5 100644
--- a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
+++ b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
@@ -30,6 +30,12 @@
 // Max NUMA node number for each node type
 #define MAX_NUM_PER_TYPE 8
 
+// for acpi
+#define NODE_IN_SOCKET                                  2
+#define CORE_NUM_PER_SOCKET                             32
+#define EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT        10
+#define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT       8
+
 #define S1_BASE               0x40000000000
 
 #define RASC_BASE                (0x5000)
diff --git a/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
index 9539cfdada..f3ad45f6c6 100644
--- a/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
+++ b/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
@@ -57,5 +57,11 @@
   EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
   }
 
+// for acpi
+#define NODE_IN_SOCKET                                  2
+#define CORE_NUM_PER_SOCKET                             48
+#define EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT        16
+#define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT       1
+
 #endif
 
diff --git a/Silicon/Hisilicon/Include/Library/AcpiNextLib.h b/Silicon/Hisilicon/Include/Library/AcpiNextLib.h
index fd05a3b960..2abffb65fc 100644
--- a/Silicon/Hisilicon/Include/Library/AcpiNextLib.h
+++ b/Silicon/Hisilicon/Include/Library/AcpiNextLib.h
@@ -19,6 +19,21 @@
 #ifndef __ACPI_NEXT_LIB_H__
 #define __ACPI_NEXT_LIB_H__
 
+#include <PlatformArch.h>
+
+///
+/// ITS Affinity Structure Definition
+///
+#pragma pack(1)
+typedef struct {
+  UINT8   Type;
+  UINT8   Length;
+  UINT32  ProximityDomain;
+  UINT16  Reserved;
+  UINT32  ItsHwId;
+} EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE;
+#pragma pack()
+
 #define EFI_ACPI_6_1_GIC_ITS_INIT(GicITSHwId, GicITSBase) \
   { \
     EFI_ACPI_6_1_GIC_ITS, sizeof (EFI_ACPI_6_1_GIC_ITS_STRUCTURE), EFI_ACPI_RESERVED_WORD, \
@@ -42,8 +57,8 @@
 #define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_INIT(                                               \
     ProximityDomain, ItsId)                                                                     \
   {                                                                                             \
-    4, sizeof (EFI_ACPI_6_2_GIC_ITS_AFFINITY_STRUCTURE), ProximityDomain,                           \
-    {EFI_ACPI_RESERVED_BYTE, EFI_ACPI_RESERVED_BYTE}, ItsId                                                               \
+    4, sizeof (EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE), ProximityDomain,                           \
+    EFI_ACPI_RESERVED_WORD, ItsId                                                               \
   }
 
 #define EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(                                              \
@@ -75,15 +90,13 @@
 // Define the number of each table type.
 // This is where the table layout is modified.
 //
-#define EFI_ACPI_PROCESSOR_LOCAL_GICC_AFFINITY_STRUCTURE_COUNT  64
-#define EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT                10
-#define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT               8
+#define EFI_ACPI_PROCESSOR_LOCAL_GICC_AFFINITY_STRUCTURE_COUNT  (MAX_SOCKET*CORE_NUM_PER_SOCKET)
 
 typedef struct {
-  EFI_ACPI_6_0_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER          Header;
-  EFI_ACPI_6_0_MEMORY_AFFINITY_STRUCTURE                      Memory[EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT];
-  EFI_ACPI_6_0_GICC_AFFINITY_STRUCTURE                        Gicc[EFI_ACPI_PROCESSOR_LOCAL_GICC_AFFINITY_STRUCTURE_COUNT];
-  EFI_ACPI_6_2_GIC_ITS_AFFINITY_STRUCTURE                     Its[EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT];
+  EFI_ACPI_6_2_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER          Header;
+  EFI_ACPI_6_2_MEMORY_AFFINITY_STRUCTURE                      Memory[EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT];
+  EFI_ACPI_6_2_GICC_AFFINITY_STRUCTURE                        Gicc[EFI_ACPI_PROCESSOR_LOCAL_GICC_AFFINITY_STRUCTURE_COUNT];
+  EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE                         Its[EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT];
 } EFI_ACPI_STATIC_RESOURCE_AFFINITY_TABLE;
 
 #pragma pack()
diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
index f5869841dc..54f49977c3 100644
--- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
+++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
@@ -20,8 +20,6 @@
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/UefiLib.h>
 
-#define CORE_NUM_PER_SOCKET  32
-#define NODE_IN_SOCKET       2
 #define CORECOUNT(X) ((X) * CORE_NUM_PER_SOCKET)
 
 STATIC
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 16/43] Hisilicon/D06: Add Debug Serial Port Init Driver
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (14 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 15/43] Silicon/Hisilicon/Acpi: Unify HisiAcipPlatformDxe Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 11:01   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 17/43] Hisilicon/D06: Add ACPI Tables for D06 Ming Huang
                   ` (27 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Heyi Guo

From: Heyi Guo <heyi.guo@linaro.org>

Hi1620 have two physical PL011 serial ports on the board,
one for serial port console (described by ACPI SPCR) and
the other for standard debug port (described by ACPI DBG2).
This driver is to initialize the debug UART, not the serial
console.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Heyi Guo <heyi.guo@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                                               |  1 +
 Platform/Hisilicon/D06/D06.fdf                                                               |  1 +
 Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf | 48 +++++++++++++++
 Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c   | 64 ++++++++++++++++++++
 4 files changed, 114 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 9ca7160dad..20d2d2a1b4 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -422,6 +422,7 @@
   # Memory test
   #
   MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
+  Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
   MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
   MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
   MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
index 07fe096f61..8cac126ccf 100644
--- a/Platform/Hisilicon/D06/D06.fdf
+++ b/Platform/Hisilicon/D06/D06.fdf
@@ -303,6 +303,7 @@ READ_LOCK_STATUS   = TRUE
   INF MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
   INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
 
+  INF Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
   INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
   #
   # Build Shell from latest source code instead of prebuilt binary
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf b/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
new file mode 100644
index 0000000000..8c91bdf0f4
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
@@ -0,0 +1,48 @@
+#/** @file
+#
+#    Copyright (c) 2016 - 2018, Hisilicon Limited. All rights reserved.
+#    Copyright (c) 2016 - 2018, Linaro Limited. All rights reserved.
+#
+#    This program and the accompanying materials
+#    are licensed and made available under the terms and conditions of the BSD License
+#    which accompanies this distribution. The full text of the license may be found at
+#    http://opensource.org/licenses/bsd-license.php
+#
+#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = Pl011DebugSerialPortInitDxe
+  FILE_GUID                      = 16D53E86-7EA4-47bd-861F-511EA9B8ABE0
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = SerialPortEntry
+
+[Sources.common]
+  Pl011DebugSerialPortInitDxe.c
+
+
+[Packages]
+  ArmPlatformPkg/ArmPlatformPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[LibraryClasses]
+  BaseLib
+  UefiDriverEntryPoint
+
+[Pcd]
+  gArmPlatformTokenSpaceGuid.PL011UartClkInHz
+  gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity
+  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits
+
+[Depex]
+  TRUE
+
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c b/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c
new file mode 100644
index 0000000000..8f83737327
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c
@@ -0,0 +1,64 @@
+/** @file
+
+    Copyright (c) 2016 - 2018, Hisilicon Limited. All rights reserved.
+    Copyright (c) 2016 - 2018, Linaro Limited. All rights reserved.
+
+    This program and the accompanying materials
+    are licensed and made available under the terms and conditions of the BSD License
+    which accompanies this distribution. The full text of the license may be found at
+    http://opensource.org/licenses/bsd-license.php
+
+    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Uefi.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PL011UartLib.h>
+#include <Library/PcdLib.h>
+#include <Library/SerialPortLib.h>
+
+RETURN_STATUS
+EFIAPI
+DebugSerialPortInitialize (
+  VOID
+  )
+{
+  UINT64              BaudRate;
+  UINT32              ReceiveFifoDepth;
+  EFI_PARITY_TYPE     Parity;
+  UINT8               DataBits;
+  EFI_STOP_BITS_TYPE  StopBits;
+
+  BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate);
+  ReceiveFifoDepth = 0;         // Use default FIFO depth
+  Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity);
+  DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);
+  StopBits = (EFI_STOP_BITS_TYPE) FixedPcdGet8 (PcdUartDefaultStopBits);
+  return PL011UartInitializePort (
+           (UINTN)FixedPcdGet64 (PcdSerialDbgRegisterBase),
+           FixedPcdGet32 (PL011UartClkInHz),
+           &BaudRate,
+           &ReceiveFifoDepth,
+           &Parity,
+           &DataBits,
+           &StopBits
+           );
+}
+
+EFI_STATUS
+SerialPortEntry (
+  IN EFI_HANDLE         ImageHandle,
+  IN EFI_SYSTEM_TABLE   *SystemTable
+  )
+{
+  EFI_STATUS Status;
+  Status = DebugSerialPortInitialize ();
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "CPU1 TB serial port init ERROR: %r\n", Status));
+  }
+  return EFI_SUCCESS;
+}
+
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 17/43] Hisilicon/D06: Add ACPI Tables for D06
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (15 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 16/43] Hisilicon/D06: Add Debug Serial Port Init Driver Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 11:49   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 18/43] Hisilicon/D06: Add Hi1620OemConfigUiLib Ming Huang
                   ` (26 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

ACPI tables for D06 2P, especially,Hi1620Iort.asl is include smmu
and Hi1620IortNoSmmu.asl is without smmu.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                          |    1 +
 Platform/Hisilicon/D06/D06.fdf                                          |    1 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf          |   59 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Platform.h              |   27 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/CPU.asl                  |  409 ++++
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Com.asl                  |   30 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/DsdtHi1620.asl           |   35 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Apei.asl           |   93 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Ged.asl            |   58 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mbig.asl           | 1459 ++++++++++++++
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mctp.asl           |   41 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Pci.asl            | 1216 ++++++++++++
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Power.asl          |   28 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Rde.asl            |   47 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Sec.asl            |   57 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c100k.asl |  249 +++
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c400k.asl |  249 +++
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/LpcUart_clk.asl          |   49 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Pv680UncorePmu.asl       | 1658 ++++++++++++++++
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/ipmi.asl                 |   49 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Facs.aslc                     |   67 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Fadt.aslc                     |   91 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Gtdt.aslc                     |   86 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Dbg2.aslc               |   86 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Iort.asl                | 1989 ++++++++++++++++++++
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620IortNoSmmu.asl          | 1736 +++++++++++++++++
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Mcfg.aslc               |   64 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Slit.aslc               |   64 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Spcr.aslc               |   81 +
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Srat.aslc               |  166 ++
 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/MadtHi1620.aslc               |  375 ++++
 31 files changed, 10620 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 20d2d2a1b4..9d4a86a4f4 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -332,6 +332,7 @@
   MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
   Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
 
+  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
   Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
 
   #
diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
index 8cac126ccf..06203dc079 100644
--- a/Platform/Hisilicon/D06/D06.fdf
+++ b/Platform/Hisilicon/D06/D06.fdf
@@ -249,6 +249,7 @@ READ_LOCK_STATUS   = TRUE
   INF MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
   INF Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
 
+  INF RuleOverride=ACPITABLE Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
   INF Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
 
   #
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
new file mode 100644
index 0000000000..4157e0feef
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
@@ -0,0 +1,59 @@
+## @file
+#
+#  ACPI table data and ASL sources required to boot the platform.
+#
+#  Copyright (c) 2014, ARM Ltd. All rights reserved.
+#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+#  Copyright (c) 2018, Linaro Limited. All rights reserved.
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = Hi1620AcpiTables
+  FILE_GUID                      = 7E374E25-8E01-4FEE-87F2-390C23C606CD
+  MODULE_TYPE                    = USER_DEFINED
+  VERSION_STRING                 = 1.0
+
+[Sources]
+  Dsdt/DsdtHi1620.asl
+  Facs.aslc
+  Fadt.aslc
+  Gtdt.aslc
+  Hi1620Dbg2.aslc
+  Hi1620Iort.asl
+  Hi1620IortNoSmmu.asl
+  Hi1620Mcfg.aslc
+  Hi1620Slit.aslc
+  Hi1620Spcr.aslc
+  Hi1620Srat.aslc
+  MadtHi1620.aslc
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+  EmbeddedPkg/EmbeddedPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[FixedPcd]
+  gArmPlatformTokenSpaceGuid.PcdCoreCount
+  gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase
+  gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum
+  gArmTokenSpaceGuid.PcdArmArchTimerIntrNum
+  gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum
+  gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum
+  gArmTokenSpaceGuid.PcdGicDistributorBase
+  gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Platform.h b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Platform.h
new file mode 100644
index 0000000000..5a6aa9a876
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Platform.h
@@ -0,0 +1,27 @@
+/** @file
+*
+*  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2015-2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+*
+**/
+
+
+#ifndef _HI1620_PLATFORM_H_
+#define _HI1620_PLATFORM_H_
+
+#include <../Include/PlatformArch.h>
+
+#define HI1620_WATCHDOG_COUNT  2
+
+#endif
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/CPU.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/CPU.asl
new file mode 100644
index 0000000000..ef8dae4d01
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/CPU.asl
@@ -0,0 +1,409 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+    This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+
+**/
+
+Scope(_SB)
+{
+  //
+  // A57x16 Processor declaration
+  //
+  Device(CPU0) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 0)
+  }
+  Device(CPU1) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 1)
+  }
+  Device(CPU2) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 2)
+  }
+  Device(CPU3) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 3)
+  }
+  Device(CPU4) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 4)
+  }
+  Device(CPU5) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 5)
+  }
+  Device(CPU6) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 6)
+  }
+  Device(CPU7) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 7)
+  }
+  Device(CPU8) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 8)
+  }
+  Device(CPU9) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 9)
+  }
+  Device(CP10) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 10)
+  }
+  Device(CP11) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 11)
+  }
+  Device(CP12) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 12)
+  }
+  Device(CP13) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 13)
+  }
+  Device(CP14) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 14)
+  }
+  Device(CP15) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 15)
+  }
+  Device(CP16) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 16)
+  }
+  Device(CP17) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 17)
+  }
+  Device(CP18) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 18)
+  }
+  Device(CP19) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 19)
+  }
+  Device(CP20) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 20)
+  }
+  Device(CP21) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 21)
+  }
+  Device(CP22) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 22)
+  }
+  Device(CP23) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 23)
+  }
+  Device(CP24) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 24)
+  }
+  Device(CP25) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 25)
+  }
+  Device(CP26) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 26)
+  }
+  Device(CP27) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 27)
+  }
+  Device(CP28) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 28)
+  }
+  Device(CP29) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 29)
+  }
+  Device(CP30) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 30)
+  }
+  Device(CP31) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 31)
+  }
+  Device(CP32) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 32)
+  }
+  Device(CP33) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 33)
+  }
+  Device(CP34) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 34)
+  }
+  Device(CP35) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 35)
+  }
+  Device(CP36) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 36)
+  }
+  Device(CP37) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 37)
+  }
+  Device(CP38) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 38)
+  }
+  Device(CP39) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 39)
+  }
+  Device(CP40) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 40)
+  }
+  Device(CP41) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 41)
+  }
+  Device(CP42) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 42)
+  }
+  Device(CP43) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 43)
+  }
+  Device(CP44) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 44)
+  }
+  Device(CP45) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 45)
+  }
+  Device(CP46) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 46)
+  }
+  Device(CP47) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 47)
+  }
+
+  Device(CP48) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 48)
+  }
+  Device(CP49) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 49)
+  }
+  Device(CP50) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 50)
+  }
+  Device(CP51) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 51)
+  }
+  Device(CP52) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 52)
+  }
+  Device(CP53) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 53)
+  }
+  Device(CP54) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 54)
+  }
+  Device(CP55) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 55)
+  }
+  Device(CP56) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 56)
+  }
+  Device(CP57) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 57)
+  }
+  Device(CP58) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 58)
+  }
+  Device(CP59) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 59)
+  }
+  Device(CP60) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 60)
+  }
+  Device(CP61) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 61)
+  }
+  Device(CP62) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 62)
+  }
+  Device(CP63) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 63)
+  }
+  Device(CP64) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 64)
+  }
+  Device(CP65) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 65)
+  }
+  Device(CP66) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 66)
+  }
+  Device(CP67) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 67)
+  }
+  Device(CP68) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 68)
+  }
+  Device(CP69) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 69)
+  }
+  Device(CP70) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 70)
+  }
+  Device(CP71) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 71)
+  }
+  Device(CP72) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 72)
+  }
+  Device(CP73) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 73)
+  }
+  Device(CP74) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 74)
+  }
+  Device(CP75) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 75)
+  }
+  Device(CP76) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 76)
+  }
+  Device(CP77) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 77)
+  }
+  Device(CP78) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 78)
+  }
+  Device(CP79) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 79)
+  }
+  Device(CP80) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 80)
+  }
+  Device(CP81) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 81)
+  }
+  Device(CP82) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 82)
+  }
+  Device(CP83) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 83)
+  }
+  Device(CP84) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 84)
+  }
+  Device(CP85) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 85)
+  }
+  Device(CP86) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 86)
+  }
+  Device(CP87) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 87)
+  }
+  Device(CP88) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 88)
+  }
+  Device(CP89) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 89)
+  }
+  Device(CP90) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 90)
+  }
+  Device(CP91) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 91)
+  }
+  Device(CP92) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 92)
+  }
+  Device(CP93) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 93)
+  }
+  Device(CP94) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 94)
+  }
+  Device(CP95) {
+    Name(_HID, "ACPI0007")
+    Name(_UID, 95)
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Com.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Com.asl
new file mode 100644
index 0000000000..377d171abb
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Com.asl
@@ -0,0 +1,30 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+    This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+
+**/
+
+Scope(_SB)
+{
+  Device(COM0) {
+    Name(_HID, "ARMH0011")
+    Name(_CID, "PL011")
+    Name(_UID, Zero)
+    Name(_CRS, ResourceTemplate() {
+      Memory32Fixed(ReadWrite, 0x94080000, 0x1000)
+      Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { 141 }
+    })
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/DsdtHi1620.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/DsdtHi1620.asl
new file mode 100644
index 0000000000..7e26ba22b7
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/DsdtHi1620.asl
@@ -0,0 +1,35 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+    This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+
+**/
+
+#include "Hi1620Platform.h"
+
+DefinitionBlock("DsdtTable.aml", "DSDT", 2, "HISI  ", "HIP08   ", EFI_ACPI_ARM_OEM_REVISION) {
+  include ("Com.asl")
+  include ("CPU.asl")
+  include ("Hi1620Pci.asl")
+  include ("Hi1620Mbig.asl")
+  include ("Hi1620Rde.asl")
+  include ("Hi1620Sec.asl")
+  include ("ipmi.asl")
+  include ("LpcUart_clk.asl")
+  include ("Hi1620Ged.asl")
+  include ("Hi1620Power.asl")
+  include ("Hi1620Apei.asl")
+  include ("Hi1620Mctp.asl")
+  include ("Pv680UncorePmu.asl")
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Apei.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Apei.asl
new file mode 100644
index 0000000000..0970ed9b99
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Apei.asl
@@ -0,0 +1,93 @@
+/** @file
+*
+*  Copyright (c) 2018 Hisilicon Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+//Define a control method APEI
+Scope(_SB)
+{
+  Device(GED2) {
+    Name(_HID, "ACPI0013")
+    Name(_UID, 2)
+
+    Name (_CRS, ResourceTemplate ()  {
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive) {
+        122
+      }
+    })
+
+    Method (_EVT, 0x1) {
+      Switch(ToInteger(Arg0)) {
+        Case(122) {
+          Notify (\_SB.ERRD, 0x80)
+        }
+      }
+    }
+
+    Method (_STA, 0x0, NotSerialized) {
+      return (0xF);
+    }
+  }
+}
+
+Device (\_SB.ERRD)
+{
+  Name (_HID, EISAID("PNP0C33"))
+  Name (_UID, 0)
+  Method (_STA, 0x0, NotSerialized) {
+    Return(0xF)
+  }
+}
+
+Name(PWCP, Zero) // Platform-Wide Capability value.
+
+Scope (\_SB) {
+  Method (_OSC,4) {
+    // Create DWord-adressable for Arg3 First DWORD.
+    CreateDWordField(Arg3,0,CDW1)
+
+    // Check for proper UUID
+    If (LEqual(Arg0,ToUUID("0811B06E-4A27-44F9-8D60-3CBBC22E7B48"))) {
+      // Create DWord-adressable fields from the Capabilities Buffer
+      CreateDWordField (Arg3,4,TPD2)
+
+      // Save Capabilities DWord2
+      Store (TPD2, PWCP)
+
+      // Set Bit[4]: APEI Support
+      Or (PWCP,0x10,PWCP)
+
+      If (LNotEqual(Arg1,One)) {// Unknown revision
+        Or (CDW1,0x08,CDW1)
+      }
+
+      // Update DWORD2 in the buffer
+      Store (PWCP,TPD2)
+
+      Return (Arg3)
+    }
+    ElseIf (LEqual(Arg0, ToUUID("ed855e0c-6c90-47bf-a62a-26de0fc5ad5c"))) { // Check for WHEA GUID
+      CreateDWordField (Arg3,4,TPD3)
+
+      Or (TPD3, 0x10, TPD3) //Set Bit[4]: APEI support.
+
+      If (LNotEqual(Arg1,One)) {// Unknown revision
+        Or (CDW1,0x08,CDW1)
+      }
+
+      return (Arg3)
+    }
+    Else {
+      Or (CDW1,4,CDW1) // Unrecognized UUID
+      Return (Arg3)
+    }
+  } // End _OSC
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Ged.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Ged.asl
new file mode 100644
index 0000000000..6664c0c681
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Ged.asl
@@ -0,0 +1,58 @@
+/** @file
+*
+* Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+* Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+* Copyright (c) 2016, Linaro Limited. All rights reserved.<BR>
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+//
+// Ged
+//
+
+//Define a control method power button
+Scope(_SB)
+{
+  OperationRegion(IOM1, SystemMemory, 0x941900C8, 0x4)
+  Field(IOM1, DWordAcc, NoLock, Preserve) {
+    IMX0, 32,
+  }
+
+  Method (_INI) {
+    Store(IMX0, Local0)
+    And(Local0, 0xFFFFFFFC, Local0)
+    Or(Local0, 0x4, Local0)
+    Store(Local0, IMX0)
+  }
+
+  Device(GED1) {
+    Name(_HID, "ACPI0013")
+    Name(_UID, 0)
+
+    Name (_CRS, ResourceTemplate ()  {
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive) {
+        121
+      }
+    })
+
+    Method (_STA, 0x0, NotSerialized) {
+      return (0xF);
+    }
+
+    Method (_EVT, 0x1) {
+      Switch(ToInteger(Arg0)) {
+        Case(121) {
+          Notify (\_SB.PWRB, 0x80)
+        }
+      }
+    }
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mbig.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mbig.asl
new file mode 100644
index 0000000000..6adf5973a6
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mbig.asl
@@ -0,0 +1,1459 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+    This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+Scope(_SB)
+{
+  //This is for S0-TB-L3T0 PMU implementation
+  Device(MB30) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x30)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-L3T1 PMU implementation
+  Device(MB31) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x31)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-L3T2 PMU implementation
+  Device(MB32) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x32)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-L3T3 PMU implementation
+  Device(MB33) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x33)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-L3T4 PMU implementation
+  Device(MB34) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x34)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-L3T5 PMU implementation
+  Device(MB35) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x35)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-DDRC0 PMU implementation
+  Device(MB38) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x38)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-DDRC1 PMU implementation
+  Device(MB39) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x39)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-DDRC2 PMU implementation
+  Device(MB3A) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x3A)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-DDRC3 PMU implementation
+  Device(MB3B) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x3B)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-HHA0 PMU implementation
+  Device(MB3C) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x3C)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TB-HHA1 PMU implementation
+  Device(MB3D) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x3D)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xA8080000,
+          0xA808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-L3T0 PMU implementation
+  Device(MB10) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x10)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-L3T1 PMU implementation
+  Device(MB11) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x11)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-L3T2 PMU implementation
+  Device(MB12) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x12)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-L3T3 PMU implementation
+  Device(MB13) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x13)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+
+  //This is for S0-TA-L3T4 PMU implementation
+  Device(MB14) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x14)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-L3T5 PMU implementation
+  Device(MB15) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x15)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-DDRC0 PMU implementation
+  Device(MB18) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x18)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-DDRC1 PMU implementation
+  Device(MB19) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x19)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-DDRC2 PMU implementation
+  Device(MB1A) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x1A)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-DDRC3 PMU implementation
+  Device(MB1B) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x1B)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-HHA0 PMU implementation
+  Device(MB1C) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x1C)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S0-TA-HHA1 PMU implementation
+  Device(MB1D) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x1D)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0xAC080000,
+          0xAC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-L3T0 PMU implementation
+  Device(MB70) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x70)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-L3T1 PMU implementation
+  Device(MB71) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x71)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-L3T2 PMU implementation
+  Device(MB72) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x72)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-L3T3 PMU implementation
+  Device(MB73) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x73)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+
+  //This is for S1-TB-L3T4 PMU implementation
+  Device(MB74) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x74)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-L3T5 PMU implementation
+  Device(MB75) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x75)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-DDRC0 PMU implementation
+  Device(MB78) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x78)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-DDRC1 PMU implementation
+  Device(MB79) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x79)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-DDRC2 PMU implementation
+  Device(MB7A) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x7A)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-DDRC3 PMU implementation
+  Device(MB7B) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x7B)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-HHA0 PMU implementation
+  Device(MB7C) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x7C)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TB-HHA1 PMU implementation
+  Device(MB7D) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x7D)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000A8080000,
+          0x4000A808ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-L3T0 PMU implementation
+  Device(MB50) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x50)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-L3T1 PMU implementation
+  Device(MB51) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x51)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-L3T2 PMU implementation
+  Device(MB52) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x52)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-L3T3 PMU implementation
+  Device(MB53) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x53)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+
+  //This is for S1-TA-L3T4 PMU implementation
+  Device(MB54) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x54)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-L3T5 PMU implementation
+  Device(MB55) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x55)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-DDRC0 PMU implementation
+  Device(MB58) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x58)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-DDRC1 PMU implementation
+  Device(MB59) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x59)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-DDRC2 PMU implementation
+  Device(MB5A) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x5A)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-DDRC3 PMU implementation
+  Device(MB5B) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x5B)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-HHA0 PMU implementation
+  Device(MB5C) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x5C)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+
+  //This is for S1-TA-HHA1 PMU implementation
+  Device(MB5D) {
+    Name(_HID, "HISI0152")
+    Name(_UID, 0x5D)
+    Name(_CID, "MBIGen")
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+          ResourceConsumer,
+          ,
+          MinFixed,
+          MaxFixed,
+          NonCacheable,
+          ReadWrite,
+          0x0,
+          0x4000AC080000,
+          0x4000AC08ffff,
+          0x0,
+          0x10000
+      )
+  })
+
+   Name(_DSD, Package () {
+        ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+        Package ()
+        {
+          Package () {"num-pins", 1}
+        }
+   })
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mctp.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mctp.asl
new file mode 100644
index 0000000000..d039e8a110
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mctp.asl
@@ -0,0 +1,41 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+    This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+
+**/
+Scope(_SB)
+{
+  Device(LOC0) {
+    Name(_HID, "HISI02F1")
+    Name(_UID, 0)
+    Name (_CRS, ResourceTemplate ()  {
+      Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive)
+      {
+        488,489
+      }
+    })
+  }
+
+  Device(MCT0) {
+    Name(_HID, "HISI0301")
+    Name(_UID, 0)
+    Name (_CRS, ResourceTemplate ()  {
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI4")
+      {
+        656
+      }
+    })
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Pci.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Pci.asl
new file mode 100644
index 0000000000..8e3547926a
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Pci.asl
@@ -0,0 +1,1216 @@
+/** @file
+*
+*  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2016, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+*
+**/
+
+//#include "ArmPlatform.h"
+Scope(_SB)
+{
+  Device (PCI0)
+  {                                          // PCI0 indicate host bridge 0
+    Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+    Name (_UID, 0)
+    Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+    Name(_SEG, 0)                            // Segment of this Root complex
+    Name (_BBN, 0x0)                         // Base Bus Number
+    Name (_CCA, 1)                           // cache coherence attribute
+
+    Name (_PRT, Package (){
+      // INTx configure for RP0, whoes device number is 0
+      // For ESL/FPGA debug, we should modify this according to
+      // specific hardware configuration.
+      Package () {0xFFFF,0,0,640},         // INT_A
+      Package () {0xFFFF,1,0,641},         // INT_B
+      Package () {0xFFFF,2,0,642},         // INT_C
+      Package () {0xFFFF,3,0,643},         // INT_D
+
+      // This is an example of RP1 INTx configure. Adding or not
+      // adding RPx INTx configure deponds on hardware board topology,
+      // if UEFI enables RPx, RPy, RPz... related INTx configure
+      // should be added
+      Package () {0x4FFFF,0,0,640},         // INT_A
+      Package () {0x4FFFF,1,0,641},         // INT_B
+      Package () {0x4FFFF,2,0,642},         // INT_C
+      Package () {0x4FFFF,3,0,643},         // INT_D
+
+      Package () {0x8FFFF,0,0,640},         // INT_A
+      Package () {0x8FFFF,1,0,641},         // INT_B
+      Package () {0x8FFFF,2,0,642},         // INT_C
+      Package () {0x8FFFF,3,0,643},         // INT_D
+
+      Package () {0xCFFFF,0,0,640},         // INT_A
+      Package () {0xCFFFF,1,0,641},         // INT_B
+      Package () {0xCFFFF,2,0,642},         // INT_C
+      Package () {0xCFFFF,3,0,643},         // INT_D
+
+      Package () {0x10FFFF,0,0,640},         // INT_A
+      Package () {0x10FFFF,1,0,641},         // INT_B
+      Package () {0x10FFFF,2,0,642},         // INT_C
+      Package () {0x10FFFF,3,0,643},         // INT_D
+
+      Package () {0x12FFFF,0,0,640},         // INT_A
+      Package () {0x12FFFF,1,0,641},         // INT_B
+      Package () {0x12FFFF,2,0,642},         // INT_C
+      Package () {0x12FFFF,3,0,643},         // INT_D
+      })
+
+    Method (_CRS, 0, Serialized) {
+      // Method is defined in 19.6.82 in ACPI 6.0 spec
+      Name (RBUF, ResourceTemplate () {
+        // 19.3.3 in ACPI 6.0 spec
+        WordBusNumber (
+          ResourceProducer,
+          MinFixed,
+          MaxFixed,
+          PosDecode,
+          0,                                 // AddressGranularity
+          0x00,                              // AddressMinimum - Minimum Bus Number
+          0x3f,                              // AddressMaximum - Maximum Bus Number
+          0,                                 // AddressTranslation - Set to 0
+          0x40                               // RangeLength - Number of Busses
+        )
+        QWordMemory (                        // 64-bit prefetch BAR windows
+          ResourceProducer,
+          PosDecode,
+          MinFixed,
+          MaxFixed,
+          Prefetchable,
+          ReadWrite,
+          0x0,                               // Granularity
+          0x80000000000,                     // Min Base Address pci address
+          0x83fffffffff,                     // Max Base Address
+          0x0,                               // Translate
+          0x4000000000                       // Length, 256G
+        )
+        QWordMemory (                        // 32-bit non-prefetch BAR windows
+          ResourceProducer,
+          PosDecode,
+          MinFixed,
+          MaxFixed,
+          Cacheable,
+          ReadWrite,
+          0x0,                               // Granularity
+          0xe0000000,                        // Min Base Address pci address
+          0xeffeffff,                        // Max Base Address
+          0x0,                               // Translate
+          0xfff0000                          // Length, 256M - 64K
+        )
+        QWordIO (
+          ResourceProducer,
+          MinFixed,
+          MaxFixed,
+          PosDecode,
+          EntireRange,
+          0x0,                               // Granularity
+          0x0,                               // Min Base Address
+          0xffff,                            // Max Base Address
+          0xefff0000,                        // Translate
+          0x10000                            // Length, 64K
+        )}
+      )                                      // Name(RBUF)
+      Return (RBUF)
+    }                                        // Method(_CRS), this method return RBUF!
+
+  //
+  // OS Control Handoff
+  //
+  Name(SUPP, Zero) // PCI _OSC Support Field value
+  Name(CTRL, Zero) // PCI _OSC Control Field value
+
+  Method(_OSC,4) {
+    // Check for proper UUID
+    If(LEqual(Arg0,ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766"))) {
+      // Create DWord-adressable fields from the Capabilities Buffer
+      CreateDWordField(Arg3,0,CDW1)
+      CreateDWordField(Arg3,4,CDW2)
+      CreateDWordField(Arg3,8,CDW3)
+
+      // Save Capabilities DWord2 & 3
+      Store(CDW2,SUPP)
+      Store(CDW3,CTRL)
+
+      // Only allow native hot plug control if OS supports:
+      //  ASPM
+      //  Clock PM
+      //  MSI/MSI-X
+      If(LNotEqual(And(SUPP, 0x16), 0x16)) {
+        And(CTRL,0x1E,CTRL) // Mask bit 0 (and undefined bits)
+      }
+
+      // Always allow native PME, AER (no dependencies)
+
+      // Never allow SHPC (no SHPC controller in this system)
+      And(CTRL,0x1D,CTRL)
+
+      If(LNotEqual(Arg1,One)) {  // Unknown revision
+        Or(CDW1,0x08,CDW1)
+      }
+
+      If(LNotEqual(CDW3,CTRL)) {  // Capabilities bits were masked
+        Or(CDW1,0x10,CDW1)
+      }
+
+      // Update DWORD3 in the buffer
+      Store(CTRL,CDW3)
+      Return(Arg3)
+    } Else {
+      Or(CDW1,4,CDW1) // Unrecognized UUID
+      Return(Arg3)
+    }
+  } // End _OSC
+
+  Method (_HPX, 0) {
+    Return (Package(2) {
+      Package(6) {    // PCI Setting Record
+        0x00,         // Type 0
+        0x01,         // Revision 1
+        0x08,         // CacheLineSize in DWORDS
+        0x40,         // LatencyTimer in PCI clocks
+        0x01,         // Enable SERR (Boolean)
+        0x01          // Enable PERR (Boolean)
+      },
+
+      Package(18){   // PCI-X Setting Record
+        0x02,        // Type 2
+        0x01,        // Revision 1
+        0xFFFFFFFF,  // Uncorrectable Error Mask Register AND Mask, Keep ->1
+        0x00000000,  // Uncorrectable Error Mask Register OR Mask, keep ->0
+        0xFFFFFFFF,  // Uncorrectable Error Severity Register AND Mask
+        0x00000000,  // Uncorrectable Error Severity Register OR Mask
+        0xFFFFFFFF,  // Correctable Error Mask Register AND Mask
+        0x00000000,  // Correctable Error Mask Register OR Mask
+        0xFFFFFFFF,  // Advanced Error Capabilities and Control Register AND Mask
+        0x00000000,  // Advanced Error Capabilities and Control Register OR Mask
+        0xFFF7,      // Device Control Register AND Mask
+        0x0007,      // Device Control Register OR Mask
+        0xFFFF,      // Link Control Register AND Mask
+        0x0000,      // Link Control Register OR Mask
+        0xFFFFFFFF,  // Secondary Uncorrectable Error Severity Register AND Mask
+        0x00000000,  // Secondary Uncorrectable Error Severity Register OR Mask
+        0xFFFFFFFF,  // Secondary Uncorrectable Error Mask Register AND Mask
+        0x00000000   // Secondary Uncorrectable Error Mask Register OR Mask
+      }
+    })
+  }
+
+  Method (_STA, 0x0, NotSerialized) {
+    Return (0xf)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x01)
+  }
+} // Device(PCI0)
+
+
+Device (PCI1)
+{                                            // PCI1 indicate host bridge 1
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 1)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0x7b)                         // Base Bus Number ??
+  Name(_CCA, 1)                            // cache coherence attribute ??
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource setting
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                          // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0x7b,                              // AddressMinimum - Minimum Bus Number
+        0x7b,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x1                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows, where to show this ??
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x148800000,                       // Min Base Address pci address ??
+        0x148ffffff,                       // Max Base Address
+        0x0,                               // Translate
+        0x800000                           // Length, 8M
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0xf)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x01)
+  }
+} // Device(PCI1)
+
+Device (PCI2)
+{
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 2)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0x7a)                         // Base Bus Number
+  Name(_CCA, 1)                            // cache coherence attribute ??
+  Name (_PRT, Package (){
+    Package () {0xFFFF,0,0,640},         // INT_A
+    Package () {0xFFFF,1,0,641},         // INT_B
+    Package () {0xFFFF,2,0,642},         // INT_C
+    Package () {0xFFFF,3,0,643},         // INT_D
+    Package () {0x1FFFF,0,0,640},         // INT_A
+    Package () {0x1FFFF,1,0,641},         // INT_B
+    Package () {0x1FFFF,2,0,642},         // INT_C
+    Package () {0x1FFFF,3,0,643},         // INT_D
+    Package () {0x2FFFF,0,0,640},         // INT_A
+    Package () {0x2FFFF,1,0,641},         // INT_B
+    Package () {0x2FFFF,2,0,642},         // INT_C
+    Package () {0x2FFFF,3,0,643},         // INT_D
+  })
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource //                               setting
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0x7a,                              // AddressMinimum - Minimum Bus Number
+        0x7a,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x1                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x20c000000,                       // Min Base Address pci address
+        0x20c1fffff,                       // Max Base Address
+        0x0,                               // Translate
+        0x200000                           // Length, 2M
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0xf)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x01)
+  }
+}
+
+Device (PCI3)
+{
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 3)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0x78)                         // Base Bus Number ??
+  Name(_CCA, 1)                            // cache coherence attribute ??
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0x78,                              // AddressMinimum - Minimum Bus Number
+        0x79,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x2                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x208000000,                       // Min Base Address pci address
+        0x208ffffff,                       // Max Base Address
+        0x0,                               // Translate
+        0x1000000                          // Length, 16M
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0xf)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x01)
+  }
+}
+
+Device (PCI4)
+{
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 4)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0x7c)                         // Base Bus Number ??
+  Name(_CCA, 1)                            // cache coherence attribute ??
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0x7c,                              // AddressMinimum - Minimum Bus Number
+        0x7d,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x2                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x120000000,                       // Min Base Address pci address
+        0x13fffffff,                       // Max Base Address
+        0x0,                               // Translate
+        0x20000000                         // Length, 512M
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0x0F)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x01)
+  }
+}
+
+Device (PCI5)
+{
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 5)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0x74)                         // Base Bus Number ??
+  Name(_CCA, 1)                            // cache coherence attribute ??
+
+  Name (_PRT, Package (){
+    Package () {0x2FFFF,0,0,640},         // INT_A
+    Package () {0x2FFFF,1,0,641},         // INT_B
+    Package () {0x2FFFF,2,0,642},         // INT_C
+    Package () {0x2FFFF,3,0,643},         // INT_D
+    Package () {0x3FFFF,0,0,640},         // INT_A
+    Package () {0x3FFFF,1,0,641},         // INT_B
+    Package () {0x3FFFF,2,0,642},         // INT_C
+    Package () {0x3FFFF,3,0,643},         // INT_D
+  })
+
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource setting
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+      ResourceProducer,
+      MinFixed,
+      MaxFixed,
+      PosDecode,
+      0,                                 // AddressGranularity
+      0x74,                              // AddressMinimum - Minimum Bus Number
+      0x76,                              // AddressMaximum - Maximum Bus Number
+      0,                                 // AddressTranslation - Set to 0
+      0x3                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows
+      ResourceProducer,
+      PosDecode,
+      MinFixed,
+      MaxFixed,
+      Prefetchable,
+      ReadWrite,
+      0x0,                               // Granularity
+      0x144000000,                       // Min Base Address pci address
+      0x147ffffff,                       // Max Base Address
+      0x0,                               // Translate
+      0x4000000                          // Length, 32M
+      )
+      QWordMemory (                        // 32-bit non-prefetch BAR Windows
+      ResourceProducer,
+      PosDecode,
+      MinFixed,
+      MaxFixed,
+      Cacheable,
+      ReadWrite,
+      0x0,                               // Granularity
+      0xa2000000,                        // Min Base Address pci address
+      0xa2ffffff,                        // Max Base Address
+      0x0,                               // Translate
+      0x1000000                          // Length, 16M
+      )
+    })                                 // Name(RBUF)
+    Return (RBUF)
+  }                                    // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0xf)
+  }
+
+  Device (SAS0)
+  {
+    Name (_ADR, 0x00020000)
+    Name (_DSD, Package ()
+    {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package ()
+      {
+        Package (2) {"sas-addr", Package() {0x50, 0x01, 0x88, 0x20, 0x16, 0x00, 0x00, 0x00}},
+        Package ()  {"queue-count", 16},
+        Package ()  {"phy-count", 8},
+      }
+    })
+
+    OperationRegion (CTL, SystemMemory, 0x140070000, 0x1000)
+    Field (CTL, DWordAcc, NoLock, Preserve)
+    {
+      Offset (0xa18),
+      RST, 32,
+      DRST, 32,
+    }
+
+    OperationRegion (TXD, SystemMemory, 0xA2000000, 0x4000)
+    Field (TXD, DwordAcc, NoLock, Preserve)
+    {
+      Offset (0x2350),  //port0
+      ST00, 32,   //0x2350
+      ST01, 32,   //0x2354
+      ST02, 32,   //0x2358
+      ST03, 32,   //0x235c
+      ST04, 32,   //0x2360
+      ST05, 32,   //0x2364
+      ST06, 32,   //0x2368
+      ST07, 32,   //0x236c
+      Offset (0x2750),  //port1
+      ST10, 32,   //0x2750
+      ST11, 32,   //0x2754
+      ST12, 32,   //0x2758
+      ST13, 32,   //0x275c
+      ST14, 32,   //0x2760
+      ST15, 32,   //0x2764
+      ST16, 32,   //0x2768
+      ST17, 32,   //0x276c
+      Offset (0x2b50),  //port2
+      ST20, 32,   //0x2b50
+      ST21, 32,   //0x2b54
+      ST22, 32,   //0x2b58
+      ST23, 32,   //0x2b5c
+      ST24, 32,   //0x2b60
+      ST25, 32,   //0x2b64
+      ST26, 32,   //0x2b68
+      ST27, 32,   //0x2b6c
+      Offset (0x2f50),  //port3
+      ST30, 32,   //0x2f50
+      ST31, 32,   //0x2f54
+      ST32, 32,   //0x2f58
+      ST33, 32,   //0x2f5c
+      ST34, 32,   //0x2f60
+      ST35, 32,   //0x2f64
+      ST36, 32,   //0x2f68
+      ST37, 32,   //0x2f6c
+      Offset (0x3350),  //port4
+      ST40, 32,   //0x3350
+      ST41, 32,   //0x3354
+      ST42, 32,   //0x3358
+      ST43, 32,   //0x335c
+      ST44, 32,   //0x3360
+      ST45, 32,   //0x3364
+      ST46, 32,   //0x3368
+      ST47, 32,   //0x336c
+      Offset (0x3750),//port5
+      ST50, 32,   //0x3750
+      ST51, 32,   //0x3754
+      ST52, 32,   //0x3758
+      ST53, 32,   //0x375c
+      ST54, 32,   //0x3760
+      ST55, 32,   //0x3764
+      ST56, 32,   //0x3768
+      ST57, 32,   //0x376c
+      Offset (0x3b50),  //port6
+      ST60, 32,   //0x3b50
+      ST61, 32,   //0x3b54
+      ST62, 32,   //0x3b58
+      ST63, 32,   //0x3b5c
+      ST64, 32,   //0x3b60
+      ST65, 32,   //0x3b64
+      ST66, 32,   //0x3b68
+      ST67, 32,   //0x3b6c
+      Offset (0x3f50),  //port7
+      ST70, 32,   //0x3f50
+      ST71, 32,   //0x3f54
+      ST72, 32,   //0x3f58
+      ST73, 32,   //0x3f5c
+      ST74, 32,   //0x3f60
+      ST75, 32,   //0x3f64
+      ST76, 32,   //0x3f68
+      ST77, 32    //0x3f6c
+    }
+
+    Method (_RST, 0x0, Serialized)
+    {
+      Store(0x7FFFFFF, RST)
+      Sleep(1)
+      Store(0x7FFFFFF, DRST)
+      Sleep(1)
+
+      //port0
+      Store (0x8D04, ST00)
+      Sleep(1)
+      Store (0x8D04, ST01)
+      Sleep(1)
+      Store (0x8D04, ST02)
+      Sleep(1)
+      Store (0x8D04, ST03)
+      Sleep(1)
+      Store (0x8D04, ST05)
+      Sleep(1)
+      Store (0x8D04, ST06)
+      Sleep(1)
+      Store (0x8D04, ST07)
+      Sleep(1)
+
+      //port1
+      Store (0x8D04, ST10)
+      Sleep(1)
+      Store (0x8D04, ST11)
+      Sleep(1)
+      Store (0x8D04, ST12)
+      Sleep(1)
+      Store (0x8D04, ST13)
+      Sleep(1)
+      Store (0x8D04, ST15)
+      Sleep(1)
+      Store (0x8D04, ST16)
+      Sleep(1)
+      Store (0x8D04, ST17)
+      Sleep(1)
+
+      //port2
+      Store (0x8D04, ST20)
+      Sleep(1)
+      Store (0x8D04, ST21)
+      Sleep(1)
+      Store (0x8D04, ST22)
+      Sleep(1)
+      Store (0x8D04, ST23)
+      Sleep(1)
+      Store (0x8D04, ST25)
+      Sleep(1)
+      Store (0x8D04, ST26)
+      Sleep(1)
+      Store (0x8D04, ST27)
+      Sleep(1)
+
+      //port3
+      Store (0x8D04, ST30)
+      Sleep(1)
+      Store (0x8D04, ST31)
+      Sleep(1)
+      Store (0x8D04, ST32)
+      Sleep(1)
+      Store (0x8D04, ST33)
+      Sleep(1)
+      Store (0x8D04, ST35)
+      Sleep(1)
+      Store (0x8D04, ST36)
+      Sleep(1)
+      Store (0x8D04, ST37)
+      Sleep(1)
+
+      //port4
+      Store (0x8D04, ST40)
+      Sleep(1)
+      Store (0x8D04, ST41)
+      Sleep(1)
+      Store (0x8D04, ST42)
+      Sleep(1)
+      Store (0x8D04, ST43)
+      Sleep(1)
+      Store (0x8D04, ST45)
+      Sleep(1)
+      Store (0x8D04, ST46)
+      Sleep(1)
+      Store (0x8D04, ST47)
+      Sleep(1)
+
+      //port5
+      Store (0x8D04, ST50)
+      Sleep(1)
+      Store (0x8D04, ST51)
+      Sleep(1)
+      Store (0x8D04, ST52)
+      Sleep(1)
+      Store (0x8D04, ST53)
+      Sleep(1)
+      Store (0x8D04, ST55)
+      Sleep(1)
+      Store (0x8D04, ST56)
+      Sleep(1)
+      Store (0x8D04, ST57)
+      Sleep(1)
+
+      //port6
+      Store (0x8D04, ST60)
+      Sleep(1)
+      Store (0x8D04, ST61)
+      Sleep(1)
+      Store (0x8D04, ST62)
+      Sleep(1)
+      Store (0x8D04, ST63)
+      Sleep(1)
+      Store (0x8D04, ST65)
+      Sleep(1)
+      Store (0x8D04, ST66)
+      Sleep(1)
+      Store (0x8D04, ST67)
+      Sleep(1)
+
+      //port7
+      Store (0x8D04, ST70)
+      Sleep(1)
+      Store (0x8D04, ST71)
+      Sleep(1)
+      Store (0x8D04, ST72)
+      Sleep(1)
+      Store (0x8D04, ST73)
+      Sleep(1)
+      Store (0x8D04, ST75)
+      Sleep(1)
+      Store (0x8D04, ST76)
+      Sleep(1)
+      Store (0x8D04, ST77)
+      Sleep(1)
+    }
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x01)
+  }
+}
+
+Device (PCI6)
+{                                            // PCI0 indicate host bridge 0
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 6)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0x80)                          // Base Bus Number ??
+  Name(_CCA, 1)                            // cache coherence attribute ??
+
+  Name (_PRT, Package (){
+    // INTx configure for RP0, whoes device number is 0
+    // For ESL/FPGA debug, we should modify this according to
+    // specific hardware configuration.
+    Package () {0xFFFF,0,0,640},         // INT_A
+    Package () {0xFFFF,1,0,641},         // INT_B
+    Package () {0xFFFF,2,0,642},         // INT_C
+    Package () {0xFFFF,3,0,643},         // INT_D
+
+    // This is an example of RP1 INTx configure. Adding or not
+    // adding RPx INTx configure deponds on hardware board topology,
+    // if UEFI enables RPx, RPy, RPz... related INTx configure
+    // should be added
+    Package () {0x04FFFF,0,0,640},         // INT_A
+    Package () {0x04FFFF,1,0,641},         // INT_B
+    Package () {0x04FFFF,2,0,642},         // INT_C
+    Package () {0x04FFFF,3,0,643},         // INT_D
+
+    Package () {0x08FFFF,0,0,640},         // INT_A
+    Package () {0x08FFFF,1,0,641},         // INT_B
+    Package () {0x08FFFF,2,0,642},         // INT_C
+    Package () {0x08FFFF,3,0,643},         // INT_D
+
+    Package () {0x0CFFFF,0,0,640},         // INT_A
+    Package () {0x0CFFFF,1,0,641},         // INT_B
+    Package () {0x0CFFFF,2,0,642},         // INT_C
+    Package () {0x0CFFFF,3,0,643},         // INT_D
+
+    Package () {0x10FFFF,0,0,640},         // INT_A
+    Package () {0x10FFFF,1,0,641},         // INT_B
+    Package () {0x10FFFF,2,0,642},         // INT_C
+    Package () {0x10FFFF,3,0,643},         // INT_D
+  })
+
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource setting
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0x80,                              // AddressMinimum - Minimum Bus Number
+        0x9f,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x20                               // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit prefetch BAR windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x480000000000,                     // Min Base Address pci address
+        0x483fffffffff,                     // Max Base Address
+        0x0,                               // Translate
+        0x4000000000                       // Length, 256G
+      )
+      QWordMemory (                        // 32-bit non-prefetch BAR windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Cacheable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0xf0000000,                        // Min Base Address pci address
+        0xfffeffff,                        // Max Base Address
+        0x0,                               // Translate
+        0xfff0000                          // Length, 256M - 64K
+      )
+      QWordIO (
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        EntireRange,
+        0x0,                               // Granularity
+        0x0,                               // Min Base Address
+        0xffff,                            // Max Base Address
+        0xffff0000,                        // Translate
+        0x10000                            // Length, 64K
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  //
+  // OS Control Handoff
+  //
+  Name(SUPP, Zero) // PCI _OSC Support Field value
+  Name(CTRL, Zero) // PCI _OSC Control Field value
+
+  Method(_OSC,4) {
+    // Check for proper UUID
+    If(LEqual(Arg0,ToUUID("33DB4D5B-1FF7-401C-9657-7441C03DD766"))) {
+    // Create DWord-adressable fields from the Capabilities Buffer
+    CreateDWordField(Arg3,0,CDW1)
+    CreateDWordField(Arg3,4,CDW2)
+    CreateDWordField(Arg3,8,CDW3)
+
+    // Save Capabilities DWord2 & 3
+    Store(CDW2,SUPP)
+    Store(CDW3,CTRL)
+
+    // Only allow native hot plug control if OS supports:
+    //  ASPM
+    //  Clock PM
+    //  MSI/MSI-X
+    If(LNotEqual(And(SUPP, 0x16), 0x16)) {
+      And(CTRL,0x1E,CTRL) // Mask bit 0 (and undefined bits)
+    }
+
+    // Always allow native PME, AER (no dependencies)
+
+    // Never allow SHPC (no SHPC controller in this system)
+    And(CTRL,0x1D,CTRL)
+
+    If(LNotEqual(Arg1,One)) {  // Unknown revision
+      Or(CDW1,0x08,CDW1)
+    }
+
+    If(LNotEqual(CDW3,CTRL)) {  // Capabilities bits were masked
+      Or(CDW1,0x10,CDW1)
+    }
+
+    // Update DWORD3 in the buffer
+    Store(CTRL,CDW3)
+    Return(Arg3)
+    } Else {
+    Or(CDW1,4,CDW1) // Unrecognized UUID
+    Return(Arg3)
+    }
+  } // End _OSC
+
+  Method (_HPX, 0) {
+    Return (Package(2) {
+      Package(6) { // PCI Setting Record
+        0x00, // Type 0
+        0x01, // Revision 1
+        0x08, // CacheLineSize in DWORDS
+        0x40, // LatencyTimer in PCI clocks
+        0x01, // Enable SERR (Boolean)
+        0x01  // Enable PERR (Boolean)
+       },
+
+       Package(18){ // PCI-X Setting Record
+       0x02,      // Type 2
+       0x01,      // Revision 1
+       0xFFFFFFFF,  // Uncorrectable Error Mask Register AND Mask, Keep ->1
+       0x00000000,  // Uncorrectable Error Mask Register OR Mask, keep ->0
+       0xFFFFFFFF,  // Uncorrectable Error Severity Register AND Mask
+       0x00000000,  // Uncorrectable Error Severity Register OR Mask
+       0xFFFFFFFF,  // Correctable Error Mask Register AND Mask
+       0x00000000,  // Correctable Error Mask Register OR Mask
+       0xFFFFFFFF,  // Advanced Error Capabilities and Control Register AND Mask
+       0x00000000,  // Advanced Error Capabilities and Control Register OR Mask
+       0xFFF7,    // Device Control Register AND Mask
+       0x0007,    // Device Control Register OR Mask
+       0xFFFF,    // Link Control Register AND Mask
+       0x0000,    // Link Control Register OR Mask
+       0xFFFFFFFF,  // Secondary Uncorrectable Error Severity Register AND Mask
+       0x00000000,  // Secondary Uncorrectable Error Severity Register OR Mask
+       0xFFFFFFFF,  // Secondary Uncorrectable Error Mask Register AND Mask
+       0x00000000   // Secondary Uncorrectable Error Mask Register OR Mask
+     }
+   })
+ }
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0xf)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x03)
+  }
+} // Device(PCI6)
+
+
+Device (PCI7)
+{                                          // PCI1 indicate host bridge 1
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 7)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0xbb)                         // Base Bus Number ??
+  Name(_CCA, 1)                            // cache coherence attribute ??
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource setting
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0xbb,                              // AddressMinimum - Minimum Bus Number
+        0xbb,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x1                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows, where to show this ??
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x400148800000,                       // Min Base Address pci address ??
+        0x400148ffffff,                       // Max Base Address
+        0x0,                               // Translate
+        0x800000                           // Length, 8M
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0xf)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x03)
+  }
+} // Device(PCI7)
+
+Device (PCI8)
+{
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 8)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0xba)                         // Base Bus Number
+  Name(_CCA, 1)                            // cache coherence attribute ??
+  Name (_PRT, Package (){
+    Package () {0xFFFF,0,0,640},         // INT_A
+    Package () {0xFFFF,1,0,641},         // INT_B
+    Package () {0xFFFF,2,0,642},         // INT_C
+    Package () {0xFFFF,3,0,643},         // INT_D
+    Package () {0x1FFFF,0,0,640},         // INT_A
+    Package () {0x1FFFF,1,0,641},         // INT_B
+    Package () {0x1FFFF,2,0,642},         // INT_C
+    Package () {0x1FFFF,3,0,643},         // INT_D
+    Package () {0x2FFFF,0,0,640},         // INT_A
+    Package () {0x2FFFF,1,0,641},         // INT_B
+    Package () {0x2FFFF,2,0,642},         // INT_C
+    Package () {0x2FFFF,3,0,643},         // INT_D
+  })
+
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource //                               setting
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0xba,                              // AddressMinimum - Minimum Bus Number
+        0xba,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x1                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x40020c000000,                       // Min Base Address pci address
+        0x40020c1fffff,                       // Max Base Address
+        0x0,                               // Translate
+        0x200000                           // Length, 2M
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0xf)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x03)
+  }
+}// Device(PCI8)
+
+Device (PCI9)
+{
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 9)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0xb8)                         // Base Bus Number ??
+  Name(_CCA, 1)                            // cache coherence attribute ??
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource //                               setting
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0xb8,                              // AddressMinimum - Minimum Bus Number
+        0xb9,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x2                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x400208000000,                       // Min Base Address pci address
+        0x400208ffffff,                       // Max Base Address
+        0x0,                               // Translate
+        0x1000000                          // Length, 16M
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0xf)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x03)
+  }
+}// Device(PCI9)
+
+Device (PCIA)
+{
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 0xA)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0xbc)                         // Base Bus Number ??
+  Name(_CCA, 1)                            // cache coherence attribute ??
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0xbc,                              // AddressMinimum - Minimum Bus Number
+        0xbd,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x2                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x400120000000,                       // Min Base Address pci address
+        0x40013fffffff,                       // Max Base Address
+        0x0,                               // Translate
+        0x20000000                         // Length, 512M
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0x0F)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x03)
+  }
+}// Device(PCIA)
+
+Device (PCIB)
+{
+  Name (_HID, "PNP0A08")                   // PCI Express Root Bridge
+  Name (_UID, 0xB)
+  Name (_CID, "PNP0A03")                   // Compatible PCI Root Bridge, Compatible ID
+  Name(_SEG, 0)                            // Segment of this Root complex
+  Name(_BBN, 0xb4)                         // Base Bus Number ??
+  Name(_CCA, 1)                            // cache coherence attribute ??
+
+  Name (_PRT, Package (){
+    Package () {0x2FFFF,0,0,640},         // INT_A
+    Package () {0x2FFFF,1,0,641},         // INT_B
+    Package () {0x2FFFF,2,0,642},         // INT_C
+    Package () {0x2FFFF,3,0,643},         // INT_D
+    Package () {0x3FFFF,0,0,640},         // INT_A
+    Package () {0x3FFFF,1,0,641},         // INT_B
+    Package () {0x3FFFF,2,0,642},         // INT_C
+    Package () {0x3FFFF,3,0,643},         // INT_D
+  })
+
+  Method (_CRS, 0, Serialized) {           // Root complex resources, _CRS: current resource setting
+    Name (RBUF, ResourceTemplate () {      // Name: 19.6.87, ResourceTemplate: 19.6.111,
+      WordBusNumber (                      // Bus numbers assigned to this root,
+        ResourceProducer,
+        MinFixed,
+        MaxFixed,
+        PosDecode,
+        0,                                 // AddressGranularity
+        0xb4,                              // AddressMinimum - Minimum Bus Number
+        0xb6,                              // AddressMaximum - Maximum Bus Number
+        0,                                 // AddressTranslation - Set to 0
+        0x3                                // RangeLength - Number of Busses
+      )
+      QWordMemory (                        // 64-bit BAR Windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Prefetchable,
+        ReadWrite,
+        0x0,                               // Granularity
+        0x400144000000,                       // Min Base Address pci address
+        0x400147ffffff,                       // Max Base Address
+        0x0,                               // Translate
+        0x4000000                          // Length, 32M
+      )
+      QWordMemory (                        // 32-bit non-prefetch BAR Windows
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        Cacheable,
+        ReadWrite,
+        0x0,                                // Granularity
+        0xa3000000,                        // Min Base Address pci address
+        0xa3ffffff,                        // Max Base Address
+        0x0,                                // Translate
+        0x1000000                          // Length, 16M
+      )
+    })                                      // Name(RBUF)
+    Return (RBUF)
+  }                                         // Method(_CRS), this method return RBUF!
+
+  Method (_STA, 0x0, NotSerialized)
+  {
+    Return (0xf)
+  }
+
+  Method (_PXM, 0, NotSerialized)
+  {
+    Return(0x03)
+  }
+}
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Power.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Power.asl
new file mode 100644
index 0000000000..39553e01af
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Power.asl
@@ -0,0 +1,28 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2016, Linaro Limited. All rights reserved.<BR>
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+
+**/
+
+Scope(_SB)
+{
+  Device(PWRB) {
+    Name(_HID, "PNP0C0C")
+    Name(_UID, Zero)
+    Method(_STA, 0x0, NotSerialized) {
+      Return(0xF)
+    }
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Rde.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Rde.asl
new file mode 100644
index 0000000000..1dcf1bba7e
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Rde.asl
@@ -0,0 +1,47 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+    This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+
+**/
+
+Scope(_SB)
+{
+  Device(RDE0) {
+    Name(_HID, "HISI0201")
+    Name(_UID, 0)
+    Name(_CCA, 1)
+    Name (_CRS, ResourceTemplate ()  {
+      //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+      QWordMemory (
+        ResourceConsumer,
+        ,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0,
+        0x209000000,
+        0x209ffffff,
+        0x0,
+        0x01000000
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI2")
+      { 586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,
+        602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617
+      }
+    })
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Sec.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Sec.asl
new file mode 100644
index 0000000000..bba455468e
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Sec.asl
@@ -0,0 +1,57 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
+    This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+
+**/
+
+Scope(_SB)
+{
+  Device(SEC0) {
+    Name (_HID, "HISI0200")
+    Name(_UID, 0)
+    Name(_CCA, 1)
+    Name (_CRS, ResourceTemplate ()  {
+      //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+      QWordMemory (
+        ResourceConsumer,
+        ,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0,
+        0x141000000,
+        0x141ffffff,
+        0x0,
+        0x01000000
+      )
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MBI3")
+      {
+        624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,
+        640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655
+      }
+    })
+  }
+
+  Device(SEC1) {
+    Name(_HID, "HISI0200")
+    Name(_UID, 1)
+    Name (_CRS, ResourceTemplate ()  {
+      Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive)
+      { 466,467
+      }
+    })
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c100k.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c100k.asl
new file mode 100644
index 0000000000..622355ade0
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c100k.asl
@@ -0,0 +1,249 @@
+/** @file
+*
+*  Copyright (c) 2018 Hisilicon Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+//
+// GPIO
+//
+
+//#include "ArmPlatform.h"
+Scope(_SB)
+{
+Device(GPO0) {
+  Name(_HID, "HISI0181")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+
+  Name (_CRS, ResourceTemplate ()  {
+    //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x201120000,
+      0x20112ffff,
+      0x0,
+      0x10000
+    )
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      476,
+    }
+  })
+
+  Device(PRTa) {
+    Name(_ADR, 0)
+    Name(_UID, 0)
+    Name(_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"reg", 0},
+        Package () {"snps,nr-gpios", 32},
+      }
+    })
+  }
+}
+
+/**
+*I2C for 100k release
+**/
+Device(I2C0) {
+  Name(_HID, "HISI02A2")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+      Package () {"i2c-sda-falling-time-ns", 913},
+      Package () {"i2c-scl-falling-time-ns", 303},
+      Package () {"i2c-sda-hold-time-ns", 1000},
+      Package () {"clock-frequency", 100000},
+    }
+  })
+
+  Name (_CRS, ResourceTemplate ()  {
+    //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x201160000,
+      0x20116ffff,
+      0x0,
+      0x10000
+    )
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      480,
+    }
+  })
+}
+
+
+/**
+*I2C for 100k vtof
+**/
+Device(I2C2) {
+  Name(_HID, "HISI0182")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+      Package () {"i2c-sda-falling-time-ns", 913},
+      Package () {"i2c-scl-falling-time-ns", 303},
+      Package () {"i2c-sda-hold-time-ns", 1000},
+      Package () {"clock-frequency", 100000},
+    }
+    })
+
+  Name (_CRS, ResourceTemplate ()  {
+    //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x201160000,
+      0x20116ffff,
+      0x0,
+      0x10000
+    )
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      480,
+    }
+  })
+}
+
+/**
+*I2C for 400k fpga
+**/
+Device(I2C3) {
+  Name(_HID, "HISI0183")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+      Package () {"i2c-sda-falling-time-ns", 300},
+      Package () {"i2c-scl-falling-time-ns", 100},
+      Package () {"i2c-sda-hold-time-ns", 250},
+      Package () {"clock-frequency", 400000},
+    }
+    })
+
+  Name (_CRS, ResourceTemplate ()  {
+  //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+  QWordMemory (
+    ResourceConsumer,
+    ,
+    MinFixed,
+    MaxFixed,
+    NonCacheable,
+    ReadWrite,
+    0x0,
+    0x201160000,
+    0x20116ffff,
+    0x0,
+    0x10000
+  )
+  Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+  {
+    480,
+  }
+  })
+}
+
+Device(LPC) {
+  Name(_HID, "HISI0191")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+    }
+  })
+
+  Name (_CRS, ResourceTemplate ()  {
+  Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+  {
+    484,
+    490
+  }
+  })
+}
+
+Device(NAD) {
+  Name(_HID, "HISI0192")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_CCA, 1)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+      Package () {"nand-bus-width", 8},
+      Package () {"nand-ecc-mode", "hw"},
+      Package () {"nand-ecc-strength", 24},
+      Package () {"nand-ecc-step-size", 1024},
+    }
+  })
+
+  Name (_CRS, ResourceTemplate ()  {
+    //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x206220000,
+      0x20622ffff,
+      0x0,
+      0x10000
+    )
+
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x206210000,
+      0x20621ffff,
+      0x0,
+      0x10000
+    )
+
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      483,
+    }
+  })
+}
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c400k.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c400k.asl
new file mode 100644
index 0000000000..5db4284467
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c400k.asl
@@ -0,0 +1,249 @@
+/** @file
+*
+*  Copyright (c) 2018 Hisilicon Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+//
+// GPIO
+//
+
+//#include "ArmPlatform.h"
+Scope(_SB)
+{
+  Device(GPO0) {
+  Name(_HID, "HISI0181")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+
+  Name (_CRS, ResourceTemplate ()  {
+    //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x201120000,
+      0x20112ffff,
+      0x0,
+      0x10000
+    )
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      476,
+    }
+  })
+
+  Device(PRTa) {
+    Name(_ADR, 0)
+    Name(_UID, 0)
+    Name(_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"reg", 0},
+        Package () {"snps,nr-gpios", 32},
+      }
+    })
+  }
+
+  }
+
+/**
+*I2C for 400k release
+**/
+Device(I2C1) {
+  Name(_HID, "HISI02A2")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+      Package () {"i2c-sda-falling-time-ns", 500},
+      Package () {"i2c-scl-falling-time-ns", 100},
+      Package () {"i2c-sda-hold-time-ns", 250},
+      Package () {"clock-frequency", 400000},
+    }
+  })
+
+  Name (_CRS, ResourceTemplate ()  {
+    //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x201160000,
+      0x20116ffff,
+      0x0,
+      0x10000
+    )
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      480,
+    }
+  })
+}
+
+/**
+*I2C for 100k vtof
+**/
+Device(I2C2) {
+  Name(_HID, "HISI0182")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+      Package () {"i2c-sda-falling-time-ns", 913},
+      Package () {"i2c-scl-falling-time-ns", 303},
+      Package () {"i2c-sda-hold-time-ns", 1000},
+      Package () {"clock-frequency", 100000},
+    }
+  })
+
+  Name (_CRS, ResourceTemplate ()  {
+    //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x201160000,
+      0x20116ffff,
+      0x0,
+      0x10000
+    )
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      480,
+    }
+  })
+}
+
+/**
+*I2C for 400k fpga
+**/
+Device(I2C3) {
+  Name(_HID, "HISI0183")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+      Package () {"i2c-sda-falling-time-ns", 300},
+      Package () {"i2c-scl-falling-time-ns", 100},
+      Package () {"i2c-sda-hold-time-ns", 250},
+      Package () {"clock-frequency", 400000},
+    }
+  })
+
+  Name (_CRS, ResourceTemplate ()  {
+    //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x201160000,
+      0x20116ffff,
+      0x0,
+      0x10000
+    )
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      480,
+    }
+  })
+}
+
+Device(LPC) {
+  Name(_HID, "HISI0191")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+    }
+  })
+
+  Name (_CRS, ResourceTemplate ()  {
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      484,
+      490
+    }
+  })
+}
+
+Device(NAD) {
+  Name(_HID, "HISI0192")
+  Name(_ADR, 0)
+  Name(_UID, 0)
+  Name(_CCA, 1)
+  Name(_DSD, Package () {
+    ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+    Package () {
+      Package () {"nand-bus-width", 8},
+      Package () {"nand-ecc-mode", "hw"},
+      Package () {"nand-ecc-strength", 24},
+      Package () {"nand-ecc-step-size", 1024},
+    }
+    })
+
+  Name (_CRS, ResourceTemplate ()  {
+    //Memory32Fixed (ReadWrite, 0x602E0000, 0x10000)
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x206220000,
+      0x20622ffff,
+      0x0,
+      0x10000
+    )
+
+    QWordMemory (
+      ResourceConsumer,
+      ,
+      MinFixed,
+      MaxFixed,
+      NonCacheable,
+      ReadWrite,
+      0x0,
+      0x206210000,
+      0x20621ffff,
+      0x0,
+      0x10000
+    )
+
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive,,,)
+    {
+      483,
+    }
+  })
+}
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/LpcUart_clk.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/LpcUart_clk.asl
new file mode 100644
index 0000000000..14e36353ad
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/LpcUart_clk.asl
@@ -0,0 +1,49 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2014, ARM Ltd. All rights reserved.<BR>
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+    This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+
+**/
+
+Scope(_SB)
+{
+  Device(UART) {
+    Name(_HID, "PNP0501")
+    Name(_UID, 0)
+    Name(_CCA, 1)
+    Name(_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"clock-frequency", 1843200},
+      }
+    })
+    Name(_CRS, ResourceTemplate() {
+      QWordMemory (
+        ResourceConsumer,
+        ,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0,
+        0x3f00003f8,
+        0x3f00003ff,
+        0x0,
+        0x8
+      )
+      Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { 484 }
+    })
+  }
+}
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Pv680UncorePmu.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Pv680UncorePmu.asl
new file mode 100644
index 0000000000..65c3eccf0a
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Pv680UncorePmu.asl
@@ -0,0 +1,1658 @@
+/** @file
+  Differentiated System Description Table Fields (DSDT)
+
+  Copyright (c) 2017, ARM Ltd. All rights reserved.<BR>
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2017, Linaro Limited. All rights reserved.<BR>
+    This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+
+**/
+
+Scope(_SB)
+{
+    // L3T0 for S0_TB(DieID:3)
+    Device (L300) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x90180000, // Min Base Address
+        0x9018FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB30")
+      {
+        832,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ccl-id", 0x00},
+      }
+    })
+
+  }
+  // L3T1 for S0_TB(DieID:3)
+  Device (L301) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 1) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x90190000, // Min Base Address
+        0x9019FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB31")
+      {
+        833,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ccl-id", 0x01},
+      }
+    })
+
+  }
+
+  // L3T2 for S0_TB(DieID:3)
+  Device (L302) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 2) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x901A0000, // Min Base Address
+        0x901AFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB32")
+      {
+        834,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ccl-id", 0x02},
+      }
+    })
+
+  }
+
+  // L3T3 for S0_TB(DieID:3)
+  Device (L303) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 3) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x901B0000, // Min Base Address
+        0x901BFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB33")
+      {
+        835,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ccl-id", 0x03},
+      }
+    })
+
+  }
+  // L3T4 for S0_TB(DieID:3)
+  Device (L304) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 4) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x901C0000, // Min Base Address
+        0x901CFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB34")
+      {
+        836,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ccl-id", 0x04},
+      }
+    })
+
+  }
+  // L3T5 for S0_TB(DieID:3)
+  Device (L305) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 5) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x901D0000, // Min Base Address
+        0x901DFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB35")
+      {
+        837,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ccl-id", 0x05},
+      }
+    })
+
+  }
+
+  // DDRC0 for S0_TB(DieID:3)
+  Device (DDR0) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 0) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // DDRC address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x94D20000, // Min Base Address
+        0x94D2FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB38")
+      {
+        844,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ch-id", 0x0},
+      }
+    })
+
+  }
+  // DDRC1 for S0_TB(DieID:3)
+  Device (DDR1) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 1) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // DDRC address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x94D30000, // Min Base Address
+        0x94D3FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB39")
+      {
+        845,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ch-id", 0x1},
+      }
+    })
+
+  }
+  // DDRC2 for S0_TB(DieID:3)
+  Device (DDR2) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 2) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // DDRC address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x94D40000, // Min Base Address
+        0x94D4FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB3A")
+      {
+        846,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ch-id", 0x2},
+      }
+    })
+
+  }
+  // DDRC3 for S0_TB(DieID:3)
+  Device (DDR3) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 3) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // DDRC address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x94D50000, // Min Base Address
+        0x94D5FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB3B")
+      {
+        847,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03},
+        Package () {"hisilicon,ch-id", 0x3},
+      }
+    })
+
+  }
+
+  // HHA0 for S0_TB(DieID:3)
+  Device (HHA0) {
+    Name (_HID, "HISI0243")  // _HID: Hardware ID
+    Name (_UID, 0)  // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // HHA address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x90120000, // Min Base Address
+        0x9012FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB3C")
+      {
+        848,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03}
+      }
+    })
+  }
+
+  // HHA1 for S0_TB(DieID:3)
+  Device (HHA1) {
+    Name (_HID, "HISI0243")  // _HID: Hardware ID
+    Name (_UID, 1)  // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // HHA address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x90130000, // Min Base Address
+        0x9013FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+    Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB3D")
+    {
+      849,
+    }
+  })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x03}
+      }
+    })
+  }
+
+  // L3T0 for S0_TA(DieID:1)
+  Device (L308) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x08) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x98180000, // Min Base Address
+        0x9818FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB10")
+      {
+        832,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ccl-id", 0x00},
+      }
+    })
+
+  }
+  // L3T1 for S0_TA(DieID:1)
+  Device (L309) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x09) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x98190000, // Min Base Address
+        0x9819FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB11")
+      {
+        833,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ccl-id", 0x01},
+      }
+    })
+
+  }
+
+  // L3T2 for S0_TA(DieID:1)
+  Device (L30A) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x0A) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x981A0000, // Min Base Address
+        0x981AFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB12")
+      {
+        834,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ccl-id", 0x02},
+      }
+    })
+
+  }
+
+  // L3T3 for S0_TA(DieID:1)
+  Device (L30B) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x0B) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x981B0000, // Min Base Address
+        0x981BFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB13")
+      {
+        835,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ccl-id", 0x03},
+      }
+    })
+
+  }
+  // L3T4 for S0_TA(DieID:1)
+  Device (L30C) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x0C) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x981C0000, // Min Base Address
+        0x981CFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB14")
+      {
+        836,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ccl-id", 0x04},
+      }
+    })
+
+  }
+  // L3T5 for S0_TA(DieID:1)
+  Device (L30D) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x0D) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x981D0000, // Min Base Address
+        0x981DFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB15")
+      {
+        837,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ccl-id", 0x05},
+      }
+    })
+
+  }
+
+  // DDRC0 for S0_TA(DieID:1)
+  Device (DDR4) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 4) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x9CD20000, // Min Base Address
+        0x9CD2FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB18")
+      {
+        844,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ch-id", 0x0},
+      }
+    })
+
+  }
+  // DDRC1 for S0_TA(DieID:1)
+  Device (DDR5) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 5) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x9CD30000, // Min Base Address
+        0x9CD3FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB19")
+      {
+        845,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ch-id", 0x1},
+      }
+    })
+
+  }
+  // DDRC2 for S0_TA(DieID:1)
+  Device (DDR6) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 6) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x9CD40000, // Min Base Address
+        0x9CD4FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB1A")
+      {
+        846,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ch-id", 0x2},
+      }
+    })
+
+  }
+  // DDRC3 for S0_TA(DieID:1)
+  Device (DDR7) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 7) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x9CD50000, // Min Base Address
+        0x9CD5FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB1B")
+      {
+        847,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01},
+        Package () {"hisilicon,ch-id", 0x3},
+      }
+    })
+  }
+
+  // HHA0 for S0_TA(DieID:1)
+  Device (HHA2) {
+    Name (_HID, "HISI0243")  // _HID: Hardware ID
+    Name (_UID, 2)  // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // HHA address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x98120000, // Min Base Address
+        0x9812FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB1C")
+      {
+        848,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01}
+      }
+    })
+  }
+
+  // HHA1 for S0_TA(DieID:1)
+  Device (HHA3) {
+    Name (_HID, "HISI0243")  // _HID: Hardware ID
+    Name (_UID, 3)  // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // HHA address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x98130000, // Min Base Address
+        0x9813FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+    Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB1D")
+    {
+      849,
+    }
+  })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x01}
+      }
+    })
+  }
+
+  // It is the list PMU node of Socket1
+  // L3T0 for S1_TB(DieID:7)
+    Device (L310) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x10) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400090180000, // Min Base Address
+        0x40009018FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB70")
+      {
+        832,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ccl-id", 0x00},
+      }
+    })
+
+  }
+  // L3T1 for S1_TB(DieID:7)
+  Device (L311) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x11) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400090190000, // Min Base Address
+        0x40009019FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB71")
+      {
+        833,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ccl-id", 0x01},
+      }
+    })
+
+  }
+
+  // L3T2 for S1_TB(DieID:7)
+  Device (L312) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x12) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x4000901A0000, // Min Base Address
+        0x4000901AFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB72")
+      {
+        834,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ccl-id", 0x02},
+      }
+    })
+
+  }
+
+  // L3T3 for S1_TB(DieID:7)
+  Device (L313) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x13) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x4000901B0000, // Min Base Address
+        0x4000901BFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB73")
+      {
+        835,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ccl-id", 0x03},
+      }
+    })
+
+  }
+  // L3T4 for S1_TB(DieID:7)
+  Device (L314) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x14) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x4000901C0000, // Min Base Address
+        0x4000901CFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB74")
+      {
+        836,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ccl-id", 0x04},
+      }
+    })
+
+  }
+  // L3T5 for S1_TB(DieID:7)
+  Device (L315) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x15) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x4000901D0000, // Min Base Address
+        0x4000901DFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB75")
+      {
+        837,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ccl-id", 0x05},
+      }
+    })
+
+  }
+
+  // DDRC0 for S1_TB(DieID:7)
+  Device (DDR8) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 8) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // DDRC address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400094D20000, // Min Base Address
+        0x400094D2FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB78")
+      {
+        844,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ch-id", 0x0},
+      }
+    })
+
+  }
+  // DDRC1 for S1_TB(DieID:7)
+  Device (DDR9) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 9) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // DDRC address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400094D30000, // Min Base Address
+        0x400094D3FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB79")
+      {
+        845,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ch-id", 0x1},
+      }
+    })
+
+  }
+  // DDRC2 for S1_TB(DieID:7)
+  Device (DDRA) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 0xA) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // DDRC address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400094D40000, // Min Base Address
+        0x400094D4FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB7A")
+      {
+        846,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ch-id", 0x2},
+      }
+    })
+
+  }
+  // DDRC3 for S1_TB(DieID:7)
+  Device (DDRB) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 0xB) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // DDRC address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400094D50000, // Min Base Address
+        0x400094D5FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB7B")
+      {
+        847,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07},
+        Package () {"hisilicon,ch-id", 0x3},
+      }
+    })
+
+  }
+
+  // HHA0 for S1_TB(DieID:7)
+  Device (HHA4) {
+    Name (_HID, "HISI0243")  // _HID: Hardware ID
+    Name (_UID, 4)  // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // HHA address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400090120000, // Min Base Address
+        0x40009012FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB7C")
+      {
+        848,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07}
+      }
+    })
+  }
+
+  // HHA1 for S1_TB(DieID:7)
+  Device (HHA5) {
+    Name (_HID, "HISI0243")  // _HID: Hardware ID
+    Name (_UID, 5)  // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // HHA address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400090130000, // Min Base Address
+        0x40009013FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+    Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB7D")
+    {
+      849,
+    }
+  })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x07}
+      }
+    })
+  }
+
+  // L3T0 for S1_TA(DieID:5)
+  Device (L318) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x18) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400098180000, // Min Base Address
+        0x40009818FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB50")
+      {
+        832,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ccl-id", 0x00},
+      }
+    })
+
+  }
+  // L3T1 for S1_TA(DieID:5)
+  Device (L319) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x19) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400098190000, // Min Base Address
+        0x40009819FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB51")
+      {
+        833,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ccl-id", 0x01},
+      }
+    })
+
+  }
+
+  // L3T2 for S1_TA(DieID:5)
+  Device (L31A) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x1A) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x4000981A0000, // Min Base Address
+        0x4000981AFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB52")
+      {
+        834,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ccl-id", 0x02},
+      }
+    })
+
+  }
+
+  // L3T3 for S1_TA(DieID:5)
+  Device (L31B) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x1B) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x4000981B0000, // Min Base Address
+        0x4000981BFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB53")
+      {
+        835,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ccl-id", 0x03},
+      }
+    })
+
+  }
+  // L3T4 for S1_TA(DieID:5)
+  Device (L31C) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x1C) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x4000981C0000, // Min Base Address
+        0x4000981CFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB54")
+      {
+        836,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ccl-id", 0x04},
+      }
+    })
+
+  }
+  // L3T5 for S1_TA(DieID:5)
+  Device (L31D) {
+    Name (_HID, "HISI0213") // _HID: Hardware ID
+    Name (_UID, 0x1D) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x4000981D0000, // Min Base Address
+        0x4000981DFFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB55")
+      {
+        837,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ccl-id", 0x05},
+      }
+    })
+
+  }
+
+  // DDRC0 for S1_TA(DieID:5)
+  Device (DDRC) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 0xC) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x40009CD20000, // Min Base Address
+        0x40009CD2FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB58")
+      {
+        844,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ch-id", 0x0},
+      }
+    })
+
+  }
+  // DDRC1 for S1_TA(DieID:5)
+  Device (DDRD) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 0xD) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x40009CD30000, // Min Base Address
+        0x40009CD3FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB59")
+      {
+        845,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ch-id", 0x1},
+      }
+    })
+
+  }
+  // DDRC2 for S1_TA(DieID:5)
+  Device (DDRE) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 0xE) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x40009CD40000, // Min Base Address
+        0x40009CD4FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB5A")
+      {
+        846,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ch-id", 0x2},
+      }
+    })
+
+  }
+  // DDRC3 for S1_TA(DieID:5)
+  Device (DDRF) {
+    Name (_HID, "HISI0233") // _HID: Hardware ID
+    Name (_UID, 0xF) // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // L3T address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x40009CD50000, // Min Base Address
+        0x40009CD5FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB5B")
+      {
+        847,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05},
+        Package () {"hisilicon,ch-id", 0x3},
+      }
+    })
+  }
+
+    // HHA0 for S1_TA(DieID:5)
+  Device (HHA6) {
+    Name (_HID, "HISI0243")  // _HID: Hardware ID
+    Name (_UID, 6)  // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // HHA address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400098120000, // Min Base Address
+        0x40009812FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+      Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB5C")
+      {
+        848,
+      }
+    })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05}
+      }
+    })
+  }
+  // HHA1 for S0_TA(DieID:5)
+  Device (HHA7) {
+    Name (_HID, "HISI0243")  // _HID: Hardware ID
+    Name (_UID, 7)  // _UID: Unique ID
+    Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+      QWordMemory ( // HHA address base
+        ResourceProducer,
+        PosDecode,
+        MinFixed,
+        MaxFixed,
+        NonCacheable,
+        ReadWrite,
+        0x0, // Granularity
+        0x400098130000, // Min Base Address
+        0x40009813FFFF, // Max Base Address
+        0x0, // Translate
+        0x10000 // Length
+      )
+
+    Interrupt (ResourceConsumer, Edge, ActiveHigh, Exclusive, 0, "\\_SB.MB5D")
+    {
+      849,
+    }
+  })
+
+    Name (_DSD, Package () {
+      ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+      Package () {
+        Package () {"hisilicon,scl-id", 0x05}
+      }
+    })
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/ipmi.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/ipmi.asl
new file mode 100644
index 0000000000..555fe39936
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/ipmi.asl
@@ -0,0 +1,49 @@
+/** @file
+*
+*  Copyright (c) 2018 Hisilicon Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+//
+// LPC
+//
+
+Scope(_SB) {
+  Device (IPI0) {
+  Name (_HID, "IPI0001")
+  Name (_UID, 0)
+  Name (_STR, Unicode("IPMI_BT"))
+  Name(_CCA, 1)
+  //Name (_CID, "IPI0001")
+  Method (_IFT) {
+    Return (0x03)
+  }
+  Method (_SRV) {
+    Return (0x0200)   // IPMI Spec Revision 2.0
+  }
+  Name (_CRS, ResourceTemplate () { // _CRS: Current Resource Settings
+    QWordMemory ( // BMC memory region
+      ResourceConsumer,
+      PosDecode,
+      MinFixed,
+      MaxFixed,
+      Cacheable,
+      ReadWrite,
+      0x0, // Granularity
+      0x3f00000e4, // Min Base Address
+      0x3f00000e7, // Max Base Address
+      0x0, // Translate
+      0x4 // Length
+    )
+    Interrupt(ResourceConsumer, Level, ActiveHigh, Exclusive) { 484 }
+  })
+  }
+}
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Facs.aslc b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Facs.aslc
new file mode 100644
index 0000000000..9e57936b85
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Facs.aslc
@@ -0,0 +1,67 @@
+/** @file
+*  Firmware ACPI Control Structure (FACS)
+*
+*  Copyright (c) 2012 - 2014, ARM Limited. All rights reserved.
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2015, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+*
+**/
+
+#include <IndustryStandard/Acpi.h>
+
+EFI_ACPI_6_2_FIRMWARE_ACPI_CONTROL_STRUCTURE Facs = {
+  EFI_ACPI_6_2_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE, // UINT32  Signature
+  sizeof (EFI_ACPI_6_2_FIRMWARE_ACPI_CONTROL_STRUCTURE),  // UINT32  Length
+  0xA152,                                                 // UINT32  HardwareSignature
+  0,                                                      // UINT32  FirmwareWakingVector
+  0,                                                      // UINT32  GlobalLock
+  0,                                                      // UINT32  Flags
+  0,                                                      // UINT64  XFirmwareWakingVector
+  EFI_ACPI_6_2_FIRMWARE_ACPI_CONTROL_STRUCTURE_VERSION,   // UINT8   Version;
+    { EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved0[0]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved0[1]
+      EFI_ACPI_RESERVED_BYTE },                           // UINT8   Reserved0[2]
+  0,                                                      // UINT32  OspmFlags  "Platform firmware must
+                                                          //                    initialize this field to zero."
+    { EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[0]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[1]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[2]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[3]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[4]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[5]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[6]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[7]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[8]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[9]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[10]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[11]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[12]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[13]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[14]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[15]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[16]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[17]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[18]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[19]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[20]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[21]
+      EFI_ACPI_RESERVED_BYTE,                             // UINT8   Reserved1[22]
+      EFI_ACPI_RESERVED_BYTE },                           // UINT8   Reserved1[23]
+};
+
+//
+// Reference the table being generated to prevent the optimizer from removing the
+// data structure from the executable
+//
+VOID* CONST ReferenceAcpiTable = &Facs;
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Fadt.aslc b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Fadt.aslc
new file mode 100644
index 0000000000..e7ee6981ec
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Fadt.aslc
@@ -0,0 +1,91 @@
+/** @file
+*  Fixed ACPI Description Table (FADT)
+*
+*  Copyright (c) 2012 - 2014, ARM Limited. All rights reserved.
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2015, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+*
+**/
+
+#include "Hi1620Platform.h"
+
+#include <Library/AcpiLib.h>
+#include <IndustryStandard/Acpi.h>
+
+EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE Fadt = {
+  ARM_ACPI_HEADER (
+    EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE,
+    EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE,
+    EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_REVISION
+  ),
+  0,                                                                        // UINT32     FirmwareCtrl
+  0,                                                                        // UINT32     Dsdt
+  EFI_ACPI_RESERVED_BYTE,                                                   // UINT8      Reserved0
+  EFI_ACPI_6_2_PM_PROFILE_UNSPECIFIED,                                      // UINT8      PreferredPmProfile
+  0,                                                                        // UINT16     SciInt
+  0,                                                                        // UINT32     SmiCmd
+  0,                                                                        // UINT8      AcpiEnable
+  0,                                                                        // UINT8      AcpiDisable
+  0,                                                                        // UINT8      S4BiosReq
+  0,                                                                        // UINT8      PstateCnt
+  0,                                                                        // UINT32     Pm1aEvtBlk
+  0,                                                                        // UINT32     Pm1bEvtBlk
+  0,                                                                        // UINT32     Pm1aCntBlk
+  0,                                                                        // UINT32     Pm1bCntBlk
+  0,                                                                        // UINT32     Pm2CntBlk
+  0,                                                                        // UINT32     PmTmrBlk
+  0,                                                                        // UINT32     Gpe0Blk
+  0,                                                                        // UINT32     Gpe1Blk
+  0,                                                                        // UINT8      Pm1EvtLen
+  0,                                                                        // UINT8      Pm1CntLen
+  0,                                                                        // UINT8      Pm2CntLen
+  0,                                                                        // UINT8      PmTmrLen
+  0,                                                                        // UINT8      Gpe0BlkLen
+  0,                                                                        // UINT8      Gpe1BlkLen
+  0,                                                                        // UINT8      Gpe1Base
+  0,                                                                        // UINT8      CstCnt
+  0,                                                                        // UINT16     PLvl2Lat
+  0,                                                                        // UINT16     PLvl3Lat
+  0,                                                                        // UINT16     FlushSize
+  0,                                                                        // UINT16     FlushStride
+  0,                                                                        // UINT8      DutyOffset
+  0,                                                                        // UINT8      DutyWidth
+  0,                                                                        // UINT8      DayAlrm
+  0,                                                                        // UINT8      MonAlrm
+  0,                                                                        // UINT8      Century
+  0,                                                                        // UINT16     IaPcBootArch
+  0,                                                                        // UINT8      Reserved1
+  EFI_ACPI_6_2_HW_REDUCED_ACPI | EFI_ACPI_6_2_LOW_POWER_S0_IDLE_CAPABLE,    // UINT32     Flags
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  ResetReg
+  0,                                                                        // UINT8      ResetValue
+  EFI_ACPI_6_2_ARM_PSCI_COMPLIANT,                                          // UINT16     ArmBootArchFlags
+  EFI_ACPI_6_2_FIXED_ACPI_DESCRIPTION_TABLE_MINOR_REVISION,                 // UINT8      MinorRevision
+  0,                                                                        // UINT64     XFirmwareCtrl
+  0,                                                                        // UINT64     XDsdt
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  XPm1aEvtBlk
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  XPm1bEvtBlk
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  XPm1aCntBlk
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  XPm1bCntBlk
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  XPm2CntBlk
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  XPmTmrBlk
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  XGpe0Blk
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  XGpe1Blk
+  NULL_GAS,                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  SleepControlReg
+  NULL_GAS                                                                 // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  SleepStatusReg
+};
+
+//
+// Reference the table being generated to prevent the optimizer from removing the
+// data structure from the executable
+//
+VOID* CONST ReferenceAcpiTable = &Fadt;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Gtdt.aslc b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Gtdt.aslc
new file mode 100644
index 0000000000..45f5d20704
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Gtdt.aslc
@@ -0,0 +1,86 @@
+/** @file
+*  Generic Timer Description Table (GTDT)
+*
+*  Copyright (c) 2012 - 2014, ARM Limited. All rights reserved.
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2015, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+*
+**/
+
+#include "Hi1620Platform.h"
+
+#include <Library/AcpiLib.h>
+#include <Library/PcdLib.h>
+#include <IndustryStandard/Acpi.h>
+
+#define GTDT_TIMER_EDGE_TRIGGERED   EFI_ACPI_6_2_GTDT_TIMER_FLAG_TIMER_INTERRUPT_MODE
+#define GTDT_TIMER_LEVEL_TRIGGERED  0
+#define GTDT_TIMER_ACTIVE_LOW       EFI_ACPI_6_2_GTDT_TIMER_FLAG_TIMER_INTERRUPT_POLARITY
+#define GTDT_TIMER_ACTIVE_HIGH      0
+#define SYSTEM_TIMER_BASE_ADDRESS     0xFFFFFFFFFFFFFFFF
+
+#define GTDT_GTIMER_FLAGS           (GTDT_TIMER_ACTIVE_LOW | GTDT_TIMER_LEVEL_TRIGGERED)
+
+#pragma pack (1)
+
+typedef struct {
+  EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE          Gtdt;
+  EFI_ACPI_6_2_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE     Watchdogs[HI1620_WATCHDOG_COUNT];
+} EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLES;
+
+#pragma pack ()
+
+EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLES Gtdt = {
+  {
+    ARM_ACPI_HEADER(
+      EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE,
+      EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE,
+      EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION
+    ),
+    SYSTEM_TIMER_BASE_ADDRESS,                    // UINT64  PhysicalAddress
+    0,                                            // UINT32  Reserved
+    FixedPcdGet32 (PcdArmArchTimerSecIntrNum),    // UINT32  SecurePL1TimerGSIV
+    GTDT_GTIMER_FLAGS,                            // UINT32  SecurePL1TimerFlags
+    FixedPcdGet32 (PcdArmArchTimerIntrNum),       // UINT32  NonSecurePL1TimerGSIV
+    GTDT_GTIMER_FLAGS,                            // UINT32  NonSecurePL1TimerFlags
+    FixedPcdGet32 (PcdArmArchTimerVirtIntrNum),   // UINT32  VirtualTimerGSIV
+    GTDT_GTIMER_FLAGS,                            // UINT32  VirtualTimerFlags
+    FixedPcdGet32 (PcdArmArchTimerHypIntrNum),    // UINT32  NonSecurePL2TimerGSIV
+    GTDT_GTIMER_FLAGS,                            // UINT32  NonSecurePL2TimerFlags
+    0xFFFFFFFFFFFFFFFF,                           // UINT64  CntReadBasePhysicalAddress
+#ifdef notyet
+    PV660_WATCHDOG_COUNT,                          // UINT32  PlatformTimerCount
+    sizeof (EFI_ACPI_6_2_GENERIC_TIMER_DESCRIPTION_TABLE) // UINT32 PlatfromTimerOffset
+  },
+  {
+    {
+      EFI_ACPI_6_2_GTDT_SBSA_GENERIC_WATCHDOG, sizeof(EFI_ACPI_6_2_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE),
+      EFI_ACPI_RESERVED_BYTE, 0, 0, 0, 0
+    },
+    {
+      EFI_ACPI_6_2_GTDT_SBSA_GENERIC_WATCHDOG, sizeof(EFI_ACPI_6_2_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE),
+      EFI_ACPI_RESERVED_BYTE, 0, 0, 0, 0
+    }
+  }
+#else /* !notyet */
+  0, 0
+  }
+#endif
+  };
+
+//
+// Reference the table being generated to prevent the optimizer from removing the
+// data structure from the executable
+//
+VOID* CONST ReferenceAcpiTable = &Gtdt;
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Dbg2.aslc b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Dbg2.aslc
new file mode 100644
index 0000000000..342ec33629
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Dbg2.aslc
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2018 Linaro Limited
+ * Copyright (c) 2018 Hisilicon Limited
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the BSD License which accompanies
+ * this distribution, and is available at
+ * http://opensource.org/licenses/bsd-license.php
+ *
+*/
+
+#include <IndustryStandard/Acpi.h>
+#include <IndustryStandard/DebugPort2Table.h>
+#include <Library/AcpiLib.h>
+#include <Library/PcdLib.h>
+#include "Hi1620Platform.h"
+
+#define NUMBER_DEBUG_DEVICE_INFO    1
+#define NUMBER_OF_GENERIC_ADDRESS   1
+#define NAMESPACE_STRING_SIZE       8
+#define UART_LENGTH                 0x1000
+
+#pragma pack(1)
+
+typedef struct {
+  EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT DdiHeader;
+  EFI_ACPI_6_1_GENERIC_ADDRESS_STRUCTURE Address[NUMBER_OF_GENERIC_ADDRESS];
+  UINT32 AddressSize[NUMBER_OF_GENERIC_ADDRESS];
+  CHAR8  NamespaceString[NAMESPACE_STRING_SIZE];
+} EFI_ACPI_DBG2_DDI_STRUCT;
+
+typedef struct {
+  EFI_ACPI_DEBUG_PORT_2_DESCRIPTION_TABLE Desc;
+  EFI_ACPI_DBG2_DDI_STRUCT Ddi[NUMBER_DEBUG_DEVICE_INFO];
+} EFI_ACPI_DEBUG_PORT_2_TABLE;
+
+#pragma pack()
+
+EFI_ACPI_DEBUG_PORT_2_TABLE Dbg2 = {
+  {
+    ARM_ACPI_HEADER(
+      EFI_ACPI_6_1_DEBUG_PORT_2_TABLE_SIGNATURE,
+      EFI_ACPI_DEBUG_PORT_2_TABLE,
+      EFI_ACPI_DEBUG_PORT_2_TABLE_REVISION
+      ),
+    OFFSET_OF(EFI_ACPI_DEBUG_PORT_2_TABLE, Ddi),
+    NUMBER_DEBUG_DEVICE_INFO
+  },
+  {
+    {
+      {
+        EFI_ACPI_DBG2_DEBUG_DEVICE_INFORMATION_STRUCT_REVISION,
+        sizeof(EFI_ACPI_DBG2_DDI_STRUCT),
+        NUMBER_OF_GENERIC_ADDRESS,
+        NAMESPACE_STRING_SIZE,
+        OFFSET_OF(EFI_ACPI_DBG2_DDI_STRUCT, NamespaceString),
+        0,  //OemDataLength
+        0,  //OemDataOffset
+        EFI_ACPI_DBG2_PORT_TYPE_SERIAL,
+         EFI_ACPI_DBG2_PORT_SUBTYPE_SERIAL_ARM_PL011_UART,
+        {EFI_ACPI_RESERVED_BYTE, EFI_ACPI_RESERVED_BYTE},
+        OFFSET_OF(EFI_ACPI_DBG2_DDI_STRUCT, Address),
+        OFFSET_OF(EFI_ACPI_DBG2_DDI_STRUCT, AddressSize),
+      },
+      {
+        {
+          EFI_ACPI_6_1_SYSTEM_MEMORY,
+          32,
+          0,
+          EFI_ACPI_6_1_BYTE,
+          FixedPcdGet64 (PcdSerialDbgRegisterBase)
+        }
+      },
+      {
+        UART_LENGTH
+      },
+      "COM1"
+    }
+  }
+};
+
+//
+// Reference the table being generated to prevent the optimizer from removing the
+// data structure from the executable
+//
+VOID* CONST ReferenceAcpiTable = &Dbg2;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Iort.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Iort.asl
new file mode 100644
index 0000000000..33b5d5250b
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Iort.asl
@@ -0,0 +1,1989 @@
+/*
+ * Intel ACPI Component Architecture
+ * iASL Compiler/Disassembler version 20151124-64
+ * Copyright (c) 2000 - 2015 Intel Corporation
+ *
+ * Template for [IORT] ACPI Table (static data table)
+ * Format: [ByteLength]  FieldName : HexFieldValue
+ */
+[0004]                          Signature : "IORT"    [IO Remapping Table]
+[0004]                       Table Length : 01c8
+[0001]                           Revision : 00
+[0001]                           Checksum : BC
+[0006]                             Oem ID : "HISI  "            // ?
+[0008]                       Oem Table ID : "HIP08   "          // ?
+[0004]                       Oem Revision : 00000000            // ?
+[0004]                    Asl Compiler ID : "INTL"
+[0004]              Asl Compiler Revision : 20150410
+
+[0004]                         Node Count : 00000005           // ITS, SMMU and RC
+[0004]                        Node Offset : 00000034           // ?
+[0004]                           Reserved : 00000000
+[0004]                   Optional Padding : 00 00 00 00
+
+/* 0x34 ITS, for PCIe */
+/* Here we use the P680/Hi1620 ACPI table which includes MADT table to help to debuge */
+[0001]                               Type : 00
+[0002]                             Length : 0018
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000000           // ?
+[0004]                     Mapping Offset : 00000000           // ?
+
+[0004]                           ItsCount : 00000001           // ?
+[0004]                        Identifiers : 00000000           // how to refer to MADT ?
+
+/* 0x4c SMMU for PCIe host bridge 0 and 1 */
+[0001]                               Type : 04
+[0002]                             Length : 0080
+[0001]                           Revision : 01
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000003
+[0004]                     Mapping Offset : 00000044
+
+[0008]                       Base Address : 148000000
+[0004]              Flags (decoded below) : 00000009
+                          COHACC Override : 1
+                            HTTU Override : 0
+                   Proximity Domain Valid : 1
+[0004]                           Reserved : 00000000
+[0008]                      VATOS Address : 0
+[0004]                              Model : 00000000
+[0004]                    Event Interrupt : 00000000
+[0004]                      PRI Interrupt : 00000000
+[0004]                     GERR Interrupt : 00000000
+[0004]                     Sync Interrupt : 00000000
+[0001]                   Proximity Domain : 01
+[0001]                           Reserved : 00
+[0002]                           Reserved : 0000
+[0004]             DeviceID mapping index : 00000002
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00004000
+[0004]                        Output Base : 00000000
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+[0004]                         Input base : 00007b00
+[0004]                           ID Count : 00000100
+[0004]                        Output Base : 00007b00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+[0004]                         Input base : 00000000   //single mapping will ignore input base
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F01
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* 0xCC SMMU for PCIe host bridge 4 */
+[0001]                               Type : 04
+[0002]                             Length : 006C
+[0001]                           Revision : 01
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000044
+
+[0008]                       Base Address : 100000000
+[0004]              Flags (decoded below) : 00000009
+                          COHACC Override : 1
+                            HTTU Override : 0
+                   Proximity Domain Valid : 1
+[0004]                           Reserved : 00000000
+[0008]                      VATOS Address : 0
+[0004]                              Model : 00000000
+[0004]                    Event Interrupt : 00000000
+[0004]                      PRI Interrupt : 00000000
+[0004]                     GERR Interrupt : 00000000
+[0004]                     Sync Interrupt : 00000000
+[0001]                   Proximity Domain : 01
+[0001]                           Reserved : 00
+[0002]                           Reserved : 0000
+[0004]             DeviceID mapping index : 0001
+
+[0004]                         Input base : 00007c00
+[0004]                           ID Count : 00000200
+[0004]                        Output Base : 00007c00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+[0004]                         Input base : 00000000   //single mapping will ignore input base
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F03
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* 0x138 */
+/* SMMU for PCIe host bridge 5 */
+[0001]                               Type : 04
+[0002]                             Length : 006C
+[0001]                           Revision : 01
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000044
+
+[0008]                       Base Address : 140000000
+[0004]              Flags (decoded below) : 00000009
+                          COHACC Override : 1
+                            HTTU Override : 0
+                   Proximity Domain Valid : 1
+[0004]                           Reserved : 00000000
+[0008]                      VATOS Address : 0
+[0004]                              Model : 00000000
+[0004]                    Event Interrupt : 00000000
+[0004]                      PRI Interrupt : 00000000
+[0004]                     GERR Interrupt : 00000000
+[0004]                     Sync Interrupt : 00000000
+[0001]                   Proximity Domain : 01
+[0001]                           Reserved : 00
+[0002]                           Reserved : 0000
+[0004]             DeviceID mapping index : 00000001
+
+[0004]                         Input base : 00007400
+[0004]                           ID Count : 00000300
+[0004]                        Output Base : 00007400
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+[0004]                         Input base : 00000000   //single mapping will ignore input base
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F04
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+// Here for Chip1 SMMU settings
+/* 0x1A4 SMMU for PCIe host bridge 6 and 7 */
+[0001]                               Type : 04
+[0002]                             Length : 0080
+[0001]                           Revision : 01
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000003
+[0004]                     Mapping Offset : 00000044
+
+[0008]                       Base Address : 400148000000
+[0004]              Flags (decoded below) : 00000009
+                          COHACC Override : 1
+                            HTTU Override : 0
+                   Proximity Domain Valid : 1
+[0004]                           Reserved : 00000000
+[0008]                      VATOS Address : 0
+[0004]                              Model : 00000000
+[0004]                    Event Interrupt : 00000000
+[0004]                      PRI Interrupt : 00000000
+[0004]                     GERR Interrupt : 00000000
+[0004]                     Sync Interrupt : 00000000
+[0001]                   Proximity Domain : 03
+[0001]                           Reserved : 00
+[0002]                           Reserved : 0000
+[0004]             DeviceID mapping index : 00000002
+
+[0004]                         Input base : 00008000
+[0004]                           ID Count : 00002000
+[0004]                        Output Base : 00008000
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+[0004]                         Input base : 0000bb00
+[0004]                           ID Count : 00000100
+[0004]                        Output Base : 0000bb00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+[0004]                         Input base : 00000000   //single mapping will ignore input base
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF01
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* 0x224 SMMU for PCIe host bridge 10 */
+[0001]                               Type : 04
+[0002]                             Length : 006C
+[0001]                           Revision : 01
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000044
+
+[0008]                       Base Address : 400100000000
+[0004]              Flags (decoded below) : 00000009
+                          COHACC Override : 1
+                            HTTU Override : 0
+                   Proximity Domain Valid : 1
+[0004]                           Reserved : 00000000
+[0008]                      VATOS Address : 0
+[0004]                              Model : 00000000
+[0004]                    Event Interrupt : 00000000
+[0004]                      PRI Interrupt : 00000000
+[0004]                     GERR Interrupt : 00000000
+[0004]                     Sync Interrupt : 00000000
+[0001]                   Proximity Domain : 03
+[0001]                           Reserved : 00
+[0002]                           Reserved : 0000
+[0004]             DeviceID mapping index : 0001
+
+[0004]                         Input base : 0000BC00
+[0004]                           ID Count : 00000200
+[0004]                        Output Base : 0000BC00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+[0004]                         Input base : 00000000   //single mapping will ignore input base
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF03
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* 0x290*/
+/* SMMU for PCIe host bridge 11 */
+[0001]                               Type : 04
+[0002]                             Length : 006C
+[0001]                           Revision : 01
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000044
+
+[0008]                       Base Address : 400140000000
+[0004]              Flags (decoded below) : 00000009
+                          COHACC Override : 1
+                            HTTU Override : 0
+                   Proximity Domain Valid : 1
+[0004]                           Reserved : 00000000
+[0008]                      VATOS Address : 0
+[0004]                              Model : 00000000
+[0004]                    Event Interrupt : 00000000
+[0004]                      PRI Interrupt : 00000000
+[0004]                     GERR Interrupt : 00000000
+[0004]                     Sync Interrupt : 00000000
+[0001]                   Proximity Domain : 03
+[0001]                           Reserved : 00
+[0002]                           Reserved : 0000
+[0004]             DeviceID mapping index : 00000001
+
+[0004]                         Input base : 0000B400
+[0004]                           ID Count : 00000300
+[0004]                        Output Base : 0000B400
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+[0004]                         Input base : 00000000   //single mapping will ignore input base
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF04
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/*0x2FC RC 0 */
+[0001]                               Type : 02
+[0002]                             Length : 00A0
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 0000000C
+[0004]                     Mapping Offset : 00000028
+
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000001
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0004]                      ATS Attribute : 00000000
+[0004]                 PCI Segment Number : 00000000           // should match with above MCFG
+
+/* BDF of pcie host 0 -> stream ID of pcie 0/1 SMMU */
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00004000          // the number of IDs in range
+[0004]                        Output Base : 00000000
+[0004]                   Output Reference : 0000004c
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* BDF of pcie host 1 -> stream ID of pcie 0/1 SMMU */
+[0004]                         Input base : 00007b00
+[0004]                           ID Count : 00000100          // the number of IDs in range
+[0004]                        Output Base : 00007b00
+[0004]                   Output Reference : 0000004c
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* host2 and host3 should no open smmu for chips smmu bug *
+/* BDF of pcie host 2 -> stream ID of pcie 0/1 ITS */
+[0004]                         Input base : 00007a00
+[0004]                           ID Count : 00000100          // the number of IDs in range
+[0004]                        Output Base : 00007a00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* BDF of pcie host 3 -> stream ID of pcie 0/1 ITS */
+[0004]                         Input base : 00007800
+[0004]                           ID Count : 00000200          // the number of IDs in range
+[0004]                        Output Base : 00007800
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* BDF of pcie host 4 -> stream ID of pcie 4 SMMU */
+[0004]                         Input base : 00007c00
+[0004]                           ID Count : 00000200          // the number of IDs in range
+[0004]                        Output Base : 00007c00
+[0004]                   Output Reference : 000000cc
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* BDF of pcie host 5 -> stream ID of pcie 5 SMMU */
+[0004]                         Input base : 00007400
+[0004]                           ID Count : 00000300          // the number of IDs in range
+[0004]                        Output Base : 00007400
+[0004]                   Output Reference : 00000138
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* BDF of pcie host 6 -> stream ID of pcie 6/7 SMMU */
+[0004]                         Input base : 00008000
+[0004]                           ID Count : 00002000          // the number of IDs in range
+[0004]                        Output Base : 00008000
+[0004]                   Output Reference : 000001A4
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* BDF of pcie host 7 -> stream ID of pcie 6/7 SMMU */
+[0004]                         Input base : 0000BB00
+[0004]                           ID Count : 00000100          // the number of IDs in range
+[0004]                        Output Base : 0000BB00
+[0004]                   Output Reference : 000001A4
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* host8 and host9 should no open smmu for chips smmu bug *
+/* BDF of pcie host 8 -> stream ID of pcie ITS */
+[0004]                         Input base : 0000BA00
+[0004]                           ID Count : 00000100          // the number of IDs in range
+[0004]                        Output Base : 0000BA00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* BDF of pcie host 9 -> stream ID of pcie 0/1 ITS */
+[0004]                         Input base : 0000B800
+[0004]                           ID Count : 00000200          // the number of IDs in range
+[0004]                        Output Base : 0000B800
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* BDF of pcie host 10 -> stream ID of pcie 10 SMMU */
+[0004]                         Input base : 0000BC00
+[0004]                           ID Count : 00000200          // the number of IDs in range
+[0004]                        Output Base : 0000BC00
+[0004]                   Output Reference : 00000224
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* BDF of pcie host 11 -> stream ID of pcie 11 SMMU */
+[0004]                         Input base : 0000B400
+[0004]                           ID Count : 00000300          // the number of IDs in range
+[0004]                        Output Base : 0000B400
+[0004]                   Output Reference : 00000290
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB30"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD1 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB31"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD2 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB32"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD3 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB33"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD4 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T4, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB34"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD5 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T5, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB35"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD6 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-DDRC0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB38"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FDD // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-DDRC1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB39"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FDE // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-DDRC2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB3A"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FDF // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-DDRC3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB3B"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FC7 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-HHA0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB3C"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FC8 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-HHA1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB3D"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FC9 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB10"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F51 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB11"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F52 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB12"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F53 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB13"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F54 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T4, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB14"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F55 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T5, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB15"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F56 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-DDRC0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB18"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F5D // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-DDRC1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB19"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F5E // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-DDRC2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB1A"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F5F // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-DDRC3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB1B"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F47 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-HHA0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB1C"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F48 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-HHA1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB1D"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F49 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB70"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD1 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB71"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD2 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB72"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD3 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB73"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD4 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T4, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB74"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD5 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T5, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB75"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD6 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-DDRC0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB78"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFDD // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-DDRC1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB79"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFDE // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-DDRC2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB7A"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFDF // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-DDRC3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB7B"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFC7 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-HHA0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB7C"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFC8 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-HHA1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB7D"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFC9 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB50"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF51 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB51"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF52 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB52"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF53 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB53"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF54 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T4, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB54"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF55 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T5, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB55"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF56 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-DDRC0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB58"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF5D // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-DDRC1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB59"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF5E // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-DDRC2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB5A"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF5F // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-DDRC3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB5B"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF47 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-HHA0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB5C"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF48 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-HHA1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB5D"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF49 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+
+[320h 0800   1]                         Type : 01
+[321h 0801   2]                       Length : 0054
+[323h 0803   1]                     Revision : 00
+[324h 0804   4]                     Reserved : 00000000
+[328h 0808   4]                Mapping Count : 00000001
+[32Ch 0812   4]               Mapping Offset : 00000040
+
+[330h 0816   4]                   Node Flags : 00000000
+[334h 0820   8]            Memory Properties : [IORT Memory Access Properties]
+[334h 0820   4]              Cache Coherency : 00000000
+[338h 0824   1]        Hints (decoded below) : 00
+                                   Transient : 0
+                              Write Allocate : 0
+                               Read Allocate : 0
+                                    Override : 0
+[339h 0825   2]                     Reserved : 0000
+[33Bh 0827   1] Memory Flags (decoded below) : 00
+                                   Coherency : 0
+                            Device Attribute : 0
+[33Ch 0828   1]            Memory Size Limit : 00
+[33Dh 0829  11]                  Device Name : "\_SB_.SEC0"
+[348h 0840  24]                      Padding : \
+    00 00 00 00 00 00 00 00 01 00 00 00 80 00 04 00 \
+    4C 00 00 00 01 00 00 00
+
+[34Ch 0844   4]                   Input base : 00000000
+[350h 0848   4]                     ID Count : 00000001
+[354h 0852   4]                  Output Base : 00000100
+[358h 0856   4]             Output Reference : 00000100
+[35Ch 0860   4]        Flags (decoded below) : 00000001
+                              Single Mapping : 1
+/* RDE device report++.*/
+[320h 0800   1]                         Type : 01
+[321h 0801   2]                       Length : 0054
+[323h 0803   1]                     Revision : 00
+[324h 0804   4]                     Reserved : 00000000
+[328h 0808   4]                Mapping Count : 00000001
+[32Ch 0812   4]               Mapping Offset : 00000040
+
+[330h 0816   4]                   Node Flags : 00000000
+[334h 0820   8]            Memory Properties : [IORT Memory Access Properties]
+[334h 0820   4]              Cache Coherency : 00000000
+[338h 0824   1]        Hints (decoded below) : 00
+                                   Transient : 0
+                              Write Allocate : 0
+                               Read Allocate : 0
+                                    Override : 0
+[339h 0825   2]                     Reserved : 0000
+[33Bh 0827   1] Memory Flags (decoded below) : 00
+                                   Coherency : 0
+                            Device Attribute : 0
+[33Ch 0828   1]            Memory Size Limit : 00
+[33Dh 0829  11]                  Device Name : "\_SB_.RDE0"
+[348h 0840  24]                      Padding : \
+    00 00 00 00 00 00 00 00 01 00 00 00 80 00 04 00 \
+    4C 00 00 00 01 00 00 00
+
+[34Ch 0844   4]                   Input base : 00000000
+[350h 0848   4]                     ID Count : 00000001
+[354h 0852   4]                  Output Base : 00007f13
+[358h 0856   4]             Output Reference : 00000034
+[35Ch 0860   4]        Flags (decoded below) : 00000001
+                              Single Mapping : 1
+
+/* mbi-gen for MCTP, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MBI4"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F18 // MCTP device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620IortNoSmmu.asl b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620IortNoSmmu.asl
new file mode 100644
index 0000000000..63d11b83eb
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620IortNoSmmu.asl
@@ -0,0 +1,1736 @@
+/*
+ * Intel ACPI Component Architecture
+ * iASL Compiler/Disassembler version 20151124-64
+ * Copyright (c) 2000 - 2015 Intel Corporation
+ *
+ * Template for [IORT] ACPI Table (static data table)
+ * Format: [ByteLength]  FieldName : HexFieldValue
+ */
+[0004]                          Signature : "IORT"    [IO Remapping Table]
+[0004]                       Table Length : 01c8
+[0001]                           Revision : 00
+[0001]                           Checksum : BC
+[0006]                             Oem ID : "HISI  "            // ?
+[0008]                       Oem Table ID : "HIP08   "          // ?
+[0004]                       Oem Revision : 00000000            // ?
+[0004]                    Asl Compiler ID : "INTL"
+[0004]              Asl Compiler Revision : 20150410
+
+[0004]                         Node Count : 00000005           // ITS, SMMU and RC
+[0004]                        Node Offset : 00000034           // ?
+[0004]                           Reserved : 00000000
+[0004]                   Optional Padding : 00 00 00 00
+
+/* 0x34 ITS, for PCIe */
+/* Here we use the P680/Hi1620 ACPI table which includes MADT table to help to debuge */
+[0001]                               Type : 00
+[0002]                             Length : 0018
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000000           // ?
+[0004]                     Mapping Offset : 00000000           // ?
+
+[0004]                           ItsCount : 00000001           // ?
+[0004]                        Identifiers : 00000000           // how to refer to MADT ?
+
+/*0x4c RC 0 */
+[0001]                               Type : 02
+[0002]                             Length : 00A0
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 0000000C
+[0004]                     Mapping Offset : 00000028
+
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000001
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0004]                      ATS Attribute : 00000000
+[0004]                 PCI Segment Number : 00000000           // should match with above MCFG
+
+/* BDF of pcie host 0 -> stream ID of pcie 0/1 SMMU */
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00004000          // the number of IDs in range
+[0004]                        Output Base : 00000000
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 1 -> stream ID of pcie 0/1 SMMU */
+[0004]                         Input base : 00007b00
+[0004]                           ID Count : 00000100          // the number of IDs in range
+[0004]                        Output Base : 00007b00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 2 -> stream ID of pcie 0/1 ITS */
+[0004]                         Input base : 00007a00
+[0004]                           ID Count : 00000100          // the number of IDs in range
+[0004]                        Output Base : 00007a00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 3 -> stream ID of pcie 0/1 ITS */
+[0004]                         Input base : 00007800
+[0004]                           ID Count : 00000200          // the number of IDs in range
+[0004]                        Output Base : 00007800
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 4 -> stream ID of pcie 4 SMMU */
+[0004]                         Input base : 00007c00
+[0004]                           ID Count : 00000200          // the number of IDs in range
+[0004]                        Output Base : 00007c00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 5 -> stream ID of pcie 5 SMMU */
+[0004]                         Input base : 00007400
+[0004]                           ID Count : 00000300          // the number of IDs in range
+[0004]                        Output Base : 00007400
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 6 -> stream ID of pcie 6/7 SMMU */
+[0004]                         Input base : 00008000
+[0004]                           ID Count : 00002000          // the number of IDs in range
+[0004]                        Output Base : 00008000
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 7 -> stream ID of pcie 6/7 SMMU */
+[0004]                         Input base : 0000BB00
+[0004]                           ID Count : 00000100          // the number of IDs in range
+[0004]                        Output Base : 0000BB00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 8 -> stream ID of pcie ITS */
+[0004]                         Input base : 0000BA00
+[0004]                           ID Count : 00000100          // the number of IDs in range
+[0004]                        Output Base : 0000BA00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 9 -> stream ID of pcie 0/1 ITS */
+[0004]                         Input base : 0000B800
+[0004]                           ID Count : 00000200          // the number of IDs in range
+[0004]                        Output Base : 0000B800
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 10 -> stream ID of pcie 10 SMMU */
+[0004]                         Input base : 0000BC00
+[0004]                           ID Count : 00000200          // the number of IDs in range
+[0004]                        Output Base : 0000BC00
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* BDF of pcie host 11 -> stream ID of pcie 11 SMMU */
+[0004]                         Input base : 0000B400
+[0004]                           ID Count : 00000300          // the number of IDs in range
+[0004]                        Output Base : 0000B400
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000000
+                           Single Mapping : 0
+
+/* mbi-gen for S0-TB-L3T0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB30"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD1 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB31"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD2 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB32"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD3 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB33"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD4 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T4, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB34"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD5 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-L3T5, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB35"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FD6 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-DDRC0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB38"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FDD // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-DDRC1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB39"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FDE // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-DDRC2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB3A"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FDF // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-DDRC3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB3B"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FC7 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-HHA0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB3C"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FC8 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TB-HHA1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB3D"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007FC9 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB10"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F51 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB11"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F52 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB12"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F53 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB13"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F54 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T4, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB14"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F55 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-L3T5, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB15"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F56 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-DDRC0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB18"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F5D // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-DDRC1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB19"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F5E // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-DDRC2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB1A"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F5F // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-DDRC3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB1B"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F47 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-HHA0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB1C"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F48 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S0-TA-HHA1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB1D"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F49 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB70"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD1 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB71"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD2 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB72"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD3 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB73"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD4 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T4, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB74"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD5 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-L3T5, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB75"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFD6 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-DDRC0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB78"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFDD // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-DDRC1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB79"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFDE // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-DDRC2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB7A"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFDF // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-DDRC3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB7B"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFC7 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-HHA0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB7C"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFC8 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TB-HHA1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB7D"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BFC9 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB50"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF51 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB51"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF52 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB52"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF53 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB53"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF54 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T4, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB54"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF55 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-L3T5, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB55"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF56 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-DDRC0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB58"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF5D // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-DDRC1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB59"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF5E // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-DDRC2, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB5A"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF5F // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-DDRC3, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB5B"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF47 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-HHA0, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB5C"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF48 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+/* mbi-gen for S1-TA-HHA1, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MB5D"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 0000BF49 // PMU device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
+
+
+[320h 0800   1]                         Type : 01
+[321h 0801   2]                       Length : 0054
+[323h 0803   1]                     Revision : 00
+[324h 0804   4]                     Reserved : 00000000
+[328h 0808   4]                Mapping Count : 00000001
+[32Ch 0812   4]               Mapping Offset : 00000040
+
+[330h 0816   4]                   Node Flags : 00000000
+[334h 0820   8]            Memory Properties : [IORT Memory Access Properties]
+[334h 0820   4]              Cache Coherency : 00000000
+[338h 0824   1]        Hints (decoded below) : 00
+                                   Transient : 0
+                              Write Allocate : 0
+                               Read Allocate : 0
+                                    Override : 0
+[339h 0825   2]                     Reserved : 0000
+[33Bh 0827   1] Memory Flags (decoded below) : 00
+                                   Coherency : 0
+                            Device Attribute : 0
+[33Ch 0828   1]            Memory Size Limit : 00
+[33Dh 0829  11]                  Device Name : "\_SB_.SEC0"
+[348h 0840  24]                      Padding : \
+    00 00 00 00 00 00 00 00 01 00 00 00 80 00 04 00 \
+    4C 00 00 00 01 00 00 00
+
+[34Ch 0844   4]                   Input base : 00000000
+[350h 0848   4]                     ID Count : 00000001
+[354h 0852   4]                  Output Base : 00000100
+[358h 0856   4]             Output Reference : 00000034
+[35Ch 0860   4]        Flags (decoded below) : 00000001
+                              Single Mapping : 1
+/* RDE device report++.*/
+[320h 0800   1]                         Type : 01
+[321h 0801   2]                       Length : 0054
+[323h 0803   1]                     Revision : 00
+[324h 0804   4]                     Reserved : 00000000
+[328h 0808   4]                Mapping Count : 00000001
+[32Ch 0812   4]               Mapping Offset : 00000040
+
+[330h 0816   4]                   Node Flags : 00000000
+[334h 0820   8]            Memory Properties : [IORT Memory Access Properties]
+[334h 0820   4]              Cache Coherency : 00000000
+[338h 0824   1]        Hints (decoded below) : 00
+                                   Transient : 0
+                              Write Allocate : 0
+                               Read Allocate : 0
+                                    Override : 0
+[339h 0825   2]                     Reserved : 0000
+[33Bh 0827   1] Memory Flags (decoded below) : 00
+                                   Coherency : 0
+                            Device Attribute : 0
+[33Ch 0828   1]            Memory Size Limit : 00
+[33Dh 0829  11]                  Device Name : "\_SB_.RDE0"
+[348h 0840  24]                      Padding : \
+    00 00 00 00 00 00 00 00 01 00 00 00 80 00 04 00 \
+    4C 00 00 00 01 00 00 00
+
+[34Ch 0844   4]                   Input base : 00000000
+[350h 0848   4]                     ID Count : 00000001
+[354h 0852   4]                  Output Base : 00007f13
+[358h 0856   4]             Output Reference : 00000034
+[35Ch 0860   4]        Flags (decoded below) : 00000001
+                              Single Mapping : 1
+
+/* mbi-gen for MCTP, named component */
+[0001]                               Type : 01
+[0002]                             Length : 0046
+[0001]                           Revision : 00
+[0004]                           Reserved : 00000000
+[0004]                      Mapping Count : 00000001
+[0004]                     Mapping Offset : 00000032
+
+[0004]                         Node Flags : 00000000
+[0008]                  Memory Properties : [IORT Memory Access Properties]
+[0004]                    Cache Coherency : 00000000
+[0001]              Hints (decoded below) : 00
+                                Transient : 0
+                           Write Allocate : 0
+                            Read Allocate : 0
+                                 Override : 0
+[0002]                           Reserved : 0000
+[0001]       Memory Flags (decoded below) : 00
+                                Coherency : 0
+                         Device Attribute : 0
+[0001]                  Memory Size Limit : 00
+[0016]                        Device Name : "\_SB_.MBI4"
+[0004]                            Padding : 00 00 00 00
+
+[0004]                         Input base : 00000000
+[0004]                           ID Count : 00000001
+[0004]                        Output Base : 00007F18 // MCTP device id
+[0004]                   Output Reference : 00000034
+[0004]              Flags (decoded below) : 00000001
+                           Single Mapping : 1
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Mcfg.aslc b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Mcfg.aslc
new file mode 100644
index 0000000000..2d719ef562
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Mcfg.aslc
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2018 Hisilicon Limited
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the BSD License which accompanies
+ * this distribution, and is available at
+ * http://opensource.org/licenses/bsd-license.php
+ *
+ */
+
+#include <IndustryStandard/Acpi.h>
+#include "Hi1620Platform.h"
+
+#define MCFG_VERSION  0x1
+
+#pragma pack(1)
+typedef struct
+{
+   UINT64 ullBaseAddress;
+   UINT16 usSegGroupNum;
+   UINT8  ucStartBusNum;
+   UINT8  ucEndBusNum;
+   UINT32 Reserved2;
+}EFI_MCFG_CONFIG_STRUCTURE;
+
+typedef struct
+{
+   EFI_ACPI_DESCRIPTION_HEADER Header;
+   UINT64 Reserved1;
+}EFI_MCFG_TABLE_CONFIG;
+
+typedef struct
+{
+   EFI_MCFG_TABLE_CONFIG Acpi_Table_Mcfg;
+   EFI_MCFG_CONFIG_STRUCTURE Config_Structure;
+}EFI_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_TABLE;
+#pragma pack()
+
+EFI_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_TABLE Mcfg=
+{
+  {
+      {
+        EFI_ACPI_6_1_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_BASE_ADDRESS_DESCRIPTION_TABLE_SIGNATURE,
+        sizeof (EFI_PCI_EXPRESS_MEMORY_MAPPED_CONFIGURATION_SPACE_TABLE),
+        MCFG_VERSION,
+        0x00,                                                     // Checksum will be updated at runtime
+        {EFI_ACPI_ARM_OEM_ID},
+        EFI_ACPI_ARM_OEM_TABLE_ID,
+        EFI_ACPI_ARM_OEM_REVISION,
+        EFI_ACPI_ARM_CREATOR_ID,
+        EFI_ACPI_ARM_CREATOR_REVISION
+      },
+      0x0000000000000000,                                 //Reserved
+  },
+  {
+    0xd0000000,                                         //Base Address
+    0x0,                                                //Segment Group Number
+    0x0,                                                //Start Bus Number
+    0xff,                                               //End Bus Number
+    0x00000000,                                         //Reserved
+  }
+};
+
+VOID* CONST ReferenceAcpiTable = &Mcfg;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Slit.aslc b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Slit.aslc
new file mode 100644
index 0000000000..53ae9a9235
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Slit.aslc
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2013 Linaro Limited
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the BSD License which accompanies
+ * this distribution, and is available at
+ * http://opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ *     Yi Li - yi.li@linaro.org
+*/
+
+#include <IndustryStandard/Acpi.h>
+#include "Hi1620Platform.h"
+
+#define EFI_ACPI_SYSTEM_LOCALITIES_ENTRY_COUNT 0x0000000000000004
+
+#pragma pack(1)
+typedef struct {
+  UINT8   Entry[EFI_ACPI_SYSTEM_LOCALITIES_ENTRY_COUNT];
+} EFI_ACPI_6_2_NUMBER_OF_SYSTEM_LOCALITIES_STRUCTURE;
+
+typedef struct {
+  EFI_ACPI_6_2_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_HEADER    Header;
+  EFI_ACPI_6_2_NUMBER_OF_SYSTEM_LOCALITIES_STRUCTURE                NumSlit[EFI_ACPI_SYSTEM_LOCALITIES_ENTRY_COUNT];
+
+} EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE;
+#pragma pack()
+
+//
+// System Locality Information Table
+// Please modify all values in Slit.h only.
+//
+EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE Slit = {
+  {
+    {
+      EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE,
+      sizeof (EFI_ACPI_6_2_SYSTEM_LOCALITY_INFORMATION_TABLE),
+      EFI_ACPI_6_2_SYSTEM_LOCALITY_DISTANCE_INFORMATION_TABLE_REVISION,
+      0x00,                                                     // Checksum will be updated at runtime
+      {EFI_ACPI_ARM_OEM_ID},
+      EFI_ACPI_ARM_OEM_TABLE_ID,
+      EFI_ACPI_ARM_OEM_REVISION,
+      EFI_ACPI_ARM_CREATOR_ID,
+      EFI_ACPI_ARM_CREATOR_REVISION,
+    },
+    //
+    // Beginning of SLIT specific fields
+    //
+    EFI_ACPI_SYSTEM_LOCALITIES_ENTRY_COUNT,
+  },
+  {
+    {{0x0A, 0x10, 0x20, 0x21}}, //Locality   0
+    {{0x10, 0x0A, 0x19, 0x20}}, //Locality   1
+    {{0x20, 0x19, 0x0A, 0x10}}, //Locality   2
+    {{0x21, 0x20, 0x10, 0x0A}}, //Locality   3
+  },
+};
+
+//
+// Reference the table being generated to prevent the optimizer from removing the
+// data structure from the executable
+//
+VOID* CONST ReferenceAcpiTable = &Slit;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Spcr.aslc b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Spcr.aslc
new file mode 100644
index 0000000000..a9768d4ba2
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Spcr.aslc
@@ -0,0 +1,81 @@
+/** @file
+*  Serial Port Console Redirection Table (SPCR)
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2016 Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+*
+**/
+
+#include <Library/AcpiLib.h>
+#include <Library/PcdLib.h>
+#include <IndustryStandard/Acpi.h>
+#include <IndustryStandard/SerialPortConsoleRedirectionTable.h>
+#include "Hi1620Platform.h"
+
+#define SPCR_FLOW_CONTROL_NONE           0
+
+STATIC EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE Spcr = {
+  ARM_ACPI_HEADER (EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE,
+                     EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE,
+                     EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_REVISION),
+  // UINT8                                   InterfaceType;
+  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERFACE_TYPE_ARM_PL011_UART,
+  // UINT8                                   Reserved1[3];
+  {
+    EFI_ACPI_RESERVED_BYTE,
+    EFI_ACPI_RESERVED_BYTE,
+    EFI_ACPI_RESERVED_BYTE
+  },
+  // EFI_ACPI_6_2_GENERIC_ADDRESS_STRUCTURE  BaseAddress;
+  ARM_GAS32 (FixedPcdGet64 (PcdSerialRegisterBase)),
+  // UINT8                                   InterruptType;
+  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_GIC,
+  // UINT8                                   Irq;
+  0,                                         // Not used on ARM
+  // UINT32                                  GlobalSystemInterrupt;
+  141,
+  // UINT8                                   BaudRate;
+  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_BAUD_RATE_115200,
+  // UINT8                                   Parity;
+  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_PARITY_NO_PARITY,
+  // UINT8                                   StopBits;
+  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_STOP_BITS_1,
+  // UINT8                                   FlowControl;
+  SPCR_FLOW_CONTROL_NONE,
+  // UINT8                                   TerminalType;
+  EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_TERMINAL_TYPE_ANSI,
+  // UINT8                                   Reserved2;
+  EFI_ACPI_RESERVED_BYTE,
+  // UINT16                                  PciDeviceId;
+  0xFFFF,
+  // UINT16                                  PciVendorId;
+  0xFFFF,
+  // UINT8                                   PciBusNumber;
+  0x00,
+  // UINT8                                   PciDeviceNumber;
+  0x00,
+  // UINT8                                   PciFunctionNumber;
+  0x00,
+  // UINT32                                  PciFlags;
+  0x00000000,
+  // UINT8                                   PciSegment;
+  0x00,
+  // UINT32                                  Reserved3;
+  EFI_ACPI_RESERVED_DWORD
+};
+
+//
+// Reference the table being generated to prevent the optimizer from removing the
+// data structure from the executable
+//
+VOID* CONST ReferenceAcpiTable = &Spcr;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Srat.aslc b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Srat.aslc
new file mode 100644
index 0000000000..aea4c21858
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Srat.aslc
@@ -0,0 +1,166 @@
+/*
+ * Copyright (c) 2013 Linaro Limited
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the BSD License which accompanies
+ * this distribution, and is available at
+ * http://opensource.org/licenses/bsd-license.php
+ *
+ * Contributors:
+ *     Yi Li - yi.li@linaro.org
+ *
+ *  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+*/
+
+#include <IndustryStandard/Acpi.h>
+#include "Hi1620Platform.h"
+#include <Library/AcpiLib.h>
+#include <Library/AcpiNextLib.h>
+
+
+//
+// Static Resource Affinity Table definition
+//
+EFI_ACPI_STATIC_RESOURCE_AFFINITY_TABLE Srat = {
+  {
+    {EFI_ACPI_6_2_SYSTEM_RESOURCE_AFFINITY_TABLE_SIGNATURE,
+    sizeof (EFI_ACPI_STATIC_RESOURCE_AFFINITY_TABLE),
+    EFI_ACPI_6_2_SYSTEM_RESOURCE_AFFINITY_TABLE_REVISION,
+    0x00,                                                     // Checksum will be updated at runtime
+    {EFI_ACPI_ARM_OEM_ID},
+    EFI_ACPI_ARM_OEM_TABLE_ID,
+    EFI_ACPI_ARM_OEM_REVISION,
+    EFI_ACPI_ARM_CREATOR_ID,
+    EFI_ACPI_ARM_CREATOR_REVISION},
+    /*Reserved*/
+    0x00000001,                                  // Reserved to be 1 for backward compatibility
+    EFI_ACPI_RESERVED_QWORD
+  },
+
+  //
+  //
+  // Memory Affinity
+  //
+  {
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+    EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000001),
+  },
+
+  {
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000000,0x00000001,0x00000000),   //GICC Affinity Processor 0
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000001,0x00000001,0x00000000),   //GICC Affinity Processor 1
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000002,0x00000001,0x00000000),   //GICC Affinity Processor 2
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000003,0x00000001,0x00000000),   //GICC Affinity Processor 3
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000004,0x00000001,0x00000000),   //GICC Affinity Processor 4
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000005,0x00000001,0x00000000),   //GICC Affinity Processor 5
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000006,0x00000001,0x00000000),   //GICC Affinity Processor 6
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000007,0x00000001,0x00000000),   //GICC Affinity Processor 7
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000008,0x00000001,0x00000000),   //GICC Affinity Processor 8
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000009,0x00000001,0x00000000),   //GICC Affinity Processor 9
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x0000000A,0x00000001,0x00000000),   //GICC Affinity Processor 10
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x0000000B,0x00000001,0x00000000),   //GICC Affinity Processor 11
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x0000000C,0x00000001,0x00000000),   //GICC Affinity Processor 12
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x0000000D,0x00000001,0x00000000),   //GICC Affinity Processor 13
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x0000000E,0x00000001,0x00000000),   //GICC Affinity Processor 14
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x0000000F,0x00000001,0x00000000),   //GICC Affinity Processor 15
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000010,0x00000001,0x00000000),   //GICC Affinity Processor 16
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000011,0x00000001,0x00000000),   //GICC Affinity Processor 17
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000012,0x00000001,0x00000000),   //GICC Affinity Processor 18
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000013,0x00000001,0x00000000),   //GICC Affinity Processor 19
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000014,0x00000001,0x00000000),   //GICC Affinity Processor 20
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000015,0x00000001,0x00000000),   //GICC Affinity Processor 21
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000016,0x00000001,0x00000000),   //GICC Affinity Processor 22
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000001,0x00000017,0x00000001,0x00000000),   //GICC Affinity Processor 23
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000018,0x00000001,0x00000000),   //GICC Affinity Processor 24
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000019,0x00000001,0x00000000),   //GICC Affinity Processor 25
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000001A,0x00000001,0x00000000),   //GICC Affinity Processor 26
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000001B,0x00000001,0x00000000),   //GICC Affinity Processor 27
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000001C,0x00000001,0x00000000),   //GICC Affinity Processor 28
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000001D,0x00000001,0x00000000),   //GICC Affinity Processor 29
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000001E,0x00000001,0x00000000),   //GICC Affinity Processor 30
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000001F,0x00000001,0x00000000),   //GICC Affinity Processor 31
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000020,0x00000001,0x00000000),   //GICC Affinity Processor 32
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000021,0x00000001,0x00000000),   //GICC Affinity Processor 33
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000022,0x00000001,0x00000000),   //GICC Affinity Processor 34
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000023,0x00000001,0x00000000),   //GICC Affinity Processor 35
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000024,0x00000001,0x00000000),   //GICC Affinity Processor 36
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000025,0x00000001,0x00000000),   //GICC Affinity Processor 37
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000026,0x00000001,0x00000000),   //GICC Affinity Processor 38
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000027,0x00000001,0x00000000),   //GICC Affinity Processor 39
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000028,0x00000001,0x00000000),   //GICC Affinity Processor 40
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x00000029,0x00000001,0x00000000),   //GICC Affinity Processor 41
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000002A,0x00000001,0x00000000),   //GICC Affinity Processor 42
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000002B,0x00000001,0x00000000),   //GICC Affinity Processor 43
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000002C,0x00000001,0x00000000),   //GICC Affinity Processor 44
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000002D,0x00000001,0x00000000),   //GICC Affinity Processor 45
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000002E,0x00000001,0x00000000),   //GICC Affinity Processor 46
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000000,0x0000002F,0x00000001,0x00000000),   //GICC Affinity Processor 47
+
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000030,0x00000001,0x00000000),   //GICC Affinity Processor 48
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000031,0x00000001,0x00000000),   //GICC Affinity Processor 49
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000032,0x00000001,0x00000000),   //GICC Affinity Processor 50
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000033,0x00000001,0x00000000),   //GICC Affinity Processor 51
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000034,0x00000001,0x00000000),   //GICC Affinity Processor 52
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000035,0x00000001,0x00000000),   //GICC Affinity Processor 53
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000036,0x00000001,0x00000000),   //GICC Affinity Processor 54
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000037,0x00000001,0x00000000),   //GICC Affinity Processor 55
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000038,0x00000001,0x00000000),   //GICC Affinity Processor 56
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000039,0x00000001,0x00000000),   //GICC Affinity Processor 57
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x0000003A,0x00000001,0x00000000),   //GICC Affinity Processor 58
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x0000003B,0x00000001,0x00000000),   //GICC Affinity Processor 59
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x0000003C,0x00000001,0x00000000),   //GICC Affinity Processor 60
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x0000003D,0x00000001,0x00000000),   //GICC Affinity Processor 61
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x0000003E,0x00000001,0x00000000),   //GICC Affinity Processor 62
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x0000003F,0x00000001,0x00000000),   //GICC Affinity Processor 63
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000040,0x00000001,0x00000000),   //GICC Affinity Processor 64
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000041,0x00000001,0x00000000),   //GICC Affinity Processor 65
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000042,0x00000001,0x00000000),   //GICC Affinity Processor 66
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000043,0x00000001,0x00000000),   //GICC Affinity Processor 67
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000044,0x00000001,0x00000000),   //GICC Affinity Processor 68
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000045,0x00000001,0x00000000),   //GICC Affinity Processor 69
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000046,0x00000001,0x00000000),   //GICC Affinity Processor 70
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000003,0x00000047,0x00000001,0x00000000),   //GICC Affinity Processor 71
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000048,0x00000001,0x00000000),   //GICC Affinity Processor 72
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000049,0x00000001,0x00000000),   //GICC Affinity Processor 73
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000004A,0x00000001,0x00000000),   //GICC Affinity Processor 74
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000004B,0x00000001,0x00000000),   //GICC Affinity Processor 75
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000004C,0x00000001,0x00000000),   //GICC Affinity Processor 76
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000004D,0x00000001,0x00000000),   //GICC Affinity Processor 77
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000004E,0x00000001,0x00000000),   //GICC Affinity Processor 78
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000004F,0x00000001,0x00000000),   //GICC Affinity Processor 79
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000050,0x00000001,0x00000000),   //GICC Affinity Processor 80
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000051,0x00000001,0x00000000),   //GICC Affinity Processor 81
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000052,0x00000001,0x00000000),   //GICC Affinity Processor 82
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000053,0x00000001,0x00000000),   //GICC Affinity Processor 83
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000054,0x00000001,0x00000000),   //GICC Affinity Processor 84
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000055,0x00000001,0x00000000),   //GICC Affinity Processor 85
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000056,0x00000001,0x00000000),   //GICC Affinity Processor 86
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000057,0x00000001,0x00000000),   //GICC Affinity Processor 87
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000058,0x00000001,0x00000000),   //GICC Affinity Processor 88
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x00000059,0x00000001,0x00000000),   //GICC Affinity Processor 89
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000005A,0x00000001,0x00000000),   //GICC Affinity Processor 90
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000005B,0x00000001,0x00000000),   //GICC Affinity Processor 91
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000005C,0x00000001,0x00000000),   //GICC Affinity Processor 92
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000005D,0x00000001,0x00000000),   //GICC Affinity Processor 93
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000005E,0x00000001,0x00000000),   //GICC Affinity Processor 94
+    EFI_ACPI_6_1_GICC_AFFINITY_STRUCTURE_INIT(0x00000002,0x0000005F,0x00000001,0x00000000),   //GICC Affinity Processor 95
+  },
+  {
+    EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_INIT(0x00000001, 0x00000000),
+   // EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_INIT(0x00000003, 0x00000001),
+  },
+};
+
+//
+// Reference the table being generated to prevent the optimizer from removing the
+// data structure from the executable
+//
+VOID* CONST ReferenceAcpiTable = &Srat;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/MadtHi1620.aslc b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/MadtHi1620.aslc
new file mode 100644
index 0000000000..43b43142af
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/MadtHi1620.aslc
@@ -0,0 +1,375 @@
+/** @file
+*  Multiple APIC Description Table (MADT)
+*
+*  Copyright (c) 2012 - 2014, ARM Limited. All rights reserved.
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2015, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under ArmPlatformPkg/ArmJunoPkg/AcpiTables/
+*
+**/
+
+#include "Hi1620Platform.h"
+
+#include <Library/AcpiLib.h>
+#include <Library/ArmLib.h>
+#include <Library/PcdLib.h>
+#include <IndustryStandard/Acpi.h>
+#include <Library/AcpiNextLib.h>
+
+// Differs from Juno, we have another affinity level beyond cluster and core
+// 0x20000 is only for socket 0
+#define PLATFORM_GET_MPID_TA(ClusterId, CoreId)   (0x10000 | ((ClusterId) << 8) | (CoreId))
+#define PLATFORM_GET_MPID_TB(ClusterId, CoreId)   (0x30000 | ((ClusterId) << 8) | (CoreId))
+#define PLATFORM_GET_MPID_TA_2(ClusterId, CoreId)   (0x50000 | ((ClusterId) << 8) | (CoreId))
+#define PLATFORM_GET_MPID_TB_2(ClusterId, CoreId)   (0x70000 | ((ClusterId) << 8) | (CoreId))
+
+//
+// Multiple APIC Description Table
+//
+#pragma pack (1)
+
+typedef struct {
+  EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER   Header;
+  EFI_ACPI_6_2_GIC_STRUCTURE                            GicInterfaces[EFI_ACPI_PROCESSOR_LOCAL_GICC_AFFINITY_STRUCTURE_COUNT];
+  EFI_ACPI_6_2_GIC_DISTRIBUTOR_STRUCTURE                GicDistributor;
+  EFI_ACPI_6_2_GIC_ITS_STRUCTURE                      GicITS[EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT];
+} EFI_ACPI_MULTIPLE_APIC_DESCRIPTION_TABLE;
+
+#pragma pack ()
+
+EFI_ACPI_MULTIPLE_APIC_DESCRIPTION_TABLE Madt = {
+  {
+    ARM_ACPI_HEADER (
+      EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
+      EFI_ACPI_MULTIPLE_APIC_DESCRIPTION_TABLE,
+      EFI_ACPI_6_2_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION
+    ),
+    //
+    // MADT specific fields
+    //
+    0, // LocalApicAddress
+    0, // Flags
+  },
+  {
+    // Format: EFI_ACPI_6_1_GICC_STRUCTURE_INIT(GicId, AcpiCpuUid, Flags, PmuIrq, GicBase, GicVBase, GicHBase,
+    //                                          GsivId, GicRBase, Mpidr)
+    // Note: The GIC Structure of the primary CPU must be the first entry (see note in 5.2.12.14 GICC Structure of
+    //       ACPI v5.1).
+    //       The cores from a same cluster are kept together. It is not an ACPI requirement but in case the OSPM uses
+    //       the ACPI ARM Parking protocol, it might want to wake up the cores in the order of this table.
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        0, 0, PLATFORM_GET_MPID_TA(0, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x100000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        1, 1, PLATFORM_GET_MPID_TA(0, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x140000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        2, 2, PLATFORM_GET_MPID_TA(0, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x180000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        3, 3, PLATFORM_GET_MPID_TA(0, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x1C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        4, 4, PLATFORM_GET_MPID_TA(1, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x200000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        5, 5, PLATFORM_GET_MPID_TA(1, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x240000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        6, 6, PLATFORM_GET_MPID_TA(1, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x280000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        7, 7, PLATFORM_GET_MPID_TA(1, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x2C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        8, 8, PLATFORM_GET_MPID_TA(2, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x300000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        9, 9, PLATFORM_GET_MPID_TA(2, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x340000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        10, 10, PLATFORM_GET_MPID_TA(2, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x380000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        11, 11, PLATFORM_GET_MPID_TA(2, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x3C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        12, 12, PLATFORM_GET_MPID_TA(3, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x400000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        13, 13, PLATFORM_GET_MPID_TA(3, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x440000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        14, 14, PLATFORM_GET_MPID_TA(3, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x480000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        15, 15, PLATFORM_GET_MPID_TA(3, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x4C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        16, 16, PLATFORM_GET_MPID_TA(4, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x500000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        17, 17, PLATFORM_GET_MPID_TA(4, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x540000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        18, 18, PLATFORM_GET_MPID_TA(4, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x580000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        19, 19, PLATFORM_GET_MPID_TA(4, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x5C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        20, 20, PLATFORM_GET_MPID_TA(5, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x600000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        21, 21, PLATFORM_GET_MPID_TA(5, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x640000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        22, 22, PLATFORM_GET_MPID_TA(5, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x680000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        23, 23, PLATFORM_GET_MPID_TA(5, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAE000000 + 0x6C0000 /* GicRBase */, 0),
+
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        24, 24, PLATFORM_GET_MPID_TB(0, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x100000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        25, 25, PLATFORM_GET_MPID_TB(0, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x140000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        26, 26, PLATFORM_GET_MPID_TB(0, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x180000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        27, 27, PLATFORM_GET_MPID_TB(0, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x1C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        28, 28, PLATFORM_GET_MPID_TB(1, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x200000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        29, 29, PLATFORM_GET_MPID_TB(1, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x240000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        30, 30, PLATFORM_GET_MPID_TB(1, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x280000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        31, 31, PLATFORM_GET_MPID_TB(1, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x2C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        32, 32, PLATFORM_GET_MPID_TB(2, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x300000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        33, 33, PLATFORM_GET_MPID_TB(2, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x340000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        34, 34, PLATFORM_GET_MPID_TB(2, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x380000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        35, 35, PLATFORM_GET_MPID_TB(2, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x3C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        36, 36, PLATFORM_GET_MPID_TB(3, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x400000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        37, 37, PLATFORM_GET_MPID_TB(3, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x440000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        38, 38, PLATFORM_GET_MPID_TB(3, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x480000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        39, 39, PLATFORM_GET_MPID_TB(3, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x4C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        40, 40, PLATFORM_GET_MPID_TB(4, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x500000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        41, 41, PLATFORM_GET_MPID_TB(4, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x540000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        42, 42, PLATFORM_GET_MPID_TB(4, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x580000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        43, 43, PLATFORM_GET_MPID_TB(4, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x5C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        44, 44, PLATFORM_GET_MPID_TB(5, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x600000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        45, 45, PLATFORM_GET_MPID_TB(5, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x640000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        46, 46, PLATFORM_GET_MPID_TB(5, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x680000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        47, 47, PLATFORM_GET_MPID_TB(5, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0xAA000000 + 0x6C0000 /* GicRBase */, 0),
+
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        48, 48, PLATFORM_GET_MPID_TA_2(0, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x100000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        49, 49, PLATFORM_GET_MPID_TA_2(0, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x140000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        50, 50, PLATFORM_GET_MPID_TA_2(0, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x180000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        51, 51, PLATFORM_GET_MPID_TA_2(0, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x1C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        52, 52, PLATFORM_GET_MPID_TA_2(1, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x200000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        53, 53, PLATFORM_GET_MPID_TA_2(1, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x240000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        54, 54, PLATFORM_GET_MPID_TA_2(1, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x280000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        55, 55, PLATFORM_GET_MPID_TA_2(1, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x2C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        56, 56, PLATFORM_GET_MPID_TA_2(2, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x300000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        57, 57, PLATFORM_GET_MPID_TA_2(2, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x340000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        58, 58, PLATFORM_GET_MPID_TA_2(2, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x380000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        59, 59, PLATFORM_GET_MPID_TA_2(2, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x3C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        60, 60, PLATFORM_GET_MPID_TA_2(3, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x400000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        61, 61, PLATFORM_GET_MPID_TA_2(3, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x440000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        62, 62, PLATFORM_GET_MPID_TA_2(3, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x480000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        63, 63, PLATFORM_GET_MPID_TA_2(3, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x4C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        64, 64, PLATFORM_GET_MPID_TA_2(4, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x500000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        65, 65, PLATFORM_GET_MPID_TA_2(4, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x540000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        66, 66, PLATFORM_GET_MPID_TA_2(4, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x580000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        67, 67, PLATFORM_GET_MPID_TA_2(4, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x5C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        68, 68, PLATFORM_GET_MPID_TA_2(5, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x600000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        69, 69, PLATFORM_GET_MPID_TA_2(5, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x640000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        70, 70, PLATFORM_GET_MPID_TA_2(5, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x680000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        71, 71, PLATFORM_GET_MPID_TA_2(5, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AE000000 + 0x6C0000 /* GicRBase */, 0),
+
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        72, 72, PLATFORM_GET_MPID_TB_2(0, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x100000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        73, 73, PLATFORM_GET_MPID_TB_2(0, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x140000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        74, 74, PLATFORM_GET_MPID_TB_2(0, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x180000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        75, 75, PLATFORM_GET_MPID_TB_2(0, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x1C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        76, 76, PLATFORM_GET_MPID_TB_2(1, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x200000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        77, 77, PLATFORM_GET_MPID_TB_2(1, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x240000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        78, 78, PLATFORM_GET_MPID_TB_2(1, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x280000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        79, 79, PLATFORM_GET_MPID_TB_2(1, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x2C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        80, 80, PLATFORM_GET_MPID_TB_2(2, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x300000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        81, 81, PLATFORM_GET_MPID_TB_2(2, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x340000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        82, 82, PLATFORM_GET_MPID_TB_2(2, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x380000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        83, 83, PLATFORM_GET_MPID_TB_2(2, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x3C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        84, 84, PLATFORM_GET_MPID_TB_2(3, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x400000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        85, 85, PLATFORM_GET_MPID_TB_2(3, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x440000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        86, 86, PLATFORM_GET_MPID_TB_2(3, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x480000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        87, 87, PLATFORM_GET_MPID_TB_2(3, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x4C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        88, 88, PLATFORM_GET_MPID_TB_2(4, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x500000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        89, 89, PLATFORM_GET_MPID_TB_2(4, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x540000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        90, 90, PLATFORM_GET_MPID_TB_2(4, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x580000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        91, 91, PLATFORM_GET_MPID_TB_2(4, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x5C0000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        92, 92, PLATFORM_GET_MPID_TB_2(5, 0),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x600000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        93, 93, PLATFORM_GET_MPID_TB_2(5, 1),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x640000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        94, 94, PLATFORM_GET_MPID_TB_2(5, 2),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x680000 /* GicRBase */, 0),
+    EFI_ACPI_6_1_GICC_STRUCTURE_INIT(
+        95, 95, PLATFORM_GET_MPID_TB_2(5, 3),  EFI_ACPI_6_2_GIC_ENABLED, 23, FixedPcdGet32 (PcdGicInterruptInterfaceBase),
+        0x0, 0x0, 25, 0x4000AA000000 + 0x6C0000 /* GicRBase */, 0),
+  },
+
+  EFI_ACPI_6_1_GIC_DISTRIBUTOR_INIT(0, 0xAA000000, 0, 0x4),
+  {
+    EFI_ACPI_6_1_GIC_ITS_INIT(0,0x202100000), //peri a
+//    EFI_ACPI_6_1_GIC_ITS_INIT(1,0x400202100000), //peri a
+  }
+};
+
+//
+// Reference the table being generated to prevent the optimizer from removing the
+// data structure from the executable
+//
+VOID* CONST ReferenceAcpiTable = &Madt;
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 18/43] Hisilicon/D06: Add Hi1620OemConfigUiLib
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (16 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 17/43] Hisilicon/D06: Add ACPI Tables for D06 Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 14:14   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 19/43] Silicon/Hisilicon/D06: Stop watchdog Ming Huang
                   ` (25 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Yang XinYi

From: Yang XinYi <yangxingyi@huawei.com>

This library is added for oem setup menu item.
Setup item include:
1 DDR option item;
2 BMC option item;
3 Ras option item;
4 Misc option item;

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yang XinYi <yangxingyi@huawei.com>
---
 Silicon/Hisilicon/HisiPkg.dec                                           |   1 +
 Platform/Hisilicon/D06/D06.dsc                                          |   5 +-
 Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf       |   2 +-
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf        |  68 ++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h               | 142 ++++++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h             |  64 ++++
 Silicon/Hisilicon/Include/Library/OemConfigData.h                       |  84 +++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c               | 363 ++++++++++++++++++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.hfr          | 154 +++++++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.uni          | 103 ++++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr            |  41 +++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni            |  27 ++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.uni        |  24 ++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLibStrings.uni |  42 +++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigVfr.Vfr          |  89 +++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfig.hfr            | 219 ++++++++++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfigStrings.uni     | 111 ++++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PciePortConfig.hfr        | 167 +++++++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr             | 172 ++++++++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.uni             |  85 +++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.hfr            |  81 +++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.uni            |  34 ++
 22 files changed, 2076 insertions(+), 2 deletions(-)

diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec
index b56a6a6af7..858b840a57 100644
--- a/Silicon/Hisilicon/HisiPkg.dec
+++ b/Silicon/Hisilicon/HisiPkg.dec
@@ -44,6 +44,7 @@
   gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}
 
   gHisiEfiMemoryMapGuid  = {0xf8870015, 0x6994, 0x4b98, {0x95, 0xa2, 0xbd, 0x56, 0xda, 0x91, 0xc0, 0x7f}}
+  gOemConfigGuid = {0x42927b59, 0x58fc, 0x41be, {0x8f, 0x59, 0xd1, 0x7c, 0x02, 0x1a, 0x70, 0x13}}
   gVersionInfoHobGuid = {0xe13a14c, 0x859c, 0x4f22, {0x82, 0xbd, 0x18, 0xe, 0xe1, 0x42, 0x12, 0xbf}}
   gHisiOemVariableGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}
   gOemBootVariableGuid = {0xb7784577, 0x5aaf, 0x4557, {0xa1, 0x99, 0xd4, 0xa4, 0x2f, 0x45, 0x06, 0xf8}}
diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 9d4a86a4f4..bec422670d 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -330,7 +330,10 @@
   #ACPI
   #
   MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
-  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
+  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf {
+    <LibraryClasses>
+    NULL|Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
+  }
 
   Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
   Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
index e268a56bbd..281a4f2ebd 100644
--- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -56,7 +56,7 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile    ## CONSUMES
 
 [Depex]
-  gEfiAcpiTableProtocolGuid
+  gEfiAcpiTableProtocolGuid AND gEfiVariableWriteArchProtocolGuid
 
 [UserExtensions.TianoCore."ExtraFiles"]
   AcpiPlatformExtra.uni
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
new file mode 100644
index 0000000000..fba619e9ba
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
@@ -0,0 +1,68 @@
+## @file
+#  OEM config Library used by BDS
+#
+#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+#  Copyright (c) 2018, Linaro Limited. All rights reserved.
+#  This program and the accompanying materials are licensed and made available under
+#  the terms and conditions of the BSD License that accompanies this distribution.
+#  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php.
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = OemConfigUiLib
+  MODULE_UNI_FILE                = OemConfigUiLib.uni
+  FILE_GUID                      = 32B373AC-00B6-471b-B3AE-6E4A4501F6BA
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = NULL|DXE_DRIVER UEFI_APPLICATION
+  CONSTRUCTOR                    = OemConfigUiLibConstructor
+  DESTRUCTOR                     = OemConfigUiLibDestructor
+
+[Sources]
+  iBMCConfig.hfr
+  iBMCConfig.uni
+  MemoryConfig.hfr
+  MemoryConfig.uni
+  MiscConfig.hfr
+  MiscConfig.uni
+  OemConfig.c
+  OemConfig.h
+  OemConfigUiLibStrings.uni
+  OemConfigVfr.Vfr
+  PcieConfig.hfr
+  PcieConfigStrings.uni
+  PciePortConfig.hfr
+  RasConfig.hfr
+  RasConfig.uni
+
+[Packages]
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[LibraryClasses]
+  BaseLib
+  BaseMemoryLib
+  DebugLib
+  DevicePathLib
+  HiiLib
+  MemoryAllocationLib
+  PrintLib
+  UefiBootServicesTableLib
+  UefiHiiServicesLib
+  UefiRuntimeServicesTableLib
+
+[Guids]
+  gEfiHiiPlatformSetupFormsetGuid               ## CONSUMES ## GUID (Indicate the formset class guid to be displayed)
+  gEfiIfrFrontPageGuid                          ## CONSUMES ## GUID (Indicate the formset in this library need to dispaly in which page)
+  gEfiIfrTianoGuid                              ## CONSUMES ## GUID (Extended IFR Guid Opcode)
+  gOemConfigGuid
+  gVersionInfoHobGuid
+
+[Protocols]
+  gEfiHiiConfigAccessProtocolGuid               ## CONSUMES
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h
new file mode 100644
index 0000000000..f91400150c
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h
@@ -0,0 +1,142 @@
+/** @file
+The Oem config reference implement
+
+Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+Copyright (c) 2018, Linaro Limited. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _OEM_CONFIG_H_
+#define _OEM_CONFIG_H_
+
+#include <Guid/HiiPlatformSetupFormset.h>
+#include <Guid/MdeModuleHii.h>
+#include <Guid/VersionInfoHobGuid.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/HiiLib.h>
+#include <Library/HobLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include "Library/OemConfigData.h"
+#include <Library/PcdLib.h>
+#include <Library/PrintLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiHiiServicesLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Pi/PiFirmwareVolume.h>
+#include <Protocol/HiiConfigAccess.h>
+
+//
+// These are the VFR compiler generated data representing our VFR data.
+//
+extern UINT8  OemConfigVfrBin[];
+
+//
+// HII specific Vendor Device Path definition.
+//
+typedef struct {
+  VENDOR_DEVICE_PATH          VendorDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL    End;
+} HII_VENDOR_DEVICE_PATH;
+
+#define OEM_CONFIG_CALLBACK_DATA_SIGNATURE  SIGNATURE_32 ('O', 'E', 'M', 'C')
+typedef struct {
+  UINTN                             Signature;
+  EFI_HII_HANDLE                    HiiHandle;
+  EFI_HANDLE                        DriverHandle;
+  EFI_HII_CONFIG_ACCESS_PROTOCOL    ConfigAccess;
+} OEM_CONFIG_CALLBACK_DATA;
+
+/**
+  This function allows a caller to extract the current configuration for one
+  or more named elements from the target driver.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Request         A null-terminated Unicode string in <ConfigRequest> format.
+  @param Progress        On return, points to a character in the Request string.
+                         Points to the string's null terminator if request was successful.
+                         Points to the most recent '&' before the first failing name/value
+                         pair (or the beginning of the string if the failure is in the
+                         first name/value pair) if the request was not successful.
+  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which
+                         has all values filled in for the names in the Request string.
+                         String to be allocated by the called function.
+
+  @retval  EFI_SUCCESS            The Results is filled with the requested values.
+  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
+  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+OemExtractConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Request,
+  OUT       EFI_STRING                       *Progress,
+  OUT       EFI_STRING                       *Results
+  );
+
+/**
+  This function processes the results of changes in configuration.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Configuration   A null-terminated Unicode string in <ConfigResp> format.
+  @param Progress        A pointer to a string filled in with the offset of the most
+                         recent '&' before the first failing name/value pair (or the
+                         beginning of the string if the failure is in the first
+                         name/value pair) or the terminating NULL if all was successful.
+
+  @retval  EFI_SUCCESS            The Results is processed successfully.
+  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+OemRouteConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Configuration,
+  OUT       EFI_STRING                       *Progress
+  );
+
+/**
+  This function is invoked if user selected a interactive opcode from Device Manager's
+  Formset. If user set VBIOS, the new value is saved to EFI variable.
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Action          Specifies the type of action taken by the browser.
+  @param QuestionId      A unique value which is sent to the original exporting driver
+                         so that it can identify the type of data to expect.
+  @param Type            The type of value for the question.
+  @param Value           A pointer to the data being sent to the original exporting driver.
+  @param ActionRequest   On return, points to the action requested by the callback function.
+
+  @retval  EFI_SUCCESS           The callback successfully handled the action.
+  @retval  EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.
+
+**/
+EFI_STATUS
+EFIAPI
+OemCallback (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN        EFI_BROWSER_ACTION               Action,
+  IN        EFI_QUESTION_ID                  QuestionId,
+  IN        UINT8                            Type,
+  IN        EFI_IFR_TYPE_VALUE               *Value,
+  OUT       EFI_BROWSER_ACTION_REQUEST       *ActionRequest
+  );
+
+VOID GetReleaseTime (EFI_TIME *Time);
+#endif
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h
new file mode 100644
index 0000000000..792e544c22
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h
@@ -0,0 +1,64 @@
+/** @file
+
+Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+Copyright (c) 2018, Linaro Limited. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+  OemConfigUi.h
+
+Abstract:
+
+  NVData structure used by the OEM Config.
+
+Revision History:
+
+
+**/
+
+#ifndef _OEM_CONFIG_UI_H_
+#define _OEM_CONFIG_UI_H_
+
+#include <Uefi/UefiMultiPhase.h>
+
+#define OEM_CONFIG_FORM_ID                   1
+#define MEMORY_CONFIG_FORM_ID                2
+#define IBMC_CONFIG_FORM_ID                  3
+#define PCIE_CONFIG_FORM_ID                  4
+#define MISC_CONFIG_FORM_ID                  5
+#define RAS_CONFIG_FORM_ID                   6
+
+#define VFR_FORMID_PCIE_SOCKET0              0x4100
+#define VFR_FORMID_PCIE_SOCKET1              0x4200
+#define VFR_FORMID_PCIE_PORT0                0x4000
+#define VFR_FORMID_PCIE_PORT1                0x4001
+#define VFR_FORMID_PCIE_PORT2                0x4002
+#define VFR_FORMID_PCIE_PORT3                0x4003
+#define VFR_FORMID_PCIE_PORT4                0x4004
+#define VFR_FORMID_PCIE_PORT5                0x4005
+#define VFR_FORMID_PCIE_PORT6                0x4006
+#define VFR_FORMID_PCIE_PORT7                0x4007
+#define VFR_FORMID_PCIE_PORT8                0x4008
+#define VFR_FORMID_PCIE_PORT9                0x4009
+#define VFR_FORMID_PCIE_PORT10               0x4010
+#define VFR_FORMID_PCIE_PORT11               0x4011
+#define VFR_FORMID_PCIE_PORT12               0x4012
+#define VFR_FORMID_PCIE_PORT13               0x4013
+#define VFR_FORMID_PCIE_PORT14               0x4014
+#define VFR_FORMID_PCIE_PORT15               0x4015
+
+#define VFR_FORMID_MEMORY_RAS                0x6100
+#define VFR_FORMID_CORRECT_ERROR             0x6101
+#define VFR_FORMID_PCIE_RAS                  0x6200
+
+#define RMT_PATTERN_LENGTH                   256
+
+
+#endif
diff --git a/Silicon/Hisilicon/Include/Library/OemConfigData.h b/Silicon/Hisilicon/Include/Library/OemConfigData.h
new file mode 100644
index 0000000000..478821ae2c
--- /dev/null
+++ b/Silicon/Hisilicon/Include/Library/OemConfigData.h
@@ -0,0 +1,84 @@
+/** @file
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+
+#ifndef _OEM_CONFIG_DATA_H_
+#define _OEM_CONFIG_DATA_H_
+
+#define PCIE_MAX_TOTAL_PORTS                 16
+#define OEM_CONFIG_NAME                      L"OemConfig"
+#define PLATFORM_SETUP_VARIABLE_FLAG         (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE)
+
+#pragma pack(1)
+typedef struct {
+  /*Memory Config*/
+  UINT8         DdrDebugLevel;
+  UINT8         DdrFreqLimit;
+  UINT8         DdrRefreshSupport;
+  UINT8         DdrRefreshRate;
+  UINT8         RankMargin;
+  UINT8         RankMarginMode;
+  UINT32        rmtPatternLength;
+  UINT8         perbitmargin;
+  UINT8         CaMargin;
+  UINT8         CaVrefMarginOption;
+  UINT8         NumaEn;
+  UINT8         HwMemTest;
+  UINT8         DieInterleaving;
+  UINT8         ChannelInterleaving;
+  UINT8         RankInterleaving;
+  UINT8         EccSupport;
+  /*iBMC Config*/
+  UINT8         BmcWdtEnable;
+  UINT8         BmcWdtTimeout;
+  UINT8         BmcWdtAction;
+  UINT8         OSWdtEnable;
+  UINT8         OSWdtTimeout;
+  UINT8         OSWdtAction;
+  /*PCIe Config*/
+  UINT8         PcieSRIOVSupport;
+  UINT8         PciePort[PCIE_MAX_TOTAL_PORTS];
+  UINT8         PcieLinkSpeedPort[PCIE_MAX_TOTAL_PORTS];
+  UINT8         PcieLinkDeEmphasisPort[PCIE_MAX_TOTAL_PORTS];
+  UINT8         PcieLinkStatusPort[PCIE_MAX_TOTAL_PORTS];
+  UINT8         PcieLinkSpeedRateStatusPort[PCIE_MAX_TOTAL_PORTS];
+  UINT8         PcieLinkMaxPort[PCIE_MAX_TOTAL_PORTS];
+  UINT8         PcieMaxPayloadSizePort[PCIE_MAX_TOTAL_PORTS];
+  UINT8         PcieAspmPort[PCIE_MAX_TOTAL_PORTS];
+  /*Misc Config*/
+  UINT8         EnableSmmu;
+  UINT8         EnableFdtTable;
+  UINT8         EnableSpcr;
+  /*RAS Config*/
+  UINT8         EnRasSupport;
+  UINT8         EnPoison;
+  UINT8         CheckAlgorithm;
+  UINT8         PatrolScrub;
+  UINT8         PatrolScrubDuration;
+  UINT8         DemandScrubMode;
+  UINT8         CorrectErrorThreshold;
+  UINT8         AdvanceDeviceCorrection;
+  UINT8         RankSparing;
+  UINT8         FunnelPeriod;
+  UINT8         DpcFeature;
+  UINT8         EcrcFeature;
+  UINT8         CompletionTimeout;
+  UINT8         CompletionTimeoutValue;
+  UINT8         HotPlug;
+
+} OEM_CONFIG_DATA;
+#pragma pack()
+
+#endif
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
new file mode 100644
index 0000000000..1e3635307c
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
@@ -0,0 +1,363 @@
+/** @file
+The OEM config reference implementation
+
+Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+Copyright (c) 2018, Linaro Limited. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "OemConfig.h"
+
+OEM_CONFIG_CALLBACK_DATA    mOemConfigPrivate = {
+  OEM_CONFIG_CALLBACK_DATA_SIGNATURE,
+  NULL,
+  NULL,
+  {
+    OemExtractConfig,
+    OemRouteConfig,
+    OemCallback
+  }
+};
+
+HII_VENDOR_DEVICE_PATH  mOemHiiVendorDevicePath = {
+  {
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_VENDOR_DP,
+      {
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
+      }
+    },
+    { 0x874c4dcb, 0x08ec, 0x4fe6, { 0xb5, 0x8e, 0x3a, 0x9e, 0x1c, 0x26, 0x70, 0xb9 } }
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    {
+      (UINT8) (END_DEVICE_PATH_LENGTH),
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
+    }
+  }
+};
+
+
+
+
+
+
+/**
+  This function allows a caller to extract the current configuration for one
+  or more named elements from the target driver.
+
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Request         A null-terminated Unicode string in <ConfigRequest> format.
+  @param Progress        On return, points to a character in the Request string.
+                         Points to the string's null terminator if request was successful.
+                         Points to the most recent '&' before the first failing name/value
+                         pair (or the beginning of the string if the failure is in the
+                         first name/value pair) if the request was not successful.
+  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which
+                         has all values filled in for the names in the Request string.
+                         String to be allocated by the called function.
+
+  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+OemExtractConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Request,
+  OUT EFI_STRING                             *Progress,
+  OUT EFI_STRING                             *Results
+  )
+{
+  if (Progress == NULL || Results == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+  *Progress = Request;
+  return EFI_NOT_FOUND;
+}
+
+/**
+  This function processes the results of changes in configuration.
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Configuration   A null-terminated Unicode string in <ConfigResp> format.
+  @param Progress        A pointer to a string filled in with the offset of the most
+                         recent '&' before the first failing name/value pair (or the
+                         beginning of the string if the failure is in the first
+                         name/value pair) or the terminating NULL if all was successful.
+
+  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
+  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
+
+**/
+EFI_STATUS
+EFIAPI
+OemRouteConfig (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  CONST EFI_STRING                       Configuration,
+  OUT EFI_STRING                             *Progress
+  )
+{
+  if (Configuration == NULL || Progress == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  *Progress = Configuration;
+
+  return EFI_NOT_FOUND;
+}
+
+/**
+  This function is invoked if user selected a interactive opcode from Device Manager's
+  Formset. If user set VBIOS, the new value is saved to EFI variable.
+
+  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
+  @param Action          Specifies the type of action taken by the browser.
+  @param QuestionId      A unique value which is sent to the original exporting driver
+                         so that it can identify the type of data to expect.
+  @param Type            The type of value for the question.
+  @param Value           A pointer to the data being sent to the original exporting driver.
+  @param ActionRequest   On return, points to the action requested by the callback function.
+
+  @retval  EFI_SUCCESS           The callback successfully handled the action.
+  @retval  EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.
+
+**/
+EFI_STATUS
+EFIAPI
+OemCallback (
+  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
+  IN  EFI_BROWSER_ACTION                     Action,
+  IN  EFI_QUESTION_ID                        QuestionId,
+  IN  UINT8                                  Type,
+  IN  EFI_IFR_TYPE_VALUE                     *Value,
+  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
+  )
+{
+  if (Action != EFI_BROWSER_ACTION_CHANGING) {
+    //
+    // Do nothing for other UEFI Action. Only do call back when data is changed.
+    //
+    return EFI_UNSUPPORTED;
+  }
+  if ((Value == NULL) || (ActionRequest == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Install Boot Manager Menu driver.
+
+  @param ImageHandle     The image handle.
+  @param SystemTable     The system table.
+
+  @retval  EFI_SUCEESS  Install Boot manager menu success.
+  @retval  Other        Return error status.
+
+**/
+EFI_STATUS
+EFIAPI
+OemConfigUiLibConstructor (
+  IN EFI_HANDLE                            ImageHandle,
+  IN EFI_SYSTEM_TABLE                      *SystemTable
+  )
+{
+  EFI_STATUS                  Status;
+  OEM_CONFIG_DATA             Configuration;
+  VOID                        *Hob;
+  VERSION_INFO                *VersionInfo;
+  UINTN                       BufSize;
+  BOOLEAN                     Action;
+  EFI_STRING                  ConfigRequestHdr;
+  EFI_TIME                    Time = {0};
+  CHAR16                      TmpString[0x100] = {0};
+
+  mOemConfigPrivate.DriverHandle = NULL;
+  Status = gBS->InstallMultipleProtocolInterfaces (
+                  &mOemConfigPrivate.DriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mOemHiiVendorDevicePath,
+                  &gEfiHiiConfigAccessProtocolGuid,
+                  &mOemConfigPrivate.ConfigAccess,
+                  NULL
+                  );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  //
+  // Publish our HII data.
+  //
+  mOemConfigPrivate.HiiHandle = HiiAddPackages (
+                                   &gOemConfigGuid,
+                                   mOemConfigPrivate.DriverHandle,
+                                   OemConfigVfrBin,
+                                   OemConfigUiLibStrings,
+                                   NULL
+                                   );
+  if (mOemConfigPrivate.HiiHandle == NULL) {
+    DEBUG ((DEBUG_ERROR, "OemConfigUiLibConstructor(), Fail to Add Oem Hii Package.\n"));
+    return EFI_INVALID_PARAMETER;
+  }
+  //
+  //BIOS Build Time Init
+  //
+  Hob = GetFirstGuidHob (&gVersionInfoHobGuid);
+  if (Hob == NULL) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%d] Version information HOB not found!\n",
+      __FILE__, __LINE__));
+    return EFI_NOT_FOUND;
+  }
+  VersionInfo = GET_GUID_HOB_DATA (Hob);
+  Time = VersionInfo->BuildTime;
+  UnicodeSPrint (
+    TmpString,
+    sizeof (TmpString),
+    L"%02d/%02d/%04d %02d:%02d",
+    Time.Month,
+    Time.Day,
+    Time.Year,
+    Time.Hour,
+    Time.Minute
+    );
+  HiiSetString (
+    mOemConfigPrivate.HiiHandle,
+    STRING_TOKEN (STR_MISC_BIOS_BUILDTIME),
+    TmpString,
+    "en-US"
+    );
+  //
+  // Check Oem Config Variable.
+  //
+  ConfigRequestHdr = HiiConstructConfigHdr (
+                       &gOemConfigGuid,
+                       OEM_CONFIG_NAME,
+                       mOemConfigPrivate.DriverHandle
+                       );
+  ZeroMem (&Configuration, sizeof (OEM_CONFIG_DATA));
+  BufSize = sizeof (OEM_CONFIG_DATA);
+  Status = gRT->GetVariable (
+                  OEM_CONFIG_NAME,
+                  &gOemConfigGuid,
+                  NULL,
+                  &BufSize,
+                  &Configuration
+                  );
+  if (EFI_ERROR (Status)) {
+    Action = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);
+    if (!Action) {
+      //
+      //Set the default value of the DDR option
+      //
+      Configuration.DdrDebugLevel = 0;
+      Configuration.DdrFreqLimit = 0;
+      Configuration.DdrRefreshSupport = 0;
+      Configuration.DdrRefreshRate = 0;
+      Configuration.RankMargin = 0;
+      Configuration.RankMarginMode = 2;
+      Configuration.rmtPatternLength = 256;
+      Configuration.perbitmargin = 0x0;
+      Configuration.CaMargin = 0x0;
+      Configuration.CaVrefMarginOption = 0x0;
+      Configuration.NumaEn = 1;
+      Configuration.HwMemTest = 0;
+      Configuration.DieInterleaving = 0;
+      Configuration.ChannelInterleaving = 1;
+      Configuration.RankInterleaving = 2;
+      Configuration.EccSupport = 0;
+      //
+      //Set the default value of the BMC option
+      //
+      Configuration.BmcWdtEnable = 0;
+      Configuration.BmcWdtTimeout = 15;
+      Configuration.BmcWdtAction = 1;
+      Configuration.OSWdtEnable = 0;
+      Configuration.OSWdtTimeout = 5;
+      Configuration.OSWdtAction = 1;
+      //
+      //Set the default value of the Misc option
+      //
+      Configuration.EnableSmmu = 1;
+      Configuration.EnableFdtTable = 0;
+      Configuration.EnableSpcr = 0;
+      //
+      //Set the default value of the Ras option
+      //
+      Configuration.EnRasSupport = 1;
+      Configuration.EnPoison = 1;
+      Configuration.CheckAlgorithm = 0;
+      Configuration.PatrolScrub = 1;
+      Configuration.PatrolScrubDuration = 24;
+      Configuration.DemandScrubMode = 0;
+      Configuration.CorrectErrorThreshold = 0;
+      Configuration.AdvanceDeviceCorrection = 0;
+      Configuration.RankSparing = 0;
+      Configuration.FunnelPeriod = 0;
+      Configuration.DpcFeature = 0;
+      Configuration.EcrcFeature = 0;
+      Configuration.CompletionTimeout = 1;
+      Configuration.CompletionTimeoutValue = 0;
+      Configuration.HotPlug = 1;
+      Status = gRT->SetVariable (
+                      OEM_CONFIG_NAME,
+                      &gOemConfigGuid,
+                      EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
+                      sizeof (OEM_CONFIG_DATA),
+                      &Configuration
+                      );
+    }
+  } else {
+    Action = HiiValidateSettings (ConfigRequestHdr);
+    if (!Action) {
+      return EFI_INVALID_PARAMETER;
+    }
+  }
+  return EFI_SUCCESS;
+}
+
+/**
+  Unloads the application and its installed protocol.
+
+  @param  ImageHandle     Handle that identifies the image to be unloaded.
+  @param  SystemTable     The system table.
+
+  @retval EFI_SUCCESS           The image has been unloaded.
+**/
+EFI_STATUS
+EFIAPI
+OemConfigUiLibDestructor (
+  IN EFI_HANDLE                            ImageHandle,
+  IN EFI_SYSTEM_TABLE                      *SystemTable
+  )
+{
+  EFI_STATUS                  Status;
+
+  Status = gBS->UninstallMultipleProtocolInterfaces (
+                  mOemConfigPrivate.DriverHandle,
+                  &gEfiDevicePathProtocolGuid,
+                  &mOemHiiVendorDevicePath,
+                  &gEfiHiiConfigAccessProtocolGuid,
+                  &mOemConfigPrivate.ConfigAccess,
+                  NULL
+                  );
+
+  HiiRemovePackages (mOemConfigPrivate.HiiHandle);
+
+  return Status;
+}
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.hfr b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.hfr
new file mode 100644
index 0000000000..c709975c38
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.hfr
@@ -0,0 +1,154 @@
+/** @file
+*
+*  Memory Config form at Oem Config fromset.
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+form formid = MEMORY_CONFIG_FORM_ID,
+  title  = STRING_TOKEN(STR_MEMORY_CONFIG_FORM_TITLE);
+
+  oneof varid  = OEM_CONFIG_DATA.DdrDebugLevel,
+        prompt   = STRING_TOKEN (STR_MEM_PRINT_LEVEL_PROMPT),
+        help     = STRING_TOKEN (STR_MEM_PRINT_LEVEL_HELP),
+        option text = STRING_TOKEN (STR_MEM_PRINT_LEVEL_DISABLE),  value = 0, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN (STR_MEM_PRINT_LEVEL_MINIMUM), value = 1, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+        option text = STRING_TOKEN (STR_MEM_PRINT_LEVEL_MINMAX),  value = 2, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN (STR_MEM_PRINT_LEVEL_MAXIMUM),  value = 3, flags = RESET_REQUIRED;
+  endoneof;
+
+  oneof varid = OEM_CONFIG_DATA.DdrFreqLimit,
+        prompt  = STRING_TOKEN(STR_XMP_DDR_FREQ_LIMIT_PROMPT),
+        help    = STRING_TOKEN(STR_XMP_DDR_FREQ_LIMIT_HELP),
+        option text = STRING_TOKEN(STR_AUTO), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_DDR_FREQ_1333_STRING), value = 5, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_DDR_FREQ_1600_STRING), value = 7, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_DDR_FREQ_1866_STRING), value = 9, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_DDR_FREQ_2133_STRING), value = 11, flags = RESET_REQUIRED ;
+        option text = STRING_TOKEN(STR_DDR_FREQ_2400_STRING), value = 13, flags = RESET_REQUIRED ;
+        option text = STRING_TOKEN(STR_DDR_FREQ_2667_STRING), value = 15, flags = RESET_REQUIRED ;
+        option text = STRING_TOKEN(STR_DDR_FREQ_2933_STRING), value = 17, flags = RESET_REQUIRED ;
+        option text = STRING_TOKEN(STR_DDR_FREQ_3200_STRING), value = 19, flags = RESET_REQUIRED ;
+  endoneof;
+
+  suppressif TRUE;
+    oneof varid = OEM_CONFIG_DATA.DdrRefreshSupport,
+          prompt  = STRING_TOKEN(STR_DDR_REFRESH_SUPPORT_PROMPT),
+          help    = STRING_TOKEN(STR_DDR_REFRESH_SUPPORT_HELP),
+          option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+          option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;
+    endoneof;
+
+    suppressif ideqval OEM_CONFIG_DATA.DdrRefreshSupport == 0;
+      oneof varid = OEM_CONFIG_DATA.DdrRefreshRate,
+            prompt  = STRING_TOKEN(STR_DDR_REFRESH_PROMPT),
+            help    = STRING_TOKEN(STR_DDR_REFRESH_HELP),
+            option text = STRING_TOKEN(STR_32MS), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+            option text = STRING_TOKEN(STR_64MS), value = 1, flags = RESET_REQUIRED;
+      endoneof;
+    endif;
+
+    oneof varid  = OEM_CONFIG_DATA.RankMargin,
+          prompt   = STRING_TOKEN (STR_RMT_PROMPT),
+          help     = STRING_TOKEN (STR_RMT_HELP),
+          option text = STRING_TOKEN (STR_DISABLE), value = 0, flags = DEFAULT | MANUFACTURING |RESET_REQUIRED;
+          option text = STRING_TOKEN (STR_ENABLE),  value = 1, flags = RESET_REQUIRED;
+    endoneof;
+
+    suppressif  ideqval OEM_CONFIG_DATA.RankMargin == 0;
+      oneof varid  = OEM_CONFIG_DATA.RankMarginMode,
+            prompt   = STRING_TOKEN (STR_RMTM_PROMPT),
+            help     = STRING_TOKEN (STR_RMTM_HELP),
+            option text = STRING_TOKEN (STR_RMTM_SFC),     value = 1, flags = RESET_REQUIRED;
+            option text = STRING_TOKEN (STR_RMTM_EXMBIST), value = 2, flags = DEFAULT | MANUFACTURING |RESET_REQUIRED;
+      endoneof;
+
+      numeric varid = OEM_CONFIG_DATA.rmtPatternLength,
+              prompt    = STRING_TOKEN (STR_RMT_PATTERN_PROMPT),
+              help      = STRING_TOKEN (STR_RMT_PATTERN_HELP),
+              flags     = RESET_REQUIRED,
+              minimum   = 1,
+              maximum   = 32767,
+              step      = 1,
+              default   = RMT_PATTERN_LENGTH,
+      endnumeric;
+
+      oneof varid  = OEM_CONFIG_DATA.perbitmargin,
+            prompt   = STRING_TOKEN (STR_PER_BIT_MARGIN_PROMPT),
+            help     = STRING_TOKEN (STR_PER_BIT_MARGIN_HELP),
+            option text = STRING_TOKEN (STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+            option text = STRING_TOKEN (STR_ENABLE),  value = 1, flags = RESET_REQUIRED;
+      endoneof;
+
+      oneof varid  = OEM_CONFIG_DATA.CaMargin,
+            prompt   = STRING_TOKEN (STR_CA_MARGINS_PROMPT),
+            help     = STRING_TOKEN (STR_CA_MARGINS_HELP),
+            option text = STRING_TOKEN (STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+            option text = STRING_TOKEN (STR_ENABLE),  value = 1, flags = RESET_REQUIRED;
+      endoneof;
+
+      oneof varid  = OEM_CONFIG_DATA.CaVrefMarginOption,
+            prompt   = STRING_TOKEN (STR_CAVREF_MARGINS_PROMPT),
+            help     = STRING_TOKEN (STR_CAVREF_MARGINS_HELP),
+            option text = STRING_TOKEN (STR_CAVREF_MARGINS_OPTION0), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+            option text = STRING_TOKEN (STR_CAVREF_MARGINS_OPTION2),  value = 1, flags = RESET_REQUIRED;
+      endoneof;
+    endif;
+
+    oneof varid = OEM_CONFIG_DATA.DieInterleaving,
+          prompt  = STRING_TOKEN(STR_DIE_INTERLEAVING_PROMPT),
+          help    = STRING_TOKEN(STR_DIE_INTERLEAVING_HELP),
+          option text = STRING_TOKEN(STR_DISABLE),               value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+          option text = STRING_TOKEN(STR_ENABLE),                value = 1, flags = RESET_REQUIRED;
+    endoneof;
+
+    oneof varid = OEM_CONFIG_DATA.ChannelInterleaving,
+          prompt  = STRING_TOKEN(STR_CHANNEL_INTERLEAVING_PROMPT),
+          help    = STRING_TOKEN(STR_CHANNEL_INTERLEAVING_HELP),
+          option text = STRING_TOKEN(STR_DISABLE),               value = 0, flags = RESET_REQUIRED;
+          option text = STRING_TOKEN(STR_ENABLE),                value = 1, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+    endoneof;
+
+    oneof varid = OEM_CONFIG_DATA.RankInterleaving,
+          prompt  = STRING_TOKEN(STR_RANK_INTERLEAVING_PROMPT),
+          help    = STRING_TOKEN(STR_RANK_INTERLEAVING_HELP),
+          option text = STRING_TOKEN(STR_1WAY_STRING),           value = 1, flags = RESET_REQUIRED;
+          option text = STRING_TOKEN(STR_2WAY_STRING),           value = 2, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+          option text = STRING_TOKEN(STR_4WAY_STRING),           value = 4, flags = RESET_REQUIRED;
+    endoneof;
+
+    oneof varid = OEM_CONFIG_DATA.NumaEn,
+          prompt  = STRING_TOKEN(STR_NUMA_PROMPT),
+          help    = STRING_TOKEN(STR_NUMA_HELP),
+          option text = STRING_TOKEN(STR_DISABLE),      value = 0,  flags = RESET_REQUIRED;
+          option text = STRING_TOKEN(STR_ENABLE),       value = 1,  flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+    endoneof;
+
+    oneof varid  = OEM_CONFIG_DATA.HwMemTest,
+          prompt   = STRING_TOKEN (STR_MEM_TEST_PROMPT),
+          help     = STRING_TOKEN (STR_MEM_TEST_HELP),
+          option text = STRING_TOKEN (STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+          option text = STRING_TOKEN (STR_ENABLE),  value = 1, flags = RESET_REQUIRED;
+    endoneof;
+
+    oneof varid  = OEM_CONFIG_DATA.EccSupport,
+          prompt   = STRING_TOKEN (STR_ECC_SUPPORT_PROMPT),
+          help     = STRING_TOKEN (STR_ECC_SUPPORT_HELP),
+          option text = STRING_TOKEN (STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+          option text = STRING_TOKEN (STR_ECC_EN),  value = 1, flags = RESET_REQUIRED;
+          option text = STRING_TOKEN (STR_SDEC_EN),  value = 2, flags = RESET_REQUIRED;
+    endoneof;
+  endif;
+
+endform;
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.uni b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.uni
new file mode 100644
index 0000000000..0ecf5e59cf
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.uni
@@ -0,0 +1,103 @@
+/** @file
+*
+*  String definitions for the Memory Config.
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+/=#
+
+#langdef   en-US "English"
+
+#string STR_MEMORY_CONFIG_FORM_TITLE        #language en-US "Memory Configuration"
+#string STR_MEMORY_CONFIG_FORM_HELP         #language en-US "Displays and provides option to change the Memory Settings"
+#string STR_MEMORY_RAS_CONFIG_FORM_TITLE    #language en-US "Memory RAS Configuration"
+#string STR_MEMORY_RAS_CONFIG_FORM_HELP     #language en-US "Displays and provides option to change the Ras Configuration"
+#string STR_MEM_PRINT_LEVEL_PROMPT          #language en-US "Memory Print Level"
+#string STR_MEM_PRINT_LEVEL_HELP            #language en-US "Memory Print Level Set. Disable: Do not print any MRC statement/ Minimum: Print the most important(High level) MRC statement/ Minmax: Print the Mid-important(Mid level) and most important MRC statement/ Maximum: Print all of the MRC statement"
+#string STR_ENABLE                          #language en-US  "Enabled"
+#string STR_DISABLE                         #language en-US  "Disabled"
+
+#string STR_MEM_PRINT_LEVEL_MINIMUM         #language en-US "Minimum"
+#string STR_MEM_PRINT_LEVEL_MINMAX          #language en-US "Minmax"
+#string STR_MEM_PRINT_LEVEL_MAXIMUM         #language en-US "Maximum"
+#string STR_MEM_PRINT_LEVEL_DISABLE         #language en-US "Disable"
+
+#string STR_XMP_DDR_FREQ_LIMIT_PROMPT       #language en-US "Memory Frequency"
+#string STR_XMP_DDR_FREQ_LIMIT_HELP         #language en-US "Maximum Memory Frequency Selections in Mhz. Do not select Reserved"
+#string STR_AUTO                            #language en-US "Auto"
+#string STR_DDR_FREQ_1333_STRING            #language en-US "1333"
+#string STR_DDR_FREQ_1600_STRING            #language en-US "1600"
+#string STR_DDR_FREQ_1866_STRING            #language en-US "1866"
+#string STR_DDR_FREQ_2133_STRING            #language en-US "2133"
+#string STR_DDR_FREQ_2400_STRING            #language en-US "2400"
+#string STR_DDR_FREQ_2600_STRING            #language en-US "2600"
+#string STR_DDR_FREQ_2667_STRING            #language en-US "2667"
+#string STR_DDR_FREQ_2800_STRING            #language en-US "2800"
+#string STR_DDR_FREQ_2933_STRING            #language en-US "2993"
+#string STR_DDR_FREQ_3000_STRING            #language en-US "3000"
+#string STR_DDR_FREQ_3200_STRING            #language en-US "3200"
+
+#string STR_DDR_REFRESH_SUPPORT_PROMPT      #language en-US "Custom Refresh Enable"
+#string STR_DDR_REFRESH_SUPPORT_HELP        #language en-US "Memory Custom Refresh Enable "
+#string STR_DDR_REFRESH_PROMPT              #language en-US "Custom Refresh Rate"
+#string STR_DDR_REFRESH_HELP                #language en-US "Memory Custom Refresh Rate "
+#string STR_32MS                            #language en-US "32ms"
+#string STR_64MS                            #language en-US "64ms"
+
+#string STR_RMT_PROMPT                      #language en-US "Rank Margin Tool"
+#string STR_RMT_HELP                        #language en-US "Enable the rank margin tool to run after DDR memory training"
+#string STR_RMTM_PROMPT                     #language en-US "Rank Margin Mode"
+#string STR_RMTM_HELP                       #language en-US "Select test mode for rank margin test"
+#string STR_RMTM_SFC                        #language en-US "SFC"
+#string STR_RMTM_EXMBIST                    #language en-US "EXMBIST"
+#string STR_RMT_PATTERN_PROMPT              #language en-US "RMT Pattern Length"
+#string STR_RMT_PATTERN_HELP                #language en-US "Set the pattern length(1-32767) for the Rank Margin Tool"
+#string STR_PER_BIT_MARGIN_PROMPT           #language en-US "Per Bit Margin"
+#string STR_PER_BIT_MARGIN_HELP             #language en-US "Enables the logging from the serial port of DDR Per Bit Margin Data"
+#string STR_CA_MARGINS_PROMPT               #language en-US "CA Margin"
+#string STR_CA_MARGINS_HELP                 #language en-US "Enables CA margin"
+#string STR_CAVREF_MARGINS_PROMPT           #language en-US "CAVref Margin"
+#string STR_CAVREF_MARGINS_HELP             #language en-US "CAVref margin Options"
+#string STR_CAVREF_MARGINS_OPTION0          #language en-US "VDD/2^2 connected to QVrefVA and BVrefCA"
+#string STR_CAVREF_MARGINS_OPTION2          #language en-US "Internally generated Vref connected to QVrefCA^3 VDD/2^2 connected to BVrefCA"
+
+#string STR_DIE_INTERLEAVING_PROMPT         #language en-US "Die Interleaving"
+#string STR_DIE_INTERLEAVING_HELP           #language en-US "Select Die Interleaving setting"
+#string STR_CHANNEL_INTERLEAVING_PROMPT     #language en-US "Channel Interleaving"
+#string STR_CHANNEL_INTERLEAVING_HELP       #language en-US "Select Channel Interleaving setting"
+#string STR_RANK_INTERLEAVING_PROMPT        #language en-US "Rank Interleaving"
+#string STR_RANK_INTERLEAVING_HELP          #language en-US "Select Rank Interleaving setting"
+
+#string STR_1WAY_STRING                     #language en-US "1-way Interleave"
+#string STR_2WAY_STRING                     #language en-US "2-way Interleave"
+#string STR_3WAY_STRING                     #language en-US "3-way Interleave"
+#string STR_4WAY_STRING                     #language en-US "4-way Interleave"
+#string STR_6WAY_STRING                     #language en-US "6-way Interleave"
+#string STR_8WAY_STRING                     #language en-US "8-way Interleave"
+
+#string STR_NUMA_PROMPT                     #language en-US "NUMA"
+#string STR_NUMA_HELP                       #language en-US "Enable or Disable Non uniform Memory Access (NUMA)."
+
+#string STR_MEM_TEST_PROMPT                 #language en-US "Memory Test"
+#string STR_MEM_TEST_HELP                   #language en-US "Enable/disable memory test during normal boot"
+
+#string STR_ECC_SUPPORT_PROMPT              #language en-US "ECC/SDEC Support"
+#string STR_ECC_SUPPORT_HELP                #language en-US "Enable/disable DDR Ecc/SDEC Support"
+#string STR_ECC_EN                          #language en-US "Ecc Enable"
+#string STR_SDEC_EN                         #language en-US "SDEC Enable"
+
+
+
+
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
new file mode 100644
index 0000000000..9e3ac73116
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
@@ -0,0 +1,41 @@
+/** @file
+*
+*  Misc Config form at Oem Config fromset.
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+form formid = MISC_CONFIG_FORM_ID,
+  title  = STRING_TOKEN(STR_MISC_CONFIG_FORM_TITLE);
+
+    oneof varid   = OEM_CONFIG_DATA.EnableSmmu,
+      prompt      = STRING_TOKEN(STR_OEM_TABLE),
+      help        = STRING_TOKEN(STR_OEM_CONFIG_HELP),
+      option text = STRING_TOKEN(STR_DISABLED), value = 0, flags = 0;
+      option text = STRING_TOKEN(STR_ENABLED), value = 1, flags = DEFAULT;
+    endoneof;
+
+    oneof varid   = OEM_CONFIG_DATA.EnableFdtTable,
+      prompt      = STRING_TOKEN(STR_FDT_TABLE),
+      help        = STRING_TOKEN(STR_FDT_CONFIG_HELP),
+      option text = STRING_TOKEN(STR_DISABLED), value = 0, flags = DEFAULT;
+      option text = STRING_TOKEN(STR_ENABLED), value = 1, flags = 0;
+    endoneof;
+
+    oneof varid   = OEM_CONFIG_DATA.EnableSpcr,
+      prompt      = STRING_TOKEN(STR_ENABLE_SPCR_TABLE),
+      help        = STRING_TOKEN(STR_ENABLE_SPCR_HELP),
+      option text = STRING_TOKEN(STR_DISABLED), value = 0, flags = DEFAULT;
+      option text = STRING_TOKEN(STR_ENABLED), value = 1, flags = 0;
+    endoneof;
+
+endform;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
new file mode 100644
index 0000000000..53eb1622c4
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
@@ -0,0 +1,27 @@
+/** @file
+*
+*  String definitions for the Misc Config form.
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#langdef   en-US "English"
+
+#string STR_OEM_TABLE                  #language en-US  "Support Smmu"
+#string STR_OEM_CONFIG_HELP            #language en-US  "Enable or Disable Smmu."
+#string STR_FDT_TABLE                  #language en-US  "Install DTB Table"
+#string STR_FDT_CONFIG_HELP            #language en-US  "Enable or Disable Fdt Table."
+#string STR_ENABLE_SPCR_TABLE          #language en-US  "Support SPCR"
+#string STR_ENABLE_SPCR_HELP           #language en-US  "Enable or Disable SPCR Table."
+#string STR_ENABLE_GOP_FRAME_BUFFER    #language en-US  "Support GOP FB"
+#string STR_ENABLE_GOP_FRAME_BUFFER_HELP     #language en-US  "Enable or Disable GOP frame buffer."
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.uni b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.uni
new file mode 100644
index 0000000000..0b2c63a625
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.uni
@@ -0,0 +1,24 @@
+/** @file
+*
+*  OEM Config Library used by UiApp
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#string STR_MODULE_ABSTRACT
+#language en-US              "OEM Config Library used by BDS"
+
+#string STR_MODULE_DESCRIPTION
+#language en-US              "OEM Config Library used by BDS"
+
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLibStrings.uni b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLibStrings.uni
new file mode 100644
index 0000000000..afc048e6cd
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLibStrings.uni
@@ -0,0 +1,42 @@
+/** @file
+*
+*  String definitions for the OEM Config.
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+/=#
+
+#langdef   en-US "English"
+
+#string STR_EMPTY_STRING               #language en-US  ""
+#string STR_BIOS_BUILDTIME_STRING      #language en-US  "Build Date"
+#string STR_MISC_BIOS_BUILDTIME        #language en-US  ""
+#string SYSTEM_TIME                    #language en-US  "System Time"
+#string SYSTEM_TIME_HELP               #language en-US  "System Time (HH:MM:SS)"
+#string SYSTEM_DATE                    #language en-US  "System Date"
+#string SYSTEM_DATE_HELP               #language en-US  "System Date (MM/DD/YYYY) Use [ENTER],[TAB] or [SHIFT-TAB] to select a field. Use [+] or [-] to configure system Time."
+#string STR_OEM_CONFIG                 #language en-US  "Oem Config"
+#string STR_ENABLED                    #language en-US  "Enabled"
+#string STR_DISABLED                   #language en-US  "Disabled"
+#string STR_MEMORY_CONFIG_FORM_TITLE   #language en-US  "Memory Config"
+#string STR_MEMORY_CONFIG_FORM_HELP    #language en-US  "Display Memory DIMM information."
+#string STR_PCIE_CONFIG_FORM_TITLE     #language en-US  "PCIe Config"
+#string STR_PCIE_CONFIG_FORM_HELP      #language en-US  "Display PCIe information."
+#string STR_MISC_CONFIG_FORM_TITLE     #language en-US  "MISC Config"
+#string STR_MISC_CONFIG_FORM_HELP      #language en-US  "Include SMMU Support Enable and Change the boot manner of DTB/ACPI."
+#string STR_IBMC_CONFIG_FORM_TITLE     #language en-US  "IBMC Config"
+#string STR_IBMC_CONFIG_FORM_HELP      #language en-US  "Include IBMC WDT(Watchdog Timer) Config."
+#string STR_RAS_CONFIG_FORM_TITLE      #language en-US  "RAS Config"
+#string STR_RAS_CONFIG_FORM_HELP       #language en-US  "Displays and provides option to change the Ras Configuration"
+#string STR_EXIT_STRING                #language en-US  "Press ESC to exit."
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigVfr.Vfr b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigVfr.Vfr
new file mode 100644
index 0000000000..470e9ace3d
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigVfr.Vfr
@@ -0,0 +1,89 @@
+/** @file
+*
+*  OEM Config formset.
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+#include "OemConfigUi.h"
+#include "Library/OemConfigData.h"
+
+formset
+  guid      = gOemConfigGuid,
+  title     = STRING_TOKEN(STR_OEM_CONFIG),
+  help      = STRING_TOKEN(STR_OEM_CONFIG),
+  classguid = gEfiIfrFrontPageGuid,  // for MdeModule Bds.
+  efivarstore OEM_CONFIG_DATA,
+    attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+    name  = OemConfig,
+    guid  = gOemConfigGuid;
+
+  form formid = OEM_CONFIG_FORM_ID,
+    title  = STRING_TOKEN(STR_OEM_CONFIG);
+
+    grayoutif  TRUE;
+      text
+        help   = STRING_TOKEN(STR_EMPTY_STRING),
+        text   = STRING_TOKEN(STR_BIOS_BUILDTIME_STRING),
+        text   = STRING_TOKEN(STR_MISC_BIOS_BUILDTIME),
+        flags  = 0,
+        key    = 0;
+    endif;
+
+    date
+      prompt  = STRING_TOKEN(SYSTEM_DATE),
+      help    = STRING_TOKEN(SYSTEM_DATE_HELP),
+      flags   = 0x10,
+      default = 2017/1/1,
+    enddate;
+
+    time
+      prompt  = STRING_TOKEN(SYSTEM_TIME),
+      help    = STRING_TOKEN(SYSTEM_TIME_HELP),
+      flags   = 0x10,
+    endtime;
+
+    subtitle text = STRING_TOKEN(STR_EMPTY_STRING);
+
+    goto MEMORY_CONFIG_FORM_ID,
+      prompt = STRING_TOKEN(STR_MEMORY_CONFIG_FORM_TITLE),
+      help   = STRING_TOKEN(STR_MEMORY_CONFIG_FORM_HELP);
+
+    goto IBMC_CONFIG_FORM_ID,
+      prompt = STRING_TOKEN(STR_IBMC_CONFIG_FORM_TITLE),
+      help   = STRING_TOKEN(STR_IBMC_CONFIG_FORM_HELP);
+
+    suppressif TRUE;
+    goto PCIE_CONFIG_FORM_ID,
+      prompt  = STRING_TOKEN(STR_PCIE_CONFIG_FORM_TITLE),
+      help    = STRING_TOKEN(STR_PCIE_CONFIG_FORM_HELP);
+    endif;
+
+    goto MISC_CONFIG_FORM_ID,
+      prompt  = STRING_TOKEN(STR_MISC_CONFIG_FORM_TITLE),
+      help    = STRING_TOKEN(STR_MISC_CONFIG_FORM_HELP);
+
+    goto RAS_CONFIG_FORM_ID,
+      prompt  = STRING_TOKEN(STR_RAS_CONFIG_FORM_TITLE),
+      help    = STRING_TOKEN(STR_RAS_CONFIG_FORM_HELP);
+
+    subtitle text = STRING_TOKEN(STR_EMPTY_STRING);
+    subtitle text = STRING_TOKEN(STR_EXIT_STRING);
+
+  endform;
+
+#include "MemoryConfig.hfr"
+#include "iBMCConfig.hfr"
+#include "PcieConfig.hfr"
+#include "MiscConfig.hfr"
+#include "RasConfig.hfr"
+endformset;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfig.hfr b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfig.hfr
new file mode 100644
index 0000000000..7cf7cdd29b
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfig.hfr
@@ -0,0 +1,219 @@
+/** @file
+*
+*  PCIe Config form at Oem Config fromset.
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+form formid = PCIE_CONFIG_FORM_ID,
+  title   = STRING_TOKEN (STR_PCIE_CONFIG_FORM_TITLE);
+
+  goto VFR_FORMID_PCIE_SOCKET0,
+    prompt  = STRING_TOKEN (STR_PCIE_CPU_0_PROMPT),
+    help    = STRING_TOKEN (STR_PCIE_CPU_PROMPT_HELP);
+
+  goto VFR_FORMID_PCIE_SOCKET1,
+    prompt  = STRING_TOKEN (STR_PCIE_CPU_1_PROMPT),
+    help    = STRING_TOKEN (STR_PCIE_CPU_PROMPT_HELP);
+
+  oneof varid  = OEM_CONFIG_DATA.PcieSRIOVSupport,
+        prompt   = STRING_TOKEN (STR_SRIOV_SUPPORT_PROMPT),
+        help     = STRING_TOKEN (STR_SRIOV_SUPPORT_HELP),
+        option text = STRING_TOKEN (STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+        option text = STRING_TOKEN (STR_ENABLE),  value = 1, flags = RESET_REQUIRED;
+  endoneof;
+
+endform;
+
+form formid = VFR_FORMID_PCIE_SOCKET0,
+  title = STRING_TOKEN(STR_PCIE_CPU_0_PROMPT);
+
+  goto VFR_FORMID_PCIE_PORT2,
+    prompt  = STRING_TOKEN(STR_PCIE_PORT_2_PROMPT),
+    help    = STRING_TOKEN(STR_PCIE_PORT_PROMPT_HELP);
+
+  goto VFR_FORMID_PCIE_PORT4,
+    prompt  = STRING_TOKEN(STR_PCIE_PORT_4_PROMPT),
+    help    = STRING_TOKEN(STR_PCIE_PORT_PROMPT_HELP);
+
+  goto VFR_FORMID_PCIE_PORT5,
+    prompt  = STRING_TOKEN(STR_PCIE_PORT_5_PROMPT),
+    help    = STRING_TOKEN(STR_PCIE_PORT_PROMPT_HELP);
+
+  goto VFR_FORMID_PCIE_PORT6,
+    prompt  = STRING_TOKEN(STR_PCIE_PORT_6_PROMPT),
+    help    = STRING_TOKEN(STR_PCIE_PORT_PROMPT_HELP);
+
+  goto VFR_FORMID_PCIE_PORT7,
+    prompt  = STRING_TOKEN(STR_PCIE_PORT_7_PROMPT),
+    help    = STRING_TOKEN(STR_PCIE_PORT_PROMPT_HELP);
+
+endform;
+
+form formid = VFR_FORMID_PCIE_SOCKET1,
+  title = STRING_TOKEN(STR_PCIE_CPU_1_PROMPT);
+  goto VFR_FORMID_PCIE_PORT10,
+    prompt  = STRING_TOKEN(STR_PCIE_PORT_10_PROMPT),
+    help    = STRING_TOKEN(STR_PCIE_PORT_PROMPT_HELP);
+
+  goto VFR_FORMID_PCIE_PORT12,
+    prompt  = STRING_TOKEN(STR_PCIE_PORT_12_PROMPT),
+    help    = STRING_TOKEN(STR_PCIE_PORT_PROMPT_HELP);
+
+  goto VFR_FORMID_PCIE_PORT13,
+    prompt  = STRING_TOKEN(STR_PCIE_PORT_13_PROMPT),
+    help    = STRING_TOKEN(STR_PCIE_PORT_PROMPT_HELP);
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT0,
+  title = STRING_TOKEN(STR_PCIE_PORT_0_PROMPT);
+  #undef  INDEX
+  #define INDEX   0
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT1,
+  title = STRING_TOKEN(STR_PCIE_PORT_1_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   1
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT2,
+  title = STRING_TOKEN(STR_PCIE_PORT_2_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   2
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT3,
+  title = STRING_TOKEN(STR_PCIE_PORT_3_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   3
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT4,
+  title = STRING_TOKEN(STR_PCIE_PORT_4_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   4
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT5,
+  title = STRING_TOKEN(STR_PCIE_PORT_5_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   5
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT6,
+  title = STRING_TOKEN(STR_PCIE_PORT_6_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   6
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT7,
+  title = STRING_TOKEN(STR_PCIE_PORT_7_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   7
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT8,
+  title = STRING_TOKEN(STR_PCIE_PORT_8_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   8
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT9,
+  title = STRING_TOKEN(STR_PCIE_PORT_9_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   9
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT10,
+  title = STRING_TOKEN(STR_PCIE_PORT_10_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   10
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT11,
+  title = STRING_TOKEN(STR_PCIE_PORT_11_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   11
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT12,
+  title = STRING_TOKEN(STR_PCIE_PORT_12_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   12
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT13,
+  title = STRING_TOKEN(STR_PCIE_PORT_13_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   13
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT14,
+  title = STRING_TOKEN(STR_PCIE_PORT_14_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   14
+  #include "PciePortConfig.hfr"
+
+endform;
+
+form formid = VFR_FORMID_PCIE_PORT15,
+  title = STRING_TOKEN(STR_PCIE_PORT_15_PROMPT);
+
+  #undef  INDEX
+  #define INDEX   15
+  #include "PciePortConfig.hfr"
+
+endform;
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfigStrings.uni b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfigStrings.uni
new file mode 100644
index 0000000000..d87d30f975
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfigStrings.uni
@@ -0,0 +1,111 @@
+/** @file
+*
+*  String definitions for the PCIe Config form.
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+/=#
+
+#langdef   en-US "English"
+
+#string STR_BLANK_STRING                #language en-US ""
+#string STR_PCIE_CPU_PROMPT_HELP        #language en-US "Press <Enter> to config this CPU."
+#string STR_PCIE_CPU_0_NULL_PROMPT      #language en-US ""
+#string STR_PCIE_CPU_0_PROMPT           #language en-US "CPU 0 PCIE Configuration"
+#string STR_PCIE_CPU_1_PROMPT           #language en-US "CPU 1 PCIE Configuration"
+#string STR_SRIOV_SUPPORT_PROMPT        #language en-US "SRIOV"
+#string STR_SRIOV_SUPPORT_HELP          #language en-US "This option enables / disables the SRIOV function"
+
+#string STR_PCIE_PORT_PROMPT_HELP       #language en-US "Press <Enter> to config this port."
+#string STR_PCIE_PORT_0_NULL_PROMPT     #language en-US ""
+#string STR_PCIE_PORT_0_PROMPT          #language en-US "CPU 0 Pcie - Port 0"
+#string STR_PCIE_PORT_1_PROMPT          #language en-US "CPU 0 Pcie - Port 1"
+#string STR_PCIE_PORT_2_PROMPT          #language en-US "CPU 0 Pcie - Port 2"
+#string STR_PCIE_PORT_3_PROMPT          #language en-US "CPU 0 Pcie - Port 3"
+#string STR_PCIE_PORT_4_PROMPT          #language en-US "CPU 0 Pcie - Port 4"
+#string STR_PCIE_PORT_5_PROMPT          #language en-US "CPU 0 Pcie - Port 5"
+#string STR_PCIE_PORT_6_PROMPT          #language en-US "CPU 0 Pcie - Port 6"
+#string STR_PCIE_PORT_7_PROMPT          #language en-US "CPU 0 Pcie - Port 7"
+#string STR_PCIE_PORT_8_PROMPT          #language en-US "CPU 1 Pcie - Port 0"
+#string STR_PCIE_PORT_9_PROMPT          #language en-US "CPU 1 Pcie - Port 1"
+#string STR_PCIE_PORT_10_PROMPT         #language en-US "CPU 1 Pcie - Port 2"
+#string STR_PCIE_PORT_11_PROMPT         #language en-US "CPU 1 Pcie - Port 3"
+#string STR_PCIE_PORT_12_PROMPT         #language en-US "CPU 1 Pcie - Port 4"
+#string STR_PCIE_PORT_13_PROMPT         #language en-US "CPU 1 Pcie - Port 5"
+#string STR_PCIE_PORT_14_PROMPT         #language en-US "CPU 1 Pcie - Port 6"
+#string STR_PCIE_PORT_15_PROMPT         #language en-US "CPU 1 Pcie - Port 7"
+
+#string STR_PCIE_PORT_ENABLE_PROMPT_0   #language en-US "PCI-E Port"
+#string STR_PCIE_PORT_ENABLE_HELP       #language en-US "Disable is used to disable the port and hide its CFG space."
+
+#string STR_LINK_STATUS                 #language en-US "PCI-E Port Link Status"
+#string STR_LINK_STATUS_NG              #language en-US "Link Training Error"
+#string STR_LINK_STATUS_OK              #language en-US "Link Up"
+#string STR_MAXLINK_STATUS              #language en-US "PCI-E Port Link Max"
+#string STR_WIDTH1_STRING               #language en-US "X1"
+#string STR_WIDTH2_STRING               #language en-US "X2"
+#string STR_WIDTH4_STRING               #language en-US "X4"
+#string STR_WIDTH8_STRING               #language en-US "X8"
+#string STR_WIDTH16_STRING              #language en-US "X16"
+#string STR_WIDTH32_STRING              #language en-US "X32"
+
+#string STR_PCIESPEED_STATUS            #language en-US "PCI-E Port Link Speed"
+#string STR_PCIE_LINK_SPEED1_STRING     #language en-US "Gen 1 (2.5 GT/s)"
+#string STR_PCIE_LINK_SPEED2_STRING     #language en-US "Gen 2 (5 GT/s)"
+#string STR_PCIE_LINK_SPEED3_STRING     #language en-US "Gen 3 (8 GT/s)"
+
+#string STR_PCIE_PORT_DEEMPHASIS_PROMPT_0  #language en-US "PCI-E Port DeEmphasis"
+
+#string STR_PCIE_PORT_DEEMPHASIS_HELP   #language en-US "De-Emphais control for this PCIe port."
+
+#string STR_35DB                        #language en-US "-3.5 dB"
+#string STR_60DB                        #language en-US "-6.0 dB"
+
+#string STR_PCIE_PORT_ASPM_PROMPT_G     #language en-US "PCI-E ASPM Support"
+
+#string STR_PCIE_GLOBAL_ASPM_HELP       #language en-US "This option enables / disables the ASPM support for all downstream devices."
+#string STR_PCIE_PORT_ASPM_HELP         #language en-US "This option enables / disables the ASPM (L1) support for the downstream devices."
+
+#string STR_L0S_ONLY                    #language en-US "L0s Only"
+#string STR_L0S_L1_BOTH                 #language en-US "L0s & L1 Both"
+#string STR_L1_ONLY                     #language en-US "L1 Only"
+
+#string STR_PCIE_PORT_MAX_PAYLOAD_REQUEST_PROMPT    #language en-US "Max Payload Size"
+#string STR_PCIE_PORT_MAX_PAYLOAD_REQUEST_HELP      #language en-US "Set Maxpayload size to 512B if possible"
+//
+// Common Strings
+//
+#string STR_AUTO                        #language en-US "Auto"
+#string STR_X1                          #language en-US "x1"
+#string STR_X2                          #language en-US "x2"
+#string STR_X4                          #language en-US "x4"
+#string STR_X8                          #language en-US "x8"
+#string STR_X16                         #language en-US "x16"
+
+#string STR_128B                        #language en-US "128B"
+#string STR_256B                        #language en-US "256B"
+#string STR_512B                        #language en-US "512B"
+#string STR_1024B                       #language en-US "1024B"
+#string STR_2048B                       #language en-US "2048B"
+#string STR_4096B                       #language en-US "4096B"
+
+#string STR_CLEAR                       #language en-US "Clear"
+#string STR_SET                         #language en-US "Set"
+
+#string STR_PCIE_PORT_LINK_SPEED_PROMPT_0       #language en-US "Link Speed"
+#string STR_PCIE_PORT_LINK_SPEED_HELP           #language en-US "Link Speed:Gen1(2.5 GT/s)/Gen2(5 GT/s)/Gen3(8 GT/s)/GEN 4 (16 gt/s)"
+#string STR_PCIE_GEN1                           #language en-US "Gen 1 (2.5 GT/s)"
+#string STR_PCIE_GEN2                           #language en-US "Gen 2 (5 GT/s)"
+#string STR_PCIE_GEN3                           #language en-US "Gen 3 (8 GT/s)"
+#string STR_PCIE_GEN4                           #language en-US "Gen 4 (16 GT/s)"
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PciePortConfig.hfr b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PciePortConfig.hfr
new file mode 100644
index 0000000000..1a8942157c
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PciePortConfig.hfr
@@ -0,0 +1,167 @@
+/** @file
+*
+*  PCIe Config form at Oem Config fromset.
+*
+*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+oneof varid = OEM_CONFIG_DATA.PciePort[INDEX],
+  prompt  = STRING_TOKEN(STR_PCIE_PORT_ENABLE_PROMPT_0),
+  help    = STRING_TOKEN(STR_PCIE_PORT_ENABLE_HELP),
+  option text = STRING_TOKEN(STR_ENABLE),  value = 1, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+  option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;
+endoneof;
+
+suppressif ideqval OEM_CONFIG_DATA.PciePort[INDEX] == 0x00;
+  oneof varid     = OEM_CONFIG_DATA.PcieLinkSpeedPort[INDEX],
+    prompt          = STRING_TOKEN(STR_PCIE_PORT_LINK_SPEED_PROMPT_0),
+    help            = STRING_TOKEN(STR_PCIE_PORT_LINK_SPEED_HELP),
+    option text     = STRING_TOKEN(STR_PCIE_GEN1),  value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
+    option text     = STRING_TOKEN(STR_PCIE_GEN2),  value = 2, flags = RESET_REQUIRED;
+    option text     = STRING_TOKEN(STR_PCIE_GEN3),  value = 3, flags = RESET_REQUIRED;
+    option text     = STRING_TOKEN(STR_PCIE_GEN4),  value = 4, flags = RESET_REQUIRED;
+  endoneof;
+
+  suppressif NOT ideqval OEM_CONFIG_DATA.PcieLinkSpeedPort[INDEX] == 2;
+    oneof varid = OEM_CONFIG_DATA.PcieLinkDeEmphasisPort[INDEX],
+      prompt  = STRING_TOKEN(STR_PCIE_PORT_DEEMPHASIS_PROMPT_0),
+      help    = STRING_TOKEN(STR_PCIE_PORT_DEEMPHASIS_HELP),
+    #if ( INDEX == 0)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 1)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 3)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 4)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 6)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 7)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 8)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 9)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 11)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 14)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 15)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED;
+    #endif
+
+    #if ( INDEX == 2)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED ;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED| MANUFACTURING | DEFAULT;
+    #endif
+
+    #if ( INDEX == 5)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+    #endif
+
+    #if ( INDEX == 10)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+    #endif
+
+    #if ( INDEX == 12)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+    #endif
+
+    #if ( INDEX == 13)
+      option text = STRING_TOKEN(STR_60DB), value = 0, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_35DB), value = 1, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+    #endif
+
+    endoneof;
+  endif;
+
+  grayoutif  TRUE;
+    oneof varid = OEM_CONFIG_DATA.PcieLinkStatusPort[INDEX],
+      prompt  = STRING_TOKEN(STR_LINK_STATUS),
+      help    = STRING_TOKEN(STR_BLANK_STRING),
+      option text = STRING_TOKEN(STR_LINK_STATUS_NG), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_LINK_STATUS_OK), value = 1, flags = RESET_REQUIRED;
+    endoneof;
+
+    oneof varid = OEM_CONFIG_DATA.PcieLinkMaxPort[INDEX],
+      prompt  = STRING_TOKEN(STR_MAXLINK_STATUS),
+      help    = STRING_TOKEN(STR_BLANK_STRING),
+      option text = STRING_TOKEN(STR_WIDTH1_STRING), value = 1, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_WIDTH2_STRING), value = 2, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_WIDTH4_STRING), value = 4, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_WIDTH8_STRING), value = 8, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+    endoneof;
+
+    suppressif NOT ideqval OEM_CONFIG_DATA.PcieLinkStatusPort[INDEX] == 1;
+      oneof varid = OEM_CONFIG_DATA.PcieLinkSpeedRateStatusPort[INDEX],
+        prompt  = STRING_TOKEN(STR_PCIESPEED_STATUS),
+        help    = STRING_TOKEN(STR_BLANK_STRING),
+        option text = STRING_TOKEN(STR_PCIE_LINK_SPEED1_STRING), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_PCIE_LINK_SPEED2_STRING), value = 1, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_PCIE_LINK_SPEED3_STRING), value = 2, flags = RESET_REQUIRED;
+      endoneof;
+    endif;
+  endif;
+
+  oneof varid = OEM_CONFIG_DATA.PcieMaxPayloadSizePort[INDEX],
+    prompt  = STRING_TOKEN(STR_PCIE_PORT_MAX_PAYLOAD_REQUEST_PROMPT),
+    help    = STRING_TOKEN(STR_PCIE_PORT_MAX_PAYLOAD_REQUEST_HELP),
+      option text = STRING_TOKEN(STR_128B), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_256B), value = 1, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_512B), value = 2, flags = RESET_REQUIRED;
+  endoneof;
+
+  oneof varid = OEM_CONFIG_DATA.PcieAspmPort[INDEX],
+    prompt   = STRING_TOKEN (STR_PCIE_PORT_ASPM_PROMPT_G),
+    help     = STRING_TOKEN (STR_PCIE_GLOBAL_ASPM_HELP),
+    option text = STRING_TOKEN(STR_DISABLE),      value = 0, flags = RESET_REQUIRED | MANUFACTURING | DEFAULT;
+    option text = STRING_TOKEN(STR_L0S_ONLY),     value = 1, flags = RESET_REQUIRED;
+    option text = STRING_TOKEN(STR_L1_ONLY),      value = 2, flags = RESET_REQUIRED;
+    option text = STRING_TOKEN(STR_L0S_L1_BOTH),  value = 3, flags = RESET_REQUIRED;
+  endoneof;
+
+endif;
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr
new file mode 100644
index 0000000000..7c0ea53061
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr
@@ -0,0 +1,172 @@
+ ///** @file
+//
+//  Memory RAS Config form.
+//
+//  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+//  Copyright (c) 2018, Linaro Limited. All rights reserved.
+//  This program and the accompanying materials
+//  are licensed and made available under the terms and conditions of the BSD License
+//  which accompanies this distribution.  The full text of the license may be found at
+//  http://opensource.org/licenses/bsd-license.php
+//
+//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+//**/
+  form formid = RAS_CONFIG_FORM_ID,
+       title  = STRING_TOKEN(STR_RAS_CONFIG_FORM_TITLE);
+
+    oneof varid = OEM_CONFIG_DATA.EnRasSupport,
+      prompt  = STRING_TOKEN(STR_SUPPORT_RAS_TITLE),
+      help    = STRING_TOKEN(STR_SUPPORT_RAS_HELP),
+      option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+    endoneof;
+
+    suppressif TRUE;
+      goto VFR_FORMID_MEMORY_RAS,
+        prompt = STRING_TOKEN(STR_MEMORY_RAS_CONFIG_FORM_TITLE),
+        help   = STRING_TOKEN(STR_MEMORY_RAS_CONFIG_FORM_HELP);
+
+      goto VFR_FORMID_PCIE_RAS,
+        prompt  = STRING_TOKEN(STR_PCIE_RAS_CONFIG_FORM_TITLE),
+        help    = STRING_TOKEN(STR_PCIE_RAS_CONFIG_FORM_HELP);
+    endif;
+  endform;
+
+  form formid = VFR_FORMID_MEMORY_RAS,
+       title  = STRING_TOKEN(STR_MEMORY_RAS_CONFIG_FORM_TITLE);
+
+    oneof varid = OEM_CONFIG_DATA.CheckAlgorithm,
+      prompt  = STRING_TOKEN(STR_CHECK_ALGORITHM_PROMPT),
+      help    = STRING_TOKEN(STR_CHECK_ALGORITHM_HELP),
+      option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_ECC), value = 1, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_SDEC), value = 2, flags = RESET_REQUIRED;
+    endoneof;
+
+    grayoutif ideqval OEM_CONFIG_DATA.CheckAlgorithm == 0;
+      oneof varid = OEM_CONFIG_DATA.EnPoison,
+        prompt  = STRING_TOKEN(STR_ENABLE_POISON_PROMPT),
+        help    = STRING_TOKEN(STR_ENABLE_POISON_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+      endoneof;
+
+      oneof varid = OEM_CONFIG_DATA.PatrolScrub,
+        prompt  = STRING_TOKEN(STR_PATROL_SCRUB_PROMPT),
+        help    = STRING_TOKEN(STR_PATROL_SCRUB_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+      endoneof;
+    endif;
+
+    grayoutif ideqval OEM_CONFIG_DATA.CheckAlgorithm == 0 OR ideqval OEM_CONFIG_DATA.PatrolScrub == 0;
+      numeric varid   = OEM_CONFIG_DATA.PatrolScrubDuration,
+        prompt  = STRING_TOKEN(STR_PATROL_SCRUB_DURATION_PROMPT),
+        help    = STRING_TOKEN(STR_PATROL_SCRUB_DURATION_HELP),
+        flags   = 0 | RESET_REQUIRED,
+        minimum = 0,
+        maximum = 24,
+        step    = 1,
+        default = 24,
+      endnumeric;
+    endif;
+
+    grayoutif ideqval OEM_CONFIG_DATA.CheckAlgorithm == 0;
+      oneof varid = OEM_CONFIG_DATA.DemandScrubMode,
+        prompt  = STRING_TOKEN(STR_DEMAND_SCRUB_PROMPT),
+        help    = STRING_TOKEN(STR_DEMAND_SCRUB_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED;
+      endoneof;
+    endif;
+
+    suppressif ideqval OEM_CONFIG_DATA.CheckAlgorithm == 0 OR ideqval OEM_CONFIG_DATA.CheckAlgorithm == 1;
+      goto VFR_FORMID_CORRECT_ERROR,
+        prompt = STRING_TOKEN(STR_CORRECT_ERROR_FORM_TITLE),
+        help   = STRING_TOKEN(STR_CORRECT_ERROR_FORM_HELP);
+    endif;
+  endform;
+
+
+  form formid = VFR_FORMID_CORRECT_ERROR,
+       title  = STRING_TOKEN(STR_CORRECT_ERROR_FORM_TITLE);
+
+    oneof varid = OEM_CONFIG_DATA.CorrectErrorThreshold,
+      prompt  = STRING_TOKEN(STR_CORRECT_ERROR_THRESHOLD_PROMPT),
+      help    = STRING_TOKEN(STR_CORRECT_ERROR_THRESHOLD_HELP),
+      option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_500), value = 1, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_1000), value = 2, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_2000), value = 3, flags = RESET_REQUIRED;
+    endoneof;
+
+    oneof varid = OEM_CONFIG_DATA.FunnelPeriod,
+      prompt  = STRING_TOKEN(STR_FUNNEL_PERIOD_PROMPT),
+      help    = STRING_TOKEN(STR_FUNNEL_PERIOD_HELP),
+      option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_30), value = 1, flags = RESET_REQUIRED;
+      option text = STRING_TOKEN(STR_60), value = 2, flags = RESET_REQUIRED;
+    endoneof;
+
+    suppressif ideqval OEM_CONFIG_DATA.CorrectErrorThreshold == 0;
+      oneof varid = OEM_CONFIG_DATA.AdvanceDeviceCorrection ,
+        prompt  = STRING_TOKEN(STR_ADVANCE_DEVICE_CORRECTION_PROMPT),
+        help    = STRING_TOKEN(STR_ADVANCE_DEVICE_CORRECTION_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_SR), value = 1, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_MR), value = 2, flags = RESET_REQUIRED;
+      endoneof;
+
+      oneof varid = OEM_CONFIG_DATA.RankSparing,
+        prompt  = STRING_TOKEN(STR_RANK_SPARING_PROMPT),
+        help    = STRING_TOKEN(STR_RANK_SPARING_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED;
+      endoneof;
+    endif;
+  endform;
+
+  form formid = VFR_FORMID_PCIE_RAS,
+       title  = STRING_TOKEN(STR_PCIE_RAS_CONFIG_FORM_TITLE);
+
+      oneof varid = OEM_CONFIG_DATA.DpcFeature,
+        prompt  = STRING_TOKEN(STR_DPC_FEARURE),
+        help    = STRING_TOKEN(STR_DPC_FEARURE_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED;
+      endoneof;
+
+      oneof varid = OEM_CONFIG_DATA.EcrcFeature,
+        prompt  = STRING_TOKEN(STR_ECRC_FEARURE),
+        help    = STRING_TOKEN(STR_ECRC_FEARURE_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED;
+      endoneof;
+
+      oneof varid = OEM_CONFIG_DATA.CompletionTimeout,
+        prompt  = STRING_TOKEN(STR_COMPLETION_TIMEOUT),
+        help    = STRING_TOKEN(STR_COMPLETION_TIMEOUT_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+      endoneof;
+
+    suppressif ideqval OEM_CONFIG_DATA.CompletionTimeout == 0;
+      oneof varid = OEM_CONFIG_DATA.CompletionTimeoutValue,
+        prompt  = STRING_TOKEN(STR_COMPLETION_TIMEOUT_VALUE),
+        help    = STRING_TOKEN(STR_COMPLETION_TIMEOUT_VALUE_HELP),
+        option text = STRING_TOKEN(STR_50US_TO_50MS), value = 0, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_50US_TO_100US), value = 1, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_1MS_TO_10MS), value = 2, flags = RESET_REQUIRED;
+      endoneof;
+    endif;
+
+      oneof varid = OEM_CONFIG_DATA.HotPlug,
+        prompt  = STRING_TOKEN(STR_HOT_PLUG),
+        help    = STRING_TOKEN(STR_HOT_PLUG_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;
+        option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = MANUFACTURING | DEFAULT | RESET_REQUIRED;
+      endoneof;
+  endform;
+
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.uni b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.uni
new file mode 100644
index 0000000000..551c65fa5f
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.uni
@@ -0,0 +1,85 @@
+// /** @file
+// OEM Config Library used by UiApp
+//
+//
+//  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+//  Copyright (c) 2018, Linaro Limited. All rights reserved.
+//
+// This program and the accompanying materials are licensed and made available under
+// the terms and conditions of the BSD License that accompanies this distribution.
+// The full text of the license may be found at
+// http://opensource.org/licenses/bsd-license.php.
+//
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+// **/
+#langdef   en-US "English"
+
+#string STR_SUPPORT_RAS_TITLE                     #language en-US  "Support RAS"
+#string STR_SUPPORT_RAS_HELP                      #language en-US  "Support memory/PCIe/CPU RAS funtions."
+
+#string STR_MEMORY_RAS_CONFIG_FORM_TITLE          #language en-US  "Memory RAS Config"
+#string STR_MEMORY_RAS_CONFIG_FORM_HELP           #language en-US  "Memory RAS Config"
+
+#string STR_PCIE_RAS_CONFIG_FORM_TITLE            #language en-US  "PCIe RAS Config"
+#string STR_PCIE_RAS_CONFIG_FORM_HELP             #language en-US  "PCIe RAS Config"
+
+#string STR_CPU_RAS_CONFIG_FORM_TITLE             #language en-US  "CPU RAS Config"
+#string STR_CPU_RAS_CONFIG_FORM_HELP              #language en-US  "CPU RAS Config"
+
+#string STR_ENABLE_POISON_PROMPT                  #language en-US  "Poison"
+#string STR_ENABLE_POISON_HELP                    #language en-US  "Enable/Disable Poison flag"
+
+#string STR_CHECK_ALGORITHM_PROMPT                #language en-US  "Check Algorithm"
+#string STR_CHECK_ALGORITHM_HELP                  #language en-US  "Set the memory check algorithm"
+#string STR_ECC                                   #language en-US  "ECC"
+#string STR_SDEC                                  #language en-US  "SDEC"
+
+#string STR_PATROL_SCRUB_PROMPT                   #language en-US  "Active Scrub"
+#string STR_PATROL_SCRUB_HELP                     #language en-US  "Enable/Disable Active Scrub"
+
+#string STR_PATROL_SCRUB_DURATION_PROMPT          #language en-US  "Active Scrub Interval"
+#string STR_PATROL_SCRUB_DURATION_HELP            #language en-US  "Selects the number of hours (0-24) required to complete full scrub. A value of zero means auto!"
+
+#string STR_DEMAND_SCRUB_PROMPT                   #language en-US  "Passive Scrub"
+#string STR_DEMAND_SCRUB_HELP                     #language en-US  "Enable/Disable Passive Scrub"
+
+#string STR_CORRECT_ERROR_FORM_TITLE              #language en-US  "Correct Error handle"
+#string STR_CORRECT_ERROR_FORM_HELP               #language en-US  "Correctable error-related configuration"
+
+#string STR_CORRECT_ERROR_THRESHOLD_PROMPT        #language en-US  "Correct Error Threshold"
+#string STR_CORRECT_ERROR_THRESHOLD_HELP          #language en-US  "Correctable error-related configuration"
+#string STR_500                                   #language en-US  "500"
+#string STR_1000                                  #language en-US  "1000"
+#string STR_2000                                  #language en-US  "2000"
+
+#string STR_FUNNEL_PERIOD_PROMPT                  #language en-US  "Funnel Period(min)"
+#string STR_FUNNEL_PERIOD_HELP                    #language en-US  "Set the Funnel function time period"
+#string STR_30                                    #language en-US  "30"
+#string STR_60                                    #language en-US  "60"
+
+#string STR_ADVANCE_DEVICE_CORRECTION_PROMPT      #language en-US  "Advance Device Correction"
+#string STR_ADVANCE_DEVICE_CORRECTION_HELP        #language en-US  "Configure the correctable error threshold alarm handling solution"
+#string STR_SR                                    #language en-US  "SR"
+#string STR_MR                                    #language en-US  "MR"
+
+#string STR_RANK_SPARING_PROMPT                   #language en-US  "Rank Sparing"
+#string STR_RANK_SPARING_HELP                     #language en-US  "Enable/Disable Rank Sparing"
+
+#string STR_DPC_FEARURE                           #language en-US  "DPC Feature"
+#string STR_DPC_FEARURE_HELP                      #language en-US  "Enable/Disable PCIE DPC(DownStream Port Containment) feature."
+
+#string STR_ECRC_FEARURE                          #language en-US  "ECRC Feature"
+#string STR_ECRC_FEARURE_HELP                     #language en-US  "Enable/Disable ECRC check feature"
+#string STR_COMPLETION_TIMEOUT                    #language en-US  "Completion Timeout"
+#string STR_COMPLETION_TIMEOUT_HELP               #language en-US  "Enable/Disable PCIE Completion Timeout feature."
+
+#string STR_COMPLETION_TIMEOUT_VALUE              #language en-US  "Completion Timeout Value"
+#string STR_COMPLETION_TIMEOUT_VALUE_HELP         #language en-US  "Set the corresponding Completion Timeout value."
+
+#string STR_HOT_PLUG                              #language en-US  "Hot-Plug"
+#string STR_HOT_PLUG_HELP                         #language en-US  "Enable/Disable PCIE Hot-plug feature."
+#string STR_50US_TO_50MS                          #language en-US  "50 us to 50 ms"
+#string STR_50US_TO_100US                         #language en-US  "50 us to 100 us"
+#string STR_1MS_TO_10MS                           #language en-US  "1 ms to 10 ms"
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.hfr b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.hfr
new file mode 100644
index 0000000000..4d295a8593
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.hfr
@@ -0,0 +1,81 @@
+ ///** @file
+//
+// IBMC Config form.
+//
+//  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+//  Copyright (c) 2018, Linaro Limited. All rights reserved.
+//  This program and the accompanying materials
+//  are licensed and made available under the terms and conditions of the BSD License
+//  which accompanies this distribution.  The full text of the license may be found at
+//  http://opensource.org/licenses/bsd-license.php
+//
+//  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+//**/
+  form formid = IBMC_CONFIG_FORM_ID,
+       title  = STRING_TOKEN(STR_IBMC_CONFIG_FORM_TITLE);
+
+    oneof
+        varid       = OEM_CONFIG_DATA.BmcWdtEnable,
+        prompt      = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER),
+        help        = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_HELP),
+        option text = STRING_TOKEN(STR_DISABLE),  value = 0, flags = DEFAULT;
+        option text = STRING_TOKEN(STR_ENABLE),   value = 1, flags = 0;
+    endoneof;
+
+    suppressif ideqval OEM_CONFIG_DATA.BmcWdtEnable == 0;
+      numeric
+        varid       = OEM_CONFIG_DATA.BmcWdtTimeout,
+        prompt      = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_TIMEOUT),
+        help        = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_TIMEOUT_C10_HELP),
+        minimum     = 15,
+        maximum     = 25,
+        step        = 1,
+        default     = 15,
+      endnumeric;
+
+      oneof
+        varid       = OEM_CONFIG_DATA.BmcWdtAction,
+        prompt      = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_ACTION),
+        help        = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_ACTION_HELP),
+        option text = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_NO_ACTION),   value = 0, flags = 0;
+        option text = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_HARD_RESET),  value = 1, flags = DEFAULT;
+        option text = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_POWER_DOWN),  value = 2, flags = 0;
+        option text = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_POWER_CYCLE), value = 3, flags = 0;
+      endoneof;
+    endif;
+
+    suppressif TRUE;
+      oneof
+        varid       = OEM_CONFIG_DATA.OSWdtEnable,
+        prompt      = STRING_TOKEN(STR_BMC_OS_WATCHDOG_TIMER),
+        help        = STRING_TOKEN(STR_BMC_OS_WATCHDOG_TIMER_HELP),
+        option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = DEFAULT;
+        option text = STRING_TOKEN(STR_ENABLE),  value = 1, flags = 0;
+      endoneof;
+    endif;
+
+    suppressif ideqval OEM_CONFIG_DATA.OSWdtEnable == 0;
+      numeric
+        varid       = OEM_CONFIG_DATA.OSWdtTimeout,
+        prompt      = STRING_TOKEN(STR_BMC_OS_WDT_TIMEOUT),
+        help        = STRING_TOKEN(STR_BMC_OS_WDT_TIMEOUT_HELP),
+        minimum     = 5,
+        maximum     = 8,
+        step        = 1,
+        default     = 5,
+      endnumeric;
+
+      oneof
+        varid       = OEM_CONFIG_DATA.OSWdtAction,
+        prompt      = STRING_TOKEN(STR_BMC_OS_WDT_ACTION),
+        help        = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_ACTION_HELP),
+        option text = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_NO_ACTION),   value = 0, flags = 0;
+        option text = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_HARD_RESET),  value = 1, flags = DEFAULT;
+        option text = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_POWER_DOWN),  value = 2, flags = 0;
+        option text = STRING_TOKEN(STR_BMC_WATCHDOG_TIMER_POWER_CYCLE), value = 3, flags = 0;
+      endoneof;
+    endif;
+
+  endform;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.uni b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.uni
new file mode 100644
index 0000000000..e12e433760
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.uni
@@ -0,0 +1,34 @@
+// /** @file
+// OEM Config Library used by UiApp
+//
+//
+//  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+//  Copyright (c) 2018, Linaro Limited. All rights reserved.
+//
+// This program and the accompanying materials are licensed and made available under
+// the terms and conditions of the BSD License that accompanies this distribution.
+// The full text of the license may be found at
+// http://opensource.org/licenses/bsd-license.php.
+//
+// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+//
+// **/
+#langdef   en-US "English"
+
+#string STR_BMC_WATCHDOG_TIMER                      #language en-US  "iBMC WDT Support For POST"
+#string STR_BMC_WATCHDOG_TIMER_HELP                 #language en-US  "Enable/Disable iBMC watchdog timer at start of POST."
+#string STR_BMC_WATCHDOG_TIMER_TIMEOUT              #language en-US  "iBMC WDT TimeOut For POST"
+#string STR_BMC_WATCHDOG_TIMER_TIMEOUT_C10_HELP     #language en-US  "Enter the number of minutes the system firmware has to boot the OS before it takes the Timeout Action. Valid values are from 15 to 25 minutes."
+#string STR_BMC_WATCHDOG_TIMER_ACTION               #language en-US  "iBMC WDT Action For POST"
+#string STR_BMC_WATCHDOG_TIMER_ACTION_HELP          #language en-US  "Timeout Action Choices: No Action, Hard Reset, Power Down or Power Cycle"
+#string STR_BMC_WATCHDOG_TIMER_NO_ACTION            #language en-US  "No Action"
+#string STR_BMC_WATCHDOG_TIMER_HARD_RESET           #language en-US  "Hard Reset"
+#string STR_BMC_WATCHDOG_TIMER_POWER_DOWN           #language en-US  "Power Down"
+#string STR_BMC_WATCHDOG_TIMER_POWER_CYCLE          #language en-US  "Power Cycle"
+#string STR_BMC_OS_WATCHDOG_TIMER                   #language en-US  "iBMC WDT Support For OS"
+#string STR_BMC_OS_WATCHDOG_TIMER_HELP              #language en-US  "Enable/Disable OS Watchdog Timer When OS Load"
+#string STR_BMC_OS_WDT_TIMEOUT                      #language en-US  "iBMC WDT TimeOut For OS"
+#string STR_BMC_OS_WDT_TIMEOUT_HELP                 #language en-US  "Enter the number of minutes the system firmware \n has to OS Load before it takes the Timeout Action. Valid values are from 5 to 8 minutes."
+#string STR_BMC_OS_WDT_ACTION                       #language en-US  "iBMC WDT Action For OS"
+
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 19/43] Silicon/Hisilicon/D06: Stop watchdog
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (17 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 18/43] Hisilicon/D06: Add Hi1620OemConfigUiLib Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 14:17   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 20/43] Hisilicon/I2C: Modify I2CLib.c for coding style Ming Huang
                   ` (24 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

according as watchdog design on D06, watchdog should be
stopped before boot a option.

This is an out of band watchdog timer in BMC; it is used
to monitor the whole BIOS boot process and reset the system
in case BIOS hangs somewhere, i.e. it is armed when system
is power on, and disabled before handling system control to
OS, while UEFI boot services watchdog is only armed before
invoking a boot option. So they are two different watchdogs.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf |  2 ++
 Silicon/Hisilicon/Include/Library/IpmiCmdLib.h                              | 16 ++++++++++++++
 Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c               | 22 ++++++++++++++++++++
 3 files changed, 40 insertions(+)

diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
index a093f13fb0..b9458b0ade 100644
--- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
+++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
@@ -46,6 +46,7 @@
   DebugLib
   DevicePathLib
   DxeServicesLib
+  IpmiCmdLib
   MemoryAllocationLib
   PcdLib
   PrintLib
@@ -69,6 +70,7 @@
   gEfiEndOfDxeEventGroupGuid
   gEfiTtyTermGuid
   gHisiOemVariableGuid
+  gOemConfigGuid
 
 [Protocols]
   gEfiGenericMemTestProtocolGuid
diff --git a/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h b/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h
index 8868b76135..b956ee6d07 100644
--- a/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h
+++ b/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h
@@ -19,6 +19,17 @@
 #define BOOT_OPTION_BOOT_FLAG_VALID         1
 #define BOOT_OPTION_BOOT_FLAG_INVALID       0
 
+typedef enum {
+  EfiReserved,
+  EfiBiosFrb2,
+  EfiBiosPost,
+  EfiOsLoad,
+  EfiSmsOs,
+  EfiOem,
+  EfiFrbReserved1,
+  EfiFrbReserved2
+} EFI_WDT_USER_TYPE;
+
 typedef enum {
   NoOverride = 0x0,
   ForcePxe,
@@ -91,4 +102,9 @@ IpmiCmdGetSysBootOptions (
   IN IPMI_GET_BOOT_OPTION   *BootOption
   );
 
+EFI_STATUS
+IpmiCmdStopWatchdogTimer (
+  IN EFI_WDT_USER_TYPE  UserType
+  );
+
 #endif
diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
index d5f6d78fa4..b63818cbe4 100644
--- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
+++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
@@ -19,6 +19,8 @@
 #include <Library/BootLogoLib.h>
 #include <Library/BmcConfigBootLib.h>
 #include <Library/DevicePathLib.h>
+#include <Library/IpmiCmdLib.h>
+#include <Library/OemConfigData.h>
 #include <Library/PcdLib.h>
 #include <Library/TimerLib.h>
 #include <Library/UefiBootManagerLib.h>
@@ -615,6 +617,8 @@ PlatformBootManagerAfterConsole (
 {
   EFI_STATUS Status;
   ESRT_MANAGEMENT_PROTOCOL           *EsrtManagement = NULL;
+  OEM_CONFIG_DATA                    SetupData;
+  UINTN                              DataSize = sizeof (OEM_CONFIG_DATA);
 
   //
   // Show the splash screen.
@@ -651,6 +655,24 @@ PlatformBootManagerAfterConsole (
     );
 
   HandleBmcBootType ();
+
+  //Disable POST Watch Dog before attempting boot
+  Status = gRT->GetVariable (
+                  OEM_CONFIG_NAME,
+                  &gOemConfigGuid,
+                  NULL,
+                  &DataSize,
+                  &SetupData
+                  );
+
+  if (!EFI_ERROR (Status)) {
+    if (SetupData.BmcWdtEnable) {
+      Status = IpmiCmdStopWatchdogTimer (EfiBiosPost);
+      if (EFI_ERROR (Status)) {
+        DEBUG ((DEBUG_ERROR, "%a:%r\n", __FUNCTION__, Status));
+      }
+    }
+  }
 }
 
 /**
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 20/43] Hisilicon/I2C: Modify I2CLib.c for coding style
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (18 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 19/43] Silicon/Hisilicon/D06: Stop watchdog Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 21/43] Silicon/Hisilicon/I2C: Refactor I2C library Ming Huang
                   ` (23 subsequent siblings)
  43 siblings, 0 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Correct coding style for I2CLib.c before adding other I2CLib patches.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 1034 ++++++++++----------
 1 file changed, 499 insertions(+), 535 deletions(-)

diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
index b5b388d756..f03d55d6b2 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
@@ -16,640 +16,604 @@
 
 
 #include <PiDxe.h>
-#include <Library/DebugLib.h>
-#include <Library/UefiBootServicesTableLib.h>
 #include <Library/ArmLib.h>
 #include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
 #include <Library/I2CLib.h>
 #include <Library/TimerLib.h>
+#include <Library/UefiBootServicesTableLib.h>
 
 #include <Library/PlatformSysCtrlLib.h>
 
 #include "I2CLibInternal.h"
 #include "I2CHw.h"
 
-VOID I2C_Delay(UINT32 ulCount)
+VOID
+I2C_Delay (
+  UINT32 Count
+  )
 {
-    MicroSecondDelay(ulCount);
-    return;
+  MicroSecondDelay (Count);
+  return;
 }
 
 
 EFI_STATUS
 EFIAPI
-I2C_Disable(UINT32 Socket,UINT8 Port)
+I2C_Disable (
+  UINT32 Socket,
+  UINT8  Port
+  )
 {
-    UINT32                  ulTimeCnt = I2C_READ_TIMEOUT;
-    I2C0_STATUS_U           I2cStatusReg;
-    I2C0_ENABLE_U           I2cEnableReg;
-    I2C0_ENABLE_STATUS_U    I2cEnableStatusReg;
+  UINT32                  TimeCnt = I2C_READ_TIMEOUT;
+  I2C0_STATUS_U           I2cStatusReg;
+  I2C0_ENABLE_U           I2cEnableReg;
+  I2C0_ENABLE_STATUS_U    I2cEnableStatusReg;
 
-    UINTN Base = GetI2cBase(Socket, Port);
+  UINTN Base = GetI2cBase (Socket, Port);
 
-    I2C_REG_READ((Base + I2C_STATUS_OFFSET), I2cStatusReg.Val32);
+  I2C_REG_READ ((Base + I2C_STATUS_OFFSET), I2cStatusReg.Val32);
 
-    while (I2cStatusReg.bits.activity)
-    {
-        I2C_Delay(10000);
+  while (I2cStatusReg.bits.activity) {
+    I2C_Delay (10000);
 
-        ulTimeCnt--;
-        I2C_REG_READ(Base + I2C_STATUS_OFFSET, I2cStatusReg.Val32);
-        if (0 == ulTimeCnt)
-        {
-            return EFI_DEVICE_ERROR;
-        }
+    TimeCnt--;
+    I2C_REG_READ (Base + I2C_STATUS_OFFSET, I2cStatusReg.Val32);
+    if (TimeCnt == 0) {
+      return EFI_DEVICE_ERROR;
     }
+  }
 
+  I2C_REG_READ (Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
+  I2cEnableReg.bits.enable = 0;
+  I2C_REG_WRITE (Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
 
-    I2C_REG_READ(Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
-    I2cEnableReg.bits.enable = 0;
-    I2C_REG_WRITE(Base + I2C_ENABLE_OFFSET,I2cEnableReg.Val32);
-
-    I2C_REG_READ(Base + I2C_ENABLE_OFFSET,I2cEnableStatusReg.Val32);
-    if (0 == I2cEnableStatusReg.bits.ic_en)
-    {
-        return EFI_SUCCESS;
-    }
-    else
-    {
-        return EFI_DEVICE_ERROR;
-    }
+  I2C_REG_READ (Base + I2C_ENABLE_OFFSET, I2cEnableStatusReg.Val32);
+  if (I2cEnableStatusReg.bits.ic_en == 0) {
+    return EFI_SUCCESS;
+  } else {
+    return EFI_DEVICE_ERROR;
+  }
 }
 
 
 EFI_STATUS
 EFIAPI
-I2C_Enable(UINT32 Socket,UINT8 Port)
+I2C_Enable (
+  UINT32 Socket,
+  UINT8  Port
+  )
 {
-    I2C0_ENABLE_U           I2cEnableReg;
-    I2C0_ENABLE_STATUS_U    I2cEnableStatusReg;
+  I2C0_ENABLE_U           I2cEnableReg;
+  I2C0_ENABLE_STATUS_U    I2cEnableStatusReg;
 
-    UINTN Base = GetI2cBase(Socket, Port);
+  UINTN Base = GetI2cBase (Socket, Port);
 
+  I2C_REG_READ (Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
+  I2cEnableReg.bits.enable = 1;
+  I2C_REG_WRITE (Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
 
-    I2C_REG_READ(Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
-    I2cEnableReg.bits.enable = 1;
-    I2C_REG_WRITE(Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
 
-
-    I2C_REG_READ(Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
-    if (1 == I2cEnableStatusReg.bits.ic_en)
-    {
-        return EFI_SUCCESS;
-    }
-    else
-    {
-        return EFI_DEVICE_ERROR;
-    }
+  I2C_REG_READ (Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
+  if (I2cEnableStatusReg.bits.ic_en == 1) {
+    return EFI_SUCCESS;
+  } else {
+    return EFI_DEVICE_ERROR;
+  }
 }
 
-void I2C_SetTarget(UINT32 Socket,UINT8 Port,UINT32 I2cDeviceAddr)
+VOID
+I2C_SetTarget (
+  UINT32 Socket,
+  UINT8  Port,
+  UINT32 I2cDeviceAddr
+  )
 {
-    I2C0_TAR_U    I2cTargetReg;
-    UINTN Base = GetI2cBase(Socket, Port);
+  I2C0_TAR_U    I2cTargetReg;
 
+  UINTN Base = GetI2cBase (Socket, Port);
 
-    I2C_REG_READ(Base + I2C_TAR_OFFSET, I2cTargetReg.Val32);
-    I2cTargetReg.bits.ic_tar = I2cDeviceAddr;
-    I2C_REG_WRITE(Base + I2C_TAR_OFFSET, I2cTargetReg.Val32);
+  I2C_REG_READ (Base + I2C_TAR_OFFSET, I2cTargetReg.Val32);
+  I2cTargetReg.bits.ic_tar = I2cDeviceAddr;
+  I2C_REG_WRITE (Base + I2C_TAR_OFFSET, I2cTargetReg.Val32);
 
-    return;
+  return;
 }
 
 
 EFI_STATUS
 EFIAPI
-I2CInit(UINT32 Socket, UINT32 Port, SPEED_MODE SpeedMode)
+I2CInit (
+  UINT32     Socket,
+  UINT32     Port,
+  SPEED_MODE SpeedMode
+  )
 {
-    I2C0_CON_U              I2cControlReg;
-    I2C0_SS_SCL_HCNT_U      I2cStandardSpeedSclHighCount;
-    I2C0_SS_SCL_LCNT_U      I2cStandardSpeedSclLowCount;
-    I2C0_RX_TL_U            I2cRxFifoReg;
-    I2C0_TX_TL_U            I2cTxFifoReg;
-    I2C0_INTR_MASK_U        I2cIntrMask;
-    EFI_STATUS              Status;
-
-    UINTN Base = GetI2cBase(Socket, Port);
-
-    if((Socket >= MAX_SOCKET) || (Port >= I2C_PORT_MAX) || (SpeedMode >= SPEED_MODE_MAX)){
-        return EFI_INVALID_PARAMETER;
-    }
-
-
-    Status = I2C_Disable(Socket,Port);
-    if(EFI_ERROR(Status))
-    {
-        return EFI_DEVICE_ERROR;
-    }
-
-
-    I2C_REG_READ(Base + I2C_CON_OFFSET, I2cControlReg.Val32);
-    I2cControlReg.bits.master = 1;
-    I2cControlReg.bits.spedd = 0x1;
-    I2cControlReg.bits.restart_en = 1;
-    I2cControlReg.bits.slave_disable = 1;
-    I2C_REG_WRITE(Base + I2C_CON_OFFSET,I2cControlReg.Val32);
-
-
-    if(Normal == SpeedMode)
-    {
-        I2C_REG_READ(Base + I2C_SS_SCL_HCNT_OFFSET,I2cStandardSpeedSclHighCount.Val32);
-        I2cStandardSpeedSclHighCount.bits.ic_ss_scl_hcnt = I2C_SS_SCLHCNT;
-        I2C_REG_WRITE(Base + I2C_SS_SCL_HCNT_OFFSET, I2cStandardSpeedSclHighCount.Val32);
-        I2C_REG_READ(Base + I2C_SS_SCL_LCNT_OFFSET, I2cStandardSpeedSclLowCount.Val32);
-        I2cStandardSpeedSclLowCount.bits.ic_ss_scl_lcnt = I2C_SS_SCLLCNT;
-        I2C_REG_WRITE(Base + I2C_SS_SCL_LCNT_OFFSET, I2cStandardSpeedSclLowCount.Val32);
-    }
-    else
-    {
-        I2C_REG_READ(Base + I2C_FS_SCL_HCNT_OFFSET,I2cStandardSpeedSclHighCount.Val32);
-        I2cStandardSpeedSclHighCount.bits.ic_ss_scl_hcnt = I2C_SS_SCLHCNT;
-        I2C_REG_WRITE(Base + I2C_FS_SCL_HCNT_OFFSET, I2cStandardSpeedSclHighCount.Val32);
-        I2C_REG_READ(Base + I2C_FS_SCL_LCNT_OFFSET, I2cStandardSpeedSclLowCount.Val32);
-        I2cStandardSpeedSclLowCount.bits.ic_ss_scl_lcnt = I2C_SS_SCLLCNT;
-        I2C_REG_WRITE(Base + I2C_FS_SCL_LCNT_OFFSET, I2cStandardSpeedSclLowCount.Val32);
-    }
-
-
-    I2C_REG_READ(Base + I2C_RX_TL_OFFSET, I2cRxFifoReg.Val32);
-    I2cRxFifoReg.bits.rx_tl = I2C_TXRX_THRESHOLD;
-    I2C_REG_WRITE(Base + I2C_RX_TL_OFFSET, I2cRxFifoReg.Val32);
-    I2C_REG_READ(Base + I2C_TX_TL_OFFSET,I2cTxFifoReg.Val32);
-    I2cTxFifoReg.bits.tx_tl = I2C_TXRX_THRESHOLD;
-    I2C_REG_WRITE(Base + I2C_TX_TL_OFFSET, I2cTxFifoReg.Val32);
-
-
-    I2C_REG_READ(Base + I2C_INTR_MASK_OFFSET, I2cIntrMask.Val32);
-    I2cIntrMask.Val32 = 0x0;
-    I2C_REG_WRITE(Base + I2C_INTR_MASK_OFFSET, I2cIntrMask.Val32);
-
-
-    Status = I2C_Enable(Socket,Port);
-    if(EFI_ERROR(Status))
-    {
-        return EFI_DEVICE_ERROR;
-    }
-
-    return I2cLibRuntimeSetup (Socket, Port);
+  I2C0_CON_U              I2cControlReg;
+  I2C0_SS_SCL_HCNT_U      I2cStandardSpeedSclHighCount;
+  I2C0_SS_SCL_LCNT_U      I2cStandardSpeedSclLowCount;
+  I2C0_RX_TL_U            I2cRxFifoReg;
+  I2C0_TX_TL_U            I2cTxFifoReg;
+  I2C0_INTR_MASK_U        I2cIntrMask;
+  EFI_STATUS              Status;
+
+  UINTN Base = GetI2cBase (Socket, Port);
+
+  if ((Socket >= MAX_SOCKET) ||
+     (Port >= I2C_PORT_MAX) ||
+     (SpeedMode >= SPEED_MODE_MAX)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = I2C_Disable (Socket,Port);
+  if (EFI_ERROR (Status)) {
+    return EFI_DEVICE_ERROR;
+  }
+
+  I2C_REG_READ (Base + I2C_CON_OFFSET, I2cControlReg.Val32);
+  I2cControlReg.bits.master = 1;
+  I2cControlReg.bits.spedd = 0x1;
+  I2cControlReg.bits.restart_en = 1;
+  I2cControlReg.bits.slave_disable = 1;
+  I2C_REG_WRITE (Base + I2C_CON_OFFSET, I2cControlReg.Val32);
+
+  if (SpeedMode == Normal) {
+    I2C_REG_READ (Base + I2C_SS_SCL_HCNT_OFFSET, I2cStandardSpeedSclHighCount.Val32);
+    I2cStandardSpeedSclHighCount.bits.ic_ss_scl_hcnt = I2C_SS_SCLHCNT;
+    I2C_REG_WRITE (Base + I2C_SS_SCL_HCNT_OFFSET, I2cStandardSpeedSclHighCount.Val32);
+    I2C_REG_READ (Base + I2C_SS_SCL_LCNT_OFFSET, I2cStandardSpeedSclLowCount.Val32);
+    I2cStandardSpeedSclLowCount.bits.ic_ss_scl_lcnt = I2C_SS_SCLLCNT;
+    I2C_REG_WRITE (Base + I2C_SS_SCL_LCNT_OFFSET, I2cStandardSpeedSclLowCount.Val32);
+  } else {
+    I2C_REG_READ (Base + I2C_FS_SCL_HCNT_OFFSET, I2cStandardSpeedSclHighCount.Val32);
+    I2cStandardSpeedSclHighCount.bits.ic_ss_scl_hcnt = I2C_SS_SCLHCNT;
+    I2C_REG_WRITE (Base + I2C_FS_SCL_HCNT_OFFSET, I2cStandardSpeedSclHighCount.Val32);
+    I2C_REG_READ (Base + I2C_FS_SCL_LCNT_OFFSET, I2cStandardSpeedSclLowCount.Val32);
+    I2cStandardSpeedSclLowCount.bits.ic_ss_scl_lcnt = I2C_SS_SCLLCNT;
+    I2C_REG_WRITE (Base + I2C_FS_SCL_LCNT_OFFSET, I2cStandardSpeedSclLowCount.Val32);
+  }
+
+  I2C_REG_READ (Base + I2C_RX_TL_OFFSET, I2cRxFifoReg.Val32);
+  I2cRxFifoReg.bits.rx_tl = I2C_TXRX_THRESHOLD;
+  I2C_REG_WRITE (Base + I2C_RX_TL_OFFSET, I2cRxFifoReg.Val32);
+  I2C_REG_READ (Base + I2C_TX_TL_OFFSET, I2cTxFifoReg.Val32);
+  I2cTxFifoReg.bits.tx_tl = I2C_TXRX_THRESHOLD;
+  I2C_REG_WRITE (Base + I2C_TX_TL_OFFSET, I2cTxFifoReg.Val32);
+
+  I2C_REG_READ (Base + I2C_INTR_MASK_OFFSET, I2cIntrMask.Val32);
+  I2cIntrMask.Val32 = 0x0;
+  I2C_REG_WRITE (Base + I2C_INTR_MASK_OFFSET, I2cIntrMask.Val32);
+
+  Status = I2C_Enable (Socket, Port);
+  if (EFI_ERROR (Status)) {
+    return EFI_DEVICE_ERROR;
+  }
+
+  return I2cLibRuntimeSetup (Socket, Port);
 }
 
 EFI_STATUS
 EFIAPI
-I2CSdaConfig(UINT32 Socket, UINT32 Port)
+I2CSdaConfig (
+  UINT32 Socket,
+  UINT32 Port
+  )
 {
+  UINTN Base = GetI2cBase (Socket, Port);
 
-    UINTN Base = GetI2cBase(Socket, Port);
+  if ((Socket >= MAX_SOCKET) || (Port >= I2C_PORT_MAX)) {
+    return EFI_INVALID_PARAMETER;
+  }
 
-    if((Socket >= MAX_SOCKET) || (Port >= I2C_PORT_MAX)){
-        return EFI_INVALID_PARAMETER;
-    }
-
-    I2C_REG_WRITE(Base + I2C_SDA_HOLD, 0x14);
+  I2C_REG_WRITE (Base + I2C_SDA_HOLD, 0x14);
 
-    return EFI_SUCCESS;
+  return EFI_SUCCESS;
 }
 
 
 
-UINT32 I2C_GetTxStatus(UINT32 Socket,UINT8 Port)
+UINT32
+I2C_GetTxStatus (
+  UINT32 Socket,
+  UINT8  Port
+  )
 {
-    I2C0_TXFLR_U ulFifo;
-    UINTN Base = GetI2cBase(Socket, Port);
+  I2C0_TXFLR_U Fifo;
+  UINTN        Base = GetI2cBase (Socket, Port);
 
-    I2C_REG_READ(Base + I2C_TXFLR_OFFSET, ulFifo.Val32);
-    return ulFifo.bits.txflr;
+  I2C_REG_READ (Base + I2C_TXFLR_OFFSET, Fifo.Val32);
+  return Fifo.bits.txflr;
 }
 
 UINT32
-I2C_GetRxStatus(UINT32 Socket,UINT8 Port)
+I2C_GetRxStatus (
+  UINT32 Socket,
+  UINT8 Port
+  )
 {
-    I2C0_RXFLR_U ulFifo;
-    UINTN Base = GetI2cBase(Socket, Port);
+  I2C0_RXFLR_U Fifo;
+  UINTN Base = GetI2cBase (Socket, Port);
 
-    I2C_REG_READ(Base + I2C_RXFLR_OFFSET, ulFifo.Val32);
-    return ulFifo.bits.rxflr;
+  I2C_REG_READ (Base + I2C_RXFLR_OFFSET, Fifo.Val32);
+  return Fifo.bits.rxflr;
 }
 
 EFI_STATUS
 EFIAPI
-WriteBeforeRead(I2C_DEVICE *I2cInfo, UINT32 ulLength, UINT8 *pBuf)
+WriteBeforeRead (
+  I2C_DEVICE *I2cInfo,
+  UINT32     Length,
+  UINT8      *pBuf
+  )
 {
-    UINT32 ulFifo;
-    UINT32 ulCnt;
-    UINT32 ulTimes = 0;
+  UINT32 Fifo;
+  UINT32 Count;
+  UINT32 Times = 0;
 
-    UINTN  Base = GetI2cBase(I2cInfo->Socket, I2cInfo->Port);
+  UINTN  Base = GetI2cBase (I2cInfo->Socket, I2cInfo->Port);
 
+  I2C_SetTarget (I2cInfo->Socket, I2cInfo->Port, I2cInfo->SlaveDeviceAddress);
 
-    I2C_SetTarget(I2cInfo->Socket,I2cInfo->Port,I2cInfo->SlaveDeviceAddress);
-
-    ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    while(0 != ulFifo)
-    {
-        I2C_Delay(2);
-        if(++ulTimes > I2C_READ_TIMEOUT)
-        {
-            return EFI_TIMEOUT;
-        }
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
+  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  while (Fifo != 0) {
+    I2C_Delay (2);
+    if (++Times > I2C_READ_TIMEOUT) {
+      return EFI_TIMEOUT;
     }
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  }
 
-    for(ulCnt = 0; ulCnt < ulLength; ulCnt++)
-    {
-        ulTimes = 0;
-        while(ulFifo > I2C_TXRX_THRESHOLD)
-        {
-            I2C_Delay(2);
-            if(++ulTimes > I2C_READ_TIMEOUT)
-            {
-                return EFI_TIMEOUT;
-            }
-            ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-        }
-
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, *pBuf++);
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
+  for (Count = 0; Count < Length; Count++) {
+    Times = 0;
+    while (Fifo > I2C_TXRX_THRESHOLD) {
+      I2C_Delay (2);
+      if (++Times > I2C_READ_TIMEOUT) {
+        return EFI_TIMEOUT;
+      }
+      Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
     }
 
-    ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    ulTimes = 0;
-    while(0 != ulFifo)
-    {
-        I2C_Delay(2);
-
-        if(++ulTimes > I2C_READ_TIMEOUT)
-        {
-            return EFI_TIMEOUT;
-        }
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, *pBuf++);
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  }
+
+  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  Times = 0;
+  while (Fifo != 0) {
+    I2C_Delay (2);
+
+    if (++Times > I2C_READ_TIMEOUT) {
+      return EFI_TIMEOUT;
     }
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  }
 
-    return EFI_SUCCESS;
+  return EFI_SUCCESS;
 }
 
 
 EFI_STATUS
 EFIAPI
-I2CWrite(I2C_DEVICE *I2cInfo, UINT16 InfoOffset, UINT32 ulLength, UINT8 *pBuf)
+I2CWrite(
+  I2C_DEVICE *I2cInfo,
+  UINT16     InfoOffset,
+  UINT32     Length,
+  UINT8 *pBuf
+  )
 {
-    UINT32 ulFifo;
-    UINT32 ulTimes = 0;
-    UINT32  Idx;
-    UINTN  Base;
-
-
-    if(I2cInfo->Port >= I2C_PORT_MAX)
-    {
-        return EFI_INVALID_PARAMETER;
-    }
-
-    Base = GetI2cBase(I2cInfo->Socket, I2cInfo->Port);
-
-    (VOID)I2C_Enable(I2cInfo->Socket, I2cInfo->Port);
-
-    I2C_SetTarget(I2cInfo->Socket,I2cInfo->Port,I2cInfo->SlaveDeviceAddress);
-
-    ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    while(0 != ulFifo)
-    {
-        I2C_Delay(2);
-        if(++ulTimes > I2C_READ_TIMEOUT)
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_TIMEOUT;
-        }
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    }
-
-
-    if(I2cInfo->DeviceType)
-    {
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 8) & 0xff);
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, InfoOffset & 0xff);
-    }
-    else
-    {
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, InfoOffset & 0xff);
-    }
-
-    ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    ulTimes = 0;
-    while(0 != ulFifo)
-    {
-        I2C_Delay(2);
-        if(++ulTimes > I2C_READ_TIMEOUT)
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_TIMEOUT;
-        }
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    }
-
-    for(Idx = 0; Idx < ulLength; Idx++)
-    {
-        ulTimes = 0;
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-        while(ulFifo > I2C_TXRX_THRESHOLD)
-        {
-            I2C_Delay(2);
-            if(++ulTimes > I2C_READ_TIMEOUT)
-            {
-                (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-                return EFI_TIMEOUT;
-            }
-            ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-        }
-
-        if (Idx < ulLength - 1) {
-            I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, (*pBuf++));
-        } else {
-            //Send command stop bit for the last transfer
-            I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, (*pBuf++) | I2C_CMD_STOP_BIT);
-        }
-    }
-
-    ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    ulTimes = 0;
-    while(0 != ulFifo)
-    {
-        I2C_Delay(2);
-
-        if(++ulTimes > I2C_READ_TIMEOUT)
-        {
-            DEBUG ((EFI_D_ERROR, "I2C Write try to finished,time out!\n"));
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_TIMEOUT;
-        }
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    }
-    (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-
-    return EFI_SUCCESS;
+  UINT32 Fifo;
+  UINT32 Times = 0;
+  UINT32  Idx;
+  UINTN  Base;
+
+  if (I2cInfo->Port >= I2C_PORT_MAX) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Base = GetI2cBase (I2cInfo->Socket, I2cInfo->Port);
+
+  (VOID)I2C_Enable(I2cInfo->Socket, I2cInfo->Port);
+
+  I2C_SetTarget(I2cInfo->Socket, I2cInfo->Port, I2cInfo->SlaveDeviceAddress);
+
+  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  while (Fifo != 0) {
+    I2C_Delay (2);
+    if (++Times > I2C_READ_TIMEOUT) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_TIMEOUT;
+    }
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  }
+
+  if (I2cInfo->DeviceType) {
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 8) & 0xff);
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, InfoOffset & 0xff);
+  } else {
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, InfoOffset & 0xff);
+  }
+
+  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  Times = 0;
+  while (Fifo != 0) {
+    I2C_Delay (2);
+    if (++Times > I2C_READ_TIMEOUT) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_TIMEOUT;
+    }
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  }
+
+  for (Idx = 0; Idx < Length; Idx++) {
+    Times = 0;
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+    while (Fifo > I2C_TXRX_THRESHOLD) {
+      I2C_Delay (2);
+      if (++Times > I2C_READ_TIMEOUT) {
+        (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+        return EFI_TIMEOUT;
+      }
+      Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+    }
+
+    if (Idx < Length - 1) {
+      I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, (*pBuf++));
+    } else {
+      //Send command stop bit for the last transfer
+      I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, (*pBuf++) | I2C_CMD_STOP_BIT);
+    }
+  }
+
+  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  Times = 0;
+  while (Fifo != 0) {
+    I2C_Delay (2);
+
+    if (++Times > I2C_READ_TIMEOUT) {
+      DEBUG ((DEBUG_ERROR, "I2C Write try to finished,time out!\n"));
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_TIMEOUT;
+    }
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  }
+  (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+
+  return EFI_SUCCESS;
 }
 
 EFI_STATUS
 EFIAPI
-I2CRead(I2C_DEVICE *I2cInfo, UINT16 InfoOffset,UINT32 ulRxLen,UINT8 *pBuf)
+I2CRead(
+  I2C_DEVICE *I2cInfo,
+  UINT16     InfoOffset,
+  UINT32     RxLen,
+  UINT8 *pBuf
+  )
 {
-    UINT32 ulFifo;
-    UINT32 ulTimes = 0;
-    UINT8  I2CWAddr[2];
-    EFI_STATUS  Status;
-    UINT32  Idx = 0;
-    UINTN Base;
-
-
-    if(I2cInfo->Port >= I2C_PORT_MAX)
-    {
-        return EFI_INVALID_PARAMETER;
-    }
-
-    (VOID)I2C_Enable(I2cInfo->Socket, I2cInfo->Port);
-    Base = GetI2cBase(I2cInfo->Socket, I2cInfo->Port);
-    if(I2cInfo->DeviceType)
-    {
-        I2CWAddr[0] = (InfoOffset >> 8) & 0xff;
-        I2CWAddr[1] = (InfoOffset & 0xff);
-        Status = WriteBeforeRead(I2cInfo, 2,I2CWAddr);
-        if(EFI_ERROR(Status))
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_ABORTED;
-        }
-    }
-    else
-    {
-        I2CWAddr[0] = (InfoOffset & 0xff);
-        Status = WriteBeforeRead(I2cInfo, 1,I2CWAddr);
-        if(EFI_ERROR(Status))
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_ABORTED;
-        }
-    }
-
-    I2C_SetTarget(I2cInfo->Socket,I2cInfo->Port,I2cInfo->SlaveDeviceAddress);
-
-    ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    while(0 != ulFifo)
-    {
-        I2C_Delay(2);
-
-        while(++ulTimes > I2C_READ_TIMEOUT)
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_TIMEOUT;
-        }
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    }
-
-    while (ulRxLen > 0) {
-        if (ulRxLen > 1) {
-            I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, I2C_READ_SIGNAL);
-        } else {
-            //Send command stop bit for the last transfer
-            I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, I2C_READ_SIGNAL | I2C_CMD_STOP_BIT);
-        }
-
-        ulTimes = 0;
-        do {
-            I2C_Delay(2);
-
-            while(++ulTimes > I2C_READ_TIMEOUT) {
-                (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-                return EFI_TIMEOUT;
-            }
-            ulFifo = I2C_GetRxStatus(I2cInfo->Socket,I2cInfo->Port);
-        }while(0 == ulFifo);
-
-        I2C_REG_READ(Base + I2C_DATA_CMD_OFFSET, pBuf[Idx++]);
-
-        ulRxLen --;
-    }
-    (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-
-    return EFI_SUCCESS;
+  UINT32      Fifo;
+  UINT32      Times = 0;
+  UINT8       I2CWAddr[2];
+  EFI_STATUS  Status;
+  UINT32      Idx = 0;
+  UINTN       Base;
+
+  if (I2cInfo->Port >= I2C_PORT_MAX) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  (VOID)I2C_Enable(I2cInfo->Socket, I2cInfo->Port);
+  Base = GetI2cBase (I2cInfo->Socket, I2cInfo->Port);
+  if (I2cInfo->DeviceType) {
+    I2CWAddr[0] = (InfoOffset >> 8) & 0xff;
+    I2CWAddr[1] = (InfoOffset & 0xff);
+    Status = WriteBeforeRead (I2cInfo, 2,I2CWAddr);
+    if (EFI_ERROR (Status)) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_ABORTED;
+    }
+  } else {
+    I2CWAddr[0] = (InfoOffset & 0xff);
+    Status = WriteBeforeRead (I2cInfo, 1, I2CWAddr);
+    if (EFI_ERROR (Status)) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_ABORTED;
+    }
+  }
+
+  I2C_SetTarget (I2cInfo->Socket, I2cInfo->Port, I2cInfo->SlaveDeviceAddress);
+
+  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  while (Fifo != 0) {
+    I2C_Delay (2);
+
+    while (++Times > I2C_READ_TIMEOUT) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_TIMEOUT;
+    }
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  }
+
+  while (RxLen > 0) {
+    if (RxLen > 1) {
+      I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, I2C_READ_SIGNAL);
+    } else {
+      //Send command stop bit for the last transfer
+      I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, I2C_READ_SIGNAL | I2C_CMD_STOP_BIT);
+    }
+
+    Times = 0;
+    do {
+      I2C_Delay (2);
+
+      while (++Times > I2C_READ_TIMEOUT) {
+        (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+        return EFI_TIMEOUT;
+      }
+      Fifo = I2C_GetRxStatus (I2cInfo->Socket, I2cInfo->Port);
+    } while (Fifo == 0);
+
+    I2C_REG_READ (Base + I2C_DATA_CMD_OFFSET, pBuf[Idx++]);
+
+    RxLen --;
+  }
+  (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+
+  return EFI_SUCCESS;
 }
 
 EFI_STATUS
 EFIAPI
-I2CReadMultiByte(I2C_DEVICE *I2cInfo, UINT32 InfoOffset,UINT32 ulRxLen,UINT8 *pBuf)
+I2CReadMultiByte (
+  I2C_DEVICE *I2cInfo,
+  UINT32     InfoOffset,
+  UINT32     RxLen,
+  UINT8      *pBuf
+  )
 {
-    UINT32 ulCnt;
-    UINT16 usTotalLen = 0;
-    UINT32 ulFifo;
-    UINT32 ulTimes = 0;
-    UINT8  I2CWAddr[4];
-    EFI_STATUS  Status;
-    UINT32  BytesLeft;
-    UINT32  Idx = 0;
-    UINTN Base;
-
-
-    if(I2cInfo->Port >= I2C_PORT_MAX)
-    {
-        return EFI_INVALID_PARAMETER;
-    }
-
-    (VOID)I2C_Enable(I2cInfo->Socket, I2cInfo->Port);
-    Base = GetI2cBase(I2cInfo->Socket, I2cInfo->Port);
-    if(I2cInfo->DeviceType == DEVICE_TYPE_E2PROM)
-    {
-        I2CWAddr[0] = (InfoOffset >> 8) & 0xff;
-        I2CWAddr[1] = (InfoOffset & 0xff);
-        Status = WriteBeforeRead(I2cInfo, 2,I2CWAddr);
-        if(EFI_ERROR(Status))
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_ABORTED;
-        }
-    }
-
-    else if(I2cInfo->DeviceType == DEVICE_TYPE_CPLD_3BYTE_OPERANDS)
-    {
-        I2CWAddr[0] = (InfoOffset >> 16) & 0xff;
-        I2CWAddr[1] = (InfoOffset >> 8) & 0xff;
-        I2CWAddr[2] = (InfoOffset & 0xff);
-        Status = WriteBeforeRead(I2cInfo, 3,I2CWAddr);
-        if(EFI_ERROR(Status))
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_ABORTED;
-        }
-    }
-
-    else if(I2cInfo->DeviceType == DEVICE_TYPE_CPLD_4BYTE_OPERANDS)
-    {
-        I2CWAddr[0] = (InfoOffset >> 24) & 0xff;
-        I2CWAddr[1] = (InfoOffset >> 16) & 0xff;
-        I2CWAddr[2] = (InfoOffset >> 8) & 0xff;
-        I2CWAddr[3] = (InfoOffset & 0xff);
-        Status = WriteBeforeRead(I2cInfo, 4,I2CWAddr);
-        if(EFI_ERROR(Status))
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_ABORTED;
-        }
-    }
-
-    else
-    {
-        I2CWAddr[0] = (InfoOffset & 0xff);
-        Status = WriteBeforeRead(I2cInfo, 1,I2CWAddr);
-        if(EFI_ERROR(Status))
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_ABORTED;
-        }
-    }
-
-
-    I2C_SetTarget(I2cInfo->Socket,I2cInfo->Port,I2cInfo->SlaveDeviceAddress);
-    usTotalLen = ulRxLen;
-    BytesLeft = usTotalLen;
-
-    for(ulCnt = 0; ulCnt < BytesLeft; ulCnt++) {
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, I2C_READ_SIGNAL);
-    }
-
-
-    for(ulCnt = 0; ulCnt < BytesLeft; ulCnt++) {
-        ulTimes = 0;
-        do {
-            I2C_Delay(2);
-
-            while(++ulTimes > I2C_READ_TIMEOUT) {
-                (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-                return EFI_TIMEOUT;
-            }
-            ulFifo = I2C_GetRxStatus(I2cInfo->Socket,I2cInfo->Port);
-        }while(0 == ulFifo);
-
-        I2C_REG_READ(Base + I2C_DATA_CMD_OFFSET, pBuf[Idx++]);
-    }
-    (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-
-    return EFI_SUCCESS;
+  UINT32      Count;
+  UINT16      TotalLen = 0;
+  UINT32      Fifo;
+  UINT32      Times = 0;
+  UINT8       I2CWAddr[4];
+  EFI_STATUS  Status;
+  UINT32      BytesLeft;
+  UINT32      Idx = 0;
+  UINTN       Base;
+
+  if (I2cInfo->Port >= I2C_PORT_MAX) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  (VOID)I2C_Enable (I2cInfo->Socket, I2cInfo->Port);
+  Base = GetI2cBase (I2cInfo->Socket, I2cInfo->Port);
+  if (I2cInfo->DeviceType == DEVICE_TYPE_E2PROM) {
+    I2CWAddr[0] = (InfoOffset >> 8) & 0xff;
+    I2CWAddr[1] = (InfoOffset & 0xff);
+    Status = WriteBeforeRead (I2cInfo, 2,I2CWAddr);
+    if (EFI_ERROR (Status)) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_ABORTED;
+    }
+  } else if (I2cInfo->DeviceType == DEVICE_TYPE_CPLD_3BYTE_OPERANDS) {
+    I2CWAddr[0] = (InfoOffset >> 16) & 0xff;
+    I2CWAddr[1] = (InfoOffset >> 8) & 0xff;
+    I2CWAddr[2] = (InfoOffset & 0xff);
+    Status = WriteBeforeRead (I2cInfo, 3, I2CWAddr);
+    if (EFI_ERROR (Status)) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_ABORTED;
+    }
+  } else if (I2cInfo->DeviceType == DEVICE_TYPE_CPLD_4BYTE_OPERANDS) {
+    I2CWAddr[0] = (InfoOffset >> 24) & 0xff;
+    I2CWAddr[1] = (InfoOffset >> 16) & 0xff;
+    I2CWAddr[2] = (InfoOffset >> 8) & 0xff;
+    I2CWAddr[3] = (InfoOffset & 0xff);
+    Status = WriteBeforeRead (I2cInfo, 4,I2CWAddr);
+    if (EFI_ERROR (Status)) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_ABORTED;
+    }
+  } else {
+    I2CWAddr[0] = (InfoOffset & 0xff);
+    Status = WriteBeforeRead (I2cInfo, 1,I2CWAddr);
+    if (EFI_ERROR (Status)) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_ABORTED;
+    }
+  }
+
+  I2C_SetTarget(I2cInfo->Socket, I2cInfo->Port, I2cInfo->SlaveDeviceAddress);
+  TotalLen = RxLen;
+  BytesLeft = TotalLen;
+
+  for (Count = 0; Count < BytesLeft; Count++) {
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, I2C_READ_SIGNAL);
+  }
+
+  for (Count = 0; Count < BytesLeft; Count++) {
+    Times = 0;
+    do {
+      I2C_Delay (2);
+
+      while (++Times > I2C_READ_TIMEOUT) {
+        (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+        return EFI_TIMEOUT;
+      }
+      Fifo = I2C_GetRxStatus (I2cInfo->Socket, I2cInfo->Port);
+    } while (Fifo == 0);
+
+    I2C_REG_READ (Base + I2C_DATA_CMD_OFFSET, pBuf[Idx++]);
+  }
+  (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+
+  return EFI_SUCCESS;
 }
 
 EFI_STATUS
 EFIAPI
-I2CWriteMultiByte(I2C_DEVICE *I2cInfo, UINT32 InfoOffset, UINT32 ulLength, UINT8 *pBuf)
+I2CWriteMultiByte(
+  I2C_DEVICE *I2cInfo,
+  UINT32     InfoOffset,
+  UINT32     Length,
+  UINT8      *pBuf
+  )
 {
-    UINT32 ulFifo;
-    UINT32 ulTimes = 0;
-    UINT32  Idx;
-    UINTN  Base;
-
-
-    if(I2cInfo->Port >= I2C_PORT_MAX)
-    {
-        return EFI_INVALID_PARAMETER;
-    }
-
-    Base = GetI2cBase(I2cInfo->Socket, I2cInfo->Port);
-
-    (VOID)I2C_Enable(I2cInfo->Socket, I2cInfo->Port);
-
-    I2C_SetTarget(I2cInfo->Socket,I2cInfo->Port,I2cInfo->SlaveDeviceAddress);
-
-    ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    while(0 != ulFifo)
-    {
-        I2C_Delay(2);
-        if(++ulTimes > I2C_READ_TIMEOUT)
-        {
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_TIMEOUT;
-        }
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    }
-
-
-    if(I2cInfo->DeviceType == DEVICE_TYPE_CPLD_3BYTE_OPERANDS)
-    {
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 16) & 0xff);
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 8) & 0xff);
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, InfoOffset & 0xff);
-    }
-
-    else if(I2cInfo->DeviceType == DEVICE_TYPE_CPLD_4BYTE_OPERANDS)
-    {
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 24) & 0xff);
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 16) & 0xff);
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 8) & 0xff);
-        I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, InfoOffset & 0xff);
-    }
-
-    else
-    {
-
-    }
-
-    ulTimes = 0;
-    for(Idx = 0; Idx < ulLength; Idx++)
-    {
-
-       I2C_REG_WRITE(Base + I2C_DATA_CMD_OFFSET, *pBuf++);
-
-    }
-
-    ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    ulTimes = 0;
-    while(0 != ulFifo)
-    {
-        I2C_Delay(2);
-
-        if(++ulTimes > I2C_READ_TIMEOUT)
-        {
-            DEBUG ((EFI_D_ERROR, "I2C Write try to finished,time out!\n"));
-            (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-            return EFI_TIMEOUT;
-        }
-        ulFifo = I2C_GetTxStatus(I2cInfo->Socket,I2cInfo->Port);
-    }
-    (VOID)I2C_Disable(I2cInfo->Socket, I2cInfo->Port);
-
-    return EFI_SUCCESS;
+  UINT32 Fifo;
+  UINT32 Times = 0;
+  UINT32  Idx;
+  UINTN  Base;
+
+  if (I2cInfo->Port >= I2C_PORT_MAX) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Base = GetI2cBase (I2cInfo->Socket, I2cInfo->Port);
+
+  (VOID)I2C_Enable(I2cInfo->Socket, I2cInfo->Port);
+
+  I2C_SetTarget(I2cInfo->Socket, I2cInfo->Port, I2cInfo->SlaveDeviceAddress);
+
+  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  while (0 != Fifo) {
+    I2C_Delay (2);
+    if (++Times > I2C_READ_TIMEOUT) {
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_TIMEOUT;
+    }
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  }
+
+  if (I2cInfo->DeviceType == DEVICE_TYPE_CPLD_3BYTE_OPERANDS) {
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 16) & 0xff);
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 8) & 0xff);
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, InfoOffset & 0xff);
+  } else if (I2cInfo->DeviceType == DEVICE_TYPE_CPLD_4BYTE_OPERANDS) {
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 24) & 0xff);
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 16) & 0xff);
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, (InfoOffset >> 8) & 0xff);
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, InfoOffset & 0xff);
+  } else {
+  }
+
+  Times = 0;
+  for (Idx = 0; Idx < Length; Idx++) {
+    I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, *pBuf++);
+  }
+
+  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  Times = 0;
+  while (Fifo != 0) {
+    I2C_Delay (2);
+
+    if (++Times > I2C_READ_TIMEOUT) {
+      DEBUG ((DEBUG_ERROR, "I2C Write try to finished,time out!\n"));
+      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+      return EFI_TIMEOUT;
+    }
+    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  }
+  (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
+
+  return EFI_SUCCESS;
 }
 
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 21/43] Silicon/Hisilicon/I2C: Refactor I2C library
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (19 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 20/43] Hisilicon/I2C: Modify I2CLib.c for coding style Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 22/43] Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06 Ming Huang
                   ` (22 subsequent siblings)
  43 siblings, 0 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

The hunk of waiting TX/TX finish is used by ten times,
so move there hunks to a function CheckI2CTimeOut().

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Library/I2CLib/I2CHw.h  |   4 +
 Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 161 ++++++++------------
 2 files changed, 66 insertions(+), 99 deletions(-)

diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
index aa561e929c..fa954c7937 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
@@ -265,5 +265,9 @@
      UINT32      Val32;
  } I2C0_ENABLE_STATUS_U;
 
+typedef enum {
+  I2CTx,
+  I2CRx
+} I2CTransfer;
 
 #endif
diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
index f03d55d6b2..9174e50dd4 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
@@ -238,6 +238,45 @@ I2C_GetRxStatus (
   return Fifo.bits.rxflr;
 }
 
+EFI_STATUS
+EFIAPI
+CheckI2CTimeOut (
+  UINT32      Socket,
+  UINT8       Port,
+  I2CTransfer Transfer
+  )
+{
+  UINT32 Times = 0;
+  UINT32 Fifo;
+
+  if (Transfer == I2CTx) {
+    Fifo = I2C_GetTxStatus (Socket, Port);
+    while (Fifo != 0) {
+      // This is a empirical value for I2C delay. MemoryFance is no need here.
+      I2C_Delay (2);
+      if (++Times > I2C_READ_TIMEOUT) {
+        (VOID)I2C_Disable (Socket, Port);
+        return EFI_TIMEOUT;
+      }
+      Fifo = I2C_GetTxStatus (Socket, Port);
+    }
+  } else {
+    Fifo = I2C_GetRxStatus (Socket, Port);
+    while (Fifo == 0) {
+      // This is a empirical value for I2C delay. MemoryFance is no need here.
+      I2C_Delay (2);
+      if (++Times > I2C_READ_TIMEOUT) {
+        (VOID)I2C_Disable (Socket, Port);
+        return EFI_TIMEOUT;
+      }
+      Fifo = I2C_GetRxStatus (Socket, Port);
+    }
+  }
+
+  return EFI_SUCCESS;
+}
+
+
 EFI_STATUS
 EFIAPI
 WriteBeforeRead (
@@ -254,15 +293,11 @@ WriteBeforeRead (
 
   I2C_SetTarget (I2cInfo->Socket, I2cInfo->Port, I2cInfo->SlaveDeviceAddress);
 
-  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
-  while (Fifo != 0) {
-    I2C_Delay (2);
-    if (++Times > I2C_READ_TIMEOUT) {
-      return EFI_TIMEOUT;
-    }
-    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CTx) == EFI_TIMEOUT) {
+    return EFI_TIMEOUT;
   }
 
+  Fifo = 0;
   for (Count = 0; Count < Length; Count++) {
     Times = 0;
     while (Fifo > I2C_TXRX_THRESHOLD) {
@@ -277,15 +312,8 @@ WriteBeforeRead (
     Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
   }
 
-  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
-  Times = 0;
-  while (Fifo != 0) {
-    I2C_Delay (2);
-
-    if (++Times > I2C_READ_TIMEOUT) {
-      return EFI_TIMEOUT;
-    }
-    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CTx) == EFI_TIMEOUT) {
+    return EFI_TIMEOUT;
   }
 
   return EFI_SUCCESS;
@@ -316,14 +344,8 @@ I2CWrite(
 
   I2C_SetTarget(I2cInfo->Socket, I2cInfo->Port, I2cInfo->SlaveDeviceAddress);
 
-  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
-  while (Fifo != 0) {
-    I2C_Delay (2);
-    if (++Times > I2C_READ_TIMEOUT) {
-      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
-      return EFI_TIMEOUT;
-    }
-    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CTx) == EFI_TIMEOUT) {
+    return EFI_TIMEOUT;
   }
 
   if (I2cInfo->DeviceType) {
@@ -333,15 +355,8 @@ I2CWrite(
     I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, InfoOffset & 0xff);
   }
 
-  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
-  Times = 0;
-  while (Fifo != 0) {
-    I2C_Delay (2);
-    if (++Times > I2C_READ_TIMEOUT) {
-      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
-      return EFI_TIMEOUT;
-    }
-    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CTx) == EFI_TIMEOUT) {
+    return EFI_TIMEOUT;
   }
 
   for (Idx = 0; Idx < Length; Idx++) {
@@ -364,17 +379,8 @@ I2CWrite(
     }
   }
 
-  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
-  Times = 0;
-  while (Fifo != 0) {
-    I2C_Delay (2);
-
-    if (++Times > I2C_READ_TIMEOUT) {
-      DEBUG ((DEBUG_ERROR, "I2C Write try to finished,time out!\n"));
-      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
-      return EFI_TIMEOUT;
-    }
-    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CTx) == EFI_TIMEOUT) {
+    return EFI_TIMEOUT;
   }
   (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
 
@@ -390,8 +396,6 @@ I2CRead(
   UINT8 *pBuf
   )
 {
-  UINT32      Fifo;
-  UINT32      Times = 0;
   UINT8       I2CWAddr[2];
   EFI_STATUS  Status;
   UINT32      Idx = 0;
@@ -422,15 +426,8 @@ I2CRead(
 
   I2C_SetTarget (I2cInfo->Socket, I2cInfo->Port, I2cInfo->SlaveDeviceAddress);
 
-  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
-  while (Fifo != 0) {
-    I2C_Delay (2);
-
-    while (++Times > I2C_READ_TIMEOUT) {
-      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
-      return EFI_TIMEOUT;
-    }
-    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CTx) == EFI_TIMEOUT) {
+    return EFI_TIMEOUT;
   }
 
   while (RxLen > 0) {
@@ -441,16 +438,9 @@ I2CRead(
       I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, I2C_READ_SIGNAL | I2C_CMD_STOP_BIT);
     }
 
-    Times = 0;
-    do {
-      I2C_Delay (2);
-
-      while (++Times > I2C_READ_TIMEOUT) {
-        (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
-        return EFI_TIMEOUT;
-      }
-      Fifo = I2C_GetRxStatus (I2cInfo->Socket, I2cInfo->Port);
-    } while (Fifo == 0);
+    if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CRx) == EFI_TIMEOUT) {
+      return EFI_TIMEOUT;
+    }
 
     I2C_REG_READ (Base + I2C_DATA_CMD_OFFSET, pBuf[Idx++]);
 
@@ -472,8 +462,6 @@ I2CReadMultiByte (
 {
   UINT32      Count;
   UINT16      TotalLen = 0;
-  UINT32      Fifo;
-  UINT32      Times = 0;
   UINT8       I2CWAddr[4];
   EFI_STATUS  Status;
   UINT32      BytesLeft;
@@ -531,16 +519,9 @@ I2CReadMultiByte (
   }
 
   for (Count = 0; Count < BytesLeft; Count++) {
-    Times = 0;
-    do {
-      I2C_Delay (2);
-
-      while (++Times > I2C_READ_TIMEOUT) {
-        (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
-        return EFI_TIMEOUT;
-      }
-      Fifo = I2C_GetRxStatus (I2cInfo->Socket, I2cInfo->Port);
-    } while (Fifo == 0);
+    if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CRx) == EFI_TIMEOUT) {
+      return EFI_TIMEOUT;
+    }
 
     I2C_REG_READ (Base + I2C_DATA_CMD_OFFSET, pBuf[Idx++]);
   }
@@ -558,8 +539,6 @@ I2CWriteMultiByte(
   UINT8      *pBuf
   )
 {
-  UINT32 Fifo;
-  UINT32 Times = 0;
   UINT32  Idx;
   UINTN  Base;
 
@@ -573,14 +552,8 @@ I2CWriteMultiByte(
 
   I2C_SetTarget(I2cInfo->Socket, I2cInfo->Port, I2cInfo->SlaveDeviceAddress);
 
-  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
-  while (0 != Fifo) {
-    I2C_Delay (2);
-    if (++Times > I2C_READ_TIMEOUT) {
-      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
-      return EFI_TIMEOUT;
-    }
-    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CTx) == EFI_TIMEOUT) {
+    return EFI_TIMEOUT;
   }
 
   if (I2cInfo->DeviceType == DEVICE_TYPE_CPLD_3BYTE_OPERANDS) {
@@ -595,22 +568,12 @@ I2CWriteMultiByte(
   } else {
   }
 
-  Times = 0;
   for (Idx = 0; Idx < Length; Idx++) {
     I2C_REG_WRITE (Base + I2C_DATA_CMD_OFFSET, *pBuf++);
   }
 
-  Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
-  Times = 0;
-  while (Fifo != 0) {
-    I2C_Delay (2);
-
-    if (++Times > I2C_READ_TIMEOUT) {
-      DEBUG ((DEBUG_ERROR, "I2C Write try to finished,time out!\n"));
-      (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
-      return EFI_TIMEOUT;
-    }
-    Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
+  if (CheckI2CTimeOut (I2cInfo->Socket, I2cInfo->Port, I2CTx) == EFI_TIMEOUT) {
+    return EFI_TIMEOUT;
   }
   (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
 
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 22/43] Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (20 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 21/43] Silicon/Hisilicon/I2C: Refactor I2C library Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 14:21   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 23/43] Silicon/Hisilicon/D06: Add I2C delay for HNS auto config Ming Huang
                   ` (21 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

I2C may enable failed in D06, so retry I2C enable while
enable failed.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
index 9174e50dd4..d67ddc7f9b 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
@@ -86,6 +86,7 @@ I2C_Enable (
 {
   I2C0_ENABLE_U           I2cEnableReg;
   I2C0_ENABLE_STATUS_U    I2cEnableStatusReg;
+  UINT32                  TimeCnt = I2C_READ_TIMEOUT;
 
   UINTN Base = GetI2cBase (Socket, Port);
 
@@ -93,13 +94,18 @@ I2C_Enable (
   I2cEnableReg.bits.enable = 1;
   I2C_REG_WRITE (Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
 
+  do {
+    // This is a empirical value for I2C delay. MemoryFance is no need here.
+    I2C_Delay (10000);
 
-  I2C_REG_READ (Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
-  if (I2cEnableStatusReg.bits.ic_en == 1) {
-    return EFI_SUCCESS;
-  } else {
-    return EFI_DEVICE_ERROR;
-  }
+    TimeCnt--;
+    I2C_REG_READ (Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
+    if (TimeCnt == 0) {
+      return EFI_DEVICE_ERROR;
+    }
+  } while (I2cEnableStatusReg.bits.ic_en == 0);
+
+  return EFI_SUCCESS;
 }
 
 VOID
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 23/43] Silicon/Hisilicon/D06: Add I2C delay for HNS auto config
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (21 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 22/43] Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06 Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 14:27   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 24/43] Hisilicon/I2C: Fix a typo issue Ming Huang
                   ` (20 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Because I2C Port5 salve device connect under I2C extender
(9545 device), it will cost more time to access I2C slave
device, so add delay time for HNS auto config.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Library/I2CLib/I2CHw.h  |  3 +++
 Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 21 +++++++++++++++-----
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
index fa954c7937..d77aea509e 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
@@ -19,6 +19,9 @@
 #include <Uefi.h>
 #include <Library/IoLib.h>
 
+// The HNS I2C port 5 is under I2C extender
+#define I2C_EXTENDER_PORT_HNS        5
+
 #define I2C_READ_TIMEOUT             500
 #define I2C_DRV_ONCE_WRITE_BYTES_NUM 8
 #define I2C_DRV_ONCE_READ_BYTES_NUM  8
diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
index d67ddc7f9b..59633106ce 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
@@ -258,8 +258,13 @@ CheckI2CTimeOut (
   if (Transfer == I2CTx) {
     Fifo = I2C_GetTxStatus (Socket, Port);
     while (Fifo != 0) {
-      // This is a empirical value for I2C delay. MemoryFance is no need here.
-      I2C_Delay (2);
+      if (Port == I2C_EXTENDER_PORT_HNS) {
+        // This is a empirical value for I2C delay. MemoryFance is no need here.
+        I2C_Delay (1000);
+      } else {
+        // This is a empirical value for I2C delay. MemoryFance is no need here.
+        I2C_Delay (2);
+      }
       if (++Times > I2C_READ_TIMEOUT) {
         (VOID)I2C_Disable (Socket, Port);
         return EFI_TIMEOUT;
@@ -269,8 +274,13 @@ CheckI2CTimeOut (
   } else {
     Fifo = I2C_GetRxStatus (Socket, Port);
     while (Fifo == 0) {
-      // This is a empirical value for I2C delay. MemoryFance is no need here.
-      I2C_Delay (2);
+      if (Port == I2C_EXTENDER_PORT_HNS) {
+        // This is a empirical value for I2C delay. MemoryFance is no need here.
+        I2C_Delay (1000);
+      } else {
+        // This is a empirical value for I2C delay. MemoryFance is no need here.
+        I2C_Delay (2);
+      }
       if (++Times > I2C_READ_TIMEOUT) {
         (VOID)I2C_Disable (Socket, Port);
         return EFI_TIMEOUT;
@@ -369,7 +379,8 @@ I2CWrite(
     Times = 0;
     Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
     while (Fifo > I2C_TXRX_THRESHOLD) {
-      I2C_Delay (2);
+      // This is a empirical value for I2C delay. MemoryFance is no need here.
+      I2C_Delay (1000);
       if (++Times > I2C_READ_TIMEOUT) {
         (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
         return EFI_TIMEOUT;
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 24/43] Hisilicon/I2C: Fix a typo issue
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (22 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 23/43] Silicon/Hisilicon/D06: Add I2C delay for HNS auto config Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 25/43] Silicon/Hisilicon/D06: Optimize HNS config CDR post time Ming Huang
                   ` (19 subsequent siblings)
  43 siblings, 0 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Modify spedd to Speed.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Library/I2CLib/I2CHw.h  | 2 +-
 Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
index d77aea509e..6fd7b8183e 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
@@ -81,7 +81,7 @@
      struct
      {
         UINT32      master                : 1   ;
-        UINT32      spedd                 : 2   ;
+        UINT32      Speed                 : 2   ;
         UINT32      slave_10bit           : 1   ;
         UINT32      master_10bit          : 1   ;
         UINT32      restart_en            : 1   ;
diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
index 59633106ce..ed44ac204f 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
@@ -158,7 +158,7 @@ I2CInit (
 
   I2C_REG_READ (Base + I2C_CON_OFFSET, I2cControlReg.Val32);
   I2cControlReg.bits.master = 1;
-  I2cControlReg.bits.spedd = 0x1;
+  I2cControlReg.bits.Speed = 0x1;
   I2cControlReg.bits.restart_en = 1;
   I2cControlReg.bits.slave_disable = 1;
   I2C_REG_WRITE (Base + I2C_CON_OFFSET, I2cControlReg.Val32);
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 25/43] Silicon/Hisilicon/D06: Optimize HNS config CDR post time
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (23 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 24/43] Hisilicon/I2C: Fix a typo issue Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 14:30   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 26/43] Silicon/Hisilicon/Setup: Add Setup Item "EnableGOP" Ming Huang
                   ` (18 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	shaochangliang, Ming Huang

From: shaochangliang <shaochangliang@huawei.com>

Use I2C 400KB speed for config CDR.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
index ed44ac204f..55c030a3af 100644
--- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
+++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
@@ -28,6 +28,9 @@
 #include "I2CLibInternal.h"
 #include "I2CHw.h"
 
+#define I2C_100KB_SPEED 0x1
+#define I2C_400KB_SPEED 0x2
+
 VOID
 I2C_Delay (
   UINT32 Count
@@ -158,7 +161,11 @@ I2CInit (
 
   I2C_REG_READ (Base + I2C_CON_OFFSET, I2cControlReg.Val32);
   I2cControlReg.bits.master = 1;
-  I2cControlReg.bits.Speed = 0x1;
+  if(SpeedMode == Normal) {
+    I2cControlReg.bits.Speed = I2C_100KB_SPEED;
+  } else {
+    I2cControlReg.bits.Speed = I2C_400KB_SPEED;
+  }
   I2cControlReg.bits.restart_en = 1;
   I2cControlReg.bits.slave_disable = 1;
   I2C_REG_WRITE (Base + I2C_CON_OFFSET, I2cControlReg.Val32);
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 26/43] Silicon/Hisilicon/Setup: Add Setup Item "EnableGOP"
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (24 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 25/43] Silicon/Hisilicon/D06: Optimize HNS config CDR post time Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 14:33   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 27/43] Hisilicon/Hi1620: Add ACPI PPTT table Ming Huang
                   ` (17 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Yang XinYi

From: Yang XinYi <yangxingyi@huawei.com>

Add Setup Item "EnableGOP" for D06, This Item only takes
effect on VGA device SM750.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yang XinYi <yangxingyi@huawei.com>
---
 Silicon/Hisilicon/Include/Library/OemConfigData.h            | 1 +
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c    | 1 +
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr | 7 +++++++
 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni | 4 ++--
 4 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/Silicon/Hisilicon/Include/Library/OemConfigData.h b/Silicon/Hisilicon/Include/Library/OemConfigData.h
index 478821ae2c..e4d5917046 100644
--- a/Silicon/Hisilicon/Include/Library/OemConfigData.h
+++ b/Silicon/Hisilicon/Include/Library/OemConfigData.h
@@ -61,6 +61,7 @@ typedef struct {
   UINT8         EnableSmmu;
   UINT8         EnableFdtTable;
   UINT8         EnableSpcr;
+  UINT8         EnableGOP;
   /*RAS Config*/
   UINT8         EnRasSupport;
   UINT8         EnPoison;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
index 1e3635307c..3ecae3759a 100644
--- a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
@@ -295,6 +295,7 @@ OemConfigUiLibConstructor (
       Configuration.EnableSmmu = 1;
       Configuration.EnableFdtTable = 0;
       Configuration.EnableSpcr = 0;
+      Configuration.EnableGOP = 0;
       //
       //Set the default value of the Ras option
       //
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
index 9e3ac73116..c0b6e294a6 100644
--- a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
@@ -38,4 +38,11 @@ form formid = MISC_CONFIG_FORM_ID,
       option text = STRING_TOKEN(STR_ENABLED), value = 1, flags = 0;
     endoneof;
 
+    oneof varid   = OEM_CONFIG_DATA.EnableGOP,
+      prompt      = STRING_TOKEN(STR_ENABLE_GOP_FRAME_BUFFER),
+      help        = STRING_TOKEN(STR_ENABLE_GOP_FRAME_BUFFER_HELP),
+      option text = STRING_TOKEN(STR_DISABLED), value = 0, flags = DEFAULT;
+      option text = STRING_TOKEN(STR_ENABLED), value = 1, flags = 0;
+    endoneof;
+
 endform;
diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
index 53eb1622c4..2fd92fedff 100644
--- a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
+++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
@@ -23,5 +23,5 @@
 #string STR_FDT_CONFIG_HELP            #language en-US  "Enable or Disable Fdt Table."
 #string STR_ENABLE_SPCR_TABLE          #language en-US  "Support SPCR"
 #string STR_ENABLE_SPCR_HELP           #language en-US  "Enable or Disable SPCR Table."
-#string STR_ENABLE_GOP_FRAME_BUFFER    #language en-US  "Support GOP FB"
-#string STR_ENABLE_GOP_FRAME_BUFFER_HELP     #language en-US  "Enable or Disable GOP frame buffer."
+#string STR_ENABLE_GOP_FRAME_BUFFER    #language en-US  "Support GOP FB for SM750"
+#string STR_ENABLE_GOP_FRAME_BUFFER_HELP     #language en-US  "Enable or Disable GOP frame buffer for SM750."
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 27/43] Hisilicon/Hi1620: Add ACPI PPTT table
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (25 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 26/43] Silicon/Hisilicon/Setup: Add Setup Item "EnableGOP" Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 14:39   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 28/43] Platform/Hisilicon/D06: Enable ACPI PPTT Ming Huang
                   ` (16 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Heyi Guo

From: Heyi Guo <heyi.guo@linaro.org>

This driver fetches information from MADT,  so it is adaptable for
partial good and 1P/2P, since MADT is updated for different
configurations by certain mechanism.

Since L2 cache is also private resource of core, so we need to set the
next level of cache for L1I and L1D, which is important for OS to
parse cache hierarchy.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Heyi Guo <heyi.guo@linaro.org>
---
 Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf |  48 ++
 Silicon/Hisilicon/Hi1620/Pptt/Pptt.h   |  68 +++
 Silicon/Hisilicon/Hi1620/Pptt/Pptt.c   | 543 ++++++++++++++++++++
 3 files changed, 659 insertions(+)

diff --git a/Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf b/Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
new file mode 100644
index 0000000000..f8a5ed33a4
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
@@ -0,0 +1,48 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under Platform/ARM/JunoPkg/AcpiTables/
+*
+**/
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = AcpiPptt
+  FILE_GUID                      = 65766562-49e7-11e8-817f-286ed489ee9b
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = PpttEntryPoint
+
+[Sources.common]
+  Pptt.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdePkg/MdePkg.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[LibraryClasses]
+  ArmLib
+  BaseMemoryLib
+  DebugLib
+  HobLib
+  UefiDriverEntryPoint
+  UefiRuntimeServicesTableLib
+
+[Protocols]
+  gEfiAcpiSdtProtocolGuid                       ## PROTOCOL ALWAYS_CONSUMED
+  gEfiAcpiTableProtocolGuid                     ## PROTOCOL ALWAYS_CONSUMED
+
+[Depex]
+  gEfiAcpiTableProtocolGuid AND gEfiAcpiSdtProtocolGuid
+
diff --git a/Silicon/Hisilicon/Hi1620/Pptt/Pptt.h b/Silicon/Hisilicon/Hi1620/Pptt/Pptt.h
new file mode 100644
index 0000000000..5f2ec67cb9
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Pptt/Pptt.h
@@ -0,0 +1,68 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under Platform/ARM/JunoPkg/AcpiTables/
+*
+**/
+
+#ifndef _PPTT_H_
+#define _PPTT_H_
+
+#include <PlatformArch.h>
+#include <IndustryStandard/Acpi.h>
+#include <Library/ArmLib/ArmLibPrivate.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PcdLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+#include <Protocol/AcpiSystemDescriptionTable.h>
+#include <Protocol/AcpiTable.h>
+
+#define PPTT_VENDOR_ID             SIGNATURE_32('H', 'I', 'S', 'I')
+
+#define EFI_ACPI_MAX_NUM_TABLES    20
+
+#define MAX_SCL_PER_SOCKET         MAX_DIE
+#define MAX_SCL                    (MAX_SOCKET * MAX_SCL_PER_SOCKET)
+#define MAX_CLUSTER_PER_SCL        8
+
+#define PPTT_TABLE_MAX_LEN         0x6000
+#define PPTT_SOCKET_COMPONENT_NO   0x1
+#define PPTT_CACHE_NO              0x4
+
+typedef union {
+  struct {
+    UINT32    InD           :1;
+    UINT32    Level         :3;
+    UINT32    Reserved      :28;
+  } Bits;
+  UINT32 Data;
+} CSSELR_DATA;
+
+typedef union {
+  struct {
+    UINT32    LineSize           :3;
+    UINT32    Associativity      :10;
+    UINT32    NumSets            :15;
+    UINT32    Wa                 :1;
+    UINT32    Ra                 :1;
+    UINT32    Wb                 :1;
+    UINT32    Wt                 :1;
+  } Bits;
+  UINT32 Data;
+} CCSIDR_DATA;
+
+#endif    // _PPTT_H_
+
diff --git a/Silicon/Hisilicon/Hi1620/Pptt/Pptt.c b/Silicon/Hisilicon/Hi1620/Pptt/Pptt.c
new file mode 100644
index 0000000000..944b4b9507
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Pptt/Pptt.c
@@ -0,0 +1,543 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+*  Based on the files under Platform/ARM/JunoPkg/AcpiTables/
+*
+**/
+
+#include "Pptt.h"
+
+typedef EFI_ACPI_5_1_GIC_STRUCTURE                          ACPI_GIC_STRUCTURE;
+typedef EFI_ACPI_5_1_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER ACPI_MADT_TABLE_HEADER;
+
+EFI_ACPI_TABLE_PROTOCOL       *mAcpiTableProtocol = NULL;
+EFI_ACPI_SDT_PROTOCOL         *mAcpiSdtProtocol   = NULL;
+
+EFI_ACPI_DESCRIPTION_HEADER mPpttHeader =
+  ARM_ACPI_HEADER (
+    EFI_ACPI_6_2_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_STRUCTURE_SIGNATURE,
+    EFI_ACPI_DESCRIPTION_HEADER,
+    EFI_ACPI_6_2_PROCESSOR_PROPERTIES_TOPOLOGY_TABLE_REVISION
+  );
+
+EFI_ACPI_6_2_PPTT_STRUCTURE_ID mPpttSocketType2[PPTT_SOCKET_COMPONENT_NO] =
+{
+  {2, sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_ID), {0, 0}, PPTT_VENDOR_ID, 0, 0, 0, 0, 0}
+};
+
+EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE mPpttCacheType1[PPTT_CACHE_NO];
+
+STATIC UINT32 mSocketOffset[MAX_SOCKET];
+STATIC UINT32 mScclOffset[MAX_SCL];
+STATIC UINT32 mClusterOffset[MAX_SCL][MAX_CLUSTER_PER_SCL];
+
+STATIC
+VOID
+InitCacheInfo (
+  VOID
+  )
+{
+  UINT8                                        Index;
+  EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE_ATTRIBUTES Type1Attributes;
+  CSSELR_DATA                                  CsselrData;
+  CCSIDR_DATA                                  CcsidrData;
+
+  for (Index = 0; Index < PPTT_CACHE_NO; Index++) {
+    CsselrData.Data = 0;
+    CcsidrData.Data = 0;
+    SetMem (
+      &Type1Attributes,
+      sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE_ATTRIBUTES),
+      0
+      );
+
+    if (Index == 0) { //L1I
+      CsselrData.Bits.InD = 1;
+      CsselrData.Bits.Level = 0;
+      Type1Attributes.CacheType  = 1;
+    } else if (Index == 1) {
+      Type1Attributes.CacheType  = 0;
+      CsselrData.Bits.Level = Index - 1;
+    } else {
+      Type1Attributes.CacheType  = 2;
+      CsselrData.Bits.Level = Index - 1;
+    }
+
+    CcsidrData.Data = ReadCCSIDR (CsselrData.Data);
+
+    if (CcsidrData.Bits.Wa == 1) {
+      Type1Attributes.AllocationType = EFI_ACPI_6_2_CACHE_ATTRIBUTES_ALLOCATION_WRITE;
+      if (CcsidrData.Bits.Ra == 1) {
+        Type1Attributes.AllocationType = EFI_ACPI_6_2_CACHE_ATTRIBUTES_ALLOCATION_READ_WRITE;
+      }
+    }
+
+    if (CcsidrData.Bits.Wt == 1) {
+      Type1Attributes.WritePolicy = 1;
+    }
+    DEBUG ((DEBUG_INFO,
+            "[Acpi PPTT] Level = %x!CcsidrData = %x!\n",
+            CsselrData.Bits.Level,
+            CcsidrData.Data));
+
+    mPpttCacheType1[Index].Type = EFI_ACPI_6_2_PPTT_TYPE_CACHE;
+    mPpttCacheType1[Index].Length = sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE);
+    mPpttCacheType1[Index].Reserved[0] = 0;
+    mPpttCacheType1[Index].Reserved[1] = 0;
+    mPpttCacheType1[Index].Flags.SizePropertyValid = 1;
+    mPpttCacheType1[Index].Flags.NumberOfSetsValid = 1;
+    mPpttCacheType1[Index].Flags.AssociativityValid = 1;
+    mPpttCacheType1[Index].Flags.AllocationTypeValid = 1;
+    mPpttCacheType1[Index].Flags.CacheTypeValid = 1;
+    mPpttCacheType1[Index].Flags.WritePolicyValid = 1;
+    mPpttCacheType1[Index].Flags.LineSizeValid = 1;
+    mPpttCacheType1[Index].Flags.Reserved = 0;
+    mPpttCacheType1[Index].NextLevelOfCache = 0;
+
+    if (Index != PPTT_CACHE_NO - 1) {
+      mPpttCacheType1[Index].NumberOfSets = (UINT16)CcsidrData.Bits.NumSets + 1;
+      mPpttCacheType1[Index].Associativity = (UINT16)CcsidrData.Bits.Associativity + 1;
+      mPpttCacheType1[Index].LineSize = (UINT16)( 1 << (CcsidrData.Bits.LineSize + 4));
+      mPpttCacheType1[Index].Size = mPpttCacheType1[Index].LineSize *      \
+                                    mPpttCacheType1[Index].Associativity * \
+                                    mPpttCacheType1[Index].NumberOfSets;
+      CopyMem (
+        &mPpttCacheType1[Index].Attributes,
+        &Type1Attributes,
+        sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE_ATTRIBUTES)
+        );
+    } else {
+      // L3 cache
+      mPpttCacheType1[Index].Size = 0x2000000;       // 32MB
+      mPpttCacheType1[Index].NumberOfSets = 0x800;
+      mPpttCacheType1[Index].Associativity = 0x0F;   // CacheAssociativity16Way
+      SetMem (
+        &mPpttCacheType1[Index].Attributes,
+        sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE_ATTRIBUTES),
+        0x0A
+        );
+      mPpttCacheType1[Index].LineSize = 0x80;        // 128byte
+    }
+  }
+}
+
+STATIC
+EFI_STATUS
+AddCoreTable (
+  IN     EFI_ACPI_DESCRIPTION_HEADER *PpttTable,
+  IN OUT UINT32                      *PpttTableLengthRemain,
+  IN     UINT32                      Parent,
+  IN     UINT32                      ResourceNo,
+  IN     UINT32                      ProcessorId
+  )
+{
+  EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR *PpttType0;
+  EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE     *PpttType1;
+  UINT32                                *PrivateResource;
+  UINT8                                 Index;
+  UINT32                                NextLevelCacheOffset;
+
+  if (*PpttTableLengthRemain <
+      (sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR) + ResourceNo * 4)) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  PpttType0 = (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR *)((UINT8 *)PpttTable +
+                                                        PpttTable->Length);
+  PpttType0->Type = 0;
+  SetMem (&PpttType0->Flags, sizeof (PpttType0->Flags), 0);
+  PpttType0->Flags.AcpiProcessorIdValid = EFI_ACPI_6_2_PPTT_PROCESSOR_ID_VALID;
+  PpttType0->Parent= Parent;
+  PpttType0->AcpiProcessorId = ProcessorId;
+  PpttType0->NumberOfPrivateResources = ResourceNo;
+  PpttType0->Length = sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR) +
+                      ResourceNo * 4;
+
+  *PpttTableLengthRemain  -= (UINTN)PpttType0->Length;
+  PpttTable->Length += PpttType0->Length;
+  PrivateResource = (UINT32 *)((UINT8 *)PpttType0 +
+                               sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR));
+
+  // Add cache type structure
+  for (Index = 0; Index < ResourceNo; Index++, PrivateResource++) {
+    if (*PpttTableLengthRemain < sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE)) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+    *PrivateResource = PpttTable->Length;
+    PpttType1 = (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE *)((UINT8 *)PpttTable +
+                                                      PpttTable->Length);
+    gBS->CopyMem (
+           PpttType1,
+           &mPpttCacheType1[Index],
+           sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE)
+           );
+    *PpttTableLengthRemain -= PpttType1->Length;
+    PpttTable->Length += PpttType1->Length;
+  }
+
+  NextLevelCacheOffset = *(PrivateResource - 1);
+  PrivateResource = (UINT32 *)(PpttType0 + 1);
+  // Set the next level to L2 for L1I and L1D
+  PpttType1 = (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE *)((UINT8 *) PpttTable + *PrivateResource++);
+  PpttType1->NextLevelOfCache = NextLevelCacheOffset;
+  PpttType1 = (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE *)((UINT8 *) PpttTable + *PrivateResource++);
+  PpttType1->NextLevelOfCache = NextLevelCacheOffset;
+
+  return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+AddClusterTable (
+  IN     EFI_ACPI_DESCRIPTION_HEADER *PpttTable,
+  IN OUT UINT32                      *PpttTableLengthRemain,
+  IN     UINT32                      Parent,
+  IN     UINT32                      ResourceNo
+  )
+{
+  EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR *PpttType0;
+
+  if ((*PpttTableLengthRemain) <
+      (sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR) + ResourceNo * 4)) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  PpttType0 = (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR *)((UINT8 *)PpttTable +
+                                                        PpttTable->Length);
+  PpttType0->Type = 0;
+  SetMem (&PpttType0->Flags, sizeof (PpttType0->Flags), 0);
+  PpttType0->Parent= Parent;
+  PpttType0->NumberOfPrivateResources = ResourceNo;
+  PpttType0->Length = sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR) +
+                      ResourceNo * 4;
+
+  *PpttTableLengthRemain -= PpttType0->Length;
+  PpttTable->Length += PpttType0->Length;
+
+  return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+AddScclTable (
+  IN     EFI_ACPI_DESCRIPTION_HEADER *PpttTable,
+  IN OUT UINT32                      *PpttTableLengthRemain,
+  IN     UINT32                      Parent,
+  IN     UINT32                      ResourceNo
+  )
+{
+  EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR *PpttType0;
+  EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE     *PpttType1;
+  UINT32                                *PrivateResource;
+
+  if (*PpttTableLengthRemain <
+      (sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR) + ResourceNo * 4)) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  PpttType0 = (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR *)((UINT8 *)PpttTable +
+                                                        PpttTable->Length);
+  PpttType0->Type = 0;
+  SetMem (&PpttType0->Flags, sizeof (PpttType0->Flags), 0);
+  PpttType0->Parent= Parent;
+  PpttType0->NumberOfPrivateResources = ResourceNo;
+  PpttType0->Length = sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR) +
+                      ResourceNo * 4;
+
+  *PpttTableLengthRemain -= PpttType0->Length;
+  PpttTable->Length += PpttType0->Length;
+  PrivateResource = (UINT32 *)((UINT8 *)PpttType0 +
+                               sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR));
+
+  // Add cache type structure
+  if (*PpttTableLengthRemain < sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE)) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  *PrivateResource = PpttTable->Length;
+  PpttType1 = (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE *)((UINT8 *)PpttTable +
+                                                    PpttTable->Length);
+  gBS->CopyMem (
+         PpttType1,
+         &mPpttCacheType1[3],
+         sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_CACHE)
+         );
+  *PpttTableLengthRemain -= PpttType1->Length;
+  PpttTable->Length += PpttType1->Length;
+
+  return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+AddSocketTable (
+  IN     EFI_ACPI_DESCRIPTION_HEADER *PpttTable,
+  IN OUT UINT32                      *PpttTableLengthRemain,
+  IN     UINT32                      Parent,
+  IN     UINT32                      ResourceNo
+  )
+{
+  EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR *PpttType0;
+  EFI_ACPI_6_2_PPTT_STRUCTURE_ID        *PpttType2;
+  UINT32                                *PrivateResource;
+  UINT8                                 Index;
+
+  if (*PpttTableLengthRemain < sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR)) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  PpttType0 = (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR *)((UINT8 *)PpttTable +
+                                                        PpttTable->Length);
+  PpttType0->Type = 0;
+  SetMem (&PpttType0->Flags, sizeof (PpttType0->Flags), 0);
+  PpttType0->Flags.PhysicalPackage = EFI_ACPI_6_2_PPTT_PROCESSOR_ID_VALID;
+  PpttType0->Parent= Parent;
+  PpttType0->NumberOfPrivateResources = ResourceNo;
+  PpttType0->Length = sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR) +
+                      ResourceNo * 4;
+  PpttTable->Length += PpttType0->Length;
+
+  *PpttTableLengthRemain -= PpttType0->Length;
+  if (*PpttTableLengthRemain < ResourceNo * 4) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  PrivateResource = (UINT32 *)((UINT8 *)PpttType0 +
+                               sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_PROCESSOR));
+  DEBUG ((DEBUG_INFO,
+          "[Acpi PPTT]  sizeof(EFI_ACPI_6_2_PPTT_STRUCTURE_ID) = %x!\n",
+          sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_ID)));
+
+  for (Index = 0; Index < ResourceNo; Index++, PrivateResource++) {
+    if (*PpttTableLengthRemain < sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_ID)) {
+      return EFI_OUT_OF_RESOURCES;
+    }
+    *PrivateResource = PpttTable->Length;
+    PpttType2 = (EFI_ACPI_6_2_PPTT_STRUCTURE_ID *)((UINT8 *)PpttTable +
+                                                   PpttTable->Length);
+    gBS->CopyMem (
+           PpttType2,
+           &mPpttSocketType2[Index],
+           sizeof (EFI_ACPI_6_2_PPTT_STRUCTURE_ID)
+           );
+    *PpttTableLengthRemain -= PpttType2->Length;
+    PpttTable->Length += PpttType2->Length;
+  }
+
+  return EFI_SUCCESS;
+}
+
+STATIC
+VOID
+GetAffLvl (
+  IN     UINT64     Mpidr,
+  IN OUT UINT8      *Level3,
+  IN OUT UINT8      *Level2,
+  IN OUT UINT8      *Level1,
+  IN OUT UINT8      *Level0
+  )
+{
+  *Level3 = BitFieldRead64 (Mpidr, 32, 39);
+  *Level2 = BitFieldRead64 (Mpidr, 16, 23);
+  *Level1 = BitFieldRead64 (Mpidr, 8, 15);
+  *Level0 = BitFieldRead64 (Mpidr, 0, 7);
+}
+
+
+STATIC
+VOID
+GetApic (
+  IN     ACPI_MADT_TABLE_HEADER                 *ApicTable,
+  IN OUT EFI_ACPI_DESCRIPTION_HEADER            *PpttTable,
+  IN     UINT32                                 PpttTableLengthRemain
+)
+{
+  UINT32                Parent = 0;
+  UINT32                ResourceNo = 0;
+  ACPI_GIC_STRUCTURE    *Ptr;
+  UINT8                 AffLvl3 = 0;
+  UINT8                 AffLvl2 = 0;
+  UINT8                 AffLvl1 = 0;
+  UINT8                 AffLvl0 = 0;
+  UINTN                 SocketIndex;
+
+  for (Ptr = (ACPI_GIC_STRUCTURE *) (ApicTable + 1);
+      (UINTN) Ptr < (UINTN) ApicTable + ApicTable->Header.Length;
+      Ptr = (ACPI_GIC_STRUCTURE *) ((UINTN) Ptr + Ptr->Length)) {
+
+    // Avoid dead loop due to corrupted MADT
+    if (Ptr->Length == 0) {
+      DEBUG ((DEBUG_ERROR, "[%a:%d] - Invalid MADT sub structure at 0x%x\n",
+            __FUNCTION__, __LINE__, (UINTN) Ptr - (UINTN) ApicTable));
+      break;
+    }
+
+    if (Ptr->Type != EFI_ACPI_5_1_GIC ||
+        (Ptr->Flags & EFI_ACPI_5_1_GIC_ENABLED) == 0) {
+      continue;
+    }
+    GetAffLvl (Ptr->MPIDR, &AffLvl3, &AffLvl2, &AffLvl1, &AffLvl0);
+    // AffLvl3 is not used for Hi1620
+    // And socket index is calculated by AffLvl2
+
+    SocketIndex = AffLvl2 / MAX_SCL_PER_SOCKET;
+    if (mSocketOffset[SocketIndex] == 0) {
+      //Add socket for type0 table
+      ResourceNo = PPTT_SOCKET_COMPONENT_NO;
+      mSocketOffset[SocketIndex] = PpttTable->Length;
+      Parent = 0;
+      AddSocketTable (
+        PpttTable,
+        &PpttTableLengthRemain,
+        Parent,
+        ResourceNo
+        );
+    }
+
+    if (mScclOffset[AffLvl2] == 0) {
+      //Add SCCL for type0 table
+      ResourceNo = 1;
+      mScclOffset[AffLvl2] = PpttTable->Length ;
+      Parent = mSocketOffset[SocketIndex];
+      AddScclTable (
+        PpttTable,
+        &PpttTableLengthRemain,
+        Parent,
+        ResourceNo
+        );
+    }
+
+    if (mClusterOffset[AffLvl2][AffLvl1] == 0) {
+      // Add cluster for type0 table
+      // No private resource for cluster on Hi1620
+      ResourceNo = 0;
+      mClusterOffset[AffLvl2][AffLvl1] = PpttTable->Length ;
+      Parent = mScclOffset[AffLvl2];
+      AddClusterTable (
+        PpttTable,
+        &PpttTableLengthRemain,
+        Parent,
+        ResourceNo
+        );
+    }
+
+    //Add core for type0 table
+    ResourceNo = 3;
+    Parent = mClusterOffset[AffLvl2][AffLvl1];
+    AddCoreTable (
+      PpttTable,
+      &PpttTableLengthRemain,
+      Parent,
+      ResourceNo,
+      Ptr->AcpiProcessorUid
+      );
+  }
+}
+
+
+STATIC
+VOID
+PpttSetAcpiTable(
+  IN EFI_EVENT    Event,
+  IN VOID         *Context
+  )
+{
+  UINTN                                         AcpiTableHandle;
+  EFI_STATUS                                    Status;
+  UINT8                                         Checksum;
+  EFI_ACPI_SDT_HEADER                           *Table;
+  ACPI_MADT_TABLE_HEADER                        *ApicTable;
+  EFI_ACPI_TABLE_VERSION                        TableVersion;
+  EFI_ACPI_DESCRIPTION_HEADER                   *PpttTable;
+  UINTN                                         TableKey;
+  UINT32                                        Index0;
+  UINT32                                        PpttTableLengthRemain = 0;
+
+  gBS->CloseEvent (Event);
+
+  InitCacheInfo ();
+
+  PpttTable = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (PPTT_TABLE_MAX_LEN);
+  gBS->CopyMem (
+         (VOID *)PpttTable,
+         &mPpttHeader,
+         sizeof (EFI_ACPI_DESCRIPTION_HEADER)
+         );
+  PpttTableLengthRemain = PPTT_TABLE_MAX_LEN - sizeof (EFI_ACPI_DESCRIPTION_HEADER);
+
+  for (Index0 = 0; Index0 < EFI_ACPI_MAX_NUM_TABLES; Index0++) {
+    Status = mAcpiSdtProtocol->GetAcpiTable (
+                                 Index0,
+                                 &Table,
+                                 &TableVersion,
+                                 &TableKey
+                                 );
+    if (EFI_ERROR (Status)) {
+      break;
+    }
+
+    // Find APIC table
+    if (Table->Signature == EFI_ACPI_6_1_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE) {
+      break;
+    }
+
+  }
+
+  if (!EFI_ERROR (Status) && (Index0 != EFI_ACPI_MAX_NUM_TABLES)) {
+    ApicTable = (ACPI_MADT_TABLE_HEADER *)Table;
+
+    GetApic (ApicTable, PpttTable, PpttTableLengthRemain);
+
+    Checksum = CalculateCheckSum8 ((UINT8 *)(PpttTable), PpttTable->Length);
+    PpttTable->Checksum = Checksum;
+
+    AcpiTableHandle = 0;
+    Status = mAcpiTableProtocol->InstallAcpiTable (
+                                   mAcpiTableProtocol,
+                                   PpttTable,
+                                   PpttTable->Length,
+                                   &AcpiTableHandle);
+  }
+
+  FreePool (PpttTable);
+  return ;
+}
+
+EFI_STATUS
+EFIAPI
+PpttEntryPoint(
+  IN EFI_HANDLE         ImageHandle,
+  IN EFI_SYSTEM_TABLE   *SystemTable
+  )
+{
+  EFI_STATUS              Status;
+  EFI_EVENT               ReadyToBootEvent;
+
+  Status = gBS->LocateProtocol (
+                  &gEfiAcpiTableProtocolGuid,
+                  NULL,
+                  (VOID **)&mAcpiTableProtocol);
+  ASSERT_EFI_ERROR (Status);
+
+  Status = gBS->LocateProtocol (
+                  &gEfiAcpiSdtProtocolGuid,
+                  NULL,
+                  (VOID **)&mAcpiSdtProtocol);
+  ASSERT_EFI_ERROR (Status);
+
+  Status = EfiCreateEventReadyToBootEx (
+             TPL_NOTIFY,
+             PpttSetAcpiTable,
+             NULL,
+             &ReadyToBootEvent
+             );
+  ASSERT_EFI_ERROR (Status);
+
+  DEBUG ((DEBUG_INFO, "Acpi Pptt init done.\n"));
+
+  return Status;
+}
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 28/43] Platform/Hisilicon/D06: Enable ACPI PPTT
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (26 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 27/43] Hisilicon/Hi1620: Add ACPI PPTT table Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 14:40   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 29/43] Platform/Hisilicon/D06: Add OemNicLib Ming Huang
                   ` (15 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Heyi Guo

From: Heyi Guo <heyi.guo@linaro.org>

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Heyi Guo <heyi.guo@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc | 1 +
 Platform/Hisilicon/D06/D06.fdf | 2 ++
 2 files changed, 3 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index bec422670d..06249d8a5b 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -338,6 +338,7 @@
   Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
   Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
 
+  Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
   #
   # Usb Support
   #
diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
index 06203dc079..5bb779d2e4 100644
--- a/Platform/Hisilicon/D06/D06.fdf
+++ b/Platform/Hisilicon/D06/D06.fdf
@@ -252,6 +252,8 @@ READ_LOCK_STATUS   = TRUE
   INF RuleOverride=ACPITABLE Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
   INF Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
 
+  INF Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
+
   #
   #Network
   #
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 29/43] Platform/Hisilicon/D06: Add OemNicLib
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (27 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 28/43] Platform/Hisilicon/D06: Enable ACPI PPTT Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 30/43] Platform/Hisilicon/D06: Add OemNicConfig2P Driver Ming Huang
                   ` (14 subsequent siblings)
  43 siblings, 0 replies; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

OemNicLib provide nic related api like GetMac,SetMac.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                         |   1 +
 Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.inf |  35 ++
 Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.c   | 570 ++++++++++++++++++++
 3 files changed, 606 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 06249d8a5b..e18badf3b3 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -90,6 +90,7 @@
 
   LpcLib|Silicon/Hisilicon/Hi1620/Library/LpcLibHi1620/LpcLib.inf
   SerialPortLib|ArmPlatformPkg/Library/PL011SerialPortLib/PL011SerialPortLib.inf
+  OemNicLib|Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.inf
 !if $(SECURE_BOOT_ENABLE) == TRUE
   FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
 !endif
diff --git a/Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.inf b/Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.inf
new file mode 100644
index 0000000000..3b0bd2d60c
--- /dev/null
+++ b/Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.inf
@@ -0,0 +1,35 @@
+#/** @file
+#
+#    Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+#    Copyright (c) 2017, Linaro Limited. All rights reserved.
+#
+#    This program and the accompanying materials
+#    are licensed and made available under the terms and conditions of the BSD License
+#    which accompanies this distribution. The full text of the license may be found at
+#    http://opensource.org/licenses/bsd-license.php
+#
+#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = OemNicLib
+  FILE_GUID                      = 520F872C-FFCF-4EF3-AC01-85BDB0816DCE
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = OemNicLib
+
+[Sources.common]
+  OemNicLib.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[LibraryClasses]
+  CpldIoLib
+  I2CLib
diff --git a/Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.c b/Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.c
new file mode 100644
index 0000000000..caf931cdbb
--- /dev/null
+++ b/Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.c
@@ -0,0 +1,570 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2017, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Uefi.h>
+#include <Library/CpldIoLib.h>
+#include <Library/DebugLib.h>
+#include <Library/I2CLib.h>
+#include <Library/IoLib.h>
+#include <Library/OemNicLib.h>
+
+#define CPU2_SFP2_100G_CARD_OFFSET   0x25
+#define CPU1_SFP1_LOCATE_OFFSET      0x16
+#define CPU1_SFP0_LOCATE_OFFSET      0x12
+#define CPU2_SFP1_LOCATE_OFFSET      0x21
+#define CPU2_SFP0_LOCATE_OFFSET      0x19
+#define CPU2_SFP2_10G_GE_CARD_OFFSET 0x25
+
+#define SFP_10G_SPEED   10
+#define SFP_25G_SPEED   25
+#define SFP_100G_SPEED  100
+#define SFP_GE_SPEED    1
+
+#define SFP_GE_SPEED_VAL_VENDOR_FINISAR 0x0C
+#define SFP_GE_SPEED_VAL                0x0D
+#define SFP_10G_SPEED_VAL               0x67
+#define SFP_25G_SPEED_VAL               0xFF
+
+#define CARD_PRESENT_100G               (BIT7)
+#define CARD_PRESENT_10G                (BIT0)
+#define SELECT_SFP_BY_INDEX(index)      (1 << (index - 1))
+#define SPF_SPEED_OFFSET                12
+
+#define SFP_DEVICE_ADDRESS 0x50
+#define CPU1_9545_I2C_ADDR 0x70
+#define CPU2_9545_I2C_ADDR 0x71
+
+#define FIBER_PRESENT     0
+#define CARD_PRESENT      1
+#define I2C_PORT_SFP      4
+#define CPU2_I2C_PORT_SFP 5
+
+#define SOCKET_0                 0
+#define SOCKET_1                 1
+#define EEPROM_I2C_PORT          4
+#define EEPROM_PAGE_SIZE         0x40
+#define MAC_ADDR_LEN             6
+#define I2C_OFFSET_EEPROM_ETH0   (0xc00)
+#define I2C_SLAVEADDR_EEPROM     (0x52)
+
+#pragma pack(1)
+typedef struct {
+  UINT16 Crc16;
+  UINT16 MacLen;
+  UINT8  Mac[MAC_ADDR_LEN];
+} NIC_MAC_ADDRESS;
+#pragma pack()
+
+ETH_PRODUCT_DESC gEthPdtDesc[ETH_MAX_PORT] =
+{
+    {TRUE,   ETH_SPEED_10KM,  ETH_FULL_DUPLEX, ETH_INVALID, ETH_INVALID},
+    {TRUE,   ETH_SPEED_10KM,  ETH_FULL_DUPLEX, ETH_INVALID, ETH_INVALID},
+    {FALSE,  ETH_INVALID,     ETH_INVALID,     ETH_INVALID, ETH_INVALID},
+    {FALSE,  ETH_INVALID,     ETH_INVALID,     ETH_INVALID, ETH_INVALID},
+    {TRUE,   ETH_SPEED_1000M, ETH_FULL_DUPLEX, ETH_PHY_MVL88E1512_ID, 0},
+    {TRUE,   ETH_SPEED_1000M, ETH_FULL_DUPLEX, ETH_PHY_MVL88E1512_ID, 1},
+    {FALSE,  ETH_INVALID,     ETH_INVALID,     ETH_INVALID, ETH_INVALID},
+    {FALSE,  ETH_INVALID,     ETH_INVALID,     ETH_INVALID, ETH_INVALID}
+};
+
+UINT16 CrcTable16[256] = {
+  0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
+  0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
+  0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
+  0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
+  0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
+  0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
+  0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
+  0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
+  0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
+  0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
+  0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
+  0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
+  0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
+  0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
+  0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
+  0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
+  0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
+  0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
+  0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
+  0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
+  0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
+  0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
+  0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
+  0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
+  0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
+  0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
+  0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
+  0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
+  0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
+  0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
+  0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
+  0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0,
+};
+
+EFI_STATUS
+GetSfpSpeed (
+  UINT16 Socket,
+  UINT16 SfpNum,
+  UINT8* FiberSpeed
+  )
+{
+  EFI_STATUS  Status;
+  I2C_DEVICE  SpdDev;
+  UINT8       SpdReg;
+  UINT8       SfpSpeed;
+  UINT32      RegAddr;
+  UINT16      I2cAddr;
+  UINT32      SfpPort;
+
+  SfpSpeed = 0x0;
+  if (Socket == SOCKET_1) {
+    I2cAddr =  CPU2_9545_I2C_ADDR;
+    SfpPort = CPU2_I2C_PORT_SFP;
+  } else {
+    I2cAddr =  CPU1_9545_I2C_ADDR;
+    SfpPort = I2C_PORT_SFP;
+  }
+
+  Status = I2CInit (Socket, SfpPort, Normal);
+  if (EFI_ERROR (Status))
+  {
+      DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Socket%d Call I2CInit failed! p1=0x%x.\n",
+             __FUNCTION__, __LINE__, Socket, Status));
+      return Status;
+  }
+
+  SpdDev.Socket = Socket;
+  SpdDev.DeviceType         =  DEVICE_TYPE_SPD;
+  SpdDev.Port               =  SfpPort;
+  SpdDev.SlaveDeviceAddress =  I2cAddr;
+  RegAddr                   =  0x0;
+  SpdReg                    =  1 << (SfpNum - 1);
+
+  Status = I2CWrite (&SpdDev, RegAddr, 1, &SpdReg);
+  if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "I2CWrite Error =%r.\n", Status));
+      return Status;
+  }
+
+  SpdDev.Socket = Socket;
+  SpdDev.DeviceType         =  DEVICE_TYPE_SPD;
+  SpdDev.Port               =  SfpPort;
+  SpdDev.SlaveDeviceAddress =  SFP_DEVICE_ADDRESS;
+
+  RegAddr                   =  SPF_SPEED_OFFSET;
+  Status = I2CRead (&SpdDev, RegAddr, 1, &SfpSpeed);
+  if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "I2CRead Error =%r.\n", Status));
+      return Status;
+  }
+
+  DEBUG ((DEBUG_INFO, "BR, Nominal, Nominal signalling rate, SfpSpeed:    0x%x\n",
+         SfpSpeed));
+
+  if (SfpSpeed == SFP_10G_SPEED_VAL) {
+    *FiberSpeed = SFP_10G_SPEED;
+  } else if (SfpSpeed == SFP_25G_SPEED_VAL) {
+    *FiberSpeed = SFP_25G_SPEED;
+  } else if ((SfpSpeed == SFP_GE_SPEED_VAL) ||
+             (SfpSpeed == SFP_GE_SPEED_VAL_VENDOR_FINISAR)) {
+    *FiberSpeed = SFP_GE_SPEED;
+  }
+
+  return EFI_SUCCESS;
+}
+
+//Fiber1Type/Fiber2Type/Fiber3Type return: SFP_10G_SPEED, SFP_100G_SPEED, SFP_GE_SPEED
+UINT32
+GetCpu2FiberType (
+  UINT8* Fiber1Type,
+  UINT8* Fiber2Type,
+  UINT8* Fiber100Ge
+  )
+{
+  EFI_STATUS  Status;
+  UINT16      SfpNum1;
+  UINT8       SfpSpeed1;
+  UINT16      SfpNum2;
+  UINT8       SfpSpeed2;
+
+  SfpNum1 = 0x1;
+  SfpSpeed1 = SFP_10G_SPEED;
+  SfpNum2 = 0x2;
+  SfpSpeed2 = SFP_10G_SPEED;
+  *Fiber100Ge = 0x0;
+  *Fiber1Type = SFP_10G_SPEED;
+  *Fiber2Type = SFP_10G_SPEED;
+
+  if ((ReadCpldReg (CPU2_SFP2_100G_CARD_OFFSET) & CARD_PRESENT_100G) != 0) {
+    // 100 Ge card
+    *Fiber1Type = SFP_10G_SPEED;
+    *Fiber2Type = SFP_10G_SPEED;
+    *Fiber100Ge = SFP_100G_SPEED;
+    DEBUG ((DEBUG_ERROR,"Detect Fiber SFP_100G is Present, Set 100Ge\n"));
+  } else if ((ReadCpldReg (CPU2_SFP2_10G_GE_CARD_OFFSET) & CARD_PRESENT_10G) != 0) {
+    *Fiber100Ge = 0x0;
+    *Fiber1Type = SFP_10G_SPEED;
+    *Fiber2Type = SFP_10G_SPEED;
+    if (ReadCpldReg (CPU2_SFP0_LOCATE_OFFSET) == FIBER_PRESENT) {
+      // Fiber detected in CPU2 slot0, read speed via i2c
+      Status = GetSfpSpeed (SOCKET_1, SfpNum1, &SfpSpeed1);
+      if (EFI_ERROR (Status)) {
+        DEBUG((DEBUG_ERROR,
+               "Get Socket1 Sfp%d Speed Error: %r.\n",
+               SfpNum1,
+               Status));
+        return Status;
+      }
+      if (SfpSpeed1 == SFP_25G_SPEED) {
+        // P1 don't support 25G, so set speed to 10G
+        *Fiber1Type = SFP_10G_SPEED;
+      } else {
+        *Fiber1Type = SfpSpeed1;
+      }
+    } else {
+      // No fiber, set speed to 10G
+      *Fiber1Type = SFP_10G_SPEED;
+    }
+
+    if (ReadCpldReg (CPU2_SFP1_LOCATE_OFFSET) == FIBER_PRESENT) {
+      // Fiber detected in CPU2 slot1, read speed via i2c
+      Status = GetSfpSpeed (SOCKET_1, SfpNum2, &SfpSpeed2);
+      if (EFI_ERROR (Status)) {
+        DEBUG ((DEBUG_ERROR, "Get Sfp%d Speed Error: %r.\n", SfpNum2, Status));
+        return Status;
+      }
+      if (SfpSpeed2 == SFP_25G_SPEED) {
+        *Fiber2Type = SFP_10G_SPEED;
+      } else {
+        *Fiber2Type = SfpSpeed2;
+      }
+    } else {
+      // No fiber, set speed to 10G
+      *Fiber2Type = SFP_10G_SPEED;
+    }
+  } else {
+    // 100Ge/10Ge/Ge Fiber is not found.
+    *Fiber1Type = SFP_10G_SPEED;
+    *Fiber2Type = SFP_10G_SPEED;
+    *Fiber100Ge = 0x0;
+  }
+
+  return EFI_SUCCESS;
+}
+
+//Fiber1Type/Fiber2Type return: SFP_10G_SPEED, SFP_25G_SPEED, SFP_GE_SPEED
+UINT32
+GetCpu1FiberType (
+  UINT8* Fiber1Type,
+  UINT8* Fiber2Type
+  )
+{
+  EFI_STATUS  Status;
+  UINT16      SfpNum1;
+  UINT8       SfpSpeed1;
+  UINT16      SfpNum2;
+  UINT8       SfpSpeed2;
+
+  SfpNum1 = 0x1;
+  SfpSpeed1 = SFP_10G_SPEED;
+  SfpNum2 = 0x2;
+  SfpSpeed2 = SFP_10G_SPEED;
+  *Fiber1Type = SFP_10G_SPEED;
+  *Fiber2Type = SFP_10G_SPEED;
+  // Fiber detected in CPU1 slot0, read speed via i2c
+  if (ReadCpldReg (CPU1_SFP0_LOCATE_OFFSET) == FIBER_PRESENT) {
+    Status = GetSfpSpeed (SOCKET_0, SfpNum1, &SfpSpeed1);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_ERROR, "Get Socket0 Sfp%d Speed Error: %r.\n",
+              SfpNum1, Status));
+      return Status;
+    }
+    *Fiber1Type = SfpSpeed1;
+  } else {
+    *Fiber1Type = SFP_10G_SPEED;
+  }
+
+  // Fiber detected in CPU1 slot1, read speed via i2c
+  if (ReadCpldReg (CPU1_SFP1_LOCATE_OFFSET) == FIBER_PRESENT) {
+    Status = GetSfpSpeed (SOCKET_0, SfpNum2, &SfpSpeed2);
+    if (EFI_ERROR (Status)) {
+      *Fiber2Type = SFP_10G_SPEED;
+      DEBUG ((DEBUG_ERROR, "Get Sfp%d Speed Error: %r.\n", SfpNum2, Status));
+      return Status;
+    }
+    *Fiber2Type = SfpSpeed2;
+  } else {
+    *Fiber2Type = SFP_10G_SPEED;
+  }
+
+  return EFI_SUCCESS;
+}
+
+UINT16 MakeCrcCheckSum (
+  UINT8 *Buffer,
+  UINT32 Length
+  )
+{
+  UINT16 StartCRC = 0;
+
+  if (Length > SIZE_512KB) {
+    return 0;
+  }
+
+  if (Buffer == NULL) {
+    return 0;
+  }
+
+  while (Length) {
+    StartCRC = CrcTable16 [((UINT8) ((StartCRC >> 8) & 0xff)) ^ *(Buffer++)] ^
+               ((UINT16) (StartCRC << 8));
+    Length--;
+  }
+
+  return StartCRC;
+}
+
+
+EFI_STATUS
+OemGetMacE2prom(
+  IN  UINT32 Port,
+  OUT UINT8  *Addr
+  )
+{
+  I2C_DEVICE       I2cDev = {0};
+  EFI_STATUS       Status;
+  UINT16           I2cOffset;
+  UINT16           Crc16;
+  NIC_MAC_ADDRESS  MacDesc = {0};
+  UINT16           RemainderMacOffset;
+  UINT16           LessSizeOfPage;
+  UINT32           I = 0;
+
+  Status = I2CInit (0, EEPROM_I2C_PORT, Normal);
+  if (EFI_ERROR (Status))
+  {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Call I2CInit failed! p1=0x%x.\n",
+            __FUNCTION__, __LINE__, Status));
+    return Status;
+  }
+
+  I2cOffset = I2C_OFFSET_EEPROM_ETH0 + (Port * sizeof (NIC_MAC_ADDRESS));
+
+  I2cDev.DeviceType = DEVICE_TYPE_E2PROM;
+  I2cDev.Port = EEPROM_I2C_PORT;
+  I2cDev.SlaveDeviceAddress = I2C_SLAVEADDR_EEPROM;
+  I2cDev.Socket = 0;
+  RemainderMacOffset = I2cOffset % EEPROM_PAGE_SIZE;
+  LessSizeOfPage = EEPROM_PAGE_SIZE - RemainderMacOffset;
+  //The length of NIC_MAC_ADDRESS is 10 bytes long,
+  //It surly less than EEPROM page size, so we could
+  //code as below, check the address whether across the page boundary,
+  //and split the data when across page boundary.
+  if (sizeof (NIC_MAC_ADDRESS) <= LessSizeOfPage) {
+    Status = I2CRead (&I2cDev, I2cOffset, sizeof (NIC_MAC_ADDRESS), (UINT8 *) &MacDesc);
+  } else {
+    Status = I2CRead (&I2cDev, I2cOffset, LessSizeOfPage, (UINT8 *) &MacDesc);
+    if (!EFI_ERROR (Status)) {
+      Status |= I2CRead (
+                  &I2cDev,
+                  I2cOffset + LessSizeOfPage,
+                  sizeof (NIC_MAC_ADDRESS) - LessSizeOfPage,
+                  (UINT8 *) &MacDesc + LessSizeOfPage
+                );
+    }
+  }
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Call I2cRead failed! p1=0x%x.\n",
+            __FUNCTION__, __LINE__, Status));
+    return Status;
+  }
+
+  Crc16 = MakeCrcCheckSum (
+            (UINT8 *) & (MacDesc.MacLen),
+            sizeof (MacDesc.MacLen) + sizeof (MacDesc.Mac)
+          );
+  if ((Crc16 != MacDesc.Crc16) || (Crc16 == 0)) {
+    return EFI_NOT_FOUND;
+  }
+
+  for (I = 0; I < MAC_ADDR_LEN; I++) {
+    Addr[I] = MacDesc.Mac[I];
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+OemSetMacE2prom (
+  IN UINT32 Port,
+  IN UINT8 *Addr
+  )
+{
+  I2C_DEVICE       I2cDev = {0};
+  EFI_STATUS       Status;
+  UINT16           I2cOffset;
+  NIC_MAC_ADDRESS  MacDesc = {0};
+  UINT32           I;
+  UINT16           RemainderMacOffset;
+  UINT16           LessSizeOfPage;
+
+  I = 0;
+  MacDesc.MacLen = MAC_ADDR_LEN;
+
+  for (I = 0; I < MAC_ADDR_LEN; I++) {
+    MacDesc.Mac[I] = Addr[I];
+  }
+
+  MacDesc.Crc16 = MakeCrcCheckSum (
+                      (UINT8 *) & (MacDesc.MacLen),
+                      sizeof (MacDesc.MacLen) + MAC_ADDR_LEN
+                    );
+
+  Status = I2CInit (0, EEPROM_I2C_PORT, Normal);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Call I2CInit failed! p1=0x%x.\n",
+           __FUNCTION__, __LINE__, Status));
+    return Status;
+  }
+
+  I2cOffset = I2C_OFFSET_EEPROM_ETH0 + (Port * sizeof (NIC_MAC_ADDRESS));
+
+  I2cDev.DeviceType = DEVICE_TYPE_E2PROM;
+  I2cDev.Port = EEPROM_I2C_PORT;
+  I2cDev.SlaveDeviceAddress = I2C_SLAVEADDR_EEPROM;
+  I2cDev.Socket = 0;
+  RemainderMacOffset = I2cOffset % EEPROM_PAGE_SIZE;
+  LessSizeOfPage = EEPROM_PAGE_SIZE - RemainderMacOffset;
+  //The length of NIC_MAC_ADDRESS is 10 bytes long,
+  //It surly less than EEPROM page size, so we could
+  //code as below, check the address whether across the page boundary,
+  //and split the data when across page boundary.
+  if (sizeof (NIC_MAC_ADDRESS) <= LessSizeOfPage) {
+    Status = I2CWrite (
+               &I2cDev,
+               I2cOffset,
+               sizeof (NIC_MAC_ADDRESS),
+               (UINT8 *) &MacDesc
+             );
+  } else {
+    Status = I2CWrite (&I2cDev, I2cOffset, LessSizeOfPage, (UINT8 *) &MacDesc);
+    if (!EFI_ERROR (Status)) {
+      Status |= I2CWrite (
+                  &I2cDev,
+                  I2cOffset + LessSizeOfPage,
+                  sizeof (NIC_MAC_ADDRESS) - LessSizeOfPage,
+                  (UINT8 *) &MacDesc + LessSizeOfPage
+                );
+    }
+  }
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Call I2cWrite failed! p1=0x%x.\n",
+            __FUNCTION__, __LINE__, Status));
+    return Status;
+  }
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+OemGetMac (
+  IN OUT EFI_MAC_ADDRESS *Mac,
+  IN     UINTN           Port
+  )
+{
+  EFI_STATUS Status;
+
+  if (Mac == NULL) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Mac buffer is null!\n",
+            __FUNCTION__, __LINE__));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = OemGetMacE2prom (Port, Mac->Addr);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR,
+      "[%a]:[%dL] Cannot get MAC from EEPROM, Status: %r; using default MAC.\n",
+      __FUNCTION__, __LINE__, Status));
+
+    Mac->Addr[0] = 0x00;
+    Mac->Addr[1] = 0x18;
+    Mac->Addr[2] = 0x82;
+    Mac->Addr[3] = 0x2F;
+    Mac->Addr[4] = 0x02;
+    Mac->Addr[5] = Port;
+    return EFI_SUCCESS;
+  }
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+OemSetMac (
+  IN EFI_MAC_ADDRESS *Mac,
+  IN UINTN           Port
+  )
+{
+  EFI_STATUS Status;
+
+  if (Mac == NULL) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Mac buffer is null!\n",
+            __FUNCTION__, __LINE__));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = OemSetMacE2prom (Port, Mac->Addr);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Set mac failed!\n", __FUNCTION__, __LINE__));
+    return Status;
+  }
+
+  return EFI_SUCCESS;
+}
+
+UINT32
+OemEthFindFirstSP (
+  VOID
+  )
+{
+  UINT32 I;
+
+  for (I = 0; I < ETH_MAX_PORT; I++) {
+    if (gEthPdtDesc[I].Valid == TRUE) {
+      return I;
+    }
+  }
+
+  return ETH_INVALID;
+}
+
+ETH_PRODUCT_DESC *
+OemEthInit (
+  UINT32 port
+  )
+{
+  return (ETH_PRODUCT_DESC *)(&(gEthPdtDesc[port]));
+}
+
+
+BOOLEAN
+OemIsInitEth (
+  UINT32 Port
+  )
+{
+  return TRUE;
+}
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 30/43] Platform/Hisilicon/D06: Add OemNicConfig2P Driver
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (28 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 29/43] Platform/Hisilicon/D06: Add OemNicLib Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 14:57   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 31/43] Hisilicon/D0x: Update SMBIOS type9 info Ming Huang
                   ` (13 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

This Driver provide Get/Set Mac function.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                         |  2 +-
 Platform/Hisilicon/D06/D06.fdf                                         |  2 +-
 Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf | 43 ++++++++++++
 Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h     | 25 +++++++
 Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c   | 71 ++++++++++++++++++++
 5 files changed, 141 insertions(+), 2 deletions(-)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index e18badf3b3..5571028f42 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -285,7 +285,7 @@
   #
   ArmPkg/Drivers/CpuDxe/CpuDxe.inf
   MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
-
+  Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
 
 !if $(SECURE_BOOT_ENABLE) == TRUE
   MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf {
diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
index 5bb779d2e4..184d5d4dcf 100644
--- a/Platform/Hisilicon/D06/D06.fdf
+++ b/Platform/Hisilicon/D06/D06.fdf
@@ -174,7 +174,7 @@ READ_LOCK_STATUS   = TRUE
   INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
   INF Platform/Hisilicon/D06/Drivers/SFC/SfcDxeDriver.inf
 
-
+  INF Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
   INF Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf
   INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
   INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
diff --git a/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
new file mode 100644
index 0000000000..a91f2b6005
--- /dev/null
+++ b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
@@ -0,0 +1,43 @@
+#/** @file
+#
+#    Copyright (c) 2016-2018, Hisilicon Limited. All rights reserved.
+#    Copyright (c) 2016-2018, Linaro Limited. All rights reserved.
+#
+#    This program and the accompanying materials
+#    are licensed and made available under the terms and conditions of the BSD License
+#    which accompanies this distribution. The full text of the license may be found at
+#    http://opensource.org/licenses/bsd-license.php
+#
+#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#**/
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = OemNicConfigPangea
+  FILE_GUID                      = edc95319-ebe9-4c38-96af-1d203fb85231
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = OemNicConfigEntry
+
+[Sources.common]
+  OemNicConfig2P.c
+
+[Packages]
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[Protocols]
+  gHisiBoardNicProtocolGuid       ##Produce
+
+[LibraryClasses]
+  DebugLib
+  IoLib
+  OemNicLib
+  UefiBootServicesTableLib
+  UefiDriverEntryPoint
+
+[Depex]
+  TRUE
diff --git a/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h
new file mode 100644
index 0000000000..35228fdf1d
--- /dev/null
+++ b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h
@@ -0,0 +1,25 @@
+/** @file
+*
+*  Copyright (c) 2016-2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2016-2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef __OEM_NIC_CONFIG_H__
+#define __OEM_NIC_CONFIG_H__
+
+#include <Uefi.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/OemNicLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Protocol/HisiBoardNicProtocol.h>
+#endif
diff --git a/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c
new file mode 100644
index 0000000000..c01c49150a
--- /dev/null
+++ b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c
@@ -0,0 +1,71 @@
+/** @file
+*
+*  Copyright (c) 2016-2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2016-2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <OemNicConfig.h>
+
+
+EFI_STATUS
+EFIAPI OemGetMac2P (
+  IN OUT EFI_MAC_ADDRESS *Mac,
+  IN     UINTN           Port
+  )
+{
+  OemGetMac (Mac, Port);
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI OemSetMac2P (
+  IN EFI_MAC_ADDRESS *Mac,
+  IN UINTN           Port
+  )
+{
+  OemSetMac (Mac, Port);
+
+  return EFI_SUCCESS;
+}
+
+HISI_BOARD_NIC_PROTOCOL mHisiBoardNicProtocol2P = {
+  .GetMac = OemGetMac2P,
+  .SetMac = OemSetMac2P,
+};
+
+
+EFI_STATUS
+EFIAPI
+OemNicConfigEntry (
+  IN EFI_HANDLE           ImageHandle,
+  IN EFI_SYSTEM_TABLE     *SystemTable
+  )
+{
+  EFI_STATUS Status;
+
+  Status = gBS->InstallProtocolInterface (
+                  &ImageHandle,
+                  &gHisiBoardNicProtocolGuid,
+                  EFI_NATIVE_INTERFACE,
+                  &mHisiBoardNicProtocol2P
+                  );
+
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Install Protocol failed %r\n",
+        __FUNCTION__, __LINE__, Status));
+    return Status;
+  }
+
+  return EFI_SUCCESS;
+}
+
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 31/43] Hisilicon/D0x: Update SMBIOS type9 info
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (29 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 30/43] Platform/Hisilicon/D06: Add OemNicConfig2P Driver Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 15:01   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 32/43] Platform/Hisilicon/D06: Add EarlyConfigPeim peim Ming Huang
                   ` (12 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Sun Yuanchen

From: Sun Yuanchen <sunyuanchen@huawei.com>

Move board level code to OemMiscLibD0x for unifying D0x.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Sun Yuanchen <sunyuanchen@huawei.com>
---
 Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf |  1 +
 Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf     |  1 +
 Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf     |  4 +
 Platform/Hisilicon/D06/Include/Library/CpldD06.h                   |  2 +
 Silicon/Hisilicon/Include/Library/OemMiscLib.h                     |  1 +
 Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c   | 24 ++++++
 Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.c       | 27 +++++-
 Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c       | 90 ++++++++++++++++++++
 Silicon/Hisilicon/Drivers/Smbios/AddSmbiosType9/AddSmbiosType9.c   | 14 +--
 9 files changed, 151 insertions(+), 13 deletions(-)

diff --git a/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf b/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf
index 310bbaea84..0fa7fdf80f 100644
--- a/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf
+++ b/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf
@@ -34,6 +34,7 @@
   Silicon/Hisilicon/HisiPkg.dec
 
 [LibraryClasses]
+  BaseMemoryLib
   PcdLib
   TimerLib
 
diff --git a/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf b/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf
index bf44ff7440..022c3e940a 100644
--- a/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf
+++ b/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf
@@ -33,6 +33,7 @@
   Silicon/Hisilicon/HisiPkg.dec
 
 [LibraryClasses]
+  BaseMemoryLib
   PcdLib
   TimerLib
 
diff --git a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
index 8f68f7cec5..bd984a6fe3 100644
--- a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
+++ b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
@@ -30,9 +30,13 @@
   ArmPkg/ArmPkg.dec
   MdeModulePkg/MdeModulePkg.dec
   MdePkg/MdePkg.dec
+  Platform/Hisilicon/D06/D06.dec
   Silicon/Hisilicon/HisiPkg.dec
 
 [LibraryClasses]
+  BaseMemoryLib
+  CpldIoLib
+  IoLib
   PcdLib
   SerdesLib
   TimerLib
diff --git a/Platform/Hisilicon/D06/Include/Library/CpldD06.h b/Platform/Hisilicon/D06/Include/Library/CpldD06.h
index be3548c8d1..ec9b49f4e7 100644
--- a/Platform/Hisilicon/D06/Include/Library/CpldD06.h
+++ b/Platform/Hisilicon/D06/Include/Library/CpldD06.h
@@ -29,6 +29,8 @@
 #define CPLD_LOGIC_COMPILE_DAY           (0x3)
 
 #define CPLD_RISER_PRSNT_FLAG             0x40
+#define CPU1_RISER_PRESENT                BIT6
+#define CPU0_RISER_PRESENT                BIT7
 #define CPLD_RISER2_BOARD_ID              0x44
 
 #define CPLD_X8_X8_X8_BOARD_ID            0x92
diff --git a/Silicon/Hisilicon/Include/Library/OemMiscLib.h b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
index efecb9aa77..86ea6a1b3d 100644
--- a/Silicon/Hisilicon/Include/Library/OemMiscLib.h
+++ b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
@@ -34,6 +34,7 @@ typedef struct _REPORT_PCIEDIDVID2BMC{
     UINTN   Slot;
 }REPORT_PCIEDIDVID2BMC;
 extern REPORT_PCIEDIDVID2BMC PcieDeviceToReport[PCIEDEVICE_REPORT_MAX];
+extern VOID GetPciDidVid (REPORT_PCIEDIDVID2BMC *Report);
 
 BOOLEAN OemIsSocketPresent (UINTN Socket);
 VOID CoreSelectBoot(VOID);
diff --git a/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c b/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c
index fa1039bda1..c80500276f 100644
--- a/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c
+++ b/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c
@@ -15,6 +15,7 @@
 
 #include <Uefi.h>
 
+#include <Library/BaseMemoryLib.h>
 #include <Library/DebugLib.h>
 #include <Library/IoLib.h>
 #include <Library/TimerLib.h>
@@ -31,6 +32,29 @@ REPORT_PCIEDIDVID2BMC  PcieDeviceToReport[PCIEDEVICE_REPORT_MAX] = {
       {0xFFFF,0xFFFF,0xFFFF,0xFFFF}
 };
 
+REPORT_PCIEDIDVID2BMC PcieDeviceToReport_2P[PCIEDEVICE_REPORT_MAX] = {
+  {0x79,0,0,0},
+  {0xFF,0xFF,0xFF,1},
+  {0xC1,0,0,2},
+  {0xF9,0,0,3},
+  {0xFF,0xFF,0xFF,4},
+  {0x11,0,0,5},
+  {0x31,0,0,6},
+  {0x21,0,0,7}
+};
+
+VOID
+GetPciDidVid (
+  REPORT_PCIEDIDVID2BMC *Report
+  )
+{
+  if (OemIsMpBoot ()) {
+    (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport_2P, sizeof (PcieDeviceToReport_2P));
+  } else {
+    (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport, sizeof (PcieDeviceToReport));
+  }
+}
+
 // Right now we only support 1P
 BOOLEAN OemIsSocketPresent (UINTN Socket)
 {
diff --git a/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.c b/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.c
index b17eeada16..4c4c944dbe 100644
--- a/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.c
+++ b/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.c
@@ -1,7 +1,7 @@
 /** @file
 *
-*  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
-*  Copyright (c) 2016, Linaro Limited. All rights reserved.
+*  Copyright (c) 2016 - 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2016 - 2018, Linaro Limited. All rights reserved.
 *
 *  This program and the accompanying materials
 *  are licensed and made available under the terms and conditions of the BSD License
@@ -16,6 +16,7 @@
 #include <PlatformArch.h>
 #include <Uefi.h>
 
+#include <Library/BaseMemoryLib.h>
 #include <Library/DebugLib.h>
 #include <Library/IoLib.h>
 #include <Library/LpcLib.h>
@@ -37,6 +38,28 @@ REPORT_PCIEDIDVID2BMC  PcieDeviceToReport[PCIEDEVICE_REPORT_MAX] = {
   {0xFFFF,0xFFFF,0xFFFF,0xFFFF}
 };
 
+REPORT_PCIEDIDVID2BMC PcieDeviceToReport_2P[PCIEDEVICE_REPORT_MAX] = {
+  {0x79,0,0,0},
+  {0xFF,0xFF,0xFF,1},
+  {0xC1,0,0,2},
+  {0xF9,0,0,3},
+  {0xFF,0xFF,0xFF,4},
+  {0x11,0,0,5},
+  {0x31,0,0,6},
+  {0x21,0,0,7}
+};
+
+VOID
+GetPciDidVid (
+  REPORT_PCIEDIDVID2BMC *Report
+  )
+{
+  if (OemIsMpBoot ()) {
+    (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport_2P, sizeof (PcieDeviceToReport_2P));
+  } else {
+    (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport, sizeof (PcieDeviceToReport));
+  }
+}
 
 BOOLEAN OemIsSocketPresent (UINTN Socket)
 {
diff --git a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
index 2cd360d49f..be11c88992 100644
--- a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
+++ b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
@@ -15,6 +15,8 @@
 
 #include <Uefi.h>
 #include <PlatformArch.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/CpldD06.h>
 #include <Library/DebugLib.h>
 #include <Library/IoLib.h>
 #include <Library/LpcLib.h>
@@ -33,6 +35,94 @@ REPORT_PCIEDIDVID2BMC PcieDeviceToReport[PCIEDEVICE_REPORT_MAX] = {
   {0xFFFF,0xFFFF,0xFFFF,0xFFFF}
 };
 
+//Cpu0 Riser type is (X16 + X8) & Cpu1 Riser type is (X16 + X8)
+REPORT_PCIEDIDVID2BMC PcieDeviceToReport_2P_Type1 [PCIEDEVICE_REPORT_MAX] = {
+  {0x01,0,0,0},
+  {0x03,0,0,1},
+  {0xFF,0xFF,0xFF,2},
+  {0x81,0,0,3},
+  {0x84,0,0,4},
+  {0xFF,0xFF,0xFF,5}
+};
+
+//Cpu0 Riser type is (X16 + X8) & Cpu1 Riser type is (3 * X8)
+REPORT_PCIEDIDVID2BMC PcieDeviceToReport_2P_Type2 [PCIEDEVICE_REPORT_MAX] = {
+  {0x01,0,0,0},
+  {0x03,0,0,1},
+  {0xFF,0xFF,0xFF,2},
+  {0xFF,0xFF,0xFF,3},
+  {0x81,0,0,4},
+  {0x85,0,0,5}
+};
+
+//Cpu0 Riser type is (3 * X8) & Cpu1 Riser type is (X16 + X8)
+REPORT_PCIEDIDVID2BMC PcieDeviceToReport_2P_Type3 [PCIEDEVICE_REPORT_MAX] = {
+  {0xFF,0xFF,0xFF,0},
+  {0x01,0,0,1},
+  {0x04,0,0,2},
+  {0x81,0,0,3},
+  {0x84,0,0,4},
+  {0xFF,0xFF,0xFF,5}
+};
+
+//Cpu0 Riser type is (3 * X8) & Cpu1 Riser type is (3 * X8)
+REPORT_PCIEDIDVID2BMC PcieDeviceToReport_2P_Type4 [PCIEDEVICE_REPORT_MAX] = {
+  {0xFF,0xFF,0xFF,0},
+  {0x01,0,0,1},
+  {0x04,0,0,2},
+  {0xFF,0xFF,0xFF,3},
+  {0x81,0,0,4},
+  {0x85,0,0,5}
+};
+
+VOID
+GetPciDidVid (
+  REPORT_PCIEDIDVID2BMC *Report
+  )
+{
+  UINT32                             PresentStatus;
+  UINT32                             CardType;
+  UINT8                              Cpu0CardType = 0;
+  UINT8                              Cpu1CardType = 0;
+
+  PresentStatus = MmioRead32 (CPLD_BASE_ADDRESS + CPLD_RISER_PRSNT_FLAG);
+  CardType = MmioRead32 (CPLD_BASE_ADDRESS + CPLD_RISER2_BOARD_ID);
+
+  // Offset 0x40: Bit7 = 1 CPU0 Riser present
+  if ((PresentStatus & CPU0_RISER_PRESENT) != 0) {
+    Cpu0CardType = (UINT8) (PresentStatus >> 8);
+  }
+
+  // Offset 0x40: Bit6 = 1 CPU1 Riser present
+  if ((PresentStatus & CPU1_RISER_PRESENT) != 0) {
+    Cpu1CardType = (UINT8)CardType;
+  }
+
+  if (OemIsMpBoot ()) {
+    if (Cpu0CardType == CPLD_X16_X8_BOARD_ID) {
+      if (Cpu1CardType == CPLD_X16_X8_BOARD_ID) {
+        (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport_2P_Type1,
+                        sizeof (PcieDeviceToReport_2P_Type1));
+      } else {
+        (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport_2P_Type2,
+                        sizeof (PcieDeviceToReport_2P_Type2));
+      }
+    } else {
+      if (Cpu1CardType == CPLD_X16_X8_BOARD_ID) {
+        (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport_2P_Type3,
+                        sizeof (PcieDeviceToReport_2P_Type3));
+      } else {
+        (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport_2P_Type4,
+                        sizeof (PcieDeviceToReport_2P_Type4));
+      }
+    }
+  } else {
+    (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport,
+                    sizeof (PcieDeviceToReport));
+  }
+}
+
+
 // Right now we only support 1P
 BOOLEAN
 OemIsSocketPresent (
diff --git a/Silicon/Hisilicon/Drivers/Smbios/AddSmbiosType9/AddSmbiosType9.c b/Silicon/Hisilicon/Drivers/Smbios/AddSmbiosType9/AddSmbiosType9.c
index 8d8dacd3e0..cc1131577d 100644
--- a/Silicon/Hisilicon/Drivers/Smbios/AddSmbiosType9/AddSmbiosType9.c
+++ b/Silicon/Hisilicon/Drivers/Smbios/AddSmbiosType9/AddSmbiosType9.c
@@ -18,12 +18,6 @@
 extern SMBIOS_TABLE_TYPE9 gPcieSlotInfo[];
 extern UINT8 OemGetPcieSlotNumber ();
 
-REPORT_PCIEDIDVID2BMC  PcieDeviceToReport_2P[PCIEDEVICE_REPORT_MAX] = {
-      {67,0,0,0},
-      {225,0,0,3},
-      {0xFFFF,0xFFFF,0xFFFF,0xFFFF},
-      {0xFFFF,0xFFFF,0xFFFF,0xFFFF}
-};
 VOID
 EFIAPI
 UpdateSmbiosType9Info(
@@ -41,11 +35,9 @@ UpdateSmbiosType9Info(
     UINTN                              FunctionNumber;
     UINTN                              Index;
     REPORT_PCIEDIDVID2BMC              ReportPcieDidVid[PCIEDEVICE_REPORT_MAX];
-    if(OemIsMpBoot()){
-        (VOID)CopyMem((VOID *)ReportPcieDidVid,(VOID *)PcieDeviceToReport_2P,sizeof(PcieDeviceToReport_2P));
-    } else {
-        (VOID)CopyMem((VOID *)ReportPcieDidVid,(VOID *)PcieDeviceToReport,sizeof(PcieDeviceToReport));
-    }
+
+    GetPciDidVid ((VOID *) ReportPcieDidVid);
+
     Status = gBS->LocateHandleBuffer (
                                       ByProtocol,
                                       &gEfiPciIoProtocolGuid,
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 32/43] Platform/Hisilicon/D06: Add EarlyConfigPeim peim
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (30 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 31/43] Hisilicon/D0x: Update SMBIOS type9 info Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 15:04   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 33/43] Platform/Hisilicon/D06: Add PciHostBridgeLib Ming Huang
                   ` (11 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

This peim configuare SMMU,BSP,MN(Miscellaneous Node).

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                |   1 +
 Platform/Hisilicon/D06/D06.fdf                                |   1 +
 Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf |  50 +++++++++
 Silicon/Hisilicon/Include/Library/OemAddressMapLib.h          |   2 +
 Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c   | 107 ++++++++++++++++++++
 5 files changed, 161 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 5571028f42..3de09ea870 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -263,6 +263,7 @@
   MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
   MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
 
+  Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
   Silicon/Hisilicon/Drivers/VersionInfoPeim/VersionInfoPeim.inf
 
   MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
index 184d5d4dcf..bd3ea47226 100644
--- a/Platform/Hisilicon/D06/D06.fdf
+++ b/Platform/Hisilicon/D06/D06.fdf
@@ -359,6 +359,7 @@ READ_LOCK_STATUS   = TRUE
   INF ArmPkg/Drivers/CpuPei/CpuPei.inf
   INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
   INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
+  INF Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
 
   INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
diff --git a/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf b/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
new file mode 100644
index 0000000000..8296ee02de
--- /dev/null
+++ b/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
@@ -0,0 +1,50 @@
+#/** @file
+#
+#    Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+#    Copyright (c) 2017, Linaro Limited. All rights reserved.
+#
+#    This program and the accompanying materials
+#    are licensed and made available under the terms and conditions of the BSD License
+#    which accompanies this distribution. The full text of the license may be found at
+#    http://opensource.org/licenses/bsd-license.php
+#
+#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#**/
+
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = EarlyConfigPeimD06
+  FILE_GUID                      = FB8C65EB-0199-40C3-A82B-029921A9E9B3
+  MODULE_TYPE                    = PEIM
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = EarlyConfigEntry
+
+[Sources.common]
+  EarlyConfigPeimD06.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[LibraryClasses]
+  ArmLib
+  CacheMaintenanceLib
+  DebugLib
+  IoLib
+  PcdLib
+  PeimEntryPoint
+  PlatformSysCtrlLib
+
+[Pcd]
+  gHisiTokenSpaceGuid.PcdMailBoxAddress
+  gHisiTokenSpaceGuid.PcdPeriSubctrlAddress
+  gHisiTokenSpaceGuid.PcdTrustedFirmwareEnable
+
+[Depex]
+## As we will clean mailbox in this module, need to wait memory init complete
+  gEfiPeiMemoryDiscoveredPpiGuid
diff --git a/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h b/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h
index 332a79343f..b330be09ba 100644
--- a/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h
+++ b/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h
@@ -16,6 +16,8 @@
 #ifndef _OEM_ADDRESS_MAP_LIB_H_
 #define _OEM_ADDRESS_MAP_LIB_H_
 
+#include "PlatformArch.h"
+
 typedef struct _DDRC_BASE_ID{
     UINTN  Base;
     UINTN  Id;
diff --git a/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c b/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c
new file mode 100644
index 0000000000..0790f7941a
--- /dev/null
+++ b/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c
@@ -0,0 +1,107 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+
+#include <Uefi.h>
+#include <Library/ArmLib.h>
+#include <Library/CacheMaintenanceLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/OemAddressMapLib.h>
+#include <Library/OemMiscLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PlatformSysCtrlLib.h>
+#include <PiPei.h>
+
+#define PERI_SUBCTRL_BASE                               (0x40000000)
+#define MDIO_SUBCTRL_BASE                               (0x60000000)
+#define PCIE2_SUBCTRL_BASE                              (0xA0000000)
+#define PCIE0_SUBCTRL_BASE                              (0xB0000000)
+#define ALG_BASE                                        (0xD0000000)
+
+#define SC_BROADCAST_EN_REG                             (0x16220)
+#define SC_BROADCAST_SCL1_ADDR0_REG                     (0x16230)
+#define SC_BROADCAST_SCL1_ADDR1_REG                     (0x16234)
+#define SC_BROADCAST_SCL2_ADDR0_REG                     (0x16238)
+#define SC_BROADCAST_SCL2_ADDR1_REG                     (0x1623C)
+#define SC_BROADCAST_SCL3_ADDR0_REG                     (0x16240)
+#define SC_BROADCAST_SCL3_ADDR1_REG                     (0x16244)
+#define PCIE_SUBCTRL_SC_DISP_DAW_EN_REG                 (0x1000)
+#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY3_REG         (0x1010)
+#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY4_REG         (0x1014)
+#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY5_REG         (0x1018)
+#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY6_REG         (0x101C)
+#define PCIE_SUBCTRL_SC_REMAP_CTRL_REG                  (0x1200)
+#define SC_ITS_M3_INT_MUX_SEL_REG                       (0x21F0)
+#define SC_TM_CLKEN0_REG                                (0x2050)
+
+#define SC_TM_CLKEN0_REG_VALUE                          (0x3)
+#define SC_BROADCAST_EN_REG_VALUE                       (0x7)
+#define SC_BROADCAST_SCLx_ADDRx_REG_VALUE0              (0x0)
+#define SC_BROADCAST_SCLx_ADDRx_REG_VALUE1              (0x40016260)
+#define SC_BROADCAST_SCLx_ADDRx_REG_VALUE2              (0x60016260)
+#define SC_BROADCAST_SCLx_ADDRx_REG_VALUE3              (0x400)
+#define SC_ITS_M3_INT_MUX_SEL_REG_VALUE                 (0x7)
+#define PCIE_SUBCTRL_SC_REMAP_CTRL_REG_VALUE0           (0x0)
+#define PCIE_SUBCTRL_SC_DISP_DAW_EN_REG_VALUE0          (0x27)
+#define PCIE_SUBCTRL_SC_DISP_DAW_EN_REG_VALUE1          (0x2F)
+#define PCIE_SUBCTRL_SC_DISP_DAW_EN_REG_VALUE2          (0x77)
+#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY3_REG_VALUE0  (0x178033)
+#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY4_REG_VALUE0  (0x17003c)
+#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY5_REG_VALUE0  (0x15003d)
+#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY5_REG_VALUE1  (0x170035)
+#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY6_REG_VALUE0  (0x16003e)
+
+STATIC
+VOID
+QResetAp (
+  VOID
+  )
+{
+  MmioWrite64 (FixedPcdGet64 (PcdMailBoxAddress), 0x0);
+  (VOID)WriteBackInvalidateDataCacheRange (
+          (VOID *)FixedPcdGet64 (PcdMailBoxAddress),
+          sizeof (UINT64)
+          );
+
+  //SCCL A
+  if (!PcdGet64 (PcdTrustedFirmwareEnable)) {
+    StartupAp ();
+  }
+}
+
+
+EFI_STATUS
+EFIAPI
+EarlyConfigEntry (
+  IN       EFI_PEI_FILE_HANDLE  FileHandle,
+  IN CONST EFI_PEI_SERVICES     **PeiServices
+  )
+{
+  DEBUG ((DEBUG_INFO,"SMMU CONFIG........."));
+  (VOID)SmmuConfigForBios ();
+  DEBUG ((DEBUG_INFO,"Done\n"));
+
+  DEBUG ((DEBUG_INFO,"AP CONFIG........."));
+  (VOID)QResetAp ();
+  DEBUG ((DEBUG_INFO,"Done\n"));
+
+  DEBUG ((DEBUG_INFO,"MN CONFIG........."));
+  (VOID)MN_CONFIG ();
+  DEBUG ((DEBUG_INFO,"Done\n"));
+
+  return EFI_SUCCESS;
+}
+
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 33/43] Platform/Hisilicon/D06: Add PciHostBridgeLib
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (31 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 32/43] Platform/Hisilicon/D06: Add EarlyConfigPeim peim Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 15:09   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 34/43] Hisilicon/D06: add apei driver Ming Huang
                   ` (10 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

PciHostBridgeLib which is need by PciHostBridgeDxe, provide
root bridges and deal with resource conflict.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                       |   2 +-
 Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.inf |  36 ++
 Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.c   | 635 ++++++++++++++++++++
 3 files changed, 672 insertions(+), 1 deletion(-)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 3de09ea870..c6de9f04ad 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -418,7 +418,7 @@
     <LibraryClasses>
       PciSegmentLib|MdePkg/Library/BasePciSegmentLibPci/BasePciSegmentLibPci.inf
       PciLib|MdePkg/Library/BasePciLibPciExpress/BasePciLibPciExpress.inf
-      PciHostBridgeLib|MdeModulePkg/Library/PciHostBridgeLibNull/PciHostBridgeLibNull.inf
+      PciHostBridgeLib|Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.inf
   }
 
   MdeModulePkg/Bus/Pci/PciBusDxe/PciBusDxe.inf
diff --git a/Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.inf b/Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.inf
new file mode 100644
index 0000000000..8a998681a3
--- /dev/null
+++ b/Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.inf
@@ -0,0 +1,36 @@
+## @file
+#
+#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+#  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution. The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = PciHostBridgeLib
+  FILE_GUID                      = 61b7276a-fc67-11e5-82fd-47ea9896dd5d
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = PciHostBridgeLib|DXE_DRIVER
+
+[Sources]
+  PciHostBridgeLib.c
+
+[Packages]
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  BaseLib
+  DebugLib
+  DevicePathLib
+  MemoryAllocationLib
+  UefiBootServicesTableLib
diff --git a/Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.c b/Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.c
new file mode 100644
index 0000000000..d1a436d9bc
--- /dev/null
+++ b/Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.c
@@ -0,0 +1,635 @@
+/** @file
+
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+#include <PiDxe.h>
+#include <Library/DebugLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PciHostBridgeLib.h>
+#include <Protocol/PciHostBridgeResourceAllocation.h>
+#include <Protocol/PciRootBridgeIo.h>
+
+#define ENUM_HB_NUM 8
+
+#define EFI_PCI_SUPPORT   (EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO | \
+                           EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO | \
+                           EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO | \
+                           EFI_PCI_ATTRIBUTE_ISA_IO_16  | \
+                           EFI_PCI_ATTRIBUTE_VGA_MEMORY | \
+                           EFI_PCI_ATTRIBUTE_VGA_IO_16  | \
+                           EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16)
+
+#define EFI_PCI_ATTRIBUTE  EFI_PCI_SUPPORT
+
+#pragma pack(1)
+typedef struct {
+  ACPI_HID_DEVICE_PATH     AcpiDevicePath;
+  EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
+} EFI_PCI_ROOT_BRIDGE_DEVICE_PATH;
+#pragma pack ()
+
+STATIC EFI_PCI_ROOT_BRIDGE_DEVICE_PATH mEfiPciRootBridgeDevicePath [ENUM_HB_NUM] = {
+//Host Bridge 0
+  {
+    {
+      {
+        ACPI_DEVICE_PATH,
+        ACPI_DP,
+        {
+          (UINT8)sizeof (ACPI_HID_DEVICE_PATH),
+          (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8)
+        }
+      },
+      EISA_PNP_ID(0x0A03), // PCI
+      0
+    },
+    {
+      END_DEVICE_PATH_TYPE,
+      END_ENTIRE_DEVICE_PATH_SUBTYPE,
+      {
+        END_DEVICE_PATH_LENGTH,
+        0
+      }
+    }
+  },
+
+//Host Bridge 2
+  {
+    {
+      {
+        ACPI_DEVICE_PATH,
+        ACPI_DP,
+        {
+          (UINT8)sizeof (ACPI_HID_DEVICE_PATH),
+          (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8)
+        }
+      },
+      EISA_PNP_ID(0x0A04), // PCI
+      0
+    },
+    {
+      END_DEVICE_PATH_TYPE,
+      END_ENTIRE_DEVICE_PATH_SUBTYPE,
+      {
+        END_DEVICE_PATH_LENGTH,
+        0
+      }
+    }
+  },
+
+//Host Bridge 4
+  {
+    {
+      {
+        ACPI_DEVICE_PATH,
+        ACPI_DP,
+        {
+          (UINT8)sizeof (ACPI_HID_DEVICE_PATH),
+          (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8)
+        }
+      },
+      EISA_PNP_ID(0x0A05), // PCI
+      0
+    },
+    {
+      END_DEVICE_PATH_TYPE,
+      END_ENTIRE_DEVICE_PATH_SUBTYPE,
+      {
+        END_DEVICE_PATH_LENGTH,
+        0
+      }
+    }
+  },
+
+//Host Bridge 5
+  {
+    {
+      {
+        ACPI_DEVICE_PATH,
+        ACPI_DP,
+        {
+          (UINT8)sizeof (ACPI_HID_DEVICE_PATH),
+          (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8)
+        }
+      },
+      EISA_PNP_ID(0x0A06), // PCI
+      0
+    },
+    {
+      END_DEVICE_PATH_TYPE,
+      END_ENTIRE_DEVICE_PATH_SUBTYPE,
+      {
+        END_DEVICE_PATH_LENGTH,
+        0
+      }
+    }
+  },
+
+//Host Bridge 6
+  {
+    {
+      {
+        ACPI_DEVICE_PATH,
+        ACPI_DP,
+        {
+          (UINT8)sizeof (ACPI_HID_DEVICE_PATH),
+          (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8)
+        }
+      },
+      EISA_PNP_ID(0x0A07), // PCI
+      0
+    },
+    {
+      END_DEVICE_PATH_TYPE,
+      END_ENTIRE_DEVICE_PATH_SUBTYPE,
+      {
+        END_DEVICE_PATH_LENGTH,
+        0
+      }
+    }
+  },
+
+//Host Bridge 8
+  {
+    {
+      {
+        ACPI_DEVICE_PATH,
+        ACPI_DP,
+        {
+          (UINT8)sizeof (ACPI_HID_DEVICE_PATH),
+          (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8)
+        }
+      },
+      EISA_PNP_ID(0x0A08), // PCI
+      0
+    },
+    {
+      END_DEVICE_PATH_TYPE,
+      END_ENTIRE_DEVICE_PATH_SUBTYPE,
+      {
+        END_DEVICE_PATH_LENGTH,
+        0
+      }
+    }
+  },
+
+//Host Bridge 10
+  {
+    {
+      {
+        ACPI_DEVICE_PATH,
+        ACPI_DP,
+        {
+          (UINT8)sizeof (ACPI_HID_DEVICE_PATH),
+          (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8)
+        }
+      },
+      EISA_PNP_ID(0x0A09), // PCI
+      0
+    },
+    {
+      END_DEVICE_PATH_TYPE,
+      END_ENTIRE_DEVICE_PATH_SUBTYPE,
+      {
+        END_DEVICE_PATH_LENGTH,
+        0
+      }
+    }
+  },
+
+//Host Bridge 11
+  {
+    {
+      {
+        ACPI_DEVICE_PATH,
+        ACPI_DP,
+        {
+          (UINT8)sizeof (ACPI_HID_DEVICE_PATH),
+          (UINT8)(sizeof (ACPI_HID_DEVICE_PATH) >> 8)
+        }
+      },
+      EISA_PNP_ID(0x0A0A), // PCI
+      0
+    },
+    {
+      END_DEVICE_PATH_TYPE,
+      END_ENTIRE_DEVICE_PATH_SUBTYPE,
+      {
+        END_DEVICE_PATH_LENGTH,
+        0
+      }
+    }
+  }
+};
+
+STATIC PCI_ROOT_BRIDGE gRootBridge [ENUM_HB_NUM] = {
+//Host Bridge 0
+  {
+    0,                                              // Segment
+    EFI_PCI_SUPPORT,                                // Supports
+    EFI_PCI_ATTRIBUTE,                              // Attributes
+    TRUE,                                           // DmaAbove4G
+    FALSE,                                          // NoExtendedConfigSpace
+    FALSE,                                          // ResourceAssigned
+    EFI_PCI_HOST_BRIDGE_MEM64_DECODE,
+    { // Bus
+      00,
+      0x3F
+    },
+    { // Io (32K)
+      0,
+      0x7FFF
+    },
+    { // Mem (256M - 64K - 1)
+      0xE0000000,
+      0xEFFEFFFF
+    },
+    { // MemAbove4G (8T + 256G)
+      0x80000000000,
+      0x83FFFFFFFFF
+    },
+    { // PMem
+      0xE0000000,
+      0xEFFEFFFF
+    },
+    { // PMemAbove4G
+      0x80000000000,
+      0x83FFFFFFFFF
+    },
+    (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[0]
+  },
+
+  //Host Bridge 2
+  {
+    0,                                              // Segment
+    EFI_PCI_SUPPORT,                                // Supports
+    EFI_PCI_ATTRIBUTE,                              // Attributes
+    TRUE,                                           // DmaAbove4G
+    FALSE,                                          // NoExtendedConfigSpace
+    FALSE,                                          // ResourceAssigned
+    EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM |          // AllocationAttributes
+    EFI_PCI_HOST_BRIDGE_MEM64_DECODE,
+    { // Bus
+      0x7A,
+      0x7A
+    },
+    { // Io
+      MAX_UINT32,
+      0
+    },
+    { // Mem
+      MAX_UINT32,
+      0
+    },
+    { // MemAbove4G
+      0x20c000000,
+      0x20c1fffff
+    },
+    { // PMem
+      MAX_UINT32,
+      0
+    },
+    { // PMemAbove4G
+      MAX_UINT64,
+      0
+    },
+    (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[1]
+  },
+
+  //Host Bridge 4
+  {
+    0,                                              // Segment
+    EFI_PCI_SUPPORT,                                // Supports
+    EFI_PCI_ATTRIBUTE,                              // Attributes
+    TRUE,                                           // DmaAbove4G
+    FALSE,                                          // NoExtendedConfigSpace
+    FALSE,                                          // ResourceAssigned
+    EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM |          // AllocationAttributes
+    EFI_PCI_HOST_BRIDGE_MEM64_DECODE,
+    { // Bus
+      0x7C,
+      0x7D
+    },
+    { // Io
+      MAX_UINT32,
+      0
+    },
+    { // Mem
+      MAX_UINT32,
+      0
+    },
+    { // MemAbove4G
+      0x120000000,
+      0x13fffffff
+    },
+    { // PMem
+      MAX_UINT32,
+      0
+    },
+    { // PMemAbove4G
+      MAX_UINT64,
+      0
+    },
+    (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[2]
+  },
+
+  //Host Bridge 5
+  {
+    0,                                              // Segment
+    EFI_PCI_SUPPORT,                                // Supports
+    EFI_PCI_ATTRIBUTE,                              // Attributes
+    TRUE,                                           // DmaAbove4G
+    FALSE,                                          // NoExtendedConfigSpace
+    FALSE,                                          // ResourceAssigned
+    EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM |          // AllocationAttributes
+    EFI_PCI_HOST_BRIDGE_MEM64_DECODE,
+    { // Bus
+      0x74,
+      0x76
+    },
+    { // Io
+      MAX_UINT32,
+      0
+    },
+    { // Mem
+      0xA2000000,
+      0xA2ffffff
+    },
+    { // MemAbove4G
+      0x144000000,
+      0x147ffffff
+    },
+    { // PMem
+      MAX_UINT32,
+      0
+    },
+    { // PMemAbove4G
+      MAX_UINT64,
+      0
+    },
+    (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[3]
+  },
+  //Host Bridge 6
+  {
+    0,                                              // Segment
+    EFI_PCI_SUPPORT,                                // Supports
+    EFI_PCI_ATTRIBUTE,                              // Attributes
+    TRUE,                                           // DmaAbove4G
+    FALSE,                                          // NoExtendedConfigSpace
+    FALSE,                                          // ResourceAssigned
+    EFI_PCI_HOST_BRIDGE_MEM64_DECODE,
+    { // Bus
+      0x80,
+      0x9F
+    },
+    { // Io (32K)
+      0x0,
+      0x7FFF
+    },
+    { // Mem (256M - 64K -1)
+      0xF0000000,
+      0xFFFEFFFF
+    },
+    { // MemAbove4G (8T + 256G)
+      0x480000000000,
+      0x483FFFFFFFFF
+    },
+    { // PMem
+      0xF0000000,
+      0xFFFEFFFF
+    },
+    { // PMemAbove4G
+      0x480000000000,
+      0x483FFFFFFFFF
+    },
+    (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[4]
+  },
+
+  //Host Bridge 8
+  {
+    0,                                              // Segment
+    EFI_PCI_SUPPORT,                                // Supports
+    EFI_PCI_ATTRIBUTE,                              // Attributes
+    TRUE,                                           // DmaAbove4G
+    FALSE,                                          // NoExtendedConfigSpace
+    FALSE,                                          // ResourceAssigned
+    EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM |          // AllocationAttributes
+    EFI_PCI_HOST_BRIDGE_MEM64_DECODE,
+    { // Bus
+      0xBA,
+      0xBA
+    },
+    { // Io
+      MAX_UINT32,
+      0
+    },
+    { // Mem
+      MAX_UINT32,
+      0
+    },
+    { // MemAbove4G
+      0x40020c000000,
+      0x40020c1fffff
+    },
+    { // PMem
+      MAX_UINT32,
+      0
+    },
+    { // PMemAbove4G
+      MAX_UINT64,
+      0
+    },
+    (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[5]
+  },
+
+  //Host Bridge 10
+  {
+    0,                                              // Segment
+    EFI_PCI_SUPPORT,                                // Supports
+    EFI_PCI_ATTRIBUTE,                              // Attributes
+    TRUE,                                           // DmaAbove4G
+    FALSE,                                          // NoExtendedConfigSpace
+    FALSE,                                          // ResourceAssigned
+    EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM |          // AllocationAttributes
+    EFI_PCI_HOST_BRIDGE_MEM64_DECODE,
+    { // Bus
+      0xBC,
+      0xBD
+    },
+    { // Io
+      MAX_UINT32,
+      0
+    },
+    { // Mem
+      MAX_UINT32,
+      0
+    },
+    { // MemAbove4G
+      0x400120000000,
+      0x40013fffffff
+    },
+    { // PMem
+      MAX_UINT32,
+      0
+    },
+    { // PMemAbove4G
+      MAX_UINT64,
+      0
+    },
+    (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[6]
+  },
+
+  //Host Bridge 11
+  {
+    0,                                              // Segment
+    EFI_PCI_SUPPORT,                                // Supports
+    EFI_PCI_ATTRIBUTE,                              // Attributes
+    TRUE,                                           // DmaAbove4G
+    FALSE,                                          // NoExtendedConfigSpace
+    FALSE,                                          // ResourceAssigned
+    EFI_PCI_HOST_BRIDGE_COMBINE_MEM_PMEM |          // AllocationAttributes
+    EFI_PCI_HOST_BRIDGE_MEM64_DECODE,
+    { // Bus
+      0xB4,
+      0xB6
+    },
+    { // Io
+      MAX_UINT32,
+      0
+    },
+    { // Mem
+      0xA3000000,
+      0xA3ffffff
+    },
+    { // MemAbove4G
+      0x400144000000,
+      0x400147ffffff
+    },
+    { // PMem
+      MAX_UINT32,
+      0
+    },
+    { // PMemAbove4G
+      MAX_UINT64,
+      0
+    },
+    (EFI_DEVICE_PATH_PROTOCOL *)&mEfiPciRootBridgeDevicePath[7]
+  }
+
+};
+
+/**
+  Return all the root bridge instances in an array.
+
+  @param Count  Return the count of root bridge instances.
+
+  @return All the root bridge instances in an array.
+          The array should be passed into PciHostBridgeFreeRootBridges()
+          when it's not used.
+**/
+PCI_ROOT_BRIDGE *
+EFIAPI
+PciHostBridgeGetRootBridges (
+  UINTN *Count
+  )
+{
+  *Count = ENUM_HB_NUM;
+
+  return gRootBridge;
+}
+
+/**
+  Free the root bridge instances array returned from PciHostBridgeGetRootBridges().
+
+  @param Bridges The root bridge instances array.
+  @param Count   The count of the array.
+**/
+VOID
+EFIAPI
+PciHostBridgeFreeRootBridges (
+  PCI_ROOT_BRIDGE *Bridges,
+  UINTN           Count
+  )
+{
+  if (Bridges == NULL && Count == 0) {
+    return;
+  }
+
+  do {
+    --Count;
+    FreePool (Bridges[Count].DevicePath);
+  } while (Count > 0);
+
+  FreePool (Bridges);
+}
+
+STATIC CONST CHAR16 mPciHostBridgeLibAcpiAddressSpaceTypeStr[][4] = {
+  L"Mem", L"I/O", L"Bus"
+};
+
+/**
+  Inform the platform that the resource conflict happens.
+
+  @param HostBridgeHandle Handle of the Host Bridge.
+  @param Configuration    Pointer to PCI I/O and PCI memory resource
+                          descriptors. The Configuration contains the resources
+                          for all the root bridges. The resource for each root
+                          bridge is terminated with END descriptor and an
+                          additional END is appended indicating the end of the
+                          entire resources. The resource descriptor field
+                          values follow the description in
+                          EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PROTOCOL
+                          .SubmitResources().
+**/
+VOID
+EFIAPI
+PciHostBridgeResourceConflict (
+  EFI_HANDLE                        HostBridgeHandle,
+  VOID                              *Configuration
+  )
+{
+  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptor;
+  UINTN                             RootBridgeIndex;
+
+  DEBUG ((DEBUG_ERROR, "\n PciHostBridge: Resource conflict happens!\n"));
+  RootBridgeIndex = 0;
+  Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)Configuration;
+  while (Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {
+    DEBUG ((DEBUG_ERROR, "RootBridge[%d]:\n", RootBridgeIndex++));
+    for (; Descriptor->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR; Descriptor++) {
+      ASSERT (Descriptor->ResType <
+              ARRAY_SIZE (mPciHostBridgeLibAcpiAddressSpaceTypeStr)
+              );
+      DEBUG ((DEBUG_ERROR, " %s: Length/Alignment = 0x%lx / 0x%lx\n",
+              mPciHostBridgeLibAcpiAddressSpaceTypeStr[Descriptor->ResType],
+              Descriptor->AddrLen, Descriptor->AddrRangeMax
+              ));
+      if (Descriptor->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {
+        DEBUG ((DEBUG_ERROR, "     Granularity/SpecificFlag = %ld / %02x%s\n",
+                Descriptor->AddrSpaceGranularity, Descriptor->SpecificFlag,
+                ((Descriptor->SpecificFlag &
+                  EFI_ACPI_MEMORY_RESOURCE_SPECIFIC_FLAG_CACHEABLE_PREFETCHABLE
+                  ) != 0) ? L" (Prefetchable)" : L""
+                ));
+      }
+    }
+    //
+    // Skip the END descriptor for root bridge
+    //
+    ASSERT (Descriptor->Desc == ACPI_END_TAG_DESCRIPTOR);
+    Descriptor = (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *)(
+                   (EFI_ACPI_END_TAG_DESCRIPTOR *)Descriptor + 1
+                   );
+  }
+}
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 34/43] Hisilicon/D06: add apei driver
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (32 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 33/43] Platform/Hisilicon/D06: Add PciHostBridgeLib Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 15:31   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 35/43] Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h Ming Huang
                   ` (9 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Luqi Jiang

From: Luqi Jiang <jiangluqi@huawei.com>

This driver provide a means for the platform to
convey error information to OSPM.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Luqi Jiang <jiangluqi@huawei.com>
---
 Platform/Hisilicon/D06/D06.dsc                           |   1 +
 Platform/Hisilicon/D06/D06.fdf                           |   1 +
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf           |  64 ++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h             |  41 +++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h        |  43 +++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h        | 146 ++++++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h | 110 ++++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h        | 146 ++++++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h        |  59 +++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h    |  43 +++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c             | 108 ++++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c        |  92 +++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c        | 349 ++++++++++++++++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c | 330 +++++++++++++++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c        | 374 ++++++++++++++++++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c        | 119 +++++++
 Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c    | 337 ++++++++++++++++++
 17 files changed, 2363 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index c6de9f04ad..9550e0d497 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -340,6 +340,7 @@
   Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
   Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
 
+  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
   Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
   #
   # Usb Support
diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
index bd3ea47226..90379b8558 100644
--- a/Platform/Hisilicon/D06/D06.fdf
+++ b/Platform/Hisilicon/D06/D06.fdf
@@ -251,6 +251,7 @@ READ_LOCK_STATUS   = TRUE
 
   INF RuleOverride=ACPITABLE Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
   INF Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
+  INF Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
 
   INF Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
 
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
new file mode 100644
index 0000000000..7a75968da1
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
@@ -0,0 +1,64 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+[defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = AcpiApei
+  FILE_GUID                      = E9570C39-EF68-4fc6-B921-C1954A87CCD2
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = ApeiEntryPoint
+
+[sources.common]
+  Apei.c
+  Bert/bert.c
+  Bert/bert.h
+  Einj/einj.c
+  Einj/einj.h
+  Erst/erst.c
+  Erst/erst.h
+  Hest/hest.c
+  Hest/hest.h
+  ErrorSource/Ghes.c
+  ErrorSource/Ghes.h
+  OemApeiHi1620.c
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  MdePkg/MdePkg.dec
+  Silicon/Hisilicon/HisiPkg.dec
+
+[LibraryClasses]
+  ArmSmcLib
+  BaseMemoryLib
+  DebugLib
+  HobLib
+  TimerLib
+  UefiDriverEntryPoint
+  UefiRuntimeServicesTableLib
+
+[Guids]
+  gOemConfigGuid
+
+[Protocols]
+  gEfiAcpiSdtProtocolGuid
+  gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
+
+[Pcd]
+  gHisiTokenSpaceGuid.PcdCpldBaseAddress
+  gHisiTokenSpaceGuid.PcdTrustedFirmwareEnable
+
+[Depex]
+  gEfiAcpiTableProtocolGuid AND gEfiAcpiSdtProtocolGuid
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h
new file mode 100644
index 0000000000..ed8ec417cb
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h
@@ -0,0 +1,41 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+#ifndef _APEI_H_
+#define _APEI_H_
+
+#include <IndustryStandard/Acpi.h>
+#include <Protocol/AcpiSystemDescriptionTable.h>
+#include <Protocol/AcpiTable.h>
+
+#define EFI_ACPI_MAX_NUM_TABLES         20
+#define PRIVATE_ARM_SMC_ID_APEI         0x83000100
+#define PRIVATE_ARM_SMC_ID_APEI_S       0x83000101
+
+typedef struct {
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *HestCorrectedErrorGhesV2;
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *HestFatalErrorGhesV2;
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *HestRecoverableErrorGhesV2;
+  EFI_PHYSICAL_ADDRESS                                            HestTableAddress;
+  EFI_PHYSICAL_ADDRESS                                            EinjTableAddress;
+  EFI_PHYSICAL_ADDRESS                                            EinjDataStruct;
+  VOID                                                            *ErstContext;
+} APEI_TRUSTED_FIRMWARE_STRUCTURE;
+
+extern EFI_ACPI_TABLE_PROTOCOL       *mAcpiTableProtocol;
+extern EFI_ACPI_SDT_PROTOCOL         *mAcpiSdtProtocol;
+extern APEI_TRUSTED_FIRMWARE_STRUCTURE     *mApeiTrustedfirmwareData;
+
+
+#endif    // _APEI_H_
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h
new file mode 100644
index 0000000000..36a0c58966
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h
@@ -0,0 +1,43 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef _BERT_H_
+#define _BERT_H_
+
+#include "Apei.h"
+#include <Guid/Cper.h>
+
+typedef struct _BERT_CONTEXT {
+  EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER   *BertHeader;
+  VOID                                          *Block;
+  UINT32                                        BlockSize;
+} BERT_CONTEXT;
+
+EFI_STATUS
+OemInitBertTable (
+  IN EFI_HANDLE    ImageHandle
+);
+VOID
+BertSetAcpiTable (
+  IN BERT_CONTEXT *Context
+);
+EFI_STATUS
+BertHeaderCreator (
+  BERT_CONTEXT  *Context,
+  UINT32        ErrorBlockSize
+);
+
+
+#endif    // _BERT_H_
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h
new file mode 100644
index 0000000000..85aa52f450
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h
@@ -0,0 +1,146 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef _EINJ_H_
+#define _EINJ_H_
+
+#include "Apei.h"
+
+#define EINJ_ACTION_NO             10
+#define EINJ_BEGIN_OPERATION_VALUE 0xFFFF
+#define EINJ_END_OPERATION_VALUE   0
+#define EINJ_WRITE_MASK            0xFFFFFFFF
+#define EINJ_READ_VALUE            0xFFFF
+#define EINJ_READ_MASK             0xFFFFFFFF
+
+#define EINJ_TRIGGER_ERROR_ACTION_NO                                    1
+
+#define EFI_ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS                       0x08
+#define EFI_ACPI_EINJ_GET_EXCUTE_OPERATION_TIMINGS                      0x09
+
+
+extern EFI_ACPI_TABLE_PROTOCOL            *mAcpiTableProtocol;
+extern EFI_ACPI_SDT_PROTOCOL              *mAcpiSdtProtocol;
+extern APEI_TRUSTED_FIRMWARE_STRUCTURE    *mApeiTrustedfirmwareData;
+
+//
+// Error Type Definition
+//
+#define EINJ_PROCESSOR_CORRECTABLE                                      BIT0
+#define EINJ_PROCESSOR_UNCORRECTABLE_NONFATAL                           BIT1
+#define EINJ_PROCESSOR_UNCORRECTABLE_FATAL                              BIT2
+#define EINJ_MEMORY_CORRECTABLE                                         BIT3
+#define EINJ_MEMORY_UNCORRECTABLE_NONFATAL                              BIT4
+#define EINJ_MEMORY_UNCORRECTABLE_FATAL                                 BIT5
+#define EINJ_PCIE_CORRECTABLE                                           BIT6
+#define EINJ_PCIE_UNCORRECTABLE_NONFATAL                                BIT7
+#define EINJ_PCIE_UNCORRECTABLE_FATAL                                   BIT8
+#define EINJ_PLATFORM_CORRECTABLE                                       BIT9
+#define EINJ_PLATFORM_UNCORRECTABLE_NONFATAL                            BIT10
+#define EINJ_PLATFORM_UNCORRECTABLE_FATAL                               BIT11
+#define EINJ_VENDOR_DEFINED_ERROR_TYPE                                  BIT31
+
+#define EINJ_PROCESSOR_APIC_VALID                                       BIT0
+#define EINJ_MEMORY_ADDRESS_VALID                                       BIT1
+#define EINJ_PCIE_SBDF_VALID                                            BIT2
+
+///
+/// EINJ Table
+///
+typedef struct {
+  EFI_ACPI_6_0_ERROR_INJECTION_TABLE_HEADER        EinjTableHeader;
+  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY    EinjInstructionEntry[EINJ_ACTION_NO];
+} EINJ_TABLE;
+
+typedef struct {
+  EFI_ACPI_6_0_EINJ_TRIGGER_ACTION_TABLE           TriggerErrorHeader;
+  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY    ErrorInstructionEntry[EINJ_TRIGGER_ERROR_ACTION_NO];
+} EINJ_TRIGGER_ERROR_ACTION;
+
+typedef struct {
+  UINT32 Reserved: 8;
+  UINT32 Function: 3;
+  UINT32 Device: 5;
+  UINT32 PrimaryOrDeviceBus: 8;
+  UINT32 Segment: 8;
+} EINJ_PCIE_SBDF;
+
+typedef struct {
+  UINT32         ErrorType;
+  UINT32         VendorErrorTypeOffset;
+  UINT32         Flags;
+  UINT32         ApicId;
+  UINT64         MemAddress;
+  UINT64         MemAddressRange;
+  EINJ_PCIE_SBDF PcieSBDF;
+} EINJ_SET_ERROR_TYPE_WITH_ADDRESS;
+
+typedef struct {
+  UINT32 Length;
+  UINT32 SBDF;
+  UINT16 VendorId;
+  UINT16 DeviceId;
+  UINT8  RevId;
+  UINT8  Reserved[3];
+} EINJ_VENDOR_ERROR_TYPE;
+
+typedef struct {
+  UINT64                           OperationBegin;
+  UINT64                           ErrorType;
+  UINT64                           ErrorCapabilities;
+  UINT64                           BusyStatus;
+  UINT64                           CommandStatus;
+  UINT64                           Timming;
+  EINJ_TRIGGER_ERROR_ACTION        *TriggerErrorActionTablePtr;
+  EINJ_SET_ERROR_TYPE_WITH_ADDRESS ErrorTypeWithAddress;
+  EINJ_VENDOR_ERROR_TYPE           VendorErrorTypeExtension;
+  EINJ_TRIGGER_ERROR_ACTION        TriggerErrorActionTable;
+} EINJ_DATA_STRUCTURE;
+
+// V2
+typedef struct _EINJ_CONTEXT {
+  EINJ_TABLE                                    *EINJ;
+  EINJ_DATA_STRUCTURE                           *EinjData;
+  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY *GetErrorTypeEntry;
+  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY *ExecuteOperationEntry;
+} EINJ_CONTEXT;
+
+
+EFI_STATUS
+InitEinjTable(VOID);
+// Version2
+EFI_STATUS
+EinjConfigErrorInjectCapability(
+  EINJ_CONTEXT  *Context,
+  UINT32        BitsSupportedErrorType
+);
+EFI_STATUS
+EinjHeaderCreator(
+  EINJ_CONTEXT  *Context
+);
+/***OEM***/
+EFI_STATUS
+OemInitEinjTable(VOID);
+EFI_STATUS
+OemEinjConfigExecuteOperationEntry(
+  EINJ_CONTEXT *Context
+);
+VOID
+EinjSetAcpiTable(
+  EINJ_CONTEXT *Context
+);
+
+
+#endif    // _EINJ_H_
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h
new file mode 100644
index 0000000000..44cd1f9577
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h
@@ -0,0 +1,110 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef GENERIC_HARDWARE_ERROR_SOURCE
+#define GENERIC_HARDWARE_ERROR_SOURCE
+#include "Apei.h"
+
+
+typedef struct {
+  UINT64 AckRegister;
+  UINT64 ErrorStatusBlockAddress;
+} GHES_REGISTER;
+
+typedef enum {
+  PROCESSOR_GENERIC   = 0,
+  PROCESSOR_IA32_X64  = 1,
+  PROCESSOR_IPF       = 2,
+  PROCESSOR_ARM       = 3,
+  PLATFORM_MEMORY     = 4,
+  PLATFORM_MEMORY2    = 5,
+  PCIE_EXPRESS        = 6,
+  FIRMWARE_ERROR      = 7,
+  PCI_BUS             = 8,
+  PCI_COMPONENT       = 9
+} EFI_CPER_SECTION_TYPE;
+typedef enum {
+  RECOVERABLE = 0,
+  FATAL = 1,
+  CORRECTED = 2,
+  NONE = 3
+} ERROR_SEVERITY;
+
+EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE*
+ErrorBlockInitial(
+  VOID   *Block,
+  UINT32 Severity
+);
+BOOLEAN ErrorBlockAddErrorData (
+  IN VOID                  *ErrorBlock,
+  IN UINT32                MaxBlockLength,
+  IN EFI_CPER_SECTION_TYPE TypeOfErrorData,
+  IN VOID                  *GenericErrorData,
+  IN UINT32                SizeOfGenericErrorData,
+  IN ERROR_SEVERITY        ErrorSeverity,
+  IN BOOLEAN               Correctable
+);
+BOOLEAN ErrorBlockAddErrorData (
+  IN VOID                  *ErrorBlock,
+  IN UINT32                MaxBlockLength,
+  IN EFI_CPER_SECTION_TYPE TypeOfErrorData,
+  IN VOID                  *GenericErrorData,
+  IN UINT32                SizeOfGenericErrorData,
+  IN ERROR_SEVERITY        ErrorSeverity,
+  IN BOOLEAN               Correctable
+);
+
+VOID
+GhesV2Initial (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *GhesV2,
+  UINT32                                                          BlockLength
+);
+
+/**
+@param type - one of HARDWARE_ERROR_NOTIFICATION Type, GSIV For ARM,and SCI for X86,
+              Notice: Windows OS hadn't support to GSIV, 20171026
+*/
+VOID
+GhesV2AddNotification (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *This,
+  UINT8                                                           Type
+);
+
+
+EFI_STATUS
+GhesV2LinkErrorBlock (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *GhesV2,
+  GHES_REGISTER                                                  *Register,
+  VOID                                                           *ErrorBlock
+);
+VOID
+GhesV1Initial (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *GhesV1,
+  UINT32                                               BlockLength
+);
+VOID
+GhesV1AddNotification (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
+  UINT8                                                Type
+);
+EFI_STATUS
+GhesV1LinkErrorBlock (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
+  UINT64                                               *ptrBlockAddress,
+  VOID                                                 *ErrorBlock
+);
+
+
+#endif
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h
new file mode 100644
index 0000000000..ca43c83fa0
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h
@@ -0,0 +1,146 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef _ERST_H_
+#define _ERST_H_
+
+#include "Apei.h"
+
+#define ERST_STATUS_SUCCESS                 EFI_ACPI_6_1_ERST_STATUS_SUCCESS
+#define ERST_STATUS_NOT_ENOUGH_SPACE        EFI_ACPI_6_1_ERST_STATUS_NOT_ENOUGH_SPACE
+#define ERST_STATUS_HARDWARE_NOT_AVAILABLE  EFI_ACPI_6_1_ERST_STATUS_HARDWARE_NOT_AVAILABLE
+#define ERST_STATUS_FAILED                  EFI_ACPI_6_1_ERST_STATUS_FAILED
+#define ERST_STATUS_RECORD_STORE_EMPTY      EFI_ACPI_6_1_ERST_STATUS_RECORD_STORE_EMPTY
+#define ERST_STATUS_RECORD_NOT_FOUND        EFI_ACPI_6_1_ERST_STATUS_RECORD_NOT_FOUND
+
+#define ERST_BEGIN_WRITE_VALUE              0x01
+#define ERST_BEGIN_WRITE_MASK               0xFFFFFFFFFFFFFFFF
+#define ERST_BEGIN_READ_VALUE               0x02
+#define ERST_BEGIN_READ_MASK                0xFFFFFFFFFFFFFFFF
+#define ERST_BEGIN_CLEAR_VALUE              0x03
+#define ERST_BEGIN_CLEAR_MASK               0xFFFFFFFFFFFFFFFF
+#define ERST_END_OPERATION_VALUE            0x04
+#define ERST_END_OPERATION_MASK             0xFFFFFFFFFFFFFFFF
+#define ERST_MASK                           0xFFFFFFFFFFFFFFFF
+
+#define ERST_BEGIN_WRITE_OPERATION          EFI_ACPI_6_1_ERST_BEGIN_WRITE_OPERATION
+#define ERST_BEGIN_READ_OPERATION           EFI_ACPI_6_1_ERST_BEGIN_READ_OPERATION
+#define ERST_BEGIN_CLEAR_OPERATION          EFI_ACPI_6_1_ERST_BEGIN_CLEAR_OPERATION
+#define ERST_END_OPERATION                  EFI_ACPI_6_1_ERST_END_OPERATION
+#define ERST_BEGIN_DUMMY_WRITE_OPERATION    EFI_ACPI_6_1_ERST_BEGIN_DUMMY_WRITE_OPERATION
+
+#define ERST_ACTION_NO                      16
+
+#define ERST_RECORD_FREE                    0x00
+#define ERST_RECORD_INUSE                   0x01
+
+#define ERST_RECORD_STORE_IN_NVRAM          0
+#define ERST_RECORD_STORE_IN_MEM            1
+#define ERST_RECORD_STORE_IN_SPI_FLASH      2
+
+#define ERST_LOG_ATTR_NVRAM                 0x02
+
+typedef struct {
+  UINT64 OperationId;
+  UINT64 RecordOffset;
+  UINT64 BusyStatus;
+  UINT64 CommandStatus;
+  UINT64 GetRecordId;
+  UINT64 SetRecordId;
+  UINT64 RecordCount;
+  UINT64 DummyWrite;
+  UINT64 Reserved;
+  UINT64 ErrorLogAddrRange;
+  UINT64 ErrorLogAddrRangeLength;
+  UINT64 ErrorLogAttributes;
+  UINT64 NvRamLogAddrNext;
+  UINT64 NvRamLogSizeRemain;
+} ERST_DATA_STRUCTURE;
+
+typedef struct {
+  UINT16 Signature;
+  UINT16 Data0;
+  UINT16 Data1;
+  UINT8  Data2;
+  UINT8  Attributes; //0: free
+} ERST_ERROR_RECORD_INFO;
+
+///
+/// ERST Table
+///
+
+
+
+typedef struct _ERST_CONTEXT {
+  UINT64 Operation;                  // WRITE,READ,CLEAR,END,
+  UINT64 DummyWrite;                 //DUMMY_WRITE_OPEATION
+  UINT64 RecordOffset;               // Offset form the buffer(error log  adress range)
+  UINT32 BusyStatus;
+  UINT32 CommandStatus;
+  UINT64 KeyRecordId;                //OS Set the Record ID To Read/Write/Search
+  UINT64 MaxTimeOfExecuteOperation;
+  UINT64 RecordCount;                // Num of Record In NVRAM
+  UINT64 ErrorLogAddressRange;       // Address Of Range Top
+  UINT64 ErrorLogAddressRangeLength; // Address Of Range Top
+  UINT64 ErrorLogAttributes;
+  VOID   *NvRamLogAddrRange;
+  UINT64 NvRamLogAddrRangeLength;
+  UINT64 NvRamRecordOffset;
+  UINT64 NvRamNextVallidRecordId;    //Get RecordId entry
+  UINT64 NvRamNextValidRecordOffset;
+  UINT64 NvRamAllRecordLength;
+} ERST_RT_CONTEXT;
+
+typedef struct _ERST_BOOT_CONTEXT {
+  EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER *ErstHeader;
+  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY    *ExecuteOperationEntry;
+  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY    *GetErrorLogAddrRangeAttributes;
+  ERST_RT_CONTEXT                                      *Rt;
+} ERST_BOOT_CONTEXT;
+
+extern EFI_ACPI_TABLE_PROTOCOL              *mAcpiTableProtocol;
+extern APEI_TRUSTED_FIRMWARE_STRUCTURE      *mApeiTrustedfirmwareData;
+
+EFI_STATUS
+ErstHeaderCreator(
+  ERST_BOOT_CONTEXT  *Context,
+  UINT64             BufferSize,//ERST_DATASTORE_SIZE
+  VOID               *NvRamAddrRange,
+  UINT64             NvRamAllRecordLength,
+  UINT64             NvRamAddrRangeLength
+);
+
+VOID
+SetAttributeOfErrorLogAddressRange (
+  ERST_BOOT_CONTEXT  *Context,
+  UINT64             Attribute
+);
+
+/***OEM***/
+EFI_STATUS
+OemInitErstTable (VOID);
+
+EFI_STATUS
+OemErstConfigExecuteOperationEntry (
+  ERST_BOOT_CONTEXT *Context
+);
+
+VOID
+ErstSetAcpiTable (
+  ERST_BOOT_CONTEXT *Context
+);
+
+
+#endif    // _ERST_H_
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h
new file mode 100644
index 0000000000..94f66496e6
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h
@@ -0,0 +1,59 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef _HEST_H_
+#define _HEST_H_
+
+#include "Apei.h"
+
+
+typedef struct _HEST_CONTEXT {
+  EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER  *HestHeader;         // pointer to hest header
+  UINT32                                           OccupiedMemorySize; // allocated memory size for hest
+  VOID                                             *KeyErrorSource;     // key error source, valtile
+} HEST_CONTEXT;
+
+EFI_STATUS
+HestAddErrorSourceDescriptor (
+  IN OUT HEST_CONTEXT  *Context,
+  IN VOID              *ErrorSourceDescriptor,
+  IN UINT32            SizeOfDescriptor
+);
+VOID
+HestSetAcpiTable (
+  IN HEST_CONTEXT *Context
+);
+EFI_STATUS
+HestHeaderCreator (
+  HEST_CONTEXT  *Context,
+  UINT32        PreAllocatedHestSize
+);
+
+/**
+* OEM Interface declaration
+* 1.Interface is not realized default
+* 2.OEM should implement this interface
+*/
+extern
+VOID
+OemHestInitialNotification (VOID);
+
+extern
+EFI_STATUS
+OemInitHestTable(
+  IN EFI_HANDLE ImageHandle
+);
+
+#endif    // _HEST_H_
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h
new file mode 100644
index 0000000000..e6fb386a62
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h
@@ -0,0 +1,43 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#ifndef OEM_APEI_HI1620_H_H
+#define OEM_APEI_HI1620_H_H
+#define GPIO0_BASE             0x94100000
+#define GPIO1_BASE             0x94110000
+#define GPIO_INT_MASK          0x34
+#define GPIO_INT_EN            0x30
+#define GPIO_SWPORT_DDR        0x04
+#define GPIO_INT_TYPE          0x38
+#define GPIO_INT_POLARITY      0x3c
+#define GPIO_LS_SYNC           0x60
+#define GPIO_INT_COMB          0xffc
+#define IOMUX_REG_BASE         0x94190000
+#define IOMG051                0xCC
+#define IOMG052                0xD0
+#define PAD_EX_INT1            0x4
+#define CPLD_GPIO10_INT_OFFSET 0xfc
+#define CPLD_BASE_ADDR         0x80000000
+#define CPLD_MASK              0x01030000
+#define CPLD_VALUE             0x01020000
+
+#define MAX_GHES                          3
+#define GENERIC_HARDWARE_ERROR_BLOCK_SIZE 0x1000
+#define HEST_TABLE_SIZE                   0x2000
+#define BOOT_ERROR_REGION_SIZE            0x1000
+#define GPIO_HEST_NOTIFIED_PIN            BIT8
+
+#define ERST_DATASTORE_SIZE               0x2000
+#endif
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c
new file mode 100644
index 0000000000..8769d88bff
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c
@@ -0,0 +1,108 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+#include <Library/ArmSmcLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/OemConfigData.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include "Apei.h"
+#include "PlatformArch.h"
+#include "bert.h"
+#include "einj.h"
+#include "erst.h"
+#include "hest.h"
+
+EFI_ACPI_TABLE_PROTOCOL        *mAcpiTableProtocol = NULL;
+EFI_ACPI_SDT_PROTOCOL          *mAcpiSdtProtocol = NULL;
+APEI_TRUSTED_FIRMWARE_STRUCTURE      *mApeiTrustedfirmwareData;
+
+EFI_STATUS
+EFIAPI
+ApeiEntryPoint (
+  IN EFI_HANDLE          ImageHandle,
+  IN EFI_SYSTEM_TABLE    *SystemTable
+)
+{
+  EFI_STATUS              Status;
+  ARM_SMC_ARGS            SmcRegs = {0};
+  UINTN                   Size = sizeof (OEM_CONFIG_DATA);
+  OEM_CONFIG_DATA         SetupData;
+
+  Status = gRT->GetVariable (
+             OEM_CONFIG_NAME,
+             &gOemConfigGuid,
+             NULL,
+             &Size,
+             &SetupData
+             );
+  if (EFI_ERROR (Status)) {
+    SetupData.EnRasSupport = 1;
+    DEBUG ((DEBUG_ERROR, "[%a]GetVariable %r.Get default variable value\n",
+      __FUNCTION__, Status));
+  }
+  if (!SetupData.EnRasSupport) {
+    return EFI_ABORTED;
+  }
+  if (PcdGet64 (PcdTrustedFirmwareEnable) == 0) {
+    return EFI_ABORTED;
+  }
+  Status = gBS->LocateProtocol (
+                  &gEfiAcpiTableProtocolGuid,
+                  NULL,
+                  (VOID**)&mAcpiTableProtocol);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  Status = gBS->LocateProtocol (
+                &gEfiAcpiSdtProtocolGuid,
+                NULL,
+                (VOID**)&mAcpiSdtProtocol);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  Status = gBS->AllocatePool (
+             EfiReservedMemoryType,
+             sizeof (APEI_TRUSTED_FIRMWARE_STRUCTURE),
+             (VOID**)&mApeiTrustedfirmwareData
+           );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  gBS->SetMem (
+    mApeiTrustedfirmwareData,
+    sizeof (APEI_TRUSTED_FIRMWARE_STRUCTURE),
+    0
+  );
+  Status = EFI_SUCCESS;
+  Status |= OemInitBertTable (ImageHandle);
+  Status |= OemInitHestTable (ImageHandle);
+  Status |= OemInitErstTable ();
+  Status |= OemInitEinjTable ();
+  // smc call
+  DEBUG ((DEBUG_INFO, "[%a]:[%dL]: %r\n", __FUNCTION__, __LINE__, Status));
+  if (Status == EFI_SUCCESS) {
+    SmcRegs.Arg0 = PRIVATE_ARM_SMC_ID_APEI;
+    SmcRegs.Arg1 = (UINTN)mApeiTrustedfirmwareData;
+    ArmCallSmc (&SmcRegs);
+  }
+  DEBUG ((DEBUG_INFO, "Acpi Apei init done.\n"));
+  return EFI_SUCCESS;
+}
+
+
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c
new file mode 100644
index 0000000000..2953e22690
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c
@@ -0,0 +1,92 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include "bert.h"
+#include "ErrorSource/Ghes.h"
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include "PlatformArch.h"
+
+VOID
+BertSetAcpiTable (
+  IN BERT_CONTEXT *Context
+)
+{
+  UINTN          AcpiTableHandle;
+  EFI_STATUS     Status;
+  if (Context == NULL) {
+    return;
+  }
+  EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER* Bert = Context->BertHeader;
+  Bert->Header.Checksum = CalculateCheckSum8 ((UINT8*)(Bert), Bert->Header.Length);
+  AcpiTableHandle = 0;
+  Status = mAcpiTableProtocol->InstallAcpiTable (
+                                 mAcpiTableProtocol,
+                                 Bert,
+                                 Bert->Header.Length,
+                                 &AcpiTableHandle);
+  ASSERT_EFI_ERROR (Status);
+  return;
+}
+
+BOOLEAN
+BertAddGenericErrorData (
+  IN EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER *Bert,
+  IN EFI_CPER_SECTION_TYPE                       TypeOfErrorData,
+  IN VOID                                        *GenericErrorData,
+  IN UINT32                                      SizeOfGenericErrorData,
+  IN ERROR_SEVERITY                              ErrorSeverity,
+  IN BOOLEAN                                     Correctable
+)
+{
+  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: \n", __FUNCTION__, __LINE__));
+  BOOLEAN Status = ErrorBlockAddErrorData (
+                     (VOID*)Bert->BootErrorRegion,
+                     Bert->BootErrorRegionLength,
+                     TypeOfErrorData,
+                     GenericErrorData,
+                     SizeOfGenericErrorData,
+                     ErrorSeverity,
+                     Correctable);
+  return Status;
+}
+
+EFI_STATUS
+BertHeaderCreator (
+  IN BERT_CONTEXT  *Context,
+  IN UINT32        ErrorBlockSize
+)
+{
+  if (Context == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+  Context->BertHeader = AllocateZeroPool (sizeof (EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER));
+  Context->Block = AllocateReservedZeroPool (ErrorBlockSize);
+  Context->BlockSize = ErrorBlockSize;
+  *Context->BertHeader = (EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER) {
+    ARM_ACPI_HEADER (
+      EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_SIGNATURE,
+      EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER,
+      EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_REVISION
+      ),
+    Context->BlockSize,
+    (UINT64)Context->Block
+  };
+  return EFI_SUCCESS;
+}
+
+
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c
new file mode 100644
index 0000000000..c53f4cdb3c
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c
@@ -0,0 +1,349 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+#include "einj.h"
+#include <IndustryStandard/Acpi62.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include "OemApeiHi1620.h"
+#include "PlatformArch.h"
+
+
+EINJ_TABLE mEinj = {
+  {
+    ARM_ACPI_HEADER (
+      EFI_ACPI_6_0_ERROR_INJECTION_TABLE_SIGNATURE,
+      EFI_ACPI_6_0_ERROR_INJECTION_TABLE_HEADER,
+      EFI_ACPI_6_0_ERROR_INJECTION_TABLE_REVISION
+    ),
+    sizeof (EFI_ACPI_6_0_ERROR_INJECTION_TABLE_HEADER),
+    0x0,
+    {
+      0x0,
+      0x0,
+      0x0
+    },
+    EINJ_ACTION_NO
+  },
+  {
+    {
+      // 0 EFI_ACPI_6_0_EINJ_BEGIN_INJECTION_OPERATION
+      EFI_ACPI_6_0_EINJ_BEGIN_INJECTION_OPERATION,
+      EFI_ACPI_6_0_EINJ_WRITE_REGISTER_VALUE,
+      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      EINJ_BEGIN_OPERATION_VALUE,
+      EINJ_WRITE_MASK
+    },
+    {
+      // 1 EFI_ACPI_6_0_EINJ_GET_TRIGGER_ERROR_ACTION_TABLE
+      EFI_ACPI_6_0_EINJ_GET_TRIGGER_ERROR_ACTION_TABLE,
+      EFI_ACPI_6_0_EINJ_READ_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      EINJ_READ_MASK
+    },
+    {
+      // 2 EFI_ACPI_6_0_EINJ_SET_ERROR_TYPE
+      EFI_ACPI_6_0_EINJ_SET_ERROR_TYPE,
+      EFI_ACPI_6_0_EINJ_WRITE_REGISTER,
+      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      EINJ_WRITE_MASK
+    },
+    {
+      // 3 EFI_ACPI_6_0_EINJ_GET_ERROR_TYPE
+      EFI_ACPI_6_0_EINJ_GET_ERROR_TYPE,
+      EFI_ACPI_6_0_EINJ_READ_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      0xFFFFFFFF
+    },
+    {
+      // 4 EFI_ACPI_6_0_EINJ_END_OPERATION
+      EFI_ACPI_6_0_EINJ_END_OPERATION,
+      EFI_ACPI_6_0_EINJ_WRITE_REGISTER_VALUE,
+      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      EINJ_END_OPERATION_VALUE,
+      0xFFFFFFFF
+    },
+    {
+      // 5 EFI_ACPI_6_0_EINJ_EXECUTE_OPERATION
+      EFI_ACPI_6_0_EINJ_EXECUTE_OPERATION,
+      EFI_ACPI_6_0_EINJ_WRITE_REGISTER_VALUE,
+      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        32,
+        0,
+        EFI_ACPI_6_0_DWORD,
+        GPIO1_BASE + GPIO_INT_MASK //0x40070008//0x4d000F00//GPIO0_BASE + GPIO0_SWPORT_DR_OFFSET
+      },
+      0,
+      0xFFFFFFFF //BIT0
+    },
+    {
+      // 6 EFI_ACPI_6_0_EINJ_CHECK_BUSY_STATUS
+      EFI_ACPI_6_0_EINJ_CHECK_BUSY_STATUS,
+      EFI_ACPI_6_0_EINJ_READ_REGISTER_VALUE,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0x01,
+      0x01
+    },
+    {
+      // 7 EFI_ACPI_6_0_EINJ_GET_COMMAND_STATUS
+      EFI_ACPI_6_0_EINJ_GET_COMMAND_STATUS,
+      EFI_ACPI_6_0_EINJ_READ_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      0x3
+    },
+    {
+      // 8 EFI_ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS
+      EFI_ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS,
+      EFI_ACPI_6_0_EINJ_WRITE_REGISTER,
+      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      0xFFFFFF
+    },
+    {
+      // 9 EFI_ACPI_EINJ_GET_EXCUTE_OPERATION_TIMINGS
+      EFI_ACPI_EINJ_GET_EXCUTE_OPERATION_TIMINGS,
+      EFI_ACPI_6_0_EINJ_WRITE_REGISTER,
+      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      0xFFFFFF
+    }
+  }
+};
+
+EINJ_TRIGGER_ERROR_ACTION mEinjTriggerErrorAction = {
+  {
+    sizeof (EFI_ACPI_6_0_EINJ_TRIGGER_ACTION_TABLE),
+    0,
+    sizeof (EINJ_TRIGGER_ERROR_ACTION),
+    EINJ_TRIGGER_ERROR_ACTION_NO
+  },
+  {
+    {
+      EFI_ACPI_6_0_EINJ_TRIGGER_ERROR,
+      EFI_ACPI_6_0_EINJ_NOOP,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_DWORD,
+        0
+      },
+      0,
+      0
+    }
+  }
+};
+
+
+VOID
+EinjSetAcpiTable (
+  EINJ_CONTEXT *Context
+)
+{
+  UINTN                   AcpiTableHandle;
+  EFI_STATUS              Status;
+  UINT8                   Checksum;
+  EFI_ACPI_SDT_HEADER     *Table;
+  EFI_ACPI_TABLE_VERSION  TableVersion;
+  UINTN                   TableKey;
+  UINTN                   i;
+
+  Context->EINJ->EinjTableHeader.Header.Length = sizeof (EINJ_TABLE);
+  Checksum = CalculateCheckSum8 (
+               (UINT8*)(Context->EINJ),
+               Context->EINJ->EinjTableHeader.Header.Length);
+  Context->EINJ->EinjTableHeader.Header.Checksum = Checksum;
+  AcpiTableHandle = 0;
+  Status = mAcpiTableProtocol->InstallAcpiTable (
+             mAcpiTableProtocol,
+             Context->EINJ,
+             Context->EINJ->EinjTableHeader.Header.Length,
+             &AcpiTableHandle
+           );
+  for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) {
+    Status = mAcpiSdtProtocol->GetAcpiTable (i, &Table, &TableVersion, &TableKey);
+    if (EFI_ERROR (Status)) {
+      break;
+    }
+    if (Table->Signature != EFI_ACPI_6_0_ERROR_INJECTION_TABLE_SIGNATURE) {
+      continue;
+    }
+    mApeiTrustedfirmwareData->EinjTableAddress = (EFI_PHYSICAL_ADDRESS)Table;
+    mApeiTrustedfirmwareData->EinjDataStruct = (EFI_PHYSICAL_ADDRESS)Context->EinjData;
+  }
+  ASSERT_EFI_ERROR (Status) ;
+}
+//V2
+EFI_STATUS
+EinjHeaderCreator (
+  EINJ_CONTEXT *Context
+)
+{
+  EFI_STATUS           Status;
+  EINJ_DATA_STRUCTURE  *EinjData = NULL;
+  Status = gBS->AllocatePool (
+             EfiReservedMemoryType,
+             sizeof (EINJ_DATA_STRUCTURE),
+             (VOID**)&EinjData
+           );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  gBS->SetMem (
+    EinjData,
+    sizeof (EINJ_DATA_STRUCTURE),
+    0
+  );
+
+  DEBUG ((DEBUG_INFO, "EINJ EinjData is at 0x%X,size =0x%x\n",
+          EinjData, sizeof (EINJ_DATA_STRUCTURE)));
+  EinjData->TriggerErrorActionTablePtr =
+    (EINJ_TRIGGER_ERROR_ACTION*)(&(EinjData->TriggerErrorActionTable));
+  gBS->CopyMem (
+         EinjData->TriggerErrorActionTablePtr,
+         &mEinjTriggerErrorAction,
+         sizeof (EINJ_TRIGGER_ERROR_ACTION));
+  EinjData->OperationBegin = 0;
+  EinjData->ErrorType = 0;
+  EinjData->ErrorCapabilities = 0xFFF;
+  EinjData->BusyStatus = 0;
+  EinjData->CommandStatus = 0;
+  mEinj.EinjInstructionEntry[0].RegisterRegion.Address =
+    (UINT64)(&(EinjData->OperationBegin));
+  mEinj.EinjInstructionEntry[1].RegisterRegion.Address =
+    (UINT64)(&(EinjData->TriggerErrorActionTablePtr));
+  mEinj.EinjInstructionEntry[2].RegisterRegion.Address =
+    (UINT64)(&(EinjData->ErrorType));
+  mEinj.EinjInstructionEntry[3].RegisterRegion.Address =
+    (UINT64)(&(EinjData->ErrorCapabilities));
+  mEinj.EinjInstructionEntry[4].RegisterRegion.Address =
+    (UINT64)(&(EinjData->OperationBegin));
+  mEinj.EinjInstructionEntry[6].RegisterRegion.Address =
+    (UINT64)(&(EinjData->BusyStatus));
+  mEinj.EinjInstructionEntry[7].RegisterRegion.Address =
+    (UINT64)(&(EinjData->CommandStatus));
+  mEinj.EinjInstructionEntry[8].RegisterRegion.Address =
+    (UINT64)(&(EinjData->ErrorTypeWithAddress));
+  mEinj.EinjInstructionEntry[9].RegisterRegion.Address =
+    (UINT64)(&(EinjData->Timming));
+  EinjData->ErrorTypeWithAddress.VendorErrorTypeOffset =
+    (UINT32)((UINTN)&(EinjData->VendorErrorTypeExtension) -
+    (UINTN)&(EinjData->ErrorTypeWithAddress));
+  Context->EinjData = EinjData;
+  Context->EINJ = &mEinj;
+  Context->ExecuteOperationEntry = &mEinj.EinjInstructionEntry[5];
+  Context->GetErrorTypeEntry = &mEinj.EinjInstructionEntry[3];
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+EinjConfigErrorInjectCapability (
+  EINJ_CONTEXT* Context,
+  UINT32        BitsSupportedErrorType
+)
+{
+  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY* KeyEntry;
+  UINT32*                                        EinjCapablity;
+
+  KeyEntry = Context->GetErrorTypeEntry;
+  EinjCapablity = (UINT32*)KeyEntry->RegisterRegion.Address;
+  *EinjCapablity = BitsSupportedErrorType;
+  KeyEntry->Value = BitsSupportedErrorType;
+  return EFI_SUCCESS;
+}
+
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c
new file mode 100644
index 0000000000..6d69b90e9b
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c
@@ -0,0 +1,330 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Guid/Cper.h>
+#include "Ghes.h"
+#include <Library/DebugLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+
+#define READ_ACK_PRESERVE 0xFFFFFFFE
+#define READ_ACK_WRITE 0x1
+
+EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE*
+ErrorBlockInitial (
+  VOID   *Block,
+  UINT32 Severity
+)
+{
+  EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE* BlockHeader = Block;
+  BlockHeader->BlockStatus = (EFI_ACPI_6_1_ERROR_BLOCK_STATUS) {0, 0, 0, 0, 0};
+  BlockHeader->RawDataOffset = 0;
+  BlockHeader->RawDataLength = 0;
+  BlockHeader->DataLength = 0;
+  BlockHeader->ErrorSeverity = Severity;
+  return BlockHeader;
+}
+
+
+BOOLEAN
+ErrorBlockUpdateStatusStructure (
+  VOID *ErrorBlock
+)
+{
+  if (ErrorBlock == NULL) {
+    return FALSE;
+  }
+  IN EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE *BlockHeader =  ErrorBlock;
+  VOID *EntriesBegin = ErrorBlock + sizeof (EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE);
+  if (BlockHeader->BlockStatus.ErrorDataEntryCount == 0) {
+    gBS->SetMem (EntriesBegin, BlockHeader->DataLength, 0);
+    BlockHeader->RawDataLength = 0;
+    BlockHeader->RawDataOffset = 0;
+    BlockHeader->DataLength = 0;
+  }
+  return TRUE;
+}
+
+
+BOOLEAN
+ErrorBlockAddErrorData (
+  IN VOID                  *ErrorBlock,
+  IN UINT32                MaxBlockLength,
+  IN EFI_CPER_SECTION_TYPE TypeOfErrorData,
+  IN VOID                  *GenericErrorData,
+  IN UINT32                SizeOfGenericErrorData,
+  IN ERROR_SEVERITY        ErrorSeverity,
+  IN BOOLEAN               Correctable
+)
+{
+  if (ErrorBlock == NULL || GenericErrorData == NULL) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]Invalid Param \n", __FUNCTION__, __LINE__));
+    return FALSE;
+  }
+  EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE*  Entry;
+  EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE* BlockHeader = ErrorBlock;
+  EFI_ACPI_6_1_ERROR_BLOCK_STATUS* BlockStatus = &BlockHeader->BlockStatus;
+  (VOID)ErrorBlockUpdateStatusStructure (ErrorBlock);
+  UINT32 ExpectedNewDataLength = BlockHeader->DataLength +
+           sizeof (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE) +
+           SizeOfGenericErrorData;
+  if (sizeof (EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE) + ExpectedNewDataLength >
+      MaxBlockLength) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]Out of BlockSize \n", __FUNCTION__, __LINE__));
+    return FALSE;
+  }
+  // guid
+  EFI_GUID Guid;
+  switch (TypeOfErrorData) {
+    case PROCESSOR_GENERIC:
+      Guid = (EFI_GUID)EFI_ERROR_SECTION_PROCESSOR_GENERIC_GUID;
+      break;
+    case PROCESSOR_ARM:
+      Guid = (EFI_GUID)EFI_ERROR_SECTION_PROCESSOR_SPECIFIC_ARM_GUID;
+      break;
+    case PLATFORM_MEMORY:
+      Guid = (EFI_GUID)EFI_ERROR_SECTION_PLATFORM_MEMORY_GUID;
+      break;
+    case PLATFORM_MEMORY2:
+      Guid = (EFI_GUID)EFI_ERROR_SECTION_PLATFORM_MEMORY2_GUID;
+      break;
+    case PCIE_EXPRESS:
+      Guid = (EFI_GUID)EFI_ERROR_SECTION_PCIE_GUID;
+      break;
+    case FIRMWARE_ERROR:
+      Guid = (EFI_GUID)EFI_ERROR_SECTION_FW_ERROR_RECORD_GUID;
+      break;
+    case PCI_BUS:
+      Guid = (EFI_GUID)EFI_ERROR_SECTION_PCI_PCIX_BUS_GUID;
+      break;
+    case PCI_COMPONENT:
+      Guid = (EFI_GUID)EFI_ERROR_SECTION_PCI_DEVICE_GUID;
+      break;
+    default:
+      return FALSE;
+  }
+  //Block Status
+  if (Correctable == TRUE) {
+    if (BlockStatus->CorrectableErrorValid == 0) {
+      BlockStatus->CorrectableErrorValid = 1;
+    } else {
+      BlockStatus->MultipleCorrectableErrors = 1;
+    }
+  } else {
+    if (BlockStatus->UncorrectableErrorValid == 0) {
+      BlockStatus->UncorrectableErrorValid = 1;
+    } else {
+      BlockStatus->MultipleUncorrectableErrors = 1;
+    }
+  }
+  BlockStatus->ErrorDataEntryCount++;
+  // Entry
+  Entry = (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE*)(ErrorBlock +
+           sizeof (EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE) +
+           BlockHeader->DataLength);
+  gBS->SetMem (Entry, sizeof (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE), 0);
+  gBS->CopyMem (&Entry->SectionType, &Guid, sizeof (EFI_GUID));
+  Entry->ErrorSeverity = ErrorSeverity;
+  Entry->Revision = EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_REVISION;
+  Entry->ErrorDataLength = SizeOfGenericErrorData;
+  VOID*  GenericErrorDataFollowEntry = (VOID*)Entry +
+           sizeof (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE);
+  gBS->CopyMem (
+         GenericErrorDataFollowEntry,
+         GenericErrorData,
+         SizeOfGenericErrorData);
+  // BlockHeader
+  BlockHeader->RawDataOffset = 0;
+  BlockHeader->RawDataLength = 0;
+  BlockHeader->DataLength = ExpectedNewDataLength;
+  return TRUE;
+}
+
+VOID
+GhesV2Initial (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *GhesV2,
+  UINT32                                                         BlockLength
+)
+{
+  if (GhesV2 == NULL) {
+    return;
+  }
+  *GhesV2 = (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE) {
+    .Type = EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_VERSION_2,
+    .SourceId = 0,
+    .RelatedSourceId = 0xFFFF,
+    .Flags = 0,
+    .Enabled = 1,
+    .NumberOfRecordsToPreAllocate = 1,//ERROR BLOCK
+    .MaxSectionsPerRecord = 1,// Num Entries(section)
+    .MaxRawDataLength = BlockLength, // Max Size Of a Raw Data
+    .ErrorStatusAddress = {
+      .AddressSpaceId = EFI_ACPI_6_1_SYSTEM_MEMORY,
+      .RegisterBitWidth = 64,
+      .RegisterBitOffset = 0,
+      .AccessSize = EFI_ACPI_6_1_QWORD,
+      .Address = 0
+    },
+    .NotificationStructure = {
+      .Type = EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV,
+      .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE),
+      .ConfigurationWriteEnable = {0, 0, 0, 0, 0, 0, 0} ,
+      .PollInterval = 0,
+      .Vector = 0,
+      .SwitchToPollingThresholdValue = 0,
+      .SwitchToPollingThresholdWindow = 0,
+      .ErrorThresholdValue = 0,
+      .ErrorThresholdWindow = 0
+    },
+    .ErrorStatusBlockLength = BlockLength,
+    .ReadAckRegister = {
+      .AddressSpaceId = EFI_ACPI_6_1_SYSTEM_MEMORY,
+      .RegisterBitWidth = 64,
+      .RegisterBitOffset = 0,
+      .AccessSize = EFI_ACPI_6_1_QWORD,
+      .Address = 0
+    },
+    .ReadAckPreserve = READ_ACK_PRESERVE,
+    .ReadAckWrite = READ_ACK_WRITE
+  };
+  return;
+}
+
+VOID
+GhesV2AddNotification (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *This,
+  UINT8                                                           Type
+)
+{
+  This->NotificationStructure = (EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_STRUCTURE) {
+    .Type = Type,
+    .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE),
+    .ConfigurationWriteEnable = {
+      .Type = 0,
+      .PollInterval = 1,
+      .SwitchToPollingThresholdValue = 1,
+      .SwitchToPollingThresholdWindow = 1,
+      .ErrorThresholdValue = 1,
+      .ErrorThresholdWindow = 1
+    },
+    .PollInterval = 20,
+    .Vector = 0,
+    .SwitchToPollingThresholdValue = 0,
+    .SwitchToPollingThresholdWindow = 0,
+    .ErrorThresholdValue = 0,
+    .ErrorThresholdWindow = 0
+  };
+  return;
+}
+
+EFI_STATUS
+GhesV2LinkErrorBlock (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *GhesV2,
+  GHES_REGISTER                                                  *Register,
+  VOID                                                           *ErrorBlock
+)
+{
+  if (ErrorBlock == NULL || Register == NULL || GhesV2 == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Register->ErrorStatusBlockAddress = (UINTN)ErrorBlock;
+  GhesV2->ErrorStatusAddress.Address = (UINTN)&(Register->ErrorStatusBlockAddress);
+  Register->AckRegister = READ_ACK_WRITE;
+  GhesV2->ReadAckRegister.Address = (UINT64)&(Register->AckRegister);
+  return EFI_SUCCESS;
+}
+
+
+VOID GhesV1Initial (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *GhesV1,
+  UINT32 BlockLength
+)
+{
+  if (GhesV1 == NULL) {
+    return;
+  }
+  *GhesV1 = (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE) {
+    .Type = EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR,
+    .SourceId = 0,
+    .RelatedSourceId = 0xFFFF,
+    .Flags = 0,
+    .Enabled = 1,
+    .NumberOfRecordsToPreAllocate = 1,//ERROR BLOCK
+    .MaxSectionsPerRecord = 1,// Num Entries(section)
+    .MaxRawDataLength = BlockLength, // Max Size Of a Raw Data
+    .ErrorStatusAddress = {
+      .AddressSpaceId = EFI_ACPI_6_1_SYSTEM_MEMORY,
+      .RegisterBitWidth = 64,
+      .RegisterBitOffset = 0,
+      .AccessSize = EFI_ACPI_6_1_QWORD,
+      .Address = 0
+    },
+    .NotificationStructure = {
+      .Type = EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV,
+      .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE),
+      .ConfigurationWriteEnable = {0, 0, 0, 0, 0, 0, 0},
+      .PollInterval = 0,
+      .Vector = 0,
+      .SwitchToPollingThresholdValue = 0,
+      .SwitchToPollingThresholdWindow = 0,
+      .ErrorThresholdValue = 0,
+      .ErrorThresholdWindow = 0
+    },
+    .ErrorStatusBlockLength = BlockLength,
+  };
+  return;
+}
+
+VOID
+GhesV1AddNotification (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
+  UINT8                                                Type
+)
+{
+  This->NotificationStructure = (EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_STRUCTURE) {
+    .Type = Type,
+    .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE),
+    .ConfigurationWriteEnable = {
+      .Type = 0,
+      .PollInterval = 1,
+      .SwitchToPollingThresholdValue = 1,
+      .SwitchToPollingThresholdWindow = 1,
+      .ErrorThresholdValue = 1,
+      .ErrorThresholdWindow = 1
+    },
+    .PollInterval = 20,
+    .Vector = 0,
+    .SwitchToPollingThresholdValue = 0,
+    .SwitchToPollingThresholdWindow = 0,
+    .ErrorThresholdValue = 0,
+    .ErrorThresholdWindow = 0
+  };
+  return;
+}
+
+EFI_STATUS GhesV1LinkErrorBlock (
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
+  UINT64                                               *ptrBlockAddress,
+  VOID                                                 *ErrorBlock
+)
+{
+  if (ErrorBlock == NULL || ptrBlockAddress == NULL || This == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+  *ptrBlockAddress = (UINTN)ErrorBlock;
+  This->ErrorStatusAddress.Address = (UINTN) ptrBlockAddress;
+  return EFI_SUCCESS;
+}
+
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c
new file mode 100644
index 0000000000..80d7d43c5b
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c
@@ -0,0 +1,374 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+#include "erst.h"
+#include <Guid/Cper.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include "PlatformArch.h"
+
+typedef struct {
+  EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER ErstTableHeader;
+  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY    ErstInstructionEntry[ERST_ACTION_NO];
+} ERST_TABLE;
+
+ERST_TABLE mErst = {
+  {
+    ARM_ACPI_HEADER (
+      EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_SIGNATURE,
+      EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_HEADER,
+      EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_REVISION
+    ),
+    sizeof (EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_HEADER),
+    {
+      0x0,
+      0x0,
+      0x0,
+      0x0
+    },
+    ERST_ACTION_NO,
+  },
+  {
+    {
+      // 0 EFI_ACPI_6_0_ERST_BEGIN_WRITE_OPERATION
+      EFI_ACPI_6_0_ERST_BEGIN_WRITE_OPERATION,
+      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      ERST_BEGIN_WRITE_VALUE,
+      ERST_BEGIN_WRITE_MASK
+    },
+    {
+      // 1 EFI_ACPI_6_0_ERST_BEGIN_READ_OPERATION
+      EFI_ACPI_6_0_ERST_BEGIN_READ_OPERATION,
+      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      ERST_BEGIN_READ_VALUE,
+      ERST_BEGIN_READ_MASK
+    },
+    {
+      // 2 EFI_ACPI_6_0_ERST_BEGIN_CLEAR_OPERATION
+      EFI_ACPI_6_0_ERST_BEGIN_CLEAR_OPERATION,
+      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      ERST_BEGIN_CLEAR_VALUE,
+      ERST_BEGIN_CLEAR_MASK
+    },
+    {
+      // 3 EFI_ACPI_6_0_ERST_END_OPERATION
+      EFI_ACPI_6_0_ERST_END_OPERATION,
+      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
+      EFI_ACPI_6_0_ERST_PRESERVE_REGISTER,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      ERST_END_OPERATION_VALUE,
+      ERST_END_OPERATION_MASK
+    },
+    {
+      // 4 EFI_ACPI_6_0_ERST_SET_RECORD_OFFSET
+      EFI_ACPI_6_0_ERST_SET_RECORD_OFFSET,
+      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    },
+    {
+      // 5 EFI_ACPI_6_0_ERST_EXECUTE_OPERATION
+      EFI_ACPI_6_0_ERST_EXECUTE_OPERATION,
+      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_DWORD,
+        0x94730000
+      },
+      0x0002,
+      0x0002
+    },
+    {
+      // 6 EFI_ACPI_6_0_ERST_CHECK_BUSY_STATUS
+      EFI_ACPI_6_0_ERST_CHECK_BUSY_STATUS,
+      EFI_ACPI_6_0_ERST_READ_REGISTER_VALUE,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0x00000001,
+      0x00000001
+    },
+    {
+      // 7 EFI_ACPI_6_0_ERST_GET_COMMAND_STATUS
+      EFI_ACPI_6_0_ERST_GET_COMMAND_STATUS,
+      EFI_ACPI_6_0_ERST_READ_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    },
+    {
+      // 8 EFI_ACPI_6_0_ERST_GET_RECORD_IDENTIFIER
+      EFI_ACPI_6_0_ERST_GET_RECORD_IDENTIFIER,
+      EFI_ACPI_6_0_ERST_READ_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    },
+    {
+      // 9 EFI_ACPI_6_0_ERST_SET_RECORD_IDENTIFIER
+      EFI_ACPI_6_0_ERST_SET_RECORD_IDENTIFIER,
+      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    },
+    {
+      // A EFI_ACPI_6_0_ERST_GET_RECORD_COUNT
+      EFI_ACPI_6_0_ERST_GET_RECORD_COUNT,
+      EFI_ACPI_6_0_ERST_READ_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    },
+    {
+      // B EFI_ACPI_6_0_ERST_BEGIN_DUMMY_WRITE_OPERATION
+      EFI_ACPI_6_0_ERST_BEGIN_DUMMY_WRITE_OPERATION,
+      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    },
+    {
+      // C RESERVED
+      0x0C,
+      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    },
+    {
+      // D EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE
+      EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE,
+      EFI_ACPI_6_0_ERST_READ_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    },
+    {
+      // E EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_LENGTH
+      EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_LENGTH,
+      EFI_ACPI_6_0_ERST_READ_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    },
+    {
+      // F EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_ATTRIBUTES
+      EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_ATTRIBUTES,
+      EFI_ACPI_6_0_ERST_READ_REGISTER,
+      0,
+      0,
+      {
+        EFI_ACPI_6_0_SYSTEM_MEMORY,
+        64,
+        0,
+        EFI_ACPI_6_0_QWORD,
+        0
+      },
+      0,
+      ERST_MASK
+    }
+  }
+};
+
+VOID
+ErstSetAcpiTable (
+  ERST_BOOT_CONTEXT *Context
+)
+{
+  UINTN                     AcpiTableHandle;
+  EFI_STATUS                Status;
+  UINT8                     Checksum;
+  mErst.ErstTableHeader.Header.Length = sizeof (ERST_TABLE);
+  Checksum = CalculateCheckSum8 ((UINT8*)(&mErst), mErst.ErstTableHeader.Header.Length);
+  mErst.ErstTableHeader.Header.Checksum = Checksum;
+  AcpiTableHandle = 0;
+  Status = mAcpiTableProtocol->InstallAcpiTable (
+             mAcpiTableProtocol,
+             &mErst,
+             mErst.ErstTableHeader.Header.Length,
+             &AcpiTableHandle
+             );
+  ASSERT_EFI_ERROR (Status) ;
+}
+
+EFI_STATUS
+ErstHeaderCreator (
+  ERST_BOOT_CONTEXT  *Context,
+  UINT64             BufferSize,//ERST_DATASTORE_SIZE
+  VOID               *NvRamAddrRange,
+  UINT64             NvRamAllRecordLength,
+  UINT64             NvRamAddrRangeLength
+)
+{
+  EFI_STATUS            Status = EFI_SUCCESS;
+  ERST_RT_CONTEXT       *ErstRtCtx;
+  //
+  ErstRtCtx = AllocateReservedZeroPool (sizeof (ERST_RT_CONTEXT));
+  ErstRtCtx->Operation = ERST_END_OPERATION;
+  ErstRtCtx->RecordOffset = 0;
+  ErstRtCtx->BusyStatus = 0;
+  ErstRtCtx->CommandStatus = 0;
+  ErstRtCtx->KeyRecordId = 0;
+  ErstRtCtx->MaxTimeOfExecuteOperation = MAX_UINT64;
+  ErstRtCtx->RecordCount = 0;
+  ErstRtCtx->ErrorLogAddressRange = (UINT64)AllocateReservedZeroPool (BufferSize);
+  ErstRtCtx->ErrorLogAddressRangeLength = BufferSize;
+  ErstRtCtx->ErrorLogAttributes = 0;
+  ErstRtCtx->NvRamLogAddrRange = NvRamAddrRange;
+  ErstRtCtx->NvRamLogAddrRangeLength = NvRamAddrRangeLength;
+  ErstRtCtx->NvRamRecordOffset = 0;
+  ErstRtCtx->NvRamNextVallidRecordId = MAX_UINT64;
+  ErstRtCtx->NvRamNextValidRecordOffset = 0;
+  ErstRtCtx->NvRamAllRecordLength = NvRamAllRecordLength;
+  mErst.ErstInstructionEntry[0].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
+  mErst.ErstInstructionEntry[1].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
+  mErst.ErstInstructionEntry[2].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
+  mErst.ErstInstructionEntry[3].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
+  mErst.ErstInstructionEntry[4].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->RecordOffset));
+  mErst.ErstInstructionEntry[6].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->BusyStatus));
+  mErst.ErstInstructionEntry[7].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->CommandStatus));
+  mErst.ErstInstructionEntry[8].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->NvRamNextVallidRecordId));
+  mErst.ErstInstructionEntry[9].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->KeyRecordId));
+  mErst.ErstInstructionEntry[10].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->RecordCount));
+  mErst.ErstInstructionEntry[11].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->DummyWrite));
+  mErst.ErstInstructionEntry[12].RegisterRegion.Address = 0;
+  mErst.ErstInstructionEntry[13].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->ErrorLogAddressRange));
+  mErst.ErstInstructionEntry[14].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->ErrorLogAddressRangeLength));
+  mErst.ErstInstructionEntry[15].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->ErrorLogAttributes));
+  Context->ErstHeader = (EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER*)&mErst;
+  Context->ExecuteOperationEntry = &(mErst.ErstInstructionEntry[5]);
+  Context->GetErrorLogAddrRangeAttributes = &(mErst.ErstInstructionEntry[15]);
+  Context->Rt = ErstRtCtx;
+  return Status;
+};
+
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c
new file mode 100644
index 0000000000..eea73af229
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c
@@ -0,0 +1,119 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include "ErrorSource/Ghes.h"
+#include "hest.h"
+#include <IndustryStandard/Acpi62.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include "PlatformArch.h"
+
+EFI_STATUS HestAddErrorSourceDescriptor (
+  IN OUT HEST_CONTEXT  *Context,
+  IN VOID              *ErrorSourceDescriptor,
+  IN UINT32            SizeOfDescriptor
+)
+{
+  UINT16                                          *pSourceId;
+  VOID                                            *Descriptor;
+  EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeader;
+
+  if ((Context == NULL) || (ErrorSourceDescriptor == NULL)) {
+    return EFI_INVALID_PARAMETER;
+  }
+  HestHeader = Context->HestHeader;
+  if (HestHeader->Header.Length + SizeOfDescriptor > Context->OccupiedMemorySize) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: Hest Size Too small\n", __FUNCTION__, __LINE__));
+    return EFI_BUFFER_TOO_SMALL;
+  }
+  Descriptor = (UINT8*)HestHeader + HestHeader->Header.Length;
+  gBS->CopyMem ((VOID*)Descriptor , ErrorSourceDescriptor, SizeOfDescriptor);
+  pSourceId = Descriptor + sizeof (UINT16);
+  *pSourceId = HestHeader->ErrorSourceCount;
+  HestHeader->Header.Length += SizeOfDescriptor;
+  HestHeader->ErrorSourceCount++;
+  Context->KeyErrorSource = Descriptor;
+  return EFI_SUCCESS;
+}
+
+VOID
+HestSetAcpiTable (
+  IN HEST_CONTEXT  *Context
+)
+{
+  UINTN                     AcpiTableHandle;
+  EFI_STATUS                Status;
+  UINT8                     Checksum;
+  EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeader;
+  EFI_ACPI_SDT_HEADER       *Table;
+  EFI_ACPI_TABLE_VERSION    TableVersion;
+  UINTN                     TableKey;
+  UINT32                    Index;
+  if (Context == NULL) {
+    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: ERROR\n", __FUNCTION__, __LINE__));
+    return;
+  }
+
+  HestHeader = Context->HestHeader;
+  Checksum = CalculateCheckSum8 ((UINT8*)(HestHeader),  HestHeader->Header.Length);
+  HestHeader->Header.Checksum = Checksum;
+  AcpiTableHandle = 0;
+  // see AcpiTableProtocol.c InstallAcpiTable
+  Status = mAcpiTableProtocol->InstallAcpiTable (
+                                  mAcpiTableProtocol,
+                                  HestHeader,
+                                  HestHeader->Header.Length,
+                                  &AcpiTableHandle);
+  for (Index = 0; Index < EFI_ACPI_MAX_NUM_TABLES; Index++) {
+    Status = mAcpiSdtProtocol->GetAcpiTable (Index, &Table, &TableVersion, &TableKey);
+    if (EFI_ERROR (Status)) {
+      break;
+    }
+    if (Table->Signature != EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE) {
+      continue;
+    }
+    mApeiTrustedfirmwareData->HestTableAddress = (EFI_PHYSICAL_ADDRESS)Table;
+    DEBUG ((DEBUG_ERROR, "Acpi HestSetAcpiTable Table = 0x%x.\n", (EFI_PHYSICAL_ADDRESS)Table));
+  }
+  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]:OUT %llx, IN %llx \n", __FUNCTION__, __LINE__,
+          AcpiTableHandle, Context->HestHeader));
+  return;
+}
+
+EFI_STATUS
+HestHeaderCreator (
+  HEST_CONTEXT  *Context,
+  UINT32        PreAllocatedHestSize
+)
+{
+  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: \n", __FUNCTION__, __LINE__));
+  if (PreAllocatedHestSize < sizeof (EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER)) {
+    return EFI_BUFFER_TOO_SMALL;
+  }
+  Context->HestHeader = AllocateReservedZeroPool (PreAllocatedHestSize);
+  *Context->HestHeader = (EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER) {
+   ARM_ACPI_HEADER (
+      EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE,
+      EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER,
+      EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_REVISION
+    ),
+    0x0
+  };
+  Context->KeyErrorSource = Context->HestHeader + 1;
+  Context->OccupiedMemorySize = PreAllocatedHestSize;
+  return EFI_SUCCESS;
+}
diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c
new file mode 100644
index 0000000000..de972b8a9e
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c
@@ -0,0 +1,337 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Guid/Cper.h>
+#include <IndustryStandard/Acpi62.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+
+#include "Bert/bert.h"
+#include "Einj/einj.h"
+#include "ErrorSource/Ghes.h"
+#include "Erst/erst.h"
+#include "Hest/hest.h"
+#include "OemApeiHi1620.h"
+
+VOID
+GpioCombInit (
+  UINTN  Base,
+  UINT32 Pin
+)
+{
+  UINT32 Val = MmioRead32 (Base + GPIO_INT_MASK);
+  MmioWrite32 (Base + GPIO_INT_MASK, Val | Pin);
+  Val = MmioRead32 (Base + GPIO_INT_EN);
+  MmioWrite32 (Base + GPIO_INT_EN, Val | Pin);
+  Val = MmioRead32 (Base + GPIO_SWPORT_DDR);
+  MmioWrite32 (Base + GPIO_SWPORT_DDR, Val & (~Pin));
+  Val = MmioRead32 (Base + GPIO_INT_TYPE);
+  MmioWrite32 (Base + GPIO_INT_TYPE, Val & (~Pin));
+  Val = MmioRead32 (Base + GPIO_INT_POLARITY);
+  MmioWrite32 (Base + GPIO_INT_POLARITY, Val | Pin);
+  Val = MmioRead32 (Base + GPIO_LS_SYNC);
+  MmioWrite32 (Base + GPIO_LS_SYNC, Val & (~Pin));
+  MmioWrite32 (Base + GPIO_INT_COMB, 1);
+  return;
+}
+/************************************************
+*************** HEST ***************
+************************************************/
+
+/*****************************************************************************
+* @param EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE* GhesV2,Vector of GhesV2
+* @param UINT8 NumOfGhesV2
+* @param_out
+* @retval EFI_STATUS
+*****************************************************************************/
+EFI_STATUS
+GhesV2ContextForHest (
+  IN EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE GhesV2[MAX_GHES],
+  IN UINT8                                                          NumOfGhesV2
+)
+{
+  // ensuce the size is expected
+  if ((GhesV2 == NULL) || (NumOfGhesV2 != MAX_GHES)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  UINT8  NumOfBlockPerGhes = 1;
+  UINT8  Iter = 0;
+  UINT32 BlockMemorySize;
+  UINT32 ErrorSeverityArray[MAX_GHES] = {
+           EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTABLE,
+           EFI_ACPI_6_2_ERROR_SEVERITY_FATAL,
+           EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTED};
+  VOID   *ErrorBlockHead;
+  VOID   *ErrorBlock;
+  VOID   *BlockMemory;
+  GHES_REGISTER  *GhesRegisters;
+  EFI_STATUS     Status = EFI_SUCCESS;
+
+  BlockMemorySize = MAX_GHES *
+    (sizeof (GHES_REGISTER) + NumOfBlockPerGhes * GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
+  Status = gBS->AllocatePool (
+             EfiReservedMemoryType,
+             BlockMemorySize,
+             &BlockMemory
+           );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  gBS->SetMem (BlockMemory, BlockMemorySize, 0);
+  GhesRegisters = BlockMemory;
+  ErrorBlockHead = BlockMemory + MAX_GHES * sizeof (GHES_REGISTER);
+  ErrorBlock = ErrorBlockHead;
+  for (Iter = 0; Iter < MAX_GHES; Iter++) {
+    GhesV2Initial (&GhesV2[Iter], GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
+    GhesV2AddNotification (&GhesV2[Iter], EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV);
+    ErrorBlockInitial (ErrorBlock, ErrorSeverityArray[Iter]);
+    GhesV2LinkErrorBlock (&GhesV2[Iter], &GhesRegisters[Iter], ErrorBlock);
+    ErrorBlock += GhesV2[Iter].ErrorStatusBlockLength;
+  }
+  return EFI_SUCCESS;
+}
+/*****************************************************************************
+* @param EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE* GhesV2,Vector of GhesV2
+* @param UINT8 NumOfGhesV2
+* @param_out
+* @retval EFI_STATUS
+*****************************************************************************/
+
+EFI_STATUS
+GhesV1ContextForHest (
+  IN EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE GhesV1[MAX_GHES],
+  IN UINT8                                                NumOfGhesV1
+)
+{
+  // ensuce the size is expected
+  if ((GhesV1 == NULL) || (NumOfGhesV1 != MAX_GHES)) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  UINT8      NumOfBlockPerGhes = 1;
+  UINT8      Iter = 0;
+  UINT32     BlockMemorySize = MAX_GHES *
+             (sizeof (UINT64) + NumOfBlockPerGhes * GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
+  UINT32     ErrorSeverityArray[MAX_GHES] = {
+             EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTABLE,
+             EFI_ACPI_6_2_ERROR_SEVERITY_FATAL,
+             EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTED};
+  VOID       *ErrorBlockHead;
+  VOID       *ErrorBlock;
+  VOID       *BlockMemory;
+  UINT64     *ptrBlockAddress;
+  EFI_STATUS Status = EFI_SUCCESS;
+  Status = gBS->AllocatePool (
+             EfiReservedMemoryType,
+             BlockMemorySize,
+             &BlockMemory
+           );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  gBS->SetMem (BlockMemory, BlockMemorySize, 0);
+  ptrBlockAddress = BlockMemory;
+  ErrorBlockHead = BlockMemory + MAX_GHES * sizeof (UINT64);
+  ErrorBlock = ErrorBlockHead;
+  for (Iter = 0; Iter < MAX_GHES; Iter++) {
+    GhesV1Initial (&GhesV1[Iter], GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
+    GhesV1AddNotification (&GhesV1[Iter], EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV);
+    ErrorBlockInitial (ErrorBlock, ErrorSeverityArray[Iter]);
+    GhesV1LinkErrorBlock (&GhesV1[Iter], &ptrBlockAddress[Iter], ErrorBlock);
+    ErrorBlock += GhesV1[Iter].ErrorStatusBlockLength;
+  }
+  return EFI_SUCCESS;
+}
+
+VOID
+OemHestInitialNotification ()
+{
+  // GPIO init
+  // use int_msk to simulate
+  UINTN Base = IOMUX_REG_BASE;
+  //GPIO9, in document 'PhosphorV680 Totemiomux' iomg051,
+  //Set GPIO9 to pad_ex_int1
+  MmioWrite32 (Base + IOMG051, PAD_EX_INT1);
+  return;
+}
+
+VOID
+OemEinjInitialNotification ()
+{
+  UINTN Base = IOMUX_REG_BASE;
+  //use TB_GPIO_PIN10 for EINJ
+  MmioWrite32 (Base + IOMG052, PAD_EX_INT1);
+  return;
+}
+
+EFI_STATUS
+OemInitHestTable (
+  IN EFI_HANDLE         ImageHandle
+)
+{
+  EFI_STATUS                                                     Status = EFI_SUCCESS;
+  HEST_CONTEXT                                                   HestContext;
+  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE GhesV2[MAX_GHES];
+  Status = HestHeaderCreator (&HestContext, HEST_TABLE_SIZE);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  Status = GhesV2ContextForHest(GhesV2, MAX_GHES);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  Status |= HestAddErrorSourceDescriptor (
+              &HestContext,
+              &GhesV2[0],
+              sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)
+              );
+  mApeiTrustedfirmwareData->HestRecoverableErrorGhesV2 = HestContext.KeyErrorSource;
+  Status |= HestAddErrorSourceDescriptor (
+              &HestContext,
+              &GhesV2[1],
+              sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)
+              );
+  mApeiTrustedfirmwareData->HestFatalErrorGhesV2 = HestContext.KeyErrorSource;
+  Status |= HestAddErrorSourceDescriptor (
+              &HestContext,
+              &GhesV2[2],
+              sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)
+              );
+  mApeiTrustedfirmwareData->HestCorrectedErrorGhesV2 = HestContext.KeyErrorSource;
+  OemHestInitialNotification ();
+  HestSetAcpiTable (&HestContext);
+  return Status;
+}
+/************************************************
+*************** BERT ***************
+************************************************/
+
+EFI_STATUS
+OemInitBertTable (
+  IN EFI_HANDLE ImageHandle
+)
+{
+  BERT_CONTEXT Context;
+  BOOLEAN      Status;
+  Status = BertHeaderCreator (&Context, BOOT_ERROR_REGION_SIZE);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  ErrorBlockInitial (Context.Block, EFI_ACPI_6_2_ERROR_SEVERITY_NONE);
+  BertSetAcpiTable (&Context);
+  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: %r\n", __FUNCTION__, __LINE__, Status));
+  return EFI_SUCCESS;
+}
+/************************************************
+*************** EINJ ***************
+************************************************/
+EFI_STATUS
+OemEinjConfigExecuteOperationEntry (
+  EINJ_CONTEXT *Context
+)
+{
+  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY* KeyEntry = Context->ExecuteOperationEntry;
+  OemEinjInitialNotification ();
+  //use TB_GPIO_PIN10 for EINJ
+  KeyEntry->RegisterRegion.Address = PcdGet64 (PcdCpldBaseAddress) + CPLD_GPIO10_INT_OFFSET;
+  KeyEntry->Mask = CPLD_MASK;
+  KeyEntry->Value = CPLD_VALUE;
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS
+OemInitEinjTable (
+)
+{
+  EFI_STATUS    Status;
+  EINJ_CONTEXT  Context;
+  Status = EinjHeaderCreator (&Context);
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+  (VOID)EinjConfigErrorInjectCapability (&Context, 0xFFF);// TBD
+  (VOID)OemEinjConfigExecuteOperationEntry (&Context);
+  EinjSetAcpiTable (&Context);
+  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: %d\n", __FUNCTION__, __LINE__, Status));
+  return EFI_SUCCESS;
+}
+/************************************************
+*************** ERST ***************
+************************************************/
+
+EFI_STATUS
+OemErstConfigExecuteOperationEntry (
+  ERST_BOOT_CONTEXT *Context
+)
+{
+  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY *KeyEntry;
+  KeyEntry = Context->ExecuteOperationEntry;
+  KeyEntry->RegisterRegion.Address = GPIO1_BASE + GPIO_INT_MASK;
+  KeyEntry->Value = 0x10;
+  KeyEntry->Mask = 0xFFFFFFFF;
+  GpioCombInit (GPIO1_BASE, 0xFFFF);
+  return EFI_SUCCESS;
+}
+
+BOOLEAN
+GetNvRamRegion (
+  OUT  VOID  **NvRamAddrRange,
+  OUT UINT64 *NvRamAddrRangeLength
+)
+{
+  UINT32 Store = ERST_RECORD_STORE_IN_MEM;
+  switch (Store) {
+    case (ERST_RECORD_STORE_IN_NVRAM):
+      break;
+    case (ERST_RECORD_STORE_IN_MEM):
+      * NvRamAddrRangeLength = ERST_DATASTORE_SIZE;
+      * NvRamAddrRange = AllocateReservedZeroPool (ERST_DATASTORE_SIZE);
+      break;
+    case (ERST_RECORD_STORE_IN_SPI_FLASH):
+      break;
+    default:
+      ;
+  }
+  return TRUE;
+}
+
+/***OEM***/
+EFI_STATUS
+OemInitErstTable (
+)
+{
+  EFI_STATUS        Status = ERST_STATUS_SUCCESS;
+  ERST_BOOT_CONTEXT Context;
+  UINT64            BufferSize = ERST_DATASTORE_SIZE;
+  VOID              *NvRamAddrRange;
+  UINT64            NvRamAddrRangeLength;
+  UINT64            NvRamAllRecordLength;
+
+  GetNvRamRegion (&NvRamAddrRange, &NvRamAddrRangeLength);
+  NvRamAllRecordLength = 0;
+  Status = ErstHeaderCreator (
+             &Context,
+             BufferSize,
+             NvRamAddrRange,
+             NvRamAllRecordLength,
+             NvRamAddrRangeLength);
+  OemErstConfigExecuteOperationEntry (&Context);
+  mApeiTrustedfirmwareData->ErstContext = (VOID*)Context.Rt;
+  ErstSetAcpiTable (&Context);
+  return Status;
+};
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 35/43] Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (33 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 34/43] Hisilicon/D06: add apei driver Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 15:33   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 36/43] Platform/Hisilicon/D06: Add capsule upgrade support Ming Huang
                   ` (8 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Add some Lpc macro to LpcLib.h for D06.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Include/Library/LpcLib.h | 51 +++++++++++++++++++-
 1 file changed, 49 insertions(+), 2 deletions(-)

diff --git a/Silicon/Hisilicon/Include/Library/LpcLib.h b/Silicon/Hisilicon/Include/Library/LpcLib.h
index 236a52ba45..5cf08ccde1 100755
--- a/Silicon/Hisilicon/Include/Library/LpcLib.h
+++ b/Silicon/Hisilicon/Include/Library/LpcLib.h
@@ -1,7 +1,7 @@
 /** @file
 *
-*  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
-*  Copyright (c) 2016, Linaro Limited. All rights reserved.
+*  Copyright (c) 2016-2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2016-2018, Linaro Limited. All rights reserved.
 *
 *  This program and the accompanying materials
 *  are licensed and made available under the terms and conditions of the BSD License
@@ -18,6 +18,53 @@
 
 #include <Uefi.h>
 
+#define PCIE_SUBSYS_IOMUX       0x201100000
+#define PCIE_SUBSYS_IOMG019     (PCIE_SUBSYS_IOMUX + 0x48)
+#define PCIE_SUBSYS_IOMG020     (PCIE_SUBSYS_IOMUX + 0x4C)
+#define PCIE_SUBSYS_IOMG021     (PCIE_SUBSYS_IOMUX + 0x50)
+#define PCIE_SUBSYS_IOMG022     (PCIE_SUBSYS_IOMUX + 0x54)
+#define PCIE_SUBSYS_IOMG023     (PCIE_SUBSYS_IOMUX + 0x58)
+#define PCIE_SUBSYS_IOMG024     (PCIE_SUBSYS_IOMUX + 0x5C)
+#define PCIE_SUBSYS_IOMG025     (PCIE_SUBSYS_IOMUX + 0x60)
+#define PCIE_SUBSYS_IOMG028     (PCIE_SUBSYS_IOMUX + 0x6C)
+
+#define IO_MGMT_SUBCTRL_BASE    0x201070000
+#define SC_LPC_RESET_REQ_REG    (IO_MGMT_SUBCTRL_BASE + 0x0a58)
+#define SC_LPC_RESET_DREQ_REG   (IO_MGMT_SUBCTRL_BASE + 0x0a5c)
+#define SC_LPC_SEL              (IO_MGMT_SUBCTRL_BASE + 0x2400)
+
+
+#define LPCD06_BASE             0x201190000
+#define LPC_FIRM_SPACE0_CFG     (LPCD06_BASE + 0x100)
+#define LPC_FIRM_SPACE1_CFG     (LPCD06_BASE + 0x104)
+#define LPC_FIRM_SPACE2_CFG     (LPCD06_BASE + 0x108)
+#define LPC_FIRM_SPACE3_CFG     (LPCD06_BASE + 0x10C)
+#define LPC_FIRM_SPACE4_CFG     (LPCD06_BASE + 0x110)
+#define LPC_FIRM_SPACE5_CFG     (LPCD06_BASE + 0x114)
+#define LPC_FIRM_SPACE6_CFG     (LPCD06_BASE + 0x118)
+#define LPC_FIRM_SPACE7_CFG     (LPCD06_BASE + 0x11C)
+#define LPC_MEM_SPACE0_CFG      (LPCD06_BASE + 0x120)
+#define LPC_MEM_SPACE1_CFG      (LPCD06_BASE + 0x124)
+#define LPC_MEM_SPACE2_CFG      (LPCD06_BASE + 0x128)
+#define LPC_MEM_SPACE3_CFG      (LPCD06_BASE + 0x12C)
+#define LPC_MEM_SPACE4_CFG      (LPCD06_BASE + 0x130)
+#define LPC_MEM_SPACE5_CFG      (LPCD06_BASE + 0x134)
+#define LPC_MEM_SPACE6_CFG      (LPCD06_BASE + 0x138)
+
+#define LPCD06_START_REG        (LPCD06_BASE + 0x00)
+#define LPCD06_OP_STATUS_REG    (LPCD06_BASE + 0x04)
+#define LPCD06_IRQ_ST_REG       (LPCD06_BASE + 0x08)
+#define LPCD06_OP_LEN_REG       (LPCD06_BASE + 0x10)
+#define LPCD06_CMD_REG          (LPCD06_BASE + 0x14)
+#define LPCD06_ADDR_REG         (LPCD06_BASE + 0x20)
+#define LPCD06_WDATA_REG        (LPCD06_BASE + 0x24)
+#define LPCD06_RDATA_REG        (LPCD06_BASE + 0x28)
+
+#define LPC_SIRQ_CTR0           (LPCD06_BASE + 0x80)
+#define LPC_SIRQ_CTR1           (LPCD06_BASE + 0x84)
+#define LPC_SIRQ_INT_MASK       (LPCD06_BASE + 0x94)
+
+
 #define PCIE_SUBSYS_IO_MUX      0xA0170000
 #define PCIE_SUBSYS_IOMG033     (PCIE_SUBSYS_IO_MUX + 0x84)
 #define PCIE_SUBSYS_IOMG035     (PCIE_SUBSYS_IO_MUX + 0x8C)
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 36/43] Platform/Hisilicon/D06: Add capsule upgrade support
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (34 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 35/43] Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 18:42   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 37/43] Silicon/Hisilicon/D06: Modify for close slave core clock Ming Huang
                   ` (7 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

This module support updating the boot CPU firmware only.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                                           | 14 ++++
 Platform/Hisilicon/D06/D06.fdf                                                           | 72 ++++++++++++++++-
 Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf     | 50 ++++++++++++
 Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c    | 70 +++++++++++++++++
 Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini | 46 +++++++++++
 Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc    | 81 ++++++++++++++++++++
 6 files changed, 332 insertions(+), 1 deletion(-)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 9550e0d497..fad6fcc747 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -121,6 +121,11 @@
   gHisiTokenSpaceGuid.PcdIsItsSupported|TRUE
   gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE
   gEfiMdeModulePkgTokenSpaceGuid.PcdHiiOsRuntimeSupport|FALSE
+[PcdsDynamicExDefault.common.DEFAULT]
+  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor|{0x0}|VOID*|0x100
+  gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid|{0x29, 0x3d, 0x4b, 0xd3, 0x85, 0x00, 0xb3, 0x4a, 0x8b, 0xe8, 0x84, 0x18, 0x8c, 0xc5, 0x04, 0x89}
+  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareFileGuid|{0xcf, 0x4f, 0x2e, 0x64, 0xf7, 0x2d, 0x15, 0x44, 0x8b, 0x70, 0xa0, 0x39, 0x09, 0xc5, 0x7b, 0x55}
+
 
 [PcdsFixedAtBuild.common]
   gArmPlatformTokenSpaceGuid.PcdCoreCount|48
@@ -266,6 +271,7 @@
   Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
   Silicon/Hisilicon/Drivers/VersionInfoPeim/VersionInfoPeim.inf
 
+  Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
   MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
     <LibraryClasses>
       NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
@@ -386,6 +392,8 @@
   MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
   MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
   MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
+  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
+  MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
   #
   # FAT filesystem + GPT/MBR partitioning
   #
@@ -434,6 +442,12 @@
   MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
   MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
   MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
+  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf {
+    <LibraryClasses>
+      FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf
+  }
+
+  MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
 
   #
   # UEFI application (Shell Embedded Boot Loader)
diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
index 90379b8558..8c3f4f9932 100644
--- a/Platform/Hisilicon/D06/D06.fdf
+++ b/Platform/Hisilicon/D06/D06.fdf
@@ -308,7 +308,9 @@ READ_LOCK_STATUS   = TRUE
   INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
 
   INF Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
-  INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
+  INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
+  INF MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
+
   #
   # Build Shell from latest source code instead of prebuilt binary
   #
@@ -364,11 +366,79 @@ READ_LOCK_STATUS   = TRUE
 
   INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
 
+  INF RuleOverride = FMP_IMAGE_DESC Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
   FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
     SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
       SECTION FV_IMAGE = FVMAIN
     }
   }
+[FV.CapsuleDispatchFv]
+FvAlignment        = 16
+ERASE_POLARITY     = 1
+MEMORY_MAPPED      = TRUE
+STICKY_WRITE       = TRUE
+LOCK_CAP           = TRUE
+LOCK_STATUS        = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP  = TRUE
+WRITE_STATUS       = TRUE
+WRITE_LOCK_CAP     = TRUE
+WRITE_LOCK_STATUS  = TRUE
+READ_DISABLED_CAP  = TRUE
+READ_ENABLED_CAP   = TRUE
+READ_STATUS        = TRUE
+READ_LOCK_CAP      = TRUE
+READ_LOCK_STATUS   = TRUE
+
+  INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf
+
+[FV.SystemFirmwareUpdateCargo]
+FvAlignment        = 16
+ERASE_POLARITY     = 1
+MEMORY_MAPPED      = TRUE
+STICKY_WRITE       = TRUE
+LOCK_CAP           = TRUE
+LOCK_STATUS        = TRUE
+WRITE_DISABLED_CAP = TRUE
+WRITE_ENABLED_CAP  = TRUE
+WRITE_STATUS       = TRUE
+WRITE_LOCK_CAP     = TRUE
+WRITE_LOCK_STATUS  = TRUE
+READ_DISABLED_CAP  = TRUE
+READ_ENABLED_CAP   = TRUE
+READ_STATUS        = TRUE
+READ_LOCK_CAP      = TRUE
+READ_LOCK_STATUS   = TRUE
+
+  FILE RAW = 642e4fcf-2df7-4415-8b70-a03909c57b55 { # PcdEdkiiSystemFirmwareFileGuid
+    FD = D06
+  }
+
+  FILE RAW = ce57b167-b0e4-41e8-a897-5f4feb781d40 { # gEdkiiSystemFmpCapsuleDriverFvFileGuid
+    FV = CapsuleDispatchFv
+  }
+
+  FILE RAW = 812136D3-4D3A-433A-9418-29BB9BF78F6E { # gEdkiiSystemFmpCapsuleConfigFileGuid
+    Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
+  }
+
+[FmpPayload.FmpPayloadSystemFirmwarePkcs7]
+IMAGE_HEADER_INIT_VERSION = 0x02
+IMAGE_TYPE_ID             = df8fe8d1-e937-45b8-9691-c4b5e183874e # PcdSystemFmpCapsuleImageTypeIdGuid
+IMAGE_INDEX               = 0x1
+HARDWARE_INSTANCE         = 0x0
+MONOTONIC_COUNT           = 0x1
+CERTIFICATE_GUID          = 4AAFD29D-68DF-49EE-8AA9-347D375665A7 # PKCS7
+
+  FV = SystemFirmwareUpdateCargo
+
+[Capsule.D06FirmwareUpdateCapsuleFmpPkcs7]
+CAPSULE_GUID                = 6dcbd5ed-e82d-4c44-bda1-7194199ad92a # gEfiFmpCapsuleGuid
+CAPSULE_HEADER_SIZE         = 0x20
+CAPSULE_HEADER_INIT_VERSION = 0x1
+
+  FMP_PAYLOAD = FmpPayloadSystemFirmwarePkcs7
+
 
 !include Silicon/Hisilicon/Hisilicon.fdf.inc
 
diff --git a/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
new file mode 100644
index 0000000000..fc1832fa5f
--- /dev/null
+++ b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
@@ -0,0 +1,50 @@
+## @file
+#  System Firmware descriptor.
+#
+#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+#  Copyright (c) 2018, Linaro Limited. All rights reserved.
+#  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = SystemFirmwareDescriptor
+  FILE_GUID                      = 90B2B846-CA6D-4D6E-A8D3-C140A8E110AC
+  MODULE_TYPE                    = PEIM
+  VERSION_STRING                 = 1.0
+  ENTRY_POINT                    = SystemFirmwareDescriptorPeimEntry
+
+[Sources]
+  SystemFirmwareDescriptorPei.c
+  SystemFirmwareDescriptor.aslc
+
+[Packages]
+  ArmPkg/ArmPkg.dec
+  ArmPlatformPkg/ArmPlatformPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  MdePkg/MdePkg.dec
+  SignedCapsulePkg/SignedCapsulePkg.dec
+
+[LibraryClasses]
+  DebugLib
+  PcdLib
+  PeimEntryPoint
+  PeiServicesLib
+
+[FixedPcd]
+  gArmTokenSpaceGuid.PcdFdSize
+
+[Pcd]
+  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor
+
+[Depex]
+  TRUE
diff --git a/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
new file mode 100644
index 0000000000..27c0a718f8
--- /dev/null
+++ b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
@@ -0,0 +1,70 @@
+/** @file
+  System Firmware descriptor producer.
+
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+  Copyright (c) 2018, Linaro Limited. All rights reserved.
+  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+#include <Guid/EdkiiSystemFmpCapsule.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PeiServicesLib.h>
+#include <Protocol/FirmwareManagement.h>
+
+/**
+  Entrypoint for SystemFirmwareDescriptor PEIM.
+
+  @param[in]  FileHandle  Handle of the file being invoked.
+  @param[in]  PeiServices Describes the list of possible PEI Services.
+
+  @retval EFI_SUCCESS            PPI successfully installed.
+**/
+EFI_STATUS
+EFIAPI
+SystemFirmwareDescriptorPeimEntry (
+  IN EFI_PEI_FILE_HANDLE     FileHandle,
+  IN CONST EFI_PEI_SERVICES  **PeiServices
+  )
+{
+  EFI_STATUS                              Status;
+  EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR  *Descriptor;
+  UINTN                                   Size;
+  UINTN                                   Index;
+  UINT32                                  AuthenticationStatus;
+
+  //
+  // Search RAW section.
+  //
+
+  Index = 0;
+  while (TRUE) {
+    Status = PeiServicesFfsFindSectionData3 (EFI_SECTION_RAW, Index, FileHandle, (VOID **)&Descriptor, &AuthenticationStatus);
+    if (EFI_ERROR (Status)) {
+      // Should not happen, must something wrong in FDF.
+      DEBUG ((DEBUG_ERROR, "Not found SystemFirmwareDescriptor in fdf !\n"));
+      return EFI_NOT_FOUND;
+    }
+    if (Descriptor->Signature == EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE) {
+      break;
+    }
+    Index++;
+  }
+
+  DEBUG ((DEBUG_INFO, "EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR size - 0x%x\n", Descriptor->Length));
+
+  Size = Descriptor->Length;
+  PcdSetPtrS (PcdEdkiiSystemFirmwareImageDescriptor, &Size, Descriptor);
+
+  return EFI_SUCCESS;
+}
diff --git a/Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini b/Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
new file mode 100644
index 0000000000..80f253b235
--- /dev/null
+++ b/Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
@@ -0,0 +1,46 @@
+#
+#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+#  Copyright (c) 2018, Linaro Limited. All rights reserved.
+#  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution.  The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+##
+
+[Head]
+NumOfUpdate = 3
+NumOfRecovery = 0
+Update0 = SysFvMain
+Update1 = SysCustom
+Update2 = SysNvRam
+
+[SysFvMain]
+FirmwareType  = 0             # 0 - SystemFirmware, 1 - NvRam
+AddressType   = 0             # 0 - relative address, 1 - absolute address.
+BaseAddress   = 0x00000000    # Base address offset on flash
+Length        = 0x003C0000    # Length
+ImageOffset   = 0x00000000    # Image offset of this SystemFirmware image
+FileGuid      = 642e4fcf-2df7-4415-8b70-a03909c57b55  # PcdEdkiiSystemFirmwareFileGuid
+
+[SysCustom]
+FirmwareType  = 0             # 0 - SystemFirmware, 1 - NvRam
+AddressType   = 0             # 0 - relative address, 1 - absolute address.
+BaseAddress   = 0x003F0000    # Base address offset on flash
+Length        = 0x00010000    # Length
+ImageOffset   = 0x003F0000    # Image offset of this SystemFirmware image
+FileGuid      = 642e4fcf-2df7-4415-8b70-a03909c57b55  # PcdEdkiiSystemFirmwareFileGuid
+
+[SysNvRam]
+FirmwareType  = 1             # 0 - SystemFirmware, 1 - NvRam
+AddressType   = 0             # 0 - relative address, 1 - absolute address.
+BaseAddress   = 0x003C0000    # Base address offset on flash
+Length        = 0x00020000    # Length
+ImageOffset   = 0x003C0000    # Image offset of this SystemFirmware image
+FileGuid      = 642e4fcf-2df7-4415-8b70-a03909c57b55  # PcdEdkiiSystemFirmwareFileGuid
+
diff --git a/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
new file mode 100644
index 0000000000..36175338dd
--- /dev/null
+++ b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
@@ -0,0 +1,81 @@
+/** @file
+  System Firmware descriptor.
+
+  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+  Copyright (c) 2018, Linaro Limited. All rights reserved.
+  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+#include <Guid/EdkiiSystemFmpCapsule.h>
+#include <Protocol/FirmwareManagement.h>
+
+#define PACKAGE_VERSION                     0xFFFFFFFF
+#define PACKAGE_VERSION_STRING              L"Unknown"
+
+#define CURRENT_FIRMWARE_VERSION            0x00000002
+#define CURRENT_FIRMWARE_VERSION_STRING     L"0x00000002"
+#define LOWEST_SUPPORTED_FIRMWARE_VERSION   0x00000001
+
+#define IMAGE_ID                            SIGNATURE_64('H','W','A', 'R', 'M', '_', 'F', 'd')
+#define IMAGE_ID_STRING                     L"ARMPlatformFd"
+
+// PcdSystemFmpCapsuleImageTypeIdGuid
+#define IMAGE_TYPE_ID_GUID                  { 0xdf8fe8d1, 0xe937, 0x45b8, { 0x96, 0x91, 0xc4, 0xb5, 0xe1, 0x83, 0x87, 0x4e } }
+
+typedef struct {
+  EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR  Descriptor;
+  // real string data
+  CHAR16                                  ImageIdNameStr[ARRAY_SIZE (IMAGE_ID_STRING)];
+  CHAR16                                  VersionNameStr[ARRAY_SIZE (CURRENT_FIRMWARE_VERSION_STRING)];
+  CHAR16                                  PackageVersionNameStr[ARRAY_SIZE (PACKAGE_VERSION_STRING)];
+} IMAGE_DESCRIPTOR;
+
+IMAGE_DESCRIPTOR mImageDescriptor =
+{
+  {
+    EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE,
+    sizeof (EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR),
+    sizeof (IMAGE_DESCRIPTOR),
+    PACKAGE_VERSION,                                       // PackageVersion
+    OFFSET_OF (IMAGE_DESCRIPTOR, PackageVersionNameStr),   // PackageVersionName
+    1,                                                     // ImageIndex;
+    {0x0},                                                 // Reserved
+    IMAGE_TYPE_ID_GUID,                                    // ImageTypeId;
+    IMAGE_ID,                                              // ImageId;
+    OFFSET_OF (IMAGE_DESCRIPTOR, ImageIdNameStr),          // ImageIdName;
+    CURRENT_FIRMWARE_VERSION,                              // Version;
+    OFFSET_OF (IMAGE_DESCRIPTOR, VersionNameStr),          // VersionName;
+    {0x0},                                                 // Reserved2
+    FixedPcdGet32 (PcdFdSize),                             // Size;
+    IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
+      IMAGE_ATTRIBUTE_RESET_REQUIRED |
+      IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
+      IMAGE_ATTRIBUTE_IN_USE,                              // AttributesSupported;
+    IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
+      IMAGE_ATTRIBUTE_RESET_REQUIRED |
+      IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
+      IMAGE_ATTRIBUTE_IN_USE,                              // AttributesSetting;
+    0x0,                                                   // Compatibilities;
+    LOWEST_SUPPORTED_FIRMWARE_VERSION,                     // LowestSupportedImageVersion;
+    0x00000000,                                            // LastAttemptVersion;
+    0,                                                     // LastAttemptStatus;
+    {0x0},                                                 // Reserved3
+    0,                                                     // HardwareInstance;
+  },
+  // real string data
+  {IMAGE_ID_STRING},
+  {CURRENT_FIRMWARE_VERSION_STRING},
+  {PACKAGE_VERSION_STRING},
+};
+
+VOID* CONST ReferenceAcpiTable = &mImageDescriptor;
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 37/43] Silicon/Hisilicon/D06: Modify for close slave core clock.
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (35 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 36/43] Platform/Hisilicon/D06: Add capsule upgrade support Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 15:44   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 38/43] Silicon/Hisilicon/D06: Add I2C Bus Exception handle function Ming Huang
                   ` (6 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	ZhenYao

From: ZhenYao <yaozhen6@huawei.com>

When BIOS booting, the power consumption is too high, so need close
some clusters clock that don't work to reduce power consumption.

The implementation of functions is in edk2-non-osi.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: ZhenYao <yaozhen6@huawei.com>
---
 Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h b/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
index ec2b9a36e7..3ccfc6bee3 100644
--- a/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
+++ b/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
@@ -102,5 +102,8 @@ VOID PlatformEventBroadcastConfig(VOID);
 UINTN GetDjtagRegBase(UINT32 NodeId);
 VOID LlcCleanInvalidateAsm(VOID);
 VOID PlatformMdioInit(VOID);
+VOID DisableClusterClock(UINTN CpuClusterBase);
+VOID EnableClusterClock(UINTN CpuClusterBase);
+VOID DisableSocketClock (UINT8 Skt);
 
 #endif
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 38/43] Silicon/Hisilicon/D06: Add I2C Bus Exception handle function
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (36 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 37/43] Silicon/Hisilicon/D06: Modify for close slave core clock Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-22 15:45   ` Leif Lindholm
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 39/43] Silicon/Hisilicon/Setup: Support SPCR table switch Ming Huang
                   ` (5 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

During the period of I2c accessing, if the board is reset
unexpectedly, and because the I2c client can not reset,
the SDA will be always pull down, then it cause I2C bus
Exception.

Follow the Hi1620 I2C FS chapter 1.8.2 design, add I2C
Bus Exception handle function. It will Config SCL and SDA
to GPIO, and set the reversal frequency of SCL to 10KHz.

The implementation of functions is in edk2-non-osi.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h b/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
index 3ccfc6bee3..a232e52ed7 100644
--- a/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
+++ b/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
@@ -106,4 +106,7 @@ VOID DisableClusterClock(UINTN CpuClusterBase);
 VOID EnableClusterClock(UINTN CpuClusterBase);
 VOID DisableSocketClock (UINT8 Skt);
 
+EFI_STATUS EFIAPI HandleI2CException (UINT32 Socket, UINT32 Port);
+EFI_STATUS EFIAPI HandleI2CExceptionBySocket (UINT32 Socket);
+
 #endif
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 39/43] Silicon/Hisilicon/Setup: Support SPCR table switch
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (37 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 38/43] Silicon/Hisilicon/D06: Add I2C Bus Exception handle function Ming Huang
@ 2018-08-14  8:08 ` Ming Huang
  2018-08-23  9:54   ` Ming
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 40/43] Silicon/Hisilicon/setup: Support SMMU switch Ming Huang
                   ` (4 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:08 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang, Heyi Guo

If install SPCR table, KVM will not output while install or boot
some OS, like ubuntu, so add SPCR switch setup item and set it
disable by default.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
Signed-off-by: Heyi Guo <heyi.guo@linaro.org>
---
 Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf |  1 +
 Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c   | 24 ++++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
index 281a4f2ebd..3d133aff85 100644
--- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -51,6 +51,7 @@
 
 [Guids]
   gHisiEfiMemoryMapGuid
+  gOemConfigGuid
 
 [Pcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile    ## CONSUMES
diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
index 54f49977c3..32878ca4f9 100644
--- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
+++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
@@ -16,8 +16,10 @@
 #include <Library/DebugLib.h>
 #include <Library/HobLib.h>
 #include <Library/HwMemInitLib.h>
+#include <Library/OemConfigData.h>
 #include <Library/OemMiscLib.h>
 #include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
 #include <Library/UefiLib.h>
 
 #define CORECOUNT(X) ((X) * CORE_NUM_PER_SOCKET)
@@ -114,6 +116,25 @@ UpdateSlit (
   return  EFI_SUCCESS;
 }
 
+STATIC
+EFI_STATUS
+IsNeedSpcr (
+  IN OUT EFI_ACPI_DESCRIPTION_HEADER  *Table
+  )
+{
+  EFI_STATUS                     Status;
+  OEM_CONFIG_DATA                SetupData;
+  UINTN                          DataSize = sizeof (OEM_CONFIG_DATA);
+
+  Status = gRT->GetVariable (OEM_CONFIG_NAME, &gOemConfigGuid, NULL, &DataSize, &SetupData);
+  if (!EFI_ERROR (Status) && (SetupData.EnableSpcr == FALSE)) {
+    return EFI_ABORTED;
+  }
+
+  return EFI_SUCCESS;
+}
+
+
 EFI_STATUS
 UpdateAcpiTable (
   IN OUT EFI_ACPI_DESCRIPTION_HEADER      *TableHeader
@@ -130,6 +151,9 @@ UpdateAcpiTable (
   case EFI_ACPI_6_0_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE:
     Status = UpdateSlit (TableHeader);
     break;
+  case EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE:
+    Status = IsNeedSpcr (TableHeader);
+    break;
   }
   return Status;
 }
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 40/43] Silicon/Hisilicon/setup: Support SMMU switch
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (38 preceding siblings ...)
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 39/43] Silicon/Hisilicon/Setup: Support SPCR table switch Ming Huang
@ 2018-08-14  8:09 ` Ming Huang
  2018-08-22 18:42   ` Leif Lindholm
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 41/43] Hisilicon/D06: Add PciPlatformLib Ming Huang
                   ` (3 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:09 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Select without SMMU iort while SMMU item is disable,
Select with SMMU iort while SMMU item is enable.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c | 88 ++++++++++++++++++++
 1 file changed, 88 insertions(+)

diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
index 32878ca4f9..e0c29e0f57 100644
--- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
+++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
@@ -24,6 +24,90 @@
 
 #define CORECOUNT(X) ((X) * CORE_NUM_PER_SOCKET)
 
+#define FIELD_IORT_NODE_OFFSET     40
+
+typedef enum {
+  NodeTypeIts = 0,
+  NodeTypeNameComponent,
+  NodeTypePciRC,
+  NodeTypeSmmuV1,
+  NodeTypeSmmuV3,
+  NodeTypePMCG
+} IORT_NODE_TYPE;
+
+#pragma pack(1)
+typedef struct {
+  UINT8   Type;
+  UINT16  Length;
+  UINT8   Revision;
+  UINT32  Reserved;
+  UINT32  IdMapNumber;
+  UINT32  IdArrayOffset;
+} IORT_NODE_HEAD;
+#pragma pack()
+
+BOOLEAN
+IsIortWithSmmu (
+  IN EFI_ACPI_DESCRIPTION_HEADER      *TableHeader
+  )
+{
+  UINT32           *NodeOffset;
+  UINT32           NextOffset;
+  IORT_NODE_HEAD   *Node;
+
+  NodeOffset = (UINT32 *)((UINT8 *)TableHeader + FIELD_IORT_NODE_OFFSET);
+  NextOffset = *NodeOffset;
+
+  while (NextOffset < TableHeader->Length) {
+    Node = (IORT_NODE_HEAD *)((UINT8 *)TableHeader + NextOffset);
+    NextOffset += Node->Length;
+
+    if ((Node->Type == NodeTypeSmmuV1) || (Node->Type == NodeTypeSmmuV3)) {
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
+
+EFI_STATUS
+SelectIort (
+  IN EFI_ACPI_DESCRIPTION_HEADER      *TableHeader
+  )
+{
+  EFI_STATUS          Status;
+  UINTN               Size;
+  OEM_CONFIG_DATA     Configuration;
+
+  Configuration.EnableSmmu = 0;
+  Size = sizeof (OEM_CONFIG_DATA);
+  Status = gRT->GetVariable (
+                  OEM_CONFIG_NAME,
+                  &gOemConfigGuid,
+                  NULL,
+                  &Size,
+                  &Configuration
+                  );
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Get OemConfig variable (%r).\n", Status));
+  }
+
+  Status =  EFI_SUCCESS;
+  if (IsIortWithSmmu (TableHeader)) {
+    if (!Configuration.EnableSmmu) {
+      Status = EFI_ABORTED;
+    }
+  } else {
+    if (Configuration.EnableSmmu) {
+      Status = EFI_ABORTED;
+    }
+  }
+  DEBUG ((DEBUG_INFO, "SmmuEnable=%x, return %r for Iort table.\n",
+          Configuration.EnableSmmu, Status));
+
+  return Status;
+}
+
 STATIC
 VOID
 RemoveUnusedMemoryNode (
@@ -151,6 +235,10 @@ UpdateAcpiTable (
   case EFI_ACPI_6_0_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE:
     Status = UpdateSlit (TableHeader);
     break;
+
+  case EFI_ACPI_6_2_IO_REMAPPING_TABLE_SIGNATURE:
+    Status = SelectIort (TableHeader);
+    break;
   case EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE:
     Status = IsNeedSpcr (TableHeader);
     break;
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 41/43] Hisilicon/D06: Add PciPlatformLib
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (39 preceding siblings ...)
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 40/43] Silicon/Hisilicon/setup: Support SMMU switch Ming Huang
@ 2018-08-14  8:09 ` Ming Huang
  2018-08-22 16:12   ` Leif Lindholm
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 42/43] Hisilicon/D06: Add edk2-non-osi Shell components Ming Huang
                   ` (2 subsequent siblings)
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:09 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Add a Null PciPlatformLib for build D06. The switch generic
PciHostBridge patch set add two api for PciPlatform driver,
so need to implement the two api for D06.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D06/D06.dsc                                                 |  1 +
 Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf | 30 +++++++++
 Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c   | 67 ++++++++++++++++++++
 3 files changed, 98 insertions(+)

diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index fad6fcc747..053ea894d5 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -95,6 +95,7 @@
   FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
 !endif
   PciExpressLib|MdePkg/Library/BasePciExpressLib/BasePciExpressLib.inf
+  PciPlatformLib|Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf
 
 [LibraryClasses.common.SEC]
   ArmPlatformLib|Silicon/Hisilicon/Library/ArmPlatformLibHisilicon/ArmPlatformLibSec.inf
diff --git a/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf b/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf
new file mode 100644
index 0000000000..7648322522
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf
@@ -0,0 +1,30 @@
+## @file
+# PCI Segment Library for Hisilicon Hi1610/Hi1616 SoC with multiple RCs
+#
+# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2017 - 2018, Linaro Ltd. All rights reserved.<BR>
+# Copyright (c) 2018, Hisilicon Ltd. All rights reserved.<BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution. The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php.
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x0001001A
+  BASE_NAME                      = Hi1620PciPlatformLib
+  FILE_GUID                      = 29ba30da-68bc-46a5-888f-c65dabb67fd8
+  MODULE_TYPE                    = BASE
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = PciPlatformLib
+
+[Sources]
+  Hi1620PciPlatformLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
diff --git a/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c b/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c
new file mode 100644
index 0000000000..ff77974c0f
--- /dev/null
+++ b/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c
@@ -0,0 +1,67 @@
+/** @file
+*
+*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
+*  Copyright (c) 2018, Linaro Limited. All rights reserved.
+*
+*  This program and the accompanying materials
+*  are licensed and made available under the terms and conditions of the BSD License
+*  which accompanies this distribution.  The full text of the license may be found at
+*  http://opensource.org/licenses/bsd-license.php
+*
+*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+*
+**/
+
+#include <Uefi.h>
+#include <Protocol/PciPlatform.h>
+
+
+/*++
+
+Routine Description:
+
+  Perform Platform initialization first in PciPlatform.
+
+Arguments:
+
+Returns:
+
+ VOID.
+
+--*/
+VOID
+EFIAPI
+PciInitPlatform (
+  VOID
+  )
+{
+  return;
+}
+
+/*++
+
+Routine Description:
+
+  Perform Platform initialization by the phase indicated.
+
+Arguments:
+
+  HostBridge    -  The associated PCI host bridge handle.
+  Phase         -  The phase of the PCI controller enumeration.
+  ChipsetPhase  -  Defines the execution phase of the PCI chipset driver.
+
+Returns:
+
+--*/
+VOID
+EFIAPI
+PhaseNotifyPlatform (
+  IN  EFI_HANDLE                                     HostBridge,
+  IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE  Phase,
+  IN  EFI_PCI_CHIPSET_EXECUTION_PHASE                ChipsetPhase
+  )
+{
+  return;
+}
+
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 42/43] Hisilicon/D06: Add edk2-non-osi Shell components
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (40 preceding siblings ...)
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 41/43] Hisilicon/D06: Add PciPlatformLib Ming Huang
@ 2018-08-14  8:09 ` Ming Huang
  2018-08-22 18:48   ` Leif Lindholm
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 43/43] Platform/Hisilicon/D0x: Update version string to 18.08 Ming Huang
  2018-08-22 18:49 ` [PATCH edk2-platforms v2 00/43] Upload for D06 platform Leif Lindholm
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:09 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Add Hisilicon Oem Shell libraries for some commands,such as
biosupdate, getmac, setmac, provision, acpistartos, brdinfo,
sfpinfo.

biosupdate example:
ifconfig -s eth2 static 192.168.2.68 255.255.255.0 192.168.2.1
biosupdate serverIp -u user -p password -f D06.fd -m master

acpistartos example:
ifconfig -s eth2 static 192.168.2.69 255.255.255.0 192.168.2.1
provision serverIp -u user -p password -f os\Image -a 0x80000
2
provision serverIp -u user -p password -f os\minifs.cpio.gz -a 0x07000000
2
acpistartos

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Silicon/Hisilicon/HisiPkg.dec  | 4 ++++
 Platform/Hisilicon/D06/D06.dsc | 2 ++
 2 files changed, 6 insertions(+)

diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec
index 858b840a57..010d501914 100644
--- a/Silicon/Hisilicon/HisiPkg.dec
+++ b/Silicon/Hisilicon/HisiPkg.dec
@@ -39,6 +39,7 @@
   gPlatformSasProtocolGuid = {0x40e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x5d}}
   gHisiPlatformSasProtocolGuid = {0x20e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x6d}}
   gHisiSnpPlatformProtocolGuid = {0x81321f27, 0xff58, 0x4a1d, {0x99, 0x97, 0xd, 0xcc, 0xfa, 0x82, 0xf4, 0x6f}}
+  gOemNicProtocolGuid = {0xb5903955, 0x31e9, 0x4aaf, {0xb2, 0x83, 0x7, 0x9f, 0x3c, 0xc4, 0x71, 0x66}}
 
 [Guids]
   gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}
@@ -49,6 +50,8 @@
   gHisiOemVariableGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}
   gOemBootVariableGuid = {0xb7784577, 0x5aaf, 0x4557, {0xa1, 0x99, 0xd4, 0xa4, 0x2f, 0x45, 0x06, 0xf8}}
   gEfiHisiSocControllerGuid = {0xee369cc3, 0xa743, 0x5382, {0x75, 0x64, 0x53, 0xe4, 0x31, 0x19, 0x38, 0x35}}
+  HisiShellSampleHiiGuid  = { 0x43859314, 0x82c1, 0x4592, { 0x8f, 0xf7, 0xc1, 0xbd, 0xf3, 0xb2, 0x0e, 0xd5 }}
+  HisiPlatformShellSampleHiiGuid = { 0x7924a5de, 0xc600, 0x40d5, { 0x91, 0x10, 0xf9, 0xc3, 0xe7, 0x25, 0x4d, 0x33 }}
 
 [LibraryClasses]
   PlatformSysCtrlLib|Include/Library/PlatformSysCtrlLib.h
@@ -101,6 +104,7 @@
   gHisiTokenSpaceGuid.PcdSlotPerChannelNum|0x0|UINT32|0x40000004
 
   gHisiTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 }|VOID*|0x30006554
+  gHisiTokenSpaceGuid.PcdStartOsParameter|L""|VOID*|0x5000000
 
   #FDT File Address
   gHisiTokenSpaceGuid.FdtFileAddress|0x0|UINT64|0x40000005
diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 053ea894d5..544039e450 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -473,6 +473,8 @@
 !if $(INCLUDE_DP) == TRUE
       NULL|ShellPkg/Library/UefiDpLib/UefiDpLib.inf
 !endif #$(INCLUDE_DP)
+      NULL|Silicon/Hisilicon/Library/HisiShellCmdLib/HisiShellCmdLib.inf
+      NULL|Silicon/Hisilicon/Hi1620/Library/HisiD06ShellCmdLib/HisiD06ShellCmdLib.inf
 
     <PcdsFixedAtBuild>
       gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0xFF
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* [PATCH edk2-platforms v2 43/43] Platform/Hisilicon/D0x: Update version string to 18.08
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (41 preceding siblings ...)
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 42/43] Hisilicon/D06: Add edk2-non-osi Shell components Ming Huang
@ 2018-08-14  8:09 ` Ming Huang
  2018-08-22 16:09   ` Leif Lindholm
  2018-08-22 18:49 ` [PATCH edk2-platforms v2 00/43] Upload for D06 platform Leif Lindholm
  43 siblings, 1 reply; 93+ messages in thread
From: Ming Huang @ 2018-08-14  8:09 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Ming Huang

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ming Huang <ming.huang@linaro.org>
---
 Platform/Hisilicon/D03/D03.dsc | 2 +-
 Platform/Hisilicon/D05/D05.dsc | 2 +-
 Platform/Hisilicon/D06/D06.dsc | 4 ++--
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/Platform/Hisilicon/D03/D03.dsc b/Platform/Hisilicon/D03/D03.dsc
index c12790ba59..add15b7f93 100644
--- a/Platform/Hisilicon/D03/D03.dsc
+++ b/Platform/Hisilicon/D03/D03.dsc
@@ -174,7 +174,7 @@
   !ifdef $(FIRMWARE_VER)
     gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"$(FIRMWARE_VER)"
   !else
-    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.02 for Hisilicon D03"
+    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.08 for Hisilicon D03"
   !endif
 
   gHisiTokenSpaceGuid.PcdBiosVersionString|L"10.01.01T18"
diff --git a/Platform/Hisilicon/D05/D05.dsc b/Platform/Hisilicon/D05/D05.dsc
index 94d386582e..76c0bd421e 100644
--- a/Platform/Hisilicon/D05/D05.dsc
+++ b/Platform/Hisilicon/D05/D05.dsc
@@ -192,7 +192,7 @@
   !ifdef $(FIRMWARE_VER)
     gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"$(FIRMWARE_VER)"
   !else
-    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.02 for Hisilicon D05"
+    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.08 for Hisilicon D05"
   !endif
 
   gHisiTokenSpaceGuid.PcdBiosVersionString|L"10.01.01T18"
diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
index 544039e450..09197922ad 100644
--- a/Platform/Hisilicon/D06/D06.dsc
+++ b/Platform/Hisilicon/D06/D06.dsc
@@ -165,12 +165,12 @@
   !ifdef $(FIRMWARE_VER)
     gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"$(FIRMWARE_VER)"
   !else
-    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Hisilicon D06 UEFI RC0 - B308 (V0.38)"
+    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.08 for Hisilicon D06"
   !endif
 
   gHisiTokenSpaceGuid.PcdBiosVersionString|L"10.01.01T18"
 
-  gHisiTokenSpaceGuid.PcdBiosVersionForBmc|L"0.38"
+  gHisiTokenSpaceGuid.PcdBiosVersionForBmc|L"0.42"
 
   gHisiTokenSpaceGuid.PcdSystemProductName|L"D06"
   gHisiTokenSpaceGuid.PcdSystemVersion|L"VER.A"
-- 
2.17.0



^ permalink raw reply related	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 07/43] Hisilicon/D0x: Move IpmiCmdLib to common path of Hisilicon
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 07/43] Hisilicon/D0x: Move IpmiCmdLib " Ming Huang
@ 2018-08-15 13:58   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-15 13:58 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

For patches 6-7 of this set:

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
Pushed as 478282ea28..28b685af6e.

On Tue, Aug 14, 2018 at 04:08:27PM +0800, Ming Huang wrote:
> The IpmiCmdLib is moved to Silicon/Hisilicon in edk2-non-osi,
> so update D0x dsc to reflect this.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Platform/Hisilicon/D03/D03.dsc | 2 +-
>  Platform/Hisilicon/D05/D05.dsc | 2 +-
>  2 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/Platform/Hisilicon/D03/D03.dsc b/Platform/Hisilicon/D03/D03.dsc
> index 38548a0f23..c12790ba59 100644
> --- a/Platform/Hisilicon/D03/D03.dsc
> +++ b/Platform/Hisilicon/D03/D03.dsc
> @@ -38,7 +38,7 @@
>    I2CLib|Silicon/Hisilicon/Library/I2CLib/I2CLib.inf
>    TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
>  
> -  IpmiCmdLib|Silicon/Hisilicon/Hi1610/Library/IpmiCmdLib/IpmiCmdLib.inf
> +  IpmiCmdLib|Silicon/Hisilicon/Library/IpmiCmdLib/IpmiCmdLib.inf
>  
>    NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
>    DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
> diff --git a/Platform/Hisilicon/D05/D05.dsc b/Platform/Hisilicon/D05/D05.dsc
> index f2bbf27639..94d386582e 100644
> --- a/Platform/Hisilicon/D05/D05.dsc
> +++ b/Platform/Hisilicon/D05/D05.dsc
> @@ -41,7 +41,7 @@
>    I2CLib|Silicon/Hisilicon/Library/I2CLib/I2CLib.inf
>    TimerLib|ArmPkg/Library/ArmArchTimerLib/ArmArchTimerLib.inf
>  
> -  IpmiCmdLib|Silicon/Hisilicon/Hi1610/Library/IpmiCmdLib/IpmiCmdLib.inf
> +  IpmiCmdLib|Silicon/Hisilicon/Library/IpmiCmdLib/IpmiCmdLib.inf
>  
>    NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
>    DpcLib|MdeModulePkg/Library/DxeDpcLib/DxeDpcLib.inf
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 03/43] Silicon/Hisilicon/Acpi: Move some macro to PlatformArch.h
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 03/43] Silicon/Hisilicon/Acpi: Move some macro to PlatformArch.h Ming Huang
@ 2018-08-17 13:23   ` Leif Lindholm
  2018-08-18  7:26     ` Ming
  0 siblings, 1 reply; 93+ messages in thread
From: Leif Lindholm @ 2018-08-17 13:23 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu


On Tue, Aug 14, 2018 at 04:08:23PM +0800, Ming Huang wrote:
> ARM_ACPI_HEADER is used by a unify module in HwPkg,
> so move some macro to PlatformArch.h for unify D0x.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h | 27 +++-----------------
>  Silicon/Hisilicon/Hi1610/Include/PlatformArch.h            | 24 +++++++++++++++++
>  Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h    | 24 +----------------
>  Silicon/Hisilicon/Hi1616/Include/PlatformArch.h            | 23 +++++++++++++++++
>  4 files changed, 51 insertions(+), 47 deletions(-)
> 
> diff --git a/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h b/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h
> index 5a95b02055..28546bea99 100644
> --- a/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h
> +++ b/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h
> @@ -1,8 +1,8 @@
>  /** @file
>  *
>  *  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
> -*  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> -*  Copyright (c) 2015, Linaro Limited. All rights reserved.
> +*  Copyright (c) 2015-2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2015-2018, Linaro Limited. All rights reserved.
>  *
>  *  This program and the accompanying materials
>  *  are licensed and made available under the terms and conditions of the BSD License
> @@ -20,28 +20,7 @@
>  #ifndef _HI1610_PLATFORM_H_
>  #define _HI1610_PLATFORM_H_
>  
> -//
> -// ACPI table information used to initialize tables.
> -//
> -#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
> -#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64('H','I','P','0','6',' ',' ',' ') // OEM table id 8 bytes long
> -#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
> -#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32('I','N','T','L')
> -#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
> -
> -// A macro to initialise the common header part of EFI ACPI tables as defined by
> -// EFI_ACPI_DESCRIPTION_HEADER structure.
> -#define ARM_ACPI_HEADER(Signature, Type, Revision) {              \
> -    Signature,                      /* UINT32  Signature */       \
> -    sizeof (Type),                  /* UINT32  Length */          \
> -    Revision,                       /* UINT8   Revision */        \
> -    0,                              /* UINT8   Checksum */        \
> -    { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
> -    EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
> -    EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
> -    EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
> -    EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
> -  }
> +#include <../Include/PlatformArch.h>

I pointed out in review of v1: no relative include paths.

Cleanest way of resolving this is by adding a
Silicon/Hisilicon/Hi1610/Hi1610.dec, much like
Platform/Hisilicon/D03/D03.dec, and add a dependency on that in the
[Packages] section of
Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/AcpiTablesHi1610.inf.

>  
>  #define HI1610_WATCHDOG_COUNT  2
>  
> diff --git a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
> index 45995c5893..8e5913447c 100644
> --- a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
> +++ b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
> @@ -31,5 +31,29 @@
>  
>  #define S1_BASE               0x40000000000
>  
> +
> +//
> +// ACPI table information used to initialize tables.
> +//
> +#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
> +#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64 ('H','I','P','0','6',' ',' ',' ') // OEM table id 8 bytes long
> +#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
> +#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32 ('I','N','T','L')
> +#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
> +
> +// A macro to initialise the common header part of EFI ACPI tables as defined by
> +// EFI_ACPI_DESCRIPTION_HEADER structure.
> +#define ARM_ACPI_HEADER(Signature, Type, Revision) {            \
> +  Signature,                      /* UINT32  Signature */       \
> +  sizeof (Type),                  /* UINT32  Length */          \
> +  Revision,                       /* UINT8   Revision */        \
> +  0,                              /* UINT8   Checksum */        \
> +  { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
> +  EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
> +  EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
> +  EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
> +  EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
> +  }
> +
>  #endif
>  
> diff --git a/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h b/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h
> index ad73aa2668..04f9e34a14 100644
> --- a/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h
> +++ b/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h
> @@ -21,29 +21,7 @@
>  #define _HI1610_PLATFORM_H_
>  
>  #include <IndustryStandard/Acpi.h>
> -
> -//
> -// ACPI table information used to initialize tables.
> -//
> -#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
> -#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64('H','I','P','0','7',' ',' ',' ') // OEM table id 8 bytes long
> -#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
> -#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32('I','N','T','L')
> -#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
> -
> -// A macro to initialise the common header part of EFI ACPI tables as defined by
> -// EFI_ACPI_DESCRIPTION_HEADER structure.
> -#define ARM_ACPI_HEADER(Signature, Type, Revision) {              \
> -    Signature,                      /* UINT32  Signature */       \
> -    sizeof (Type),                  /* UINT32  Length */          \
> -    Revision,                       /* UINT8   Revision */        \
> -    0,                              /* UINT8   Checksum */        \
> -    { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
> -    EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
> -    EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
> -    EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
> -    EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
> -  }
> +#include <../Include/PlatformArch.h>

Same comment, no relative includes.
But here a Silicon/Hisilicon/Hi1616/Hi1616.dec.

/
    Leif

>  
>  #define HI1616_WATCHDOG_COUNT  2
>  #define HI1616_GIC_STRUCTURE_COUNT  64
> diff --git a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
> index bf0994a5e9..24167d1633 100644
> --- a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
> +++ b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
> @@ -31,5 +31,28 @@
>  
>  #define S1_BASE               0x40000000000
>  
> +//
> +// ACPI table information used to initialize tables.
> +//
> +#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
> +#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64 ('H','I','P','0','7',' ',' ',' ') // OEM table id 8 bytes long
> +#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
> +#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32 ('I','N','T','L')
> +#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
> +
> +// A macro to initialise the common header part of EFI ACPI tables as defined by
> +// EFI_ACPI_DESCRIPTION_HEADER structure.
> +#define ARM_ACPI_HEADER(Signature, Type, Revision) {            \
> +  Signature,                      /* UINT32  Signature */       \
> +  sizeof (Type),                  /* UINT32  Length */          \
> +  Revision,                       /* UINT8   Revision */        \
> +  0,                              /* UINT8   Checksum */        \
> +  { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
> +  EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
> +  EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
> +  EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
> +  EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
> +  }
> +
>  #endif
>  
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 03/43] Silicon/Hisilicon/Acpi: Move some macro to PlatformArch.h
  2018-08-17 13:23   ` Leif Lindholm
@ 2018-08-18  7:26     ` Ming
  0 siblings, 0 replies; 93+ messages in thread
From: Ming @ 2018-08-18  7:26 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu



在 8/17/2018 9:23 PM, Leif Lindholm 写道:
> 
> On Tue, Aug 14, 2018 at 04:08:23PM +0800, Ming Huang wrote:
>> ARM_ACPI_HEADER is used by a unify module in HwPkg,
>> so move some macro to PlatformArch.h for unify D0x.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ming Huang <ming.huang@linaro.org>
>> ---
>>  Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h | 27 +++-----------------
>>  Silicon/Hisilicon/Hi1610/Include/PlatformArch.h            | 24 +++++++++++++++++
>>  Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h    | 24 +----------------
>>  Silicon/Hisilicon/Hi1616/Include/PlatformArch.h            | 23 +++++++++++++++++
>>  4 files changed, 51 insertions(+), 47 deletions(-)
>>
>> diff --git a/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h b/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h
>> index 5a95b02055..28546bea99 100644
>> --- a/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h
>> +++ b/Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/Hi1610Platform.h
>> @@ -1,8 +1,8 @@
>>  /** @file
>>  *
>>  *  Copyright (c) 2011-2015, ARM Limited. All rights reserved.
>> -*  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
>> -*  Copyright (c) 2015, Linaro Limited. All rights reserved.
>> +*  Copyright (c) 2015-2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2015-2018, Linaro Limited. All rights reserved.
>>  *
>>  *  This program and the accompanying materials
>>  *  are licensed and made available under the terms and conditions of the BSD License
>> @@ -20,28 +20,7 @@
>>  #ifndef _HI1610_PLATFORM_H_
>>  #define _HI1610_PLATFORM_H_
>>  
>> -//
>> -// ACPI table information used to initialize tables.
>> -//
>> -#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
>> -#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64('H','I','P','0','6',' ',' ',' ') // OEM table id 8 bytes long
>> -#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
>> -#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32('I','N','T','L')
>> -#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
>> -
>> -// A macro to initialise the common header part of EFI ACPI tables as defined by
>> -// EFI_ACPI_DESCRIPTION_HEADER structure.
>> -#define ARM_ACPI_HEADER(Signature, Type, Revision) {              \
>> -    Signature,                      /* UINT32  Signature */       \
>> -    sizeof (Type),                  /* UINT32  Length */          \
>> -    Revision,                       /* UINT8   Revision */        \
>> -    0,                              /* UINT8   Checksum */        \
>> -    { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
>> -    EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
>> -    EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
>> -    EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
>> -    EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
>> -  }
>> +#include <../Include/PlatformArch.h>
> 
> I pointed out in review of v1: no relative include paths.
> 
> Cleanest way of resolving this is by adding a
> Silicon/Hisilicon/Hi1610/Hi1610.dec, much like
> Platform/Hisilicon/D03/D03.dec, and add a dependency on that in the
> [Packages] section of
> Silicon/Hisilicon/Hi1610/Hi1610AcpiTables/AcpiTablesHi1610.inf.
> 
>>  
>>  #define HI1610_WATCHDOG_COUNT  2
>>  
>> diff --git a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
>> index 45995c5893..8e5913447c 100644
>> --- a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
>> +++ b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
>> @@ -31,5 +31,29 @@
>>  
>>  #define S1_BASE               0x40000000000
>>  
>> +
>> +//
>> +// ACPI table information used to initialize tables.
>> +//
>> +#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
>> +#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64 ('H','I','P','0','6',' ',' ',' ') // OEM table id 8 bytes long
>> +#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
>> +#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32 ('I','N','T','L')
>> +#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
>> +
>> +// A macro to initialise the common header part of EFI ACPI tables as defined by
>> +// EFI_ACPI_DESCRIPTION_HEADER structure.
>> +#define ARM_ACPI_HEADER(Signature, Type, Revision) {            \
>> +  Signature,                      /* UINT32  Signature */       \
>> +  sizeof (Type),                  /* UINT32  Length */          \
>> +  Revision,                       /* UINT8   Revision */        \
>> +  0,                              /* UINT8   Checksum */        \
>> +  { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
>> +  EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
>> +  EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
>> +  EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
>> +  EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
>> +  }
>> +
>>  #endif
>>  
>> diff --git a/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h b/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h
>> index ad73aa2668..04f9e34a14 100644
>> --- a/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h
>> +++ b/Silicon/Hisilicon/Hi1616/D05AcpiTables/Hi1616Platform.h
>> @@ -21,29 +21,7 @@
>>  #define _HI1610_PLATFORM_H_
>>  
>>  #include <IndustryStandard/Acpi.h>
>> -
>> -//
>> -// ACPI table information used to initialize tables.
>> -//
>> -#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
>> -#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64('H','I','P','0','7',' ',' ',' ') // OEM table id 8 bytes long
>> -#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
>> -#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32('I','N','T','L')
>> -#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
>> -
>> -// A macro to initialise the common header part of EFI ACPI tables as defined by
>> -// EFI_ACPI_DESCRIPTION_HEADER structure.
>> -#define ARM_ACPI_HEADER(Signature, Type, Revision) {              \
>> -    Signature,                      /* UINT32  Signature */       \
>> -    sizeof (Type),                  /* UINT32  Length */          \
>> -    Revision,                       /* UINT8   Revision */        \
>> -    0,                              /* UINT8   Checksum */        \
>> -    { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
>> -    EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
>> -    EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
>> -    EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
>> -    EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
>> -  }
>> +#include <../Include/PlatformArch.h>
> 
> Same comment, no relative includes.
> But here a Silicon/Hisilicon/Hi1616/Hi1616.dec.

Apology for miss the comments in v2 and thank for providing the way.
Modify it in v4.

> 
> /
>     Leif
> 
>>  
>>  #define HI1616_WATCHDOG_COUNT  2
>>  #define HI1616_GIC_STRUCTURE_COUNT  64
>> diff --git a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
>> index bf0994a5e9..24167d1633 100644
>> --- a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
>> +++ b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
>> @@ -31,5 +31,28 @@
>>  
>>  #define S1_BASE               0x40000000000
>>  
>> +//
>> +// ACPI table information used to initialize tables.
>> +//
>> +#define EFI_ACPI_ARM_OEM_ID           'H','I','S','I',' ',' '   // OEMID 6 bytes long
>> +#define EFI_ACPI_ARM_OEM_TABLE_ID     SIGNATURE_64 ('H','I','P','0','7',' ',' ',' ') // OEM table id 8 bytes long
>> +#define EFI_ACPI_ARM_OEM_REVISION     0x00000000
>> +#define EFI_ACPI_ARM_CREATOR_ID       SIGNATURE_32 ('I','N','T','L')
>> +#define EFI_ACPI_ARM_CREATOR_REVISION 0x20151124
>> +
>> +// A macro to initialise the common header part of EFI ACPI tables as defined by
>> +// EFI_ACPI_DESCRIPTION_HEADER structure.
>> +#define ARM_ACPI_HEADER(Signature, Type, Revision) {            \
>> +  Signature,                      /* UINT32  Signature */       \
>> +  sizeof (Type),                  /* UINT32  Length */          \
>> +  Revision,                       /* UINT8   Revision */        \
>> +  0,                              /* UINT8   Checksum */        \
>> +  { EFI_ACPI_ARM_OEM_ID },        /* UINT8   OemId[6] */        \
>> +  EFI_ACPI_ARM_OEM_TABLE_ID,      /* UINT64  OemTableId */      \
>> +  EFI_ACPI_ARM_OEM_REVISION,      /* UINT32  OemRevision */     \
>> +  EFI_ACPI_ARM_CREATOR_ID,        /* UINT32  CreatorId */       \
>> +  EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
>> +  }
>> +
>>  #endif
>>  
>> -- 
>> 2.17.0
>>


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 05/43] Silicon/Hisilicon/D0x: Move RAS macro to PlatformArch.h
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 05/43] Silicon/Hisilicon/D0x: Move RAS macro " Ming Huang
@ 2018-08-21 17:48   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-21 17:48 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Sun Yuanchen

This one needs to be rebased onto the modified 3/43.
I have no other issues with it, so when you resubmit:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

On Tue, Aug 14, 2018 at 04:08:25PM +0800, Ming Huang wrote:
> From: Sun Yuanchen <sunyuanchen@huawei.com>
> 
> Move some RAS macros definition to PlatformArch.h for
> unifying D0x
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Sun Yuanchen <sunyuanchen@huawei.com>
> ---
>  Silicon/Hisilicon/Hi1610/Include/PlatformArch.h |  9 +++++++--
>  Silicon/Hisilicon/Hi1616/Include/PlatformArch.h | 12 ++++++++++++
>  2 files changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
> index 2ff076901e..f39ae0748c 100644
> --- a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
> +++ b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
> @@ -1,7 +1,7 @@
>  /** @file
>  *
> -*  Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> -*  Copyright (c) 2015, Linaro Limited. All rights reserved.
> +*  Copyright (c) 2015 - 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2015 - 2018, Linaro Limited. All rights reserved.
>  *
>  *  This program and the accompanying materials
>  *  are licensed and made available under the terms and conditions of the BSD License
> @@ -32,6 +32,11 @@
>  
>  #define S1_BASE               0x40000000000
>  
> +#define RASC_BASE                (0x5000)
> +/* configuration register for Rank statistical information */
> +#define RASC_CFG_INFOIDX_REG     (RASC_BASE + 0x5C)
> +/* configuration register for Sparing level */
> +#define RASC_CFG_SPLVL_REG       (RASC_BASE + 0xB8)
>  
>  //
>  // ACPI table information used to initialize tables.
> diff --git a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
> index 60a60593be..e02e4bdabd 100644
> --- a/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
> +++ b/Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
> @@ -30,6 +30,18 @@
>  // Max NUMA node number for each node type
>  #define MAX_NUM_PER_TYPE 8
>  
> +#define RASC_BASE                (0x5000)
> +/* configuration register for Rank statistical information */
> +#define RASC_CFG_INFOIDX_REG     (RASC_BASE + 0x5C)
> +/* configuration register for Sparing level */
> +#define RASC_CFG_SPLVL_REG       (RASC_BASE + 0xB8)
> +
> +// for acpi
> +#define NODE_IN_SOCKET                                  2
> +#define CORE_NUM_PER_SOCKET                             32
> +#define EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT        10
> +#define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT       8
> +
>  #define S1_BASE               0x40000000000
>  
>  //
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 01/43] Silicon/Hisilicon: Modify the MRC interface for other module
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 01/43] Silicon/Hisilicon: Modify the MRC interface for other module Ming Huang
@ 2018-08-21 17:50   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-21 17:50 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:21PM +0800, Ming Huang wrote:
> This patch is to unify D0x. Add pGBL_INTERFACE struct define
> and remove useless interfece. Replace DMRC pGblData with pGblInterface;

interfece ->
interface

I will fix that up on commit.
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>


> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Silicon/Hisilicon/Include/Library/HwMemInitLib.h                    | 356 ++++----------------
>  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c     |   4 +-
>  Silicon/Hisilicon/Drivers/Smbios/MemorySubClassDxe/MemorySubClass.c |  26 +-
>  3 files changed, 78 insertions(+), 308 deletions(-)


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 09/43] Hisilicon/D0X: Rename the global variable gDS3231RtcDevice
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 09/43] Hisilicon/D0X: Rename the global variable gDS3231RtcDevice Ming Huang
@ 2018-08-21 17:59   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-21 17:59 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:29PM +0800, Ming Huang wrote:
> The global variable gDS3231RtcDevice is used by several
> modules included common module in HwPkg. Renaming it
> with a general name is proper.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Silicon/Hisilicon/Include/Library/OemMiscLib.h                                 | 2 +-
>  Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c | 8 ++++----
>  Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c             | 2 +-
>  Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c                 | 2 +-
>  Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c      | 8 ++++----
>  5 files changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/Silicon/Hisilicon/Include/Library/OemMiscLib.h b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
> index 6f18c0fa72..87cb498dd7 100644
> --- a/Silicon/Hisilicon/Include/Library/OemMiscLib.h
> +++ b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
> @@ -34,7 +34,7 @@ extern REPORT_PCIEDIDVID2BMC PcieDeviceToReport[PCIEDEVICE_REPORT_MAX];
>  BOOLEAN OemIsSocketPresent (UINTN Socket);
>  VOID CoreSelectBoot(VOID);
>  VOID OemPcieResetAndOffReset(void);
> -extern I2C_DEVICE gDS3231RtcDevice;
> +extern I2C_DEVICE gRtcDevice;
>  
>  UINTN OemGetSocketNumber(VOID);
>  UINTN OemGetDdrChannel (VOID);
> diff --git a/Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c b/Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
> index 07fa52aa78..f6dbcf6b75 100644
> --- a/Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
> +++ b/Platform/Hisilicon/D03/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
> @@ -41,7 +41,7 @@
>  #include <Library/CpldD03.h>
>  #include <Library/CpldIoLib.h>
>  
> -extern I2C_DEVICE gDS3231RtcDevice;
> +extern I2C_DEVICE gRtcDevice;
>  
>  STATIC BOOLEAN       mDS3231Initialized = FALSE;
>  
> @@ -117,7 +117,7 @@ InitializeDS3231 (
>    // Prepare the hardware
>    (VOID)IdentifyDS3231();
>  
> -  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
> +  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));

You did the correct thing in adjusting the spacing when modifying this
line (and the identical ones below).

However, there should also be no space after (VOID), but there should
be one after sizeof. I have fixed this up on pushing.

For 2, 4, 8, 9:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

1, 2, 4, 8, 9, pushed as:
d11581e5fd..4e6af5fa1b

/
    Leif

>    Status = I2CInit(Dev.Socket,Dev.Port,Normal);
>    if (EFI_ERROR (Status)) {
> @@ -199,7 +199,7 @@ LibGetTime (
>      }
>    }
>  
> -  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
> +  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
>  
>    Status |= I2CRead(&Dev,DS3231_REGADDR_MONTH,1,&Temp);
>  
> @@ -299,7 +299,7 @@ LibSetTime (
>      }
>    }
>  
> -  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
> +  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
>  
>    Temp = ((Time->Second/10)<<4) | (Time->Second%10);
>    MicroSecondDelay(1000);
> diff --git a/Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c b/Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c
> index 66d62895a6..4771cb900c 100644
> --- a/Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c
> +++ b/Platform/Hisilicon/D03/Library/OemMiscLib2P/BoardFeature2PHi1610.c
> @@ -25,7 +25,7 @@
>  #include <Library/I2CLib.h>
>  #include <Library/HiiLib.h>
>  
> -I2C_DEVICE gDS3231RtcDevice = {
> +I2C_DEVICE gRtcDevice = {
>      .Socket = 0,
>      .Port = 6,
>      .DeviceType = DEVICE_TYPE_SPD,
> diff --git a/Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c b/Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c
> index 15a509be5d..ae4c194070 100644
> --- a/Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c
> +++ b/Platform/Hisilicon/D05/Library/OemMiscLibD05/BoardFeatureD05.c
> @@ -26,7 +26,7 @@
>  #include <Protocol/Smbios.h>
>  
>  
> -I2C_DEVICE gDS3231RtcDevice = {
> +I2C_DEVICE gRtcDevice = {
>    .Socket = 0,
>    .Port = 4,
>    .DeviceType = DEVICE_TYPE_SPD,
> diff --git a/Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c b/Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
> index 02d6d7f14d..105eb15635 100644
> --- a/Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
> +++ b/Silicon/Hisilicon/Library/DS3231RealTimeClockLib/DS3231RealTimeClockLib.c
> @@ -39,7 +39,7 @@
>  #include <Library/I2CLib.h>
>  #include "DS3231RealTimeClock.h"
>  
> -extern I2C_DEVICE gDS3231RtcDevice;
> +extern I2C_DEVICE gRtcDevice;
>  
>  STATIC BOOLEAN       mDS3231Initialized = FALSE;
>  
> @@ -67,7 +67,7 @@ InitializeDS3231 (
>    // Prepare the hardware
>    (VOID)IdentifyDS3231();
>  
> -  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
> +  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
>  
>    Status = I2CInit(Dev.Socket,Dev.Port,Normal);
>    if (EFI_ERROR (Status)) {
> @@ -143,7 +143,7 @@ LibGetTime (
>      }
>    }
>  
> -  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
> +  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
>  
>  
>    Status |= I2CRead(&Dev,DS3231_REGADDR_MONTH,1,&Temp);
> @@ -233,7 +233,7 @@ LibSetTime (
>      }
>    }
>  
> -  (VOID) CopyMem(&Dev, &gDS3231RtcDevice, sizeof(Dev));
> +  (VOID) CopyMem (&Dev, &gRtcDevice, sizeof(Dev));
>  
>    Temp = ((Time->Second/10)<<4) | (Time->Second%10);
>    MicroSecondDelay(1000);
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 10/43] Hisilicon/D06: Add several base file for D06
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 10/43] Hisilicon/D06: Add several base file for D06 Ming Huang
@ 2018-08-21 21:56   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-21 21:56 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:30PM +0800, Ming Huang wrote:
> Add several base head files and add several build
> files for D06.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

All my comments have been addressed, so:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---
>  Platform/Hisilicon/D06/D06.dec                       |  29 ++
>  Platform/Hisilicon/D06/D06.dsc                       | 455 ++++++++++++++++++++
>  Platform/Hisilicon/D06/D06.fdf                       | 351 +++++++++++++++
>  Platform/Hisilicon/D06/Include/Library/CpldD06.h     |  37 ++
>  Silicon/Hisilicon/Hi1620/Include/Library/SerdesLib.h |  85 ++++
>  Silicon/Hisilicon/Hi1620/Include/PlatformArch.h      |  61 +++
>  Silicon/Hisilicon/Include/Library/OemAddressMapLib.h |   6 +
>  Silicon/Hisilicon/Include/Library/OemNicLib.h        |  57 +++
>  8 files changed, 1081 insertions(+)


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 11/43] Platform/Hisilicon/D06: Add M41T83RealTimeClockLib
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 11/43] Platform/Hisilicon/D06: Add M41T83RealTimeClockLib Ming Huang
@ 2018-08-21 22:57   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-21 22:57 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu



On Tue, Aug 14, 2018 at 04:08:31PM +0800, Ming Huang wrote:
> Add M41T83RealTimeClockLib for RTC.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Platform/Hisilicon/D06/D06.dsc                                              |   1 +
>  Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf |  46 ++
>  Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h      | 158 ++++++
>  Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c   | 564 ++++++++++++++++++++
>  4 files changed, 769 insertions(+)
> 
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index d14fce1159..27358f8c78 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -65,6 +65,7 @@
>    CpldIoLib|Silicon/Hisilicon/Library/CpldIoLib/CpldIoLib.inf
>  
>    TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf
> +  RealTimeClockLib|Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
>  
>    CapsuleLib|MdeModulePkg/Library/DxeCapsuleLibNull/DxeCapsuleLibNull.inf
>    GenericBdsLib|IntelFrameworkModulePkg/Library/GenericBdsLib/GenericBdsLib.inf
> diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
> new file mode 100644
> index 0000000000..e0bf6b3f24
> --- /dev/null
> +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
> @@ -0,0 +1,46 @@
> +#/** @file
> +#
> +#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
> +#  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and conditions of the BSD License
> +#  which accompanies this distribution.  The full text of the license may be found at
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#**/
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001001A
> +  BASE_NAME                      = M41T83RealTimeClockLib
> +  FILE_GUID                      = 470DFB96-E205-4515-A75E-2E60F853E79D
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = RealTimeClockLib
> +
> +[Sources.common]
> +  M41T83RealTimeClockLib.c
> +
> +[Packages]
> +  EmbeddedPkg/EmbeddedPkg.dec
> +  MdePkg/MdePkg.dec
> +  Platform/Hisilicon/D06/D06.dec
> +  Silicon/Hisilicon/HisiPkg.dec
> +
> +[LibraryClasses]
> +  BaseMemoryLib
> +  CpldIoLib
> +  DebugLib
> +  I2CLib
> +  IoLib
> +  PcdLib
> +  TimeBaseLib
> +  TimerLib
> +  UefiLib
> +  UefiRuntimeLib        # Use EFiAtRuntime to check stage
> +
> +[Depex]
> +  gEfiCpuArchProtocolGuid
> diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h
> new file mode 100644
> index 0000000000..ed10099bf3
> --- /dev/null
> +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h
> @@ -0,0 +1,158 @@
> +/** @file
> +
> +  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
> +  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD License
> +  which accompanies this distribution.  The full text of the license may be found at
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef __M41T83_REAL_TIME_CLOCK_H__
> +#define __M41T83_REAL_TIME_CLOCK_H__
> +
> +// The delay is need for cpld and I2C. This is a empirical value. MemoryFance is no need.
> +#define RTC_DELAY_30_MS            30000
> +// The delay is need for cpld and I2C. This is a empirical value. MemoryFance is no need.
> +#define RTC_DELAY_1000_MACROSECOND 1000
> +// The delay is need for cpld and I2C. This is a empirical value. MemoryFance is no need.
> +#define RTC_DELAY_2_MACROSECOND    2
> +
> +#define M41T83_REGADDR_DOTSECONDS       0x00
> +#define M41T83_REGADDR_SECONDS          0x01
> +#define M41T83_REGADDR_MINUTES          0x02
> +#define M41T83_REGADDR_HOURS            0x03
> +#define M41T83_REGADDR_WEEK_DAY         0x04
> +#define M41T83_REGADDR_DAY              0x05
> +#define M41T83_REGADDR_MONTH            0x06
> +#define M41T83_REGADDR_YEAR             0x07
> +#define M41T83_REGADDR_ALARM1SEC        0x0E
> +#define M41T83_REGADDR_ALARM1MIN        0x0D
> +#define M41T83_REGADDR_ALARM1HOUR       0x0C
> +#define M41T83_REGADDR_ALARM1DATE       0x0B
> +#define M41T83_REGADDR_ALARM1MONTH      0x0A
> +
> +#define M41T83_REGADDR_TIMERCONTROL     0x11
> +
> +#define M41T83_REGADDR_ALARM2SEC        0x18
> +#define M41T83_REGADDR_ALARM2MIN        0x17
> +#define M41T83_REGADDR_ALARM2HOUR       0x16
> +#define M41T83_REGADDR_ALARM2DATE       0x15
> +#define M41T83_REGADDR_ALARM2MONTH      0x14
> +
> +typedef union {
> +  struct {
> +    UINT8 TD0:1;
> +    UINT8 TD1:1;
> +    UINT8 RSV:3;
> +    UINT8 TIE:1;
> +    UINT8 TITP:1;
> +    UINT8 TE:1;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_TIMERCONTROL;
> +
> +typedef union {
> +  struct {
> +    UINT8 MicroSeconds;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_DOTSECOND;
> +
> +typedef union {
> +  struct{
> +    UINT8 Seconds:7;
> +    UINT8 ST:1;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_SECOND;
> +
> +typedef union {
> +  struct {
> +    UINT8 Minutes:7;
> +    UINT8 Rsv:1;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_MINUTE;
> +
> +typedef union {
> +  struct {
> +    UINT8 Hours:6;
> +    UINT8 CB:2;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_HOUR;
> +
> +typedef union {
> +  struct{
> +    UINT8 Days:3;
> +    UINT8 Rsv:5;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_WEEK_DAY;
> +
> +typedef union {
> +  struct{
> +    UINT8 Days:6;
> +    UINT8 Rsv:2;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_MONTH_DAY;
> +
> +typedef union {
> +  struct {
> +    UINT8 Months:5;
> +    UINT8 Rsv:3;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_MONTH;
> +
> +typedef union {
> +  struct {
> +    UINT8 Years:8;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_YEAR;
> +
> +typedef union {
> +  struct {
> +    UINT8 Second:7;
> +    UINT8 RPT11:1;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_ALARM1SEC;
> +
> +typedef union {
> +  struct {
> +    UINT8 Minute:7;
> +    UINT8 RPT12:1;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_ALARM1MIN;
> +
> +typedef union {
> +  struct {
> +    UINT8 Hour:6;
> +    UINT8 HT:1;
> +    UINT8 RPT13:1;
> +  } Bits;
> +  UINT8 Uint8;
> +} RTC_M41T83_ALARM1HOUR;
> +
> +typedef struct {
> +  RTC_M41T83_DOTSECOND  DotSecond;
> +  RTC_M41T83_SECOND     Second;
> +  RTC_M41T83_MINUTE     Minute;
> +  RTC_M41T83_HOUR       Hour;
> +  RTC_M41T83_WEEK_DAY   WeekDay;
> +  RTC_M41T83_MONTH_DAY  Day;
> +  RTC_M41T83_MONTH      Month;
> +  RTC_M41T83_YEAR       Year;
> +} RTC_M41T83_TIME;
> +
> +#endif
> diff --git a/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c
> new file mode 100644
> index 0000000000..eabe8dc0f3
> --- /dev/null
> +++ b/Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c
> @@ -0,0 +1,564 @@
> +/** @file
> +
> +  Copyright (c) 2018, Hisilicon Limited. All rights reserved.<BR>
> +  Copyright (c) 2018, Linaro Limited. All rights reserved.<BR>
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD License
> +  which accompanies this distribution.  The full text of the license may be found at
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +

The highlightes include appear unused.

> +#include <Uefi.h>
> +#include <PiDxe.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/CpldD06.h>
> +#include <Library/CpldIoLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/I2CLib.h>

* > +#include <Library/IoLib.h>

* > +#include <Library/MemoryAllocationLib.h>

* > +#include <Library/PcdLib.h>

> +#include <Library/TimeBaseLib.h>
> +#include <Library/TimerLib.h>
> +#include <Library/UefiLib.h>

* > +#include <Library/UefiBootServicesTableLib.h>

> +#include <Library/UefiRuntimeLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>

* > +#include <Protocol/RealTimeClock.h>

If really unused, please delete.

/
    Leif


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 12/43] Platform/Hisilicon/D06: Add edk2-non-osi components for D06
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 12/43] Platform/Hisilicon/D06: Add edk2-non-osi components for D06 Ming Huang
@ 2018-08-22  9:49   ` Leif Lindholm
  2018-08-22 14:54     ` Ming
  0 siblings, 1 reply; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22  9:49 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:32PM +0800, Ming Huang wrote:
> Add PcdCoreCount to fix build issue while add binary components.

This commit message fails to describe what is being done, apart from a
single thing that should be a separate patch.

Pleas add a proper commit message describing which components are
being imported.

> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Platform/Hisilicon/D06/D06.dsc                                                 |  7 +++++++
>  Platform/Hisilicon/D06/D06.fdf                                                 | 17 +++++++++++++++++
>  Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf |  2 ++
>  3 files changed, 26 insertions(+)
> 

> diff --git a/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf b/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
> index 2275586ff3..a47806f391 100644
> --- a/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
> +++ b/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
> @@ -28,6 +28,7 @@
>  
>  [Packages]
>    ArmPkg/ArmPkg.dec
> +  ArmPlatformPkg/ArmPlatformPkg.dec
>    MdePkg/MdePkg.dec
>    MdeModulePkg/MdeModulePkg.dec
>    IntelFrameworkPkg/IntelFrameworkPkg.dec
> @@ -52,6 +53,7 @@
>    gEfiSmbiosProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
>  
>  [Pcd]
> +  gArmPlatformTokenSpaceGuid.PcdCoreCount
>    gHisiTokenSpaceGuid.PcdCPUInfo
>    gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz

And please submit this as a separate patch, explaining why the change
is needed. If it is only needed by one of the binary modules imported
as part of the current patch, place it immediately preceding this.

If it resolves some other issue, please insert it as early in the set
as possible.

/
    Leif

>  
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 13/43] Hisilicon/D06: Add OemMiscLibD06
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 13/43] Hisilicon/D06: Add OemMiscLibD06 Ming Huang
@ 2018-08-22 10:17   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 10:17 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:33PM +0800, Ming Huang wrote:
> This library include BoardFeatureD06.c and OemMiscLibD06.c c file,
> use for several modules like PciHostBridgeLib and Smbios.
> Enlarge macro PCIEDEVICE_REPORT_MAX for D06.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Platform/Hisilicon/D06/D06.dsc                                          |   1 +
>  Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf          |  47 +++
>  Silicon/Hisilicon/Include/Library/OemMiscLib.h                          |   6 +-
>  Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06.c          | 432 ++++++++++++++++++++
>  Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c            | 132 ++++++
>  Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni |  64 +++
>  6 files changed, 681 insertions(+), 1 deletion(-)
> 
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index 94454569f6..9ca7160dad 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -70,6 +70,7 @@
>  
>    TimeBaseLib|EmbeddedPkg/Library/TimeBaseLib/TimeBaseLib.inf
>    RealTimeClockLib|Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
> +  OemMiscLib|Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
>    OemAddressMapLib|Platform/Hisilicon/D06/Library/OemAddressMapD06/OemAddressMapD06.inf
>    PlatformSysCtrlLib|Silicon/Hisilicon/Hi1620/Library/PlatformSysCtrlLibHi1620/PlatformSysCtrlLibHi1620.inf
>  

> diff --git a/Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni b/Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni
> new file mode 100644
> index 0000000000..046fa05dff
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni
> @@ -0,0 +1,64 @@
> +// *++
> +//
> +// Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>

Add your own copyright year.
With that, the next revision can include:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> +//
> +// This program and the accompanying materials
> +// are licensed and made available under the terms and conditions of the BSD License
> +// which accompanies this distribution.  The full text of the license may be found at
> +// http://opensource.org/licenses/bsd-license.php
> +//
> +// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +//
> +// --*/
> +
> +/=#
> +
> +#langdef en-US "English"
> +
> +//
> +// Begin English Language Strings
> +//
> +#string STR_MEMORY_SUBCLASS_UNKNOWN    #language en-US  "Unknown"
> +
> +//
> +// DIMM Device Locator strings
> +
> +// D06
> +#string STR_LEMON_C10_DIMM_000     #language en-US "J5"
> +#string STR_LEMON_C10_DIMM_001     #language en-US "J6"
> +#string STR_LEMON_C10_DIMM_010     #language en-US "J7"
> +#string STR_LEMON_C10_DIMM_011     #language en-US "J8"
> +#string STR_LEMON_C10_DIMM_020     #language en-US "J9"
> +#string STR_LEMON_C10_DIMM_021     #language en-US "J10"
> +#string STR_LEMON_C10_DIMM_030     #language en-US "J11"
> +#string STR_LEMON_C10_DIMM_031     #language en-US "J12"
> +#string STR_LEMON_C10_DIMM_040     #language en-US "J13"
> +#string STR_LEMON_C10_DIMM_041     #language en-US "J14"
> +#string STR_LEMON_C10_DIMM_050     #language en-US "J15"
> +#string STR_LEMON_C10_DIMM_051     #language en-US "J16"
> +#string STR_LEMON_C10_DIMM_060     #language en-US "J17"
> +#string STR_LEMON_C10_DIMM_061     #language en-US "J18"
> +#string STR_LEMON_C10_DIMM_070     #language en-US "J19"
> +#string STR_LEMON_C10_DIMM_071     #language en-US "J20"
> +#string STR_LEMON_C10_DIMM_100     #language en-US "J21"
> +#string STR_LEMON_C10_DIMM_101     #language en-US "J22"
> +#string STR_LEMON_C10_DIMM_110     #language en-US "J23"
> +#string STR_LEMON_C10_DIMM_111     #language en-US "J24"
> +#string STR_LEMON_C10_DIMM_120     #language en-US "J25"
> +#string STR_LEMON_C10_DIMM_121     #language en-US "J26"
> +#string STR_LEMON_C10_DIMM_130     #language en-US "J27"
> +#string STR_LEMON_C10_DIMM_131     #language en-US "J28"
> +#string STR_LEMON_C10_DIMM_140     #language en-US "J29"
> +#string STR_LEMON_C10_DIMM_141     #language en-US "J30"
> +#string STR_LEMON_C10_DIMM_150     #language en-US "J31"
> +#string STR_LEMON_C10_DIMM_151     #language en-US "J32"
> +#string STR_LEMON_C10_DIMM_160     #language en-US "J33"
> +#string STR_LEMON_C10_DIMM_161     #language en-US "J34"
> +#string STR_LEMON_C10_DIMM_170     #language en-US "J35"
> +#string STR_LEMON_C10_DIMM_171     #language en-US "J36"
> +
> +//
> +// End English Language Strings
> +//
> +
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 15/43] Silicon/Hisilicon/Acpi: Unify HisiAcipPlatformDxe
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 15/43] Silicon/Hisilicon/Acpi: Unify HisiAcipPlatformDxe Ming Huang
@ 2018-08-22 10:29   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 10:29 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:35PM +0800, Ming Huang wrote:
> The EFI_ACPI_STATIC_RESOURCE_AFFINITY_TABLE struct is used by
> UpdateAcpiTable.c and Srat aslc. The struct may be different
> according to chips, so move some macro to PlatformArch.h.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

I told you you could have
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
on this one.

Please add that to all patches where I say that on next submission.

(But also fix the spelling of Acpi in the subject please, I missed
that :)

/
    Leif

> ---
>  Silicon/Hisilicon/Hi1610/Include/PlatformArch.h                 |  6 ++++
>  Silicon/Hisilicon/Hi1620/Include/PlatformArch.h                 |  6 ++++
>  Silicon/Hisilicon/Include/Library/AcpiNextLib.h                 | 31 ++++++++++++++------
>  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c |  2 --
>  4 files changed, 34 insertions(+), 11 deletions(-)
> 
> diff --git a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
> index f39ae0748c..1ebddca4e5 100644
> --- a/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
> +++ b/Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
> @@ -30,6 +30,12 @@
>  // Max NUMA node number for each node type
>  #define MAX_NUM_PER_TYPE 8
>  
> +// for acpi
> +#define NODE_IN_SOCKET                                  2
> +#define CORE_NUM_PER_SOCKET                             32
> +#define EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT        10
> +#define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT       8
> +
>  #define S1_BASE               0x40000000000
>  
>  #define RASC_BASE                (0x5000)
> diff --git a/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h b/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
> index 9539cfdada..f3ad45f6c6 100644
> --- a/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
> +++ b/Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
> @@ -57,5 +57,11 @@
>    EFI_ACPI_ARM_CREATOR_REVISION   /* UINT32  CreatorRevision */ \
>    }
>  
> +// for acpi
> +#define NODE_IN_SOCKET                                  2
> +#define CORE_NUM_PER_SOCKET                             48
> +#define EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT        16
> +#define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT       1
> +
>  #endif
>  
> diff --git a/Silicon/Hisilicon/Include/Library/AcpiNextLib.h b/Silicon/Hisilicon/Include/Library/AcpiNextLib.h
> index fd05a3b960..2abffb65fc 100644
> --- a/Silicon/Hisilicon/Include/Library/AcpiNextLib.h
> +++ b/Silicon/Hisilicon/Include/Library/AcpiNextLib.h
> @@ -19,6 +19,21 @@
>  #ifndef __ACPI_NEXT_LIB_H__
>  #define __ACPI_NEXT_LIB_H__
>  
> +#include <PlatformArch.h>
> +
> +///
> +/// ITS Affinity Structure Definition
> +///
> +#pragma pack(1)
> +typedef struct {
> +  UINT8   Type;
> +  UINT8   Length;
> +  UINT32  ProximityDomain;
> +  UINT16  Reserved;
> +  UINT32  ItsHwId;
> +} EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE;
> +#pragma pack()
> +
>  #define EFI_ACPI_6_1_GIC_ITS_INIT(GicITSHwId, GicITSBase) \
>    { \
>      EFI_ACPI_6_1_GIC_ITS, sizeof (EFI_ACPI_6_1_GIC_ITS_STRUCTURE), EFI_ACPI_RESERVED_WORD, \
> @@ -42,8 +57,8 @@
>  #define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_INIT(                                               \
>      ProximityDomain, ItsId)                                                                     \
>    {                                                                                             \
> -    4, sizeof (EFI_ACPI_6_2_GIC_ITS_AFFINITY_STRUCTURE), ProximityDomain,                           \
> -    {EFI_ACPI_RESERVED_BYTE, EFI_ACPI_RESERVED_BYTE}, ItsId                                                               \
> +    4, sizeof (EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE), ProximityDomain,                           \
> +    EFI_ACPI_RESERVED_WORD, ItsId                                                               \
>    }
>  
>  #define EFI_ACPI_6_1_MEMORY_AFFINITY_STRUCTURE_INIT(                                              \
> @@ -75,15 +90,13 @@
>  // Define the number of each table type.
>  // This is where the table layout is modified.
>  //
> -#define EFI_ACPI_PROCESSOR_LOCAL_GICC_AFFINITY_STRUCTURE_COUNT  64
> -#define EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT                10
> -#define EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT               8
> +#define EFI_ACPI_PROCESSOR_LOCAL_GICC_AFFINITY_STRUCTURE_COUNT  (MAX_SOCKET*CORE_NUM_PER_SOCKET)
>  
>  typedef struct {
> -  EFI_ACPI_6_0_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER          Header;
> -  EFI_ACPI_6_0_MEMORY_AFFINITY_STRUCTURE                      Memory[EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT];
> -  EFI_ACPI_6_0_GICC_AFFINITY_STRUCTURE                        Gicc[EFI_ACPI_PROCESSOR_LOCAL_GICC_AFFINITY_STRUCTURE_COUNT];
> -  EFI_ACPI_6_2_GIC_ITS_AFFINITY_STRUCTURE                     Its[EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT];
> +  EFI_ACPI_6_2_SYSTEM_RESOURCE_AFFINITY_TABLE_HEADER          Header;
> +  EFI_ACPI_6_2_MEMORY_AFFINITY_STRUCTURE                      Memory[EFI_ACPI_MEMORY_AFFINITY_STRUCTURE_COUNT];
> +  EFI_ACPI_6_2_GICC_AFFINITY_STRUCTURE                        Gicc[EFI_ACPI_PROCESSOR_LOCAL_GICC_AFFINITY_STRUCTURE_COUNT];
> +  EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE                         Its[EFI_ACPI_6_2_ITS_AFFINITY_STRUCTURE_COUNT];
>  } EFI_ACPI_STATIC_RESOURCE_AFFINITY_TABLE;
>  
>  #pragma pack()
> diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> index f5869841dc..54f49977c3 100644
> --- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> +++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> @@ -20,8 +20,6 @@
>  #include <Library/UefiBootServicesTableLib.h>
>  #include <Library/UefiLib.h>
>  
> -#define CORE_NUM_PER_SOCKET  32
> -#define NODE_IN_SOCKET       2
>  #define CORECOUNT(X) ((X) * CORE_NUM_PER_SOCKET)
>  
>  STATIC
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 16/43] Hisilicon/D06: Add Debug Serial Port Init Driver
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 16/43] Hisilicon/D06: Add Debug Serial Port Init Driver Ming Huang
@ 2018-08-22 11:01   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 11:01 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Heyi Guo

On Tue, Aug 14, 2018 at 04:08:36PM +0800, Ming Huang wrote:
> From: Heyi Guo <heyi.guo@linaro.org>
> 
> Hi1620 have two physical PL011 serial ports on the board,
> one for serial port console (described by ACPI SPCR) and
> the other for standard debug port (described by ACPI DBG2).
> This driver is to initialize the debug UART, not the serial
> console.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Heyi Guo <heyi.guo@linaro.org>

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---
>  Platform/Hisilicon/D06/D06.dsc                                                               |  1 +
>  Platform/Hisilicon/D06/D06.fdf                                                               |  1 +
>  Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf | 48 +++++++++++++++
>  Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c   | 64 ++++++++++++++++++++
>  4 files changed, 114 insertions(+)
> 
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index 9ca7160dad..20d2d2a1b4 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -422,6 +422,7 @@
>    # Memory test
>    #
>    MdeModulePkg/Universal/MemoryTest/NullMemoryTestDxe/NullMemoryTestDxe.inf
> +  Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
>    MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
>    MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
>    MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
> diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
> index 07fe096f61..8cac126ccf 100644
> --- a/Platform/Hisilicon/D06/D06.fdf
> +++ b/Platform/Hisilicon/D06/D06.fdf
> @@ -303,6 +303,7 @@ READ_LOCK_STATUS   = TRUE
>    INF MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
>    INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
>  
> +  INF Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
>    INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
>    #
>    # Build Shell from latest source code instead of prebuilt binary
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf b/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
> new file mode 100644
> index 0000000000..8c91bdf0f4
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
> @@ -0,0 +1,48 @@
> +#/** @file
> +#
> +#    Copyright (c) 2016 - 2018, Hisilicon Limited. All rights reserved.
> +#    Copyright (c) 2016 - 2018, Linaro Limited. All rights reserved.
> +#
> +#    This program and the accompanying materials
> +#    are licensed and made available under the terms and conditions of the BSD License
> +#    which accompanies this distribution. The full text of the license may be found at
> +#    http://opensource.org/licenses/bsd-license.php
> +#
> +#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#**/
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001001A
> +  BASE_NAME                      = Pl011DebugSerialPortInitDxe
> +  FILE_GUID                      = 16D53E86-7EA4-47bd-861F-511EA9B8ABE0
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = SerialPortEntry
> +
> +[Sources.common]
> +  Pl011DebugSerialPortInitDxe.c
> +
> +
> +[Packages]
> +  ArmPlatformPkg/ArmPlatformPkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +  Silicon/Hisilicon/HisiPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  UefiDriverEntryPoint
> +
> +[Pcd]
> +  gArmPlatformTokenSpaceGuid.PL011UartClkInHz
> +  gArmPlatformTokenSpaceGuid.PcdSerialDbgRegisterBase
> +  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultBaudRate
> +  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultDataBits
> +  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultParity
> +  gEfiMdePkgTokenSpaceGuid.PcdUartDefaultStopBits
> +
> +[Depex]
> +  TRUE
> +
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c b/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c
> new file mode 100644
> index 0000000000..8f83737327
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c
> @@ -0,0 +1,64 @@
> +/** @file
> +
> +    Copyright (c) 2016 - 2018, Hisilicon Limited. All rights reserved.
> +    Copyright (c) 2016 - 2018, Linaro Limited. All rights reserved.
> +
> +    This program and the accompanying materials
> +    are licensed and made available under the terms and conditions of the BSD License
> +    which accompanies this distribution. The full text of the license may be found at
> +    http://opensource.org/licenses/bsd-license.php
> +
> +    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <Uefi.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PL011UartLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/SerialPortLib.h>
> +
> +RETURN_STATUS
> +EFIAPI
> +DebugSerialPortInitialize (
> +  VOID
> +  )
> +{
> +  UINT64              BaudRate;
> +  UINT32              ReceiveFifoDepth;
> +  EFI_PARITY_TYPE     Parity;
> +  UINT8               DataBits;
> +  EFI_STOP_BITS_TYPE  StopBits;
> +
> +  BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate);
> +  ReceiveFifoDepth = 0;         // Use default FIFO depth
> +  Parity = (EFI_PARITY_TYPE)FixedPcdGet8 (PcdUartDefaultParity);
> +  DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);
> +  StopBits = (EFI_STOP_BITS_TYPE) FixedPcdGet8 (PcdUartDefaultStopBits);
> +  return PL011UartInitializePort (
> +           (UINTN)FixedPcdGet64 (PcdSerialDbgRegisterBase),
> +           FixedPcdGet32 (PL011UartClkInHz),
> +           &BaudRate,
> +           &ReceiveFifoDepth,
> +           &Parity,
> +           &DataBits,
> +           &StopBits
> +           );
> +}
> +
> +EFI_STATUS
> +SerialPortEntry (
> +  IN EFI_HANDLE         ImageHandle,
> +  IN EFI_SYSTEM_TABLE   *SystemTable
> +  )
> +{
> +  EFI_STATUS Status;
> +  Status = DebugSerialPortInitialize ();
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "CPU1 TB serial port init ERROR: %r\n", Status));
> +  }
> +  return EFI_SUCCESS;
> +}
> +
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 17/43] Hisilicon/D06: Add ACPI Tables for D06
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 17/43] Hisilicon/D06: Add ACPI Tables for D06 Ming Huang
@ 2018-08-22 11:49   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 11:49 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:37PM +0800, Ming Huang wrote:
> ACPI tables for D06 2P, especially,Hi1620Iort.asl is include smmu
> and Hi1620IortNoSmmu.asl is without smmu.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

As per last feedback:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

(The only modification I asked for has been done.)

> ---
>  Platform/Hisilicon/D06/D06.dsc                                          |    1 +
>  Platform/Hisilicon/D06/D06.fdf                                          |    1 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf          |   59 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Platform.h              |   27 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/CPU.asl                  |  409 ++++
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Com.asl                  |   30 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/DsdtHi1620.asl           |   35 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Apei.asl           |   93 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Ged.asl            |   58 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mbig.asl           | 1459 ++++++++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mctp.asl           |   41 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Pci.asl            | 1216 ++++++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Power.asl          |   28 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Rde.asl            |   47 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Sec.asl            |   57 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c100k.asl |  249 +++
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c400k.asl |  249 +++
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/LpcUart_clk.asl          |   49 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Pv680UncorePmu.asl       | 1658 ++++++++++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/ipmi.asl                 |   49 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Facs.aslc                     |   67 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Fadt.aslc                     |   91 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Gtdt.aslc                     |   86 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Dbg2.aslc               |   86 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Iort.asl                | 1989 ++++++++++++++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620IortNoSmmu.asl          | 1736 +++++++++++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Mcfg.aslc               |   64 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Slit.aslc               |   64 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Spcr.aslc               |   81 +
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Srat.aslc               |  166 ++
>  Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/MadtHi1620.aslc               |  375 ++++
>  31 files changed, 10620 insertions(+)


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 18/43] Hisilicon/D06: Add Hi1620OemConfigUiLib
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 18/43] Hisilicon/D06: Add Hi1620OemConfigUiLib Ming Huang
@ 2018-08-22 14:14   ` Leif Lindholm
  2018-08-22 15:11     ` Ming
  0 siblings, 1 reply; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 14:14 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Yang XinYi

On Tue, Aug 14, 2018 at 04:08:38PM +0800, Ming Huang wrote:
> From: Yang XinYi <yangxingyi@huawei.com>
> 
> This library is added for oem setup menu item.
> Setup item include:
> 1 DDR option item;
> 2 BMC option item;
> 3 Ras option item;
> 4 Misc option item;
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Yang XinYi <yangxingyi@huawei.com>
> ---
>  Silicon/Hisilicon/HisiPkg.dec                                           |   1 +
>  Platform/Hisilicon/D06/D06.dsc                                          |   5 +-
>  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf       |   2 +-
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf        |  68 ++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h               | 142 ++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h             |  64 ++++
>  Silicon/Hisilicon/Include/Library/OemConfigData.h                       |  84 +++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c               | 363 ++++++++++++++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.hfr          | 154 +++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.uni          | 103 ++++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr            |  41 +++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni            |  27 ++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.uni        |  24 ++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLibStrings.uni |  42 +++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigVfr.Vfr          |  89 +++++

Ah, I didn't spot thie before - but can you please rename this one
from
.Vfr to
.vfr

to align with the others?

>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfig.hfr            | 219 ++++++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfigStrings.uni     | 111 ++++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PciePortConfig.hfr        | 167 +++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr             | 172 ++++++++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.uni             |  85 +++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.hfr            |  81 +++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.uni            |  34 ++
>  22 files changed, 2076 insertions(+), 2 deletions(-)
> 
> diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec
> index b56a6a6af7..858b840a57 100644
> --- a/Silicon/Hisilicon/HisiPkg.dec
> +++ b/Silicon/Hisilicon/HisiPkg.dec
> @@ -44,6 +44,7 @@
>    gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}
>  
>    gHisiEfiMemoryMapGuid  = {0xf8870015, 0x6994, 0x4b98, {0x95, 0xa2, 0xbd, 0x56, 0xda, 0x91, 0xc0, 0x7f}}
> +  gOemConfigGuid = {0x42927b59, 0x58fc, 0x41be, {0x8f, 0x59, 0xd1, 0x7c, 0x02, 0x1a, 0x70, 0x13}}
>    gVersionInfoHobGuid = {0xe13a14c, 0x859c, 0x4f22, {0x82, 0xbd, 0x18, 0xe, 0xe1, 0x42, 0x12, 0xbf}}
>    gHisiOemVariableGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}
>    gOemBootVariableGuid = {0xb7784577, 0x5aaf, 0x4557, {0xa1, 0x99, 0xd4, 0xa4, 0x2f, 0x45, 0x06, 0xf8}}
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index 9d4a86a4f4..bec422670d 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -330,7 +330,10 @@
>    #ACPI
>    #
>    MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
> -  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> +  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf {
> +    <LibraryClasses>
> +    NULL|Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
> +  }
>  
>    Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
>    Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
> diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> index e268a56bbd..281a4f2ebd 100644
> --- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> +++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> @@ -56,7 +56,7 @@
>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile    ## CONSUMES
>  
>  [Depex]
> -  gEfiAcpiTableProtocolGuid
> +  gEfiAcpiTableProtocolGuid AND gEfiVariableWriteArchProtocolGuid
>  
>  [UserExtensions.TianoCore."ExtraFiles"]
>    AcpiPlatformExtra.uni
> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
> new file mode 100644
> index 0000000000..fba619e9ba
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
> @@ -0,0 +1,68 @@
> +## @file
> +#  OEM config Library used by BDS
> +#
> +#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +#  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +#  This program and the accompanying materials are licensed and made available under
> +#  the terms and conditions of the BSD License that accompanies this distribution.
> +#  The full text of the license may be found at
> +#  http://opensource.org/licenses/bsd-license.php.
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +##
> +[Defines]
> +  INF_VERSION                    = 0x0001001A
> +  BASE_NAME                      = OemConfigUiLib
> +  MODULE_UNI_FILE                = OemConfigUiLib.uni
> +  FILE_GUID                      = 32B373AC-00B6-471b-B3AE-6E4A4501F6BA
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = NULL|DXE_DRIVER UEFI_APPLICATION
> +  CONSTRUCTOR                    = OemConfigUiLibConstructor
> +  DESTRUCTOR                     = OemConfigUiLibDestructor
> +
> +[Sources]
> +  iBMCConfig.hfr
> +  iBMCConfig.uni
> +  MemoryConfig.hfr
> +  MemoryConfig.uni
> +  MiscConfig.hfr
> +  MiscConfig.uni
> +  OemConfig.c
> +  OemConfig.h
> +  OemConfigUiLibStrings.uni
> +  OemConfigVfr.Vfr
> +  PcieConfig.hfr
> +  PcieConfigStrings.uni
> +  PciePortConfig.hfr
> +  RasConfig.hfr
> +  RasConfig.uni
> +
> +[Packages]
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +  Silicon/Hisilicon/HisiPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  DevicePathLib
> +  HiiLib
> +  MemoryAllocationLib
> +  PrintLib
> +  UefiBootServicesTableLib
> +  UefiHiiServicesLib
> +  UefiRuntimeServicesTableLib
> +
> +[Guids]
> +  gEfiHiiPlatformSetupFormsetGuid               ## CONSUMES ## GUID (Indicate the formset class guid to be displayed)
> +  gEfiIfrFrontPageGuid                          ## CONSUMES ## GUID (Indicate the formset in this library need to dispaly in which page)
> +  gEfiIfrTianoGuid                              ## CONSUMES ## GUID (Extended IFR Guid Opcode)
> +  gOemConfigGuid
> +  gVersionInfoHobGuid
> +
> +[Protocols]
> +  gEfiHiiConfigAccessProtocolGuid               ## CONSUMES
> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h
> new file mode 100644
> index 0000000000..f91400150c
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h
> @@ -0,0 +1,142 @@
> +/** @file
> +The Oem config reference implement
> +
> +Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +Copyright (c) 2018, Linaro Limited. All rights reserved.
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD License
> +which accompanies this distribution.  The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef _OEM_CONFIG_H_
> +#define _OEM_CONFIG_H_
> +
> +#include <Guid/HiiPlatformSetupFormset.h>
> +#include <Guid/MdeModuleHii.h>
> +#include <Guid/VersionInfoHobGuid.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/DevicePathLib.h>
> +#include <Library/HiiLib.h>
> +#include <Library/HobLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include "Library/OemConfigData.h"
> +#include <Library/PcdLib.h>
> +#include <Library/PrintLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiHiiServicesLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +#include <Pi/PiFirmwareVolume.h>
> +#include <Protocol/HiiConfigAccess.h>
> +
> +//
> +// These are the VFR compiler generated data representing our VFR data.
> +//
> +extern UINT8  OemConfigVfrBin[];
> +
> +//
> +// HII specific Vendor Device Path definition.
> +//
> +typedef struct {
> +  VENDOR_DEVICE_PATH          VendorDevicePath;
> +  EFI_DEVICE_PATH_PROTOCOL    End;
> +} HII_VENDOR_DEVICE_PATH;
> +
> +#define OEM_CONFIG_CALLBACK_DATA_SIGNATURE  SIGNATURE_32 ('O', 'E', 'M', 'C')
> +typedef struct {
> +  UINTN                             Signature;
> +  EFI_HII_HANDLE                    HiiHandle;
> +  EFI_HANDLE                        DriverHandle;
> +  EFI_HII_CONFIG_ACCESS_PROTOCOL    ConfigAccess;
> +} OEM_CONFIG_CALLBACK_DATA;
> +
> +/**
> +  This function allows a caller to extract the current configuration for one
> +  or more named elements from the target driver.
> +
> +
> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> +  @param Request         A null-terminated Unicode string in <ConfigRequest> format.
> +  @param Progress        On return, points to a character in the Request string.
> +                         Points to the string's null terminator if request was successful.
> +                         Points to the most recent '&' before the first failing name/value
> +                         pair (or the beginning of the string if the failure is in the
> +                         first name/value pair) if the request was not successful.
> +  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which
> +                         has all values filled in for the names in the Request string.
> +                         String to be allocated by the called function.
> +
> +  @retval  EFI_SUCCESS            The Results is filled with the requested values.
> +  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
> +  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
> +  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +OemExtractConfig (
> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
> +  IN  CONST EFI_STRING                       Request,
> +  OUT       EFI_STRING                       *Progress,
> +  OUT       EFI_STRING                       *Results
> +  );
> +
> +/**
> +  This function processes the results of changes in configuration.
> +
> +
> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> +  @param Configuration   A null-terminated Unicode string in <ConfigResp> format.
> +  @param Progress        A pointer to a string filled in with the offset of the most
> +                         recent '&' before the first failing name/value pair (or the
> +                         beginning of the string if the failure is in the first
> +                         name/value pair) or the terminating NULL if all was successful.
> +
> +  @retval  EFI_SUCCESS            The Results is processed successfully.
> +  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
> +  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +OemRouteConfig (
> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
> +  IN  CONST EFI_STRING                       Configuration,
> +  OUT       EFI_STRING                       *Progress
> +  );
> +
> +/**
> +  This function is invoked if user selected a interactive opcode from Device Manager's
> +  Formset. If user set VBIOS, the new value is saved to EFI variable.
> +
> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> +  @param Action          Specifies the type of action taken by the browser.
> +  @param QuestionId      A unique value which is sent to the original exporting driver
> +                         so that it can identify the type of data to expect.
> +  @param Type            The type of value for the question.
> +  @param Value           A pointer to the data being sent to the original exporting driver.
> +  @param ActionRequest   On return, points to the action requested by the callback function.
> +
> +  @retval  EFI_SUCCESS           The callback successfully handled the action.
> +  @retval  EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +OemCallback (
> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
> +  IN        EFI_BROWSER_ACTION               Action,
> +  IN        EFI_QUESTION_ID                  QuestionId,
> +  IN        UINT8                            Type,
> +  IN        EFI_IFR_TYPE_VALUE               *Value,
> +  OUT       EFI_BROWSER_ACTION_REQUEST       *ActionRequest
> +  );
> +
> +VOID GetReleaseTime (EFI_TIME *Time);
> +#endif
> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h
> new file mode 100644
> index 0000000000..792e544c22
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h
> @@ -0,0 +1,64 @@
> +/** @file
> +
> +Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +Copyright (c) 2018, Linaro Limited. All rights reserved.
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD License
> +which accompanies this distribution.  The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +Module Name:
> +
> +  OemConfigUi.h
> +
> +Abstract:
> +
> +  NVData structure used by the OEM Config.
> +
> +Revision History:
> +
> +
> +**/
> +
> +#ifndef _OEM_CONFIG_UI_H_
> +#define _OEM_CONFIG_UI_H_
> +
> +#include <Uefi/UefiMultiPhase.h>
> +
> +#define OEM_CONFIG_FORM_ID                   1
> +#define MEMORY_CONFIG_FORM_ID                2
> +#define IBMC_CONFIG_FORM_ID                  3
> +#define PCIE_CONFIG_FORM_ID                  4
> +#define MISC_CONFIG_FORM_ID                  5
> +#define RAS_CONFIG_FORM_ID                   6
> +
> +#define VFR_FORMID_PCIE_SOCKET0              0x4100
> +#define VFR_FORMID_PCIE_SOCKET1              0x4200
> +#define VFR_FORMID_PCIE_PORT0                0x4000
> +#define VFR_FORMID_PCIE_PORT1                0x4001
> +#define VFR_FORMID_PCIE_PORT2                0x4002
> +#define VFR_FORMID_PCIE_PORT3                0x4003
> +#define VFR_FORMID_PCIE_PORT4                0x4004
> +#define VFR_FORMID_PCIE_PORT5                0x4005
> +#define VFR_FORMID_PCIE_PORT6                0x4006
> +#define VFR_FORMID_PCIE_PORT7                0x4007
> +#define VFR_FORMID_PCIE_PORT8                0x4008
> +#define VFR_FORMID_PCIE_PORT9                0x4009
> +#define VFR_FORMID_PCIE_PORT10               0x4010
> +#define VFR_FORMID_PCIE_PORT11               0x4011
> +#define VFR_FORMID_PCIE_PORT12               0x4012
> +#define VFR_FORMID_PCIE_PORT13               0x4013
> +#define VFR_FORMID_PCIE_PORT14               0x4014
> +#define VFR_FORMID_PCIE_PORT15               0x4015
> +
> +#define VFR_FORMID_MEMORY_RAS                0x6100
> +#define VFR_FORMID_CORRECT_ERROR             0x6101
> +#define VFR_FORMID_PCIE_RAS                  0x6200
> +
> +#define RMT_PATTERN_LENGTH                   256
> +
> +
> +#endif
> diff --git a/Silicon/Hisilicon/Include/Library/OemConfigData.h b/Silicon/Hisilicon/Include/Library/OemConfigData.h
> new file mode 100644
> index 0000000000..478821ae2c
> --- /dev/null
> +++ b/Silicon/Hisilicon/Include/Library/OemConfigData.h
> @@ -0,0 +1,84 @@
> +/** @file
> +*
> +*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +
> +#ifndef _OEM_CONFIG_DATA_H_
> +#define _OEM_CONFIG_DATA_H_
> +
> +#define PCIE_MAX_TOTAL_PORTS                 16
> +#define OEM_CONFIG_NAME                      L"OemConfig"
> +#define PLATFORM_SETUP_VARIABLE_FLAG         (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE)
> +
> +#pragma pack(1)
> +typedef struct {
> +  /*Memory Config*/
> +  UINT8         DdrDebugLevel;
> +  UINT8         DdrFreqLimit;
> +  UINT8         DdrRefreshSupport;
> +  UINT8         DdrRefreshRate;
> +  UINT8         RankMargin;
> +  UINT8         RankMarginMode;
> +  UINT32        rmtPatternLength;
> +  UINT8         perbitmargin;
> +  UINT8         CaMargin;
> +  UINT8         CaVrefMarginOption;
> +  UINT8         NumaEn;
> +  UINT8         HwMemTest;
> +  UINT8         DieInterleaving;
> +  UINT8         ChannelInterleaving;
> +  UINT8         RankInterleaving;
> +  UINT8         EccSupport;
> +  /*iBMC Config*/
> +  UINT8         BmcWdtEnable;
> +  UINT8         BmcWdtTimeout;
> +  UINT8         BmcWdtAction;
> +  UINT8         OSWdtEnable;
> +  UINT8         OSWdtTimeout;
> +  UINT8         OSWdtAction;
> +  /*PCIe Config*/
> +  UINT8         PcieSRIOVSupport;
> +  UINT8         PciePort[PCIE_MAX_TOTAL_PORTS];
> +  UINT8         PcieLinkSpeedPort[PCIE_MAX_TOTAL_PORTS];
> +  UINT8         PcieLinkDeEmphasisPort[PCIE_MAX_TOTAL_PORTS];
> +  UINT8         PcieLinkStatusPort[PCIE_MAX_TOTAL_PORTS];
> +  UINT8         PcieLinkSpeedRateStatusPort[PCIE_MAX_TOTAL_PORTS];
> +  UINT8         PcieLinkMaxPort[PCIE_MAX_TOTAL_PORTS];
> +  UINT8         PcieMaxPayloadSizePort[PCIE_MAX_TOTAL_PORTS];
> +  UINT8         PcieAspmPort[PCIE_MAX_TOTAL_PORTS];
> +  /*Misc Config*/
> +  UINT8         EnableSmmu;
> +  UINT8         EnableFdtTable;
> +  UINT8         EnableSpcr;
> +  /*RAS Config*/
> +  UINT8         EnRasSupport;
> +  UINT8         EnPoison;
> +  UINT8         CheckAlgorithm;
> +  UINT8         PatrolScrub;
> +  UINT8         PatrolScrubDuration;
> +  UINT8         DemandScrubMode;
> +  UINT8         CorrectErrorThreshold;
> +  UINT8         AdvanceDeviceCorrection;
> +  UINT8         RankSparing;
> +  UINT8         FunnelPeriod;
> +  UINT8         DpcFeature;
> +  UINT8         EcrcFeature;
> +  UINT8         CompletionTimeout;
> +  UINT8         CompletionTimeoutValue;
> +  UINT8         HotPlug;
> +
> +} OEM_CONFIG_DATA;
> +#pragma pack()
> +
> +#endif
> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
> new file mode 100644
> index 0000000000..1e3635307c
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
> @@ -0,0 +1,363 @@
> +/** @file
> +The OEM config reference implementation
> +
> +Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +Copyright (c) 2018, Linaro Limited. All rights reserved.
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD License
> +which accompanies this distribution.  The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include "OemConfig.h"
> +
> +OEM_CONFIG_CALLBACK_DATA    mOemConfigPrivate = {
> +  OEM_CONFIG_CALLBACK_DATA_SIGNATURE,
> +  NULL,
> +  NULL,
> +  {
> +    OemExtractConfig,
> +    OemRouteConfig,
> +    OemCallback
> +  }
> +};
> +
> +HII_VENDOR_DEVICE_PATH  mOemHiiVendorDevicePath = {
> +  {
> +    {
> +      HARDWARE_DEVICE_PATH,
> +      HW_VENDOR_DP,
> +      {
> +        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
> +        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
> +      }
> +    },
> +    { 0x874c4dcb, 0x08ec, 0x4fe6, { 0xb5, 0x8e, 0x3a, 0x9e, 0x1c, 0x26, 0x70, 0xb9 } }
> +  },
> +  {
> +    END_DEVICE_PATH_TYPE,
> +    END_ENTIRE_DEVICE_PATH_SUBTYPE,
> +    {
> +      (UINT8) (END_DEVICE_PATH_LENGTH),
> +      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
> +    }
> +  }
> +};
> +
> +
> +
> +
> +
> +
> +/**
> +  This function allows a caller to extract the current configuration for one
> +  or more named elements from the target driver.
> +
> +
> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> +  @param Request         A null-terminated Unicode string in <ConfigRequest> format.
> +  @param Progress        On return, points to a character in the Request string.
> +                         Points to the string's null terminator if request was successful.
> +                         Points to the most recent '&' before the first failing name/value
> +                         pair (or the beginning of the string if the failure is in the
> +                         first name/value pair) if the request was not successful.
> +  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which
> +                         has all values filled in for the names in the Request string.
> +                         String to be allocated by the called function.
> +
> +  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
> +  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +OemExtractConfig (
> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
> +  IN  CONST EFI_STRING                       Request,
> +  OUT EFI_STRING                             *Progress,
> +  OUT EFI_STRING                             *Results
> +  )
> +{
> +  if (Progress == NULL || Results == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  *Progress = Request;
> +  return EFI_NOT_FOUND;
> +}
> +
> +/**
> +  This function processes the results of changes in configuration.
> +
> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> +  @param Configuration   A null-terminated Unicode string in <ConfigResp> format.
> +  @param Progress        A pointer to a string filled in with the offset of the most
> +                         recent '&' before the first failing name/value pair (or the
> +                         beginning of the string if the failure is in the first
> +                         name/value pair) or the terminating NULL if all was successful.
> +
> +  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
> +  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +OemRouteConfig (
> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
> +  IN  CONST EFI_STRING                       Configuration,
> +  OUT EFI_STRING                             *Progress
> +  )
> +{
> +  if (Configuration == NULL || Progress == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  *Progress = Configuration;
> +
> +  return EFI_NOT_FOUND;
> +}
> +
> +/**
> +  This function is invoked if user selected a interactive opcode from Device Manager's
> +  Formset. If user set VBIOS, the new value is saved to EFI variable.
> +
> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
> +  @param Action          Specifies the type of action taken by the browser.
> +  @param QuestionId      A unique value which is sent to the original exporting driver
> +                         so that it can identify the type of data to expect.
> +  @param Type            The type of value for the question.
> +  @param Value           A pointer to the data being sent to the original exporting driver.
> +  @param ActionRequest   On return, points to the action requested by the callback function.
> +
> +  @retval  EFI_SUCCESS           The callback successfully handled the action.
> +  @retval  EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +OemCallback (
> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
> +  IN  EFI_BROWSER_ACTION                     Action,
> +  IN  EFI_QUESTION_ID                        QuestionId,
> +  IN  UINT8                                  Type,
> +  IN  EFI_IFR_TYPE_VALUE                     *Value,
> +  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
> +  )
> +{
> +  if (Action != EFI_BROWSER_ACTION_CHANGING) {
> +    //
> +    // Do nothing for other UEFI Action. Only do call back when data is changed.
> +    //
> +    return EFI_UNSUPPORTED;
> +  }
> +  if ((Value == NULL) || (ActionRequest == NULL)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Install Boot Manager Menu driver.
> +
> +  @param ImageHandle     The image handle.
> +  @param SystemTable     The system table.
> +
> +  @retval  EFI_SUCEESS  Install Boot manager menu success.
> +  @retval  Other        Return error status.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +OemConfigUiLibConstructor (
> +  IN EFI_HANDLE                            ImageHandle,
> +  IN EFI_SYSTEM_TABLE                      *SystemTable
> +  )
> +{
> +  EFI_STATUS                  Status;
> +  OEM_CONFIG_DATA             Configuration;
> +  VOID                        *Hob;
> +  VERSION_INFO                *VersionInfo;
> +  UINTN                       BufSize;
> +  BOOLEAN                     Action;
> +  EFI_STRING                  ConfigRequestHdr;
> +  EFI_TIME                    Time = {0};
> +  CHAR16                      TmpString[0x100] = {0};
> +
> +  mOemConfigPrivate.DriverHandle = NULL;
> +  Status = gBS->InstallMultipleProtocolInterfaces (
> +                  &mOemConfigPrivate.DriverHandle,
> +                  &gEfiDevicePathProtocolGuid,
> +                  &mOemHiiVendorDevicePath,
> +                  &gEfiHiiConfigAccessProtocolGuid,
> +                  &mOemConfigPrivate.ConfigAccess,
> +                  NULL
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  //
> +  // Publish our HII data.
> +  //
> +  mOemConfigPrivate.HiiHandle = HiiAddPackages (
> +                                   &gOemConfigGuid,
> +                                   mOemConfigPrivate.DriverHandle,
> +                                   OemConfigVfrBin,
> +                                   OemConfigUiLibStrings,
> +                                   NULL
> +                                   );
> +  if (mOemConfigPrivate.HiiHandle == NULL) {
> +    DEBUG ((DEBUG_ERROR, "OemConfigUiLibConstructor(), Fail to Add Oem Hii Package.\n"));

Sorry, missed this one first time around:
Please use %a and __FUNCTION__ instead of hardcoding the function name.

> +    return EFI_INVALID_PARAMETER;
> +  }
> +  //
> +  //BIOS Build Time Init
> +  //
> +  Hob = GetFirstGuidHob (&gVersionInfoHobGuid);
> +  if (Hob == NULL) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%d] Version information HOB not found!\n",
> +      __FILE__, __LINE__));
> +    return EFI_NOT_FOUND;
> +  }
> +  VersionInfo = GET_GUID_HOB_DATA (Hob);
> +  Time = VersionInfo->BuildTime;
> +  UnicodeSPrint (
> +    TmpString,
> +    sizeof (TmpString),
> +    L"%02d/%02d/%04d %02d:%02d",
> +    Time.Month,
> +    Time.Day,
> +    Time.Year,
> +    Time.Hour,
> +    Time.Minute
> +    );
> +  HiiSetString (
> +    mOemConfigPrivate.HiiHandle,
> +    STRING_TOKEN (STR_MISC_BIOS_BUILDTIME),
> +    TmpString,
> +    "en-US"
> +    );
> +  //
> +  // Check Oem Config Variable.
> +  //
> +  ConfigRequestHdr = HiiConstructConfigHdr (
> +                       &gOemConfigGuid,
> +                       OEM_CONFIG_NAME,
> +                       mOemConfigPrivate.DriverHandle
> +                       );
> +  ZeroMem (&Configuration, sizeof (OEM_CONFIG_DATA));
> +  BufSize = sizeof (OEM_CONFIG_DATA);
> +  Status = gRT->GetVariable (
> +                  OEM_CONFIG_NAME,
> +                  &gOemConfigGuid,
> +                  NULL,
> +                  &BufSize,
> +                  &Configuration
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    Action = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);
> +    if (!Action) {
> +      //
> +      //Set the default value of the DDR option
> +      //
> +      Configuration.DdrDebugLevel = 0;
> +      Configuration.DdrFreqLimit = 0;
> +      Configuration.DdrRefreshSupport = 0;
> +      Configuration.DdrRefreshRate = 0;
> +      Configuration.RankMargin = 0;
> +      Configuration.RankMarginMode = 2;
> +      Configuration.rmtPatternLength = 256;
> +      Configuration.perbitmargin = 0x0;
> +      Configuration.CaMargin = 0x0;
> +      Configuration.CaVrefMarginOption = 0x0;
> +      Configuration.NumaEn = 1;
> +      Configuration.HwMemTest = 0;
> +      Configuration.DieInterleaving = 0;
> +      Configuration.ChannelInterleaving = 1;
> +      Configuration.RankInterleaving = 2;
> +      Configuration.EccSupport = 0;
> +      //
> +      //Set the default value of the BMC option
> +      //
> +      Configuration.BmcWdtEnable = 0;
> +      Configuration.BmcWdtTimeout = 15;
> +      Configuration.BmcWdtAction = 1;
> +      Configuration.OSWdtEnable = 0;
> +      Configuration.OSWdtTimeout = 5;
> +      Configuration.OSWdtAction = 1;

Where did the PCIe go?

/
    Leif


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 19/43] Silicon/Hisilicon/D06: Stop watchdog
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 19/43] Silicon/Hisilicon/D06: Stop watchdog Ming Huang
@ 2018-08-22 14:17   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 14:17 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:39PM +0800, Ming Huang wrote:
> according as watchdog design on D06, watchdog should be
> stopped before boot a option.
> 
> This is an out of band watchdog timer in BMC; it is used
> to monitor the whole BIOS boot process and reset the system
> in case BIOS hangs somewhere, i.e. it is armed when system
> is power on, and disabled before handling system control to
> OS, while UEFI boot services watchdog is only armed before
> invoking a boot option. So they are two different watchdogs.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---
>  Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf |  2 ++
>  Silicon/Hisilicon/Include/Library/IpmiCmdLib.h                              | 16 ++++++++++++++
>  Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c               | 22 ++++++++++++++++++++
>  3 files changed, 40 insertions(+)
> 
> diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
> index a093f13fb0..b9458b0ade 100644
> --- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
> +++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
> @@ -46,6 +46,7 @@
>    DebugLib
>    DevicePathLib
>    DxeServicesLib
> +  IpmiCmdLib
>    MemoryAllocationLib
>    PcdLib
>    PrintLib
> @@ -69,6 +70,7 @@
>    gEfiEndOfDxeEventGroupGuid
>    gEfiTtyTermGuid
>    gHisiOemVariableGuid
> +  gOemConfigGuid
>  
>  [Protocols]
>    gEfiGenericMemTestProtocolGuid
> diff --git a/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h b/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h
> index 8868b76135..b956ee6d07 100644
> --- a/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h
> +++ b/Silicon/Hisilicon/Include/Library/IpmiCmdLib.h
> @@ -19,6 +19,17 @@
>  #define BOOT_OPTION_BOOT_FLAG_VALID         1
>  #define BOOT_OPTION_BOOT_FLAG_INVALID       0
>  
> +typedef enum {
> +  EfiReserved,
> +  EfiBiosFrb2,
> +  EfiBiosPost,
> +  EfiOsLoad,
> +  EfiSmsOs,
> +  EfiOem,
> +  EfiFrbReserved1,
> +  EfiFrbReserved2
> +} EFI_WDT_USER_TYPE;
> +
>  typedef enum {
>    NoOverride = 0x0,
>    ForcePxe,
> @@ -91,4 +102,9 @@ IpmiCmdGetSysBootOptions (
>    IN IPMI_GET_BOOT_OPTION   *BootOption
>    );
>  
> +EFI_STATUS
> +IpmiCmdStopWatchdogTimer (
> +  IN EFI_WDT_USER_TYPE  UserType
> +  );
> +
>  #endif
> diff --git a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
> index d5f6d78fa4..b63818cbe4 100644
> --- a/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
> +++ b/Silicon/Hisilicon/Library/PlatformBootManagerLib/PlatformBm.c
> @@ -19,6 +19,8 @@
>  #include <Library/BootLogoLib.h>
>  #include <Library/BmcConfigBootLib.h>
>  #include <Library/DevicePathLib.h>
> +#include <Library/IpmiCmdLib.h>
> +#include <Library/OemConfigData.h>
>  #include <Library/PcdLib.h>
>  #include <Library/TimerLib.h>
>  #include <Library/UefiBootManagerLib.h>
> @@ -615,6 +617,8 @@ PlatformBootManagerAfterConsole (
>  {
>    EFI_STATUS Status;
>    ESRT_MANAGEMENT_PROTOCOL           *EsrtManagement = NULL;
> +  OEM_CONFIG_DATA                    SetupData;
> +  UINTN                              DataSize = sizeof (OEM_CONFIG_DATA);
>  
>    //
>    // Show the splash screen.
> @@ -651,6 +655,24 @@ PlatformBootManagerAfterConsole (
>      );
>  
>    HandleBmcBootType ();
> +
> +  //Disable POST Watch Dog before attempting boot
> +  Status = gRT->GetVariable (
> +                  OEM_CONFIG_NAME,
> +                  &gOemConfigGuid,
> +                  NULL,
> +                  &DataSize,
> +                  &SetupData
> +                  );
> +
> +  if (!EFI_ERROR (Status)) {
> +    if (SetupData.BmcWdtEnable) {
> +      Status = IpmiCmdStopWatchdogTimer (EfiBiosPost);
> +      if (EFI_ERROR (Status)) {
> +        DEBUG ((DEBUG_ERROR, "%a:%r\n", __FUNCTION__, Status));
> +      }
> +    }
> +  }
>  }
>  
>  /**
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 22/43] Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 22/43] Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06 Ming Huang
@ 2018-08-22 14:21   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 14:21 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:42PM +0800, Ming Huang wrote:
> I2C may enable failed in D06, so retry I2C enable while
> enable failed.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 18 ++++++++++++------
>  1 file changed, 12 insertions(+), 6 deletions(-)

Please change subject line to:
Silicon/Hisilicon: Fix I2CLib enable fail issue
and reorder it before the first D06 patch.

With that:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> index 9174e50dd4..d67ddc7f9b 100644
> --- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> +++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> @@ -86,6 +86,7 @@ I2C_Enable (
>  {
>    I2C0_ENABLE_U           I2cEnableReg;
>    I2C0_ENABLE_STATUS_U    I2cEnableStatusReg;
> +  UINT32                  TimeCnt = I2C_READ_TIMEOUT;
>  
>    UINTN Base = GetI2cBase (Socket, Port);
>  
> @@ -93,13 +94,18 @@ I2C_Enable (
>    I2cEnableReg.bits.enable = 1;
>    I2C_REG_WRITE (Base + I2C_ENABLE_OFFSET, I2cEnableReg.Val32);
>  
> +  do {
> +    // This is a empirical value for I2C delay. MemoryFance is no need here.
> +    I2C_Delay (10000);
>  
> -  I2C_REG_READ (Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
> -  if (I2cEnableStatusReg.bits.ic_en == 1) {
> -    return EFI_SUCCESS;
> -  } else {
> -    return EFI_DEVICE_ERROR;
> -  }
> +    TimeCnt--;
> +    I2C_REG_READ (Base + I2C_ENABLE_STATUS_OFFSET, I2cEnableStatusReg.Val32);
> +    if (TimeCnt == 0) {
> +      return EFI_DEVICE_ERROR;
> +    }
> +  } while (I2cEnableStatusReg.bits.ic_en == 0);
> +
> +  return EFI_SUCCESS;
>  }
>  
>  VOID
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 23/43] Silicon/Hisilicon/D06: Add I2C delay for HNS auto config
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 23/43] Silicon/Hisilicon/D06: Add I2C delay for HNS auto config Ming Huang
@ 2018-08-22 14:27   ` Leif Lindholm
  2018-08-22 15:16     ` Ming
  0 siblings, 1 reply; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 14:27 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:43PM +0800, Ming Huang wrote:
> Because I2C Port5 salve device connect under I2C extender
> (9545 device), it will cost more time to access I2C slave
> device, so add delay time for HNS auto config.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Silicon/Hisilicon/Library/I2CLib/I2CHw.h  |  3 +++
>  Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 21 +++++++++++++++-----
>  2 files changed, 19 insertions(+), 5 deletions(-)

Like previous patch, please change subject line - this affects d03,
d05, d06.

Silicon/Hisilicon: Add I2CLib delay for HNS auto config

> diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
> index fa954c7937..d77aea509e 100644
> --- a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
> +++ b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
> @@ -19,6 +19,9 @@
>  #include <Uefi.h>
>  #include <Library/IoLib.h>
>  
> +// The HNS I2C port 5 is under I2C extender
> +#define I2C_EXTENDER_PORT_HNS        5
> +
>  #define I2C_READ_TIMEOUT             500
>  #define I2C_DRV_ONCE_WRITE_BYTES_NUM 8
>  #define I2C_DRV_ONCE_READ_BYTES_NUM  8
> diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> index d67ddc7f9b..59633106ce 100644
> --- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> +++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> @@ -258,8 +258,13 @@ CheckI2CTimeOut (
>    if (Transfer == I2CTx) {
>      Fifo = I2C_GetTxStatus (Socket, Port);
>      while (Fifo != 0) {
> -      // This is a empirical value for I2C delay. MemoryFance is no need here.
> -      I2C_Delay (2);
> +      if (Port == I2C_EXTENDER_PORT_HNS) {
> +        // This is a empirical value for I2C delay. MemoryFance is no need here.

MemoryFance ->
MemoryFence

(You may want to search and replace that on the whole set.)

With that:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

/
    Leif

> +        I2C_Delay (1000);
> +      } else {
> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
> +        I2C_Delay (2);
> +      }
>        if (++Times > I2C_READ_TIMEOUT) {
>          (VOID)I2C_Disable (Socket, Port);
>          return EFI_TIMEOUT;
> @@ -269,8 +274,13 @@ CheckI2CTimeOut (
>    } else {
>      Fifo = I2C_GetRxStatus (Socket, Port);
>      while (Fifo == 0) {
> -      // This is a empirical value for I2C delay. MemoryFance is no need here.
> -      I2C_Delay (2);
> +      if (Port == I2C_EXTENDER_PORT_HNS) {
> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
> +        I2C_Delay (1000);
> +      } else {
> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
> +        I2C_Delay (2);
> +      }
>        if (++Times > I2C_READ_TIMEOUT) {
>          (VOID)I2C_Disable (Socket, Port);
>          return EFI_TIMEOUT;
> @@ -369,7 +379,8 @@ I2CWrite(
>      Times = 0;
>      Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
>      while (Fifo > I2C_TXRX_THRESHOLD) {
> -      I2C_Delay (2);
> +      // This is a empirical value for I2C delay. MemoryFance is no need here.
> +      I2C_Delay (1000);
>        if (++Times > I2C_READ_TIMEOUT) {
>          (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
>          return EFI_TIMEOUT;
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 25/43] Silicon/Hisilicon/D06: Optimize HNS config CDR post time
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 25/43] Silicon/Hisilicon/D06: Optimize HNS config CDR post time Ming Huang
@ 2018-08-22 14:30   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 14:30 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	shaochangliang

On Tue, Aug 14, 2018 at 04:08:45PM +0800, Ming Huang wrote:
> From: shaochangliang <shaochangliang@huawei.com>
> 
> Use I2C 400KB speed for config CDR.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

The start of the subject line is supposed to reflect the code that is
being modified - not the platform you are doing it for. Drop D06,
mention I2CLib.

All of these patches should go in before the first D06 one.

With those changes:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---
>  Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> index ed44ac204f..55c030a3af 100644
> --- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> +++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> @@ -28,6 +28,9 @@
>  #include "I2CLibInternal.h"
>  #include "I2CHw.h"
>  
> +#define I2C_100KB_SPEED 0x1
> +#define I2C_400KB_SPEED 0x2
> +
>  VOID
>  I2C_Delay (
>    UINT32 Count
> @@ -158,7 +161,11 @@ I2CInit (
>  
>    I2C_REG_READ (Base + I2C_CON_OFFSET, I2cControlReg.Val32);
>    I2cControlReg.bits.master = 1;
> -  I2cControlReg.bits.Speed = 0x1;
> +  if(SpeedMode == Normal) {
> +    I2cControlReg.bits.Speed = I2C_100KB_SPEED;
> +  } else {
> +    I2cControlReg.bits.Speed = I2C_400KB_SPEED;
> +  }
>    I2cControlReg.bits.restart_en = 1;
>    I2cControlReg.bits.slave_disable = 1;
>    I2C_REG_WRITE (Base + I2C_CON_OFFSET, I2cControlReg.Val32);
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 26/43] Silicon/Hisilicon/Setup: Add Setup Item "EnableGOP"
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 26/43] Silicon/Hisilicon/Setup: Add Setup Item "EnableGOP" Ming Huang
@ 2018-08-22 14:33   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 14:33 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Yang XinYi

On Tue, Aug 14, 2018 at 04:08:46PM +0800, Ming Huang wrote:
> From: Yang XinYi <yangxingyi@huawei.com>
> 
> Add Setup Item "EnableGOP" for D06, This Item only takes
> effect on VGA device SM750.

Feedback on v1 was:
What is SM750? Please add more detail to commit message.

Please address.

Rest of patch is fine.

/
    Leif

> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Yang XinYi <yangxingyi@huawei.com>
> ---
>  Silicon/Hisilicon/Include/Library/OemConfigData.h            | 1 +
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c    | 1 +
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr | 7 +++++++
>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni | 4 ++--
>  4 files changed, 11 insertions(+), 2 deletions(-)
> 
> diff --git a/Silicon/Hisilicon/Include/Library/OemConfigData.h b/Silicon/Hisilicon/Include/Library/OemConfigData.h
> index 478821ae2c..e4d5917046 100644
> --- a/Silicon/Hisilicon/Include/Library/OemConfigData.h
> +++ b/Silicon/Hisilicon/Include/Library/OemConfigData.h
> @@ -61,6 +61,7 @@ typedef struct {
>    UINT8         EnableSmmu;
>    UINT8         EnableFdtTable;
>    UINT8         EnableSpcr;
> +  UINT8         EnableGOP;
>    /*RAS Config*/
>    UINT8         EnRasSupport;
>    UINT8         EnPoison;
> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
> index 1e3635307c..3ecae3759a 100644
> --- a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
> @@ -295,6 +295,7 @@ OemConfigUiLibConstructor (
>        Configuration.EnableSmmu = 1;
>        Configuration.EnableFdtTable = 0;
>        Configuration.EnableSpcr = 0;
> +      Configuration.EnableGOP = 0;
>        //
>        //Set the default value of the Ras option
>        //
> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
> index 9e3ac73116..c0b6e294a6 100644
> --- a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
> @@ -38,4 +38,11 @@ form formid = MISC_CONFIG_FORM_ID,
>        option text = STRING_TOKEN(STR_ENABLED), value = 1, flags = 0;
>      endoneof;
>  
> +    oneof varid   = OEM_CONFIG_DATA.EnableGOP,
> +      prompt      = STRING_TOKEN(STR_ENABLE_GOP_FRAME_BUFFER),
> +      help        = STRING_TOKEN(STR_ENABLE_GOP_FRAME_BUFFER_HELP),
> +      option text = STRING_TOKEN(STR_DISABLED), value = 0, flags = DEFAULT;
> +      option text = STRING_TOKEN(STR_ENABLED), value = 1, flags = 0;
> +    endoneof;
> +
>  endform;
> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
> index 53eb1622c4..2fd92fedff 100644
> --- a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
> @@ -23,5 +23,5 @@
>  #string STR_FDT_CONFIG_HELP            #language en-US  "Enable or Disable Fdt Table."
>  #string STR_ENABLE_SPCR_TABLE          #language en-US  "Support SPCR"
>  #string STR_ENABLE_SPCR_HELP           #language en-US  "Enable or Disable SPCR Table."
> -#string STR_ENABLE_GOP_FRAME_BUFFER    #language en-US  "Support GOP FB"
> -#string STR_ENABLE_GOP_FRAME_BUFFER_HELP     #language en-US  "Enable or Disable GOP frame buffer."
> +#string STR_ENABLE_GOP_FRAME_BUFFER    #language en-US  "Support GOP FB for SM750"
> +#string STR_ENABLE_GOP_FRAME_BUFFER_HELP     #language en-US  "Enable or Disable GOP frame buffer for SM750."
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 27/43] Hisilicon/Hi1620: Add ACPI PPTT table
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 27/43] Hisilicon/Hi1620: Add ACPI PPTT table Ming Huang
@ 2018-08-22 14:39   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 14:39 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Heyi Guo

On Tue, Aug 14, 2018 at 04:08:47PM +0800, Ming Huang wrote:
> From: Heyi Guo <heyi.guo@linaro.org>
> 
> This driver fetches information from MADT,  so it is adaptable for
> partial good and 1P/2P, since MADT is updated for different
> configurations by certain mechanism.
> 
> Since L2 cache is also private resource of core, so we need to set the
> next level of cache for L1I and L1D, which is important for OS to
> parse cache hierarchy.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Heyi Guo <heyi.guo@linaro.org>

No, Signed-off-by: Ming Huang <ming.huang@linaro.org>
You are signing off on these patches being correclty licensed and
permitted to contribute under the Contribution agreement.
The above is equivalent to "Heyi says it's fine".

"Heyi wrote this code" is reflected through the From: tag above.

Looking back, I notice this is true for many patches in the set.
Please address throughout v4.

I have no further comment on this patch, so with that change:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---
>  Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf |  48 ++
>  Silicon/Hisilicon/Hi1620/Pptt/Pptt.h   |  68 +++
>  Silicon/Hisilicon/Hi1620/Pptt/Pptt.c   | 543 ++++++++++++++++++++
>  3 files changed, 659 insertions(+)


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 28/43] Platform/Hisilicon/D06: Enable ACPI PPTT
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 28/43] Platform/Hisilicon/D06: Enable ACPI PPTT Ming Huang
@ 2018-08-22 14:40   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 14:40 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Heyi Guo

On Tue, Aug 14, 2018 at 04:08:48PM +0800, Ming Huang wrote:
> From: Heyi Guo <heyi.guo@linaro.org>
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Heyi Guo <heyi.guo@linaro.org>

Replace Heyi's Signed-off-by with your own.
Then
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>


> ---
>  Platform/Hisilicon/D06/D06.dsc | 1 +
>  Platform/Hisilicon/D06/D06.fdf | 2 ++
>  2 files changed, 3 insertions(+)
> 
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index bec422670d..06249d8a5b 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -338,6 +338,7 @@
>    Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
>    Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>  
> +  Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
>    #
>    # Usb Support
>    #
> diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
> index 06203dc079..5bb779d2e4 100644
> --- a/Platform/Hisilicon/D06/D06.fdf
> +++ b/Platform/Hisilicon/D06/D06.fdf
> @@ -252,6 +252,8 @@ READ_LOCK_STATUS   = TRUE
>    INF RuleOverride=ACPITABLE Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
>    INF Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>  
> +  INF Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
> +
>    #
>    #Network
>    #
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 12/43] Platform/Hisilicon/D06: Add edk2-non-osi components for D06
  2018-08-22  9:49   ` Leif Lindholm
@ 2018-08-22 14:54     ` Ming
  2018-08-22 16:43       ` Leif Lindholm
  0 siblings, 1 reply; 93+ messages in thread
From: Ming @ 2018-08-22 14:54 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu



On 8/22/2018 5:49 PM, Leif Lindholm wrote:
> On Tue, Aug 14, 2018 at 04:08:32PM +0800, Ming Huang wrote:
>> Add PcdCoreCount to fix build issue while add binary components.
> 
> This commit message fails to describe what is being done, apart from a
> single thing that should be a separate patch.
> 
> Pleas add a proper commit message describing which components are
> being imported.
> 
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ming Huang <ming.huang@linaro.org>
>> ---
>>  Platform/Hisilicon/D06/D06.dsc                                                 |  7 +++++++
>>  Platform/Hisilicon/D06/D06.fdf                                                 | 17 +++++++++++++++++
>>  Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf |  2 ++
>>  3 files changed, 26 insertions(+)
>>
> 
>> diff --git a/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf b/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
>> index 2275586ff3..a47806f391 100644
>> --- a/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
>> +++ b/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
>> @@ -28,6 +28,7 @@
>>  
>>  [Packages]
>>    ArmPkg/ArmPkg.dec
>> +  ArmPlatformPkg/ArmPlatformPkg.dec
>>    MdePkg/MdePkg.dec
>>    MdeModulePkg/MdeModulePkg.dec
>>    IntelFrameworkPkg/IntelFrameworkPkg.dec
>> @@ -52,6 +53,7 @@
>>    gEfiSmbiosProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
>>  
>>  [Pcd]
>> +  gArmPlatformTokenSpaceGuid.PcdCoreCount
>>    gHisiTokenSpaceGuid.PcdCPUInfo
>>    gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz
> 
> And please submit this as a separate patch, explaining why the change
> is needed. If it is only needed by one of the binary modules imported
> as part of the current patch, place it immediately preceding this.
> 
> If it resolves some other issue, please insert it as early in the set
> as possible.

Silicon/Hisilicon/Hi1620/Library/PlatformSysCtrlLibHi1620 add a function
which use the PcdCoreCount and the function is used by ProcessorSubClassDxe.
Should I add gArmPlatformTokenSpaceGuid.PcdCoreCount to
Silicon/Hisilicon/Hi1620/Library/PlatformSysCtrlLibHi1620/PlatformSysCtrlLibHi1620.inf ?
And delete the commit message in this patch ?

> 
> /
>     Leif
> 
>>  
>> -- 
>> 2.17.0
>>


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 30/43] Platform/Hisilicon/D06: Add OemNicConfig2P Driver
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 30/43] Platform/Hisilicon/D06: Add OemNicConfig2P Driver Ming Huang
@ 2018-08-22 14:57   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 14:57 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:50PM +0800, Ming Huang wrote:
> This Driver provide Get/Set Mac function.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---
>  Platform/Hisilicon/D06/D06.dsc                                         |  2 +-
>  Platform/Hisilicon/D06/D06.fdf                                         |  2 +-
>  Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf | 43 ++++++++++++
>  Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h     | 25 +++++++
>  Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c   | 71 ++++++++++++++++++++
>  5 files changed, 141 insertions(+), 2 deletions(-)
> 
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index e18badf3b3..5571028f42 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -285,7 +285,7 @@
>    #
>    ArmPkg/Drivers/CpuDxe/CpuDxe.inf
>    MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf
> -
> +  Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
>  
>  !if $(SECURE_BOOT_ENABLE) == TRUE
>    MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf {
> diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
> index 5bb779d2e4..184d5d4dcf 100644
> --- a/Platform/Hisilicon/D06/D06.fdf
> +++ b/Platform/Hisilicon/D06/D06.fdf
> @@ -174,7 +174,7 @@ READ_LOCK_STATUS   = TRUE
>    INF MdeModulePkg/Universal/SecurityStubDxe/SecurityStubDxe.inf
>    INF Platform/Hisilicon/D06/Drivers/SFC/SfcDxeDriver.inf
>  
> -
> +  INF Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
>    INF Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.inf
>    INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
>    INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf
> diff --git a/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
> new file mode 100644
> index 0000000000..a91f2b6005
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
> @@ -0,0 +1,43 @@
> +#/** @file
> +#
> +#    Copyright (c) 2016-2018, Hisilicon Limited. All rights reserved.
> +#    Copyright (c) 2016-2018, Linaro Limited. All rights reserved.
> +#
> +#    This program and the accompanying materials
> +#    are licensed and made available under the terms and conditions of the BSD License
> +#    which accompanies this distribution. The full text of the license may be found at
> +#    http://opensource.org/licenses/bsd-license.php
> +#
> +#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#**/
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001001A
> +  BASE_NAME                      = OemNicConfigPangea
> +  FILE_GUID                      = edc95319-ebe9-4c38-96af-1d203fb85231
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = OemNicConfigEntry
> +
> +[Sources.common]
> +  OemNicConfig2P.c
> +
> +[Packages]
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +  Silicon/Hisilicon/HisiPkg.dec
> +
> +[Protocols]
> +  gHisiBoardNicProtocolGuid       ##Produce
> +
> +[LibraryClasses]
> +  DebugLib
> +  IoLib
> +  OemNicLib
> +  UefiBootServicesTableLib
> +  UefiDriverEntryPoint
> +
> +[Depex]
> +  TRUE
> diff --git a/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h
> new file mode 100644
> index 0000000000..35228fdf1d
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h
> @@ -0,0 +1,25 @@
> +/** @file
> +*
> +*  Copyright (c) 2016-2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2016-2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef __OEM_NIC_CONFIG_H__
> +#define __OEM_NIC_CONFIG_H__
> +
> +#include <Uefi.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/OemNicLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Protocol/HisiBoardNicProtocol.h>
> +#endif
> diff --git a/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c
> new file mode 100644
> index 0000000000..c01c49150a
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c
> @@ -0,0 +1,71 @@
> +/** @file
> +*
> +*  Copyright (c) 2016-2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2016-2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#include <OemNicConfig.h>
> +
> +
> +EFI_STATUS
> +EFIAPI OemGetMac2P (
> +  IN OUT EFI_MAC_ADDRESS *Mac,
> +  IN     UINTN           Port
> +  )
> +{
> +  OemGetMac (Mac, Port);
> +
> +  return EFI_SUCCESS;
> +}
> +
> +EFI_STATUS
> +EFIAPI OemSetMac2P (
> +  IN EFI_MAC_ADDRESS *Mac,
> +  IN UINTN           Port
> +  )
> +{
> +  OemSetMac (Mac, Port);
> +
> +  return EFI_SUCCESS;
> +}
> +
> +HISI_BOARD_NIC_PROTOCOL mHisiBoardNicProtocol2P = {
> +  .GetMac = OemGetMac2P,
> +  .SetMac = OemSetMac2P,
> +};
> +
> +
> +EFI_STATUS
> +EFIAPI
> +OemNicConfigEntry (
> +  IN EFI_HANDLE           ImageHandle,
> +  IN EFI_SYSTEM_TABLE     *SystemTable
> +  )
> +{
> +  EFI_STATUS Status;
> +
> +  Status = gBS->InstallProtocolInterface (
> +                  &ImageHandle,
> +                  &gHisiBoardNicProtocolGuid,
> +                  EFI_NATIVE_INTERFACE,
> +                  &mHisiBoardNicProtocol2P
> +                  );
> +
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL] Install Protocol failed %r\n",
> +        __FUNCTION__, __LINE__, Status));
> +    return Status;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 31/43] Hisilicon/D0x: Update SMBIOS type9 info
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 31/43] Hisilicon/D0x: Update SMBIOS type9 info Ming Huang
@ 2018-08-22 15:01   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 15:01 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Sun Yuanchen

On Tue, Aug 14, 2018 at 04:08:51PM +0800, Ming Huang wrote:
> From: Sun Yuanchen <sunyuanchen@huawei.com>
> 
> Move board level code to OemMiscLibD0x for unifying D0x.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Sun Yuanchen <sunyuanchen@huawei.com>
> ---
>  Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf |  1 +
>  Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf     |  1 +
>  Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf     |  4 +
>  Platform/Hisilicon/D06/Include/Library/CpldD06.h                   |  2 +
>  Silicon/Hisilicon/Include/Library/OemMiscLib.h                     |  1 +
>  Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c   | 24 ++++++
>  Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.c       | 27 +++++-
>  Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c       | 90 ++++++++++++++++++++
>  Silicon/Hisilicon/Drivers/Smbios/AddSmbiosType9/AddSmbiosType9.c   | 14 +--
>  9 files changed, 151 insertions(+), 13 deletions(-)
> 
> diff --git a/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf b/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf
> index 310bbaea84..0fa7fdf80f 100644
> --- a/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf
> +++ b/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.inf
> @@ -34,6 +34,7 @@
>    Silicon/Hisilicon/HisiPkg.dec
>  
>  [LibraryClasses]
> +  BaseMemoryLib
>    PcdLib
>    TimerLib
>  
> diff --git a/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf b/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf
> index bf44ff7440..022c3e940a 100644
> --- a/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf
> +++ b/Platform/Hisilicon/D05/Library/OemMiscLibD05/OemMiscLibD05.inf
> @@ -33,6 +33,7 @@
>    Silicon/Hisilicon/HisiPkg.dec
>  
>  [LibraryClasses]
> +  BaseMemoryLib
>    PcdLib
>    TimerLib
>  
> diff --git a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
> index 8f68f7cec5..bd984a6fe3 100644
> --- a/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
> +++ b/Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
> @@ -30,9 +30,13 @@
>    ArmPkg/ArmPkg.dec
>    MdeModulePkg/MdeModulePkg.dec
>    MdePkg/MdePkg.dec
> +  Platform/Hisilicon/D06/D06.dec
>    Silicon/Hisilicon/HisiPkg.dec
>  
>  [LibraryClasses]
> +  BaseMemoryLib
> +  CpldIoLib
> +  IoLib
>    PcdLib
>    SerdesLib
>    TimerLib
> diff --git a/Platform/Hisilicon/D06/Include/Library/CpldD06.h b/Platform/Hisilicon/D06/Include/Library/CpldD06.h
> index be3548c8d1..ec9b49f4e7 100644
> --- a/Platform/Hisilicon/D06/Include/Library/CpldD06.h
> +++ b/Platform/Hisilicon/D06/Include/Library/CpldD06.h
> @@ -29,6 +29,8 @@
>  #define CPLD_LOGIC_COMPILE_DAY           (0x3)
>  
>  #define CPLD_RISER_PRSNT_FLAG             0x40
> +#define CPU1_RISER_PRESENT                BIT6
> +#define CPU0_RISER_PRESENT                BIT7
>  #define CPLD_RISER2_BOARD_ID              0x44
>  
>  #define CPLD_X8_X8_X8_BOARD_ID            0x92
> diff --git a/Silicon/Hisilicon/Include/Library/OemMiscLib.h b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
> index efecb9aa77..86ea6a1b3d 100644
> --- a/Silicon/Hisilicon/Include/Library/OemMiscLib.h
> +++ b/Silicon/Hisilicon/Include/Library/OemMiscLib.h
> @@ -34,6 +34,7 @@ typedef struct _REPORT_PCIEDIDVID2BMC{
>      UINTN   Slot;
>  }REPORT_PCIEDIDVID2BMC;
>  extern REPORT_PCIEDIDVID2BMC PcieDeviceToReport[PCIEDEVICE_REPORT_MAX];
> +extern VOID GetPciDidVid (REPORT_PCIEDIDVID2BMC *Report);
>  
>  BOOLEAN OemIsSocketPresent (UINTN Socket);
>  VOID CoreSelectBoot(VOID);
> diff --git a/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c b/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c
> index fa1039bda1..c80500276f 100644
> --- a/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c
> +++ b/Platform/Hisilicon/D03/Library/OemMiscLib2P/OemMiscLib2PHi1610.c
> @@ -15,6 +15,7 @@
>  
>  #include <Uefi.h>
>  
> +#include <Library/BaseMemoryLib.h>
>  #include <Library/DebugLib.h>
>  #include <Library/IoLib.h>
>  #include <Library/TimerLib.h>
> @@ -31,6 +32,29 @@ REPORT_PCIEDIDVID2BMC  PcieDeviceToReport[PCIEDEVICE_REPORT_MAX] = {
>        {0xFFFF,0xFFFF,0xFFFF,0xFFFF}
>  };
>  
> +REPORT_PCIEDIDVID2BMC PcieDeviceToReport_2P[PCIEDEVICE_REPORT_MAX] = {

Should really drop that _ from the variable name.

> +  {0x79,0,0,0},
> +  {0xFF,0xFF,0xFF,1},
> +  {0xC1,0,0,2},
> +  {0xF9,0,0,3},
> +  {0xFF,0xFF,0xFF,4},
> +  {0x11,0,0,5},
> +  {0x31,0,0,6},
> +  {0x21,0,0,7}
> +};
> +
> +VOID
> +GetPciDidVid (
> +  REPORT_PCIEDIDVID2BMC *Report
> +  )
> +{
> +  if (OemIsMpBoot ()) {
> +    (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport_2P, sizeof (PcieDeviceToReport_2P));
> +  } else {
> +    (VOID)CopyMem ((VOID *)Report, (VOID *)PcieDeviceToReport, sizeof (PcieDeviceToReport));

I think these lines got longer from v1?
Please wrap.

With these changes:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

/
    Leif


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 32/43] Platform/Hisilicon/D06: Add EarlyConfigPeim peim
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 32/43] Platform/Hisilicon/D06: Add EarlyConfigPeim peim Ming Huang
@ 2018-08-22 15:04   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 15:04 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:52PM +0800, Ming Huang wrote:
> This peim configuare SMMU,BSP,MN(Miscellaneous Node).

configuare still needs to change to
configures

With that change:
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>


> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Platform/Hisilicon/D06/D06.dsc                                |   1 +
>  Platform/Hisilicon/D06/D06.fdf                                |   1 +
>  Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf |  50 +++++++++
>  Silicon/Hisilicon/Include/Library/OemAddressMapLib.h          |   2 +
>  Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c   | 107 ++++++++++++++++++++
>  5 files changed, 161 insertions(+)
> 
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index 5571028f42..3de09ea870 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -263,6 +263,7 @@
>    MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
>    MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
>  
> +  Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
>    Silicon/Hisilicon/Drivers/VersionInfoPeim/VersionInfoPeim.inf
>  
>    MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
> diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
> index 184d5d4dcf..bd3ea47226 100644
> --- a/Platform/Hisilicon/D06/D06.fdf
> +++ b/Platform/Hisilicon/D06/D06.fdf
> @@ -359,6 +359,7 @@ READ_LOCK_STATUS   = TRUE
>    INF ArmPkg/Drivers/CpuPei/CpuPei.inf
>    INF MdeModulePkg/Universal/PCD/Pei/Pcd.inf
>    INF IntelFrameworkModulePkg/Universal/StatusCode/Pei/StatusCodePei.inf
> +  INF Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
>  
>    INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>  
> diff --git a/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf b/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
> new file mode 100644
> index 0000000000..8296ee02de
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
> @@ -0,0 +1,50 @@
> +#/** @file
> +#
> +#    Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +#    Copyright (c) 2017, Linaro Limited. All rights reserved.
> +#
> +#    This program and the accompanying materials
> +#    are licensed and made available under the terms and conditions of the BSD License
> +#    which accompanies this distribution. The full text of the license may be found at
> +#    http://opensource.org/licenses/bsd-license.php
> +#
> +#    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#**/
> +
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001001A
> +  BASE_NAME                      = EarlyConfigPeimD06
> +  FILE_GUID                      = FB8C65EB-0199-40C3-A82B-029921A9E9B3
> +  MODULE_TYPE                    = PEIM
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = EarlyConfigEntry
> +
> +[Sources.common]
> +  EarlyConfigPeimD06.c
> +
> +[Packages]
> +  ArmPkg/ArmPkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +  Silicon/Hisilicon/HisiPkg.dec
> +
> +[LibraryClasses]
> +  ArmLib
> +  CacheMaintenanceLib
> +  DebugLib
> +  IoLib
> +  PcdLib
> +  PeimEntryPoint
> +  PlatformSysCtrlLib
> +
> +[Pcd]
> +  gHisiTokenSpaceGuid.PcdMailBoxAddress
> +  gHisiTokenSpaceGuid.PcdPeriSubctrlAddress
> +  gHisiTokenSpaceGuid.PcdTrustedFirmwareEnable
> +
> +[Depex]
> +## As we will clean mailbox in this module, need to wait memory init complete
> +  gEfiPeiMemoryDiscoveredPpiGuid
> diff --git a/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h b/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h
> index 332a79343f..b330be09ba 100644
> --- a/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h
> +++ b/Silicon/Hisilicon/Include/Library/OemAddressMapLib.h
> @@ -16,6 +16,8 @@
>  #ifndef _OEM_ADDRESS_MAP_LIB_H_
>  #define _OEM_ADDRESS_MAP_LIB_H_
>  
> +#include "PlatformArch.h"
> +
>  typedef struct _DDRC_BASE_ID{
>      UINTN  Base;
>      UINTN  Id;
> diff --git a/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c b/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c
> new file mode 100644
> index 0000000000..0790f7941a
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c
> @@ -0,0 +1,107 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +
> +#include <Uefi.h>
> +#include <Library/ArmLib.h>
> +#include <Library/CacheMaintenanceLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/OemAddressMapLib.h>
> +#include <Library/OemMiscLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/PlatformSysCtrlLib.h>
> +#include <PiPei.h>
> +
> +#define PERI_SUBCTRL_BASE                               (0x40000000)
> +#define MDIO_SUBCTRL_BASE                               (0x60000000)
> +#define PCIE2_SUBCTRL_BASE                              (0xA0000000)
> +#define PCIE0_SUBCTRL_BASE                              (0xB0000000)
> +#define ALG_BASE                                        (0xD0000000)
> +
> +#define SC_BROADCAST_EN_REG                             (0x16220)
> +#define SC_BROADCAST_SCL1_ADDR0_REG                     (0x16230)
> +#define SC_BROADCAST_SCL1_ADDR1_REG                     (0x16234)
> +#define SC_BROADCAST_SCL2_ADDR0_REG                     (0x16238)
> +#define SC_BROADCAST_SCL2_ADDR1_REG                     (0x1623C)
> +#define SC_BROADCAST_SCL3_ADDR0_REG                     (0x16240)
> +#define SC_BROADCAST_SCL3_ADDR1_REG                     (0x16244)
> +#define PCIE_SUBCTRL_SC_DISP_DAW_EN_REG                 (0x1000)
> +#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY3_REG         (0x1010)
> +#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY4_REG         (0x1014)
> +#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY5_REG         (0x1018)
> +#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY6_REG         (0x101C)
> +#define PCIE_SUBCTRL_SC_REMAP_CTRL_REG                  (0x1200)
> +#define SC_ITS_M3_INT_MUX_SEL_REG                       (0x21F0)
> +#define SC_TM_CLKEN0_REG                                (0x2050)
> +
> +#define SC_TM_CLKEN0_REG_VALUE                          (0x3)
> +#define SC_BROADCAST_EN_REG_VALUE                       (0x7)
> +#define SC_BROADCAST_SCLx_ADDRx_REG_VALUE0              (0x0)
> +#define SC_BROADCAST_SCLx_ADDRx_REG_VALUE1              (0x40016260)
> +#define SC_BROADCAST_SCLx_ADDRx_REG_VALUE2              (0x60016260)
> +#define SC_BROADCAST_SCLx_ADDRx_REG_VALUE3              (0x400)
> +#define SC_ITS_M3_INT_MUX_SEL_REG_VALUE                 (0x7)
> +#define PCIE_SUBCTRL_SC_REMAP_CTRL_REG_VALUE0           (0x0)
> +#define PCIE_SUBCTRL_SC_DISP_DAW_EN_REG_VALUE0          (0x27)
> +#define PCIE_SUBCTRL_SC_DISP_DAW_EN_REG_VALUE1          (0x2F)
> +#define PCIE_SUBCTRL_SC_DISP_DAW_EN_REG_VALUE2          (0x77)
> +#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY3_REG_VALUE0  (0x178033)
> +#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY4_REG_VALUE0  (0x17003c)
> +#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY5_REG_VALUE0  (0x15003d)
> +#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY5_REG_VALUE1  (0x170035)
> +#define PCIE_SUBCTRL_SC_DISPATCH_DAW_ARRAY6_REG_VALUE0  (0x16003e)
> +
> +STATIC
> +VOID
> +QResetAp (
> +  VOID
> +  )
> +{
> +  MmioWrite64 (FixedPcdGet64 (PcdMailBoxAddress), 0x0);
> +  (VOID)WriteBackInvalidateDataCacheRange (
> +          (VOID *)FixedPcdGet64 (PcdMailBoxAddress),
> +          sizeof (UINT64)
> +          );
> +
> +  //SCCL A
> +  if (!PcdGet64 (PcdTrustedFirmwareEnable)) {
> +    StartupAp ();
> +  }
> +}
> +
> +
> +EFI_STATUS
> +EFIAPI
> +EarlyConfigEntry (
> +  IN       EFI_PEI_FILE_HANDLE  FileHandle,
> +  IN CONST EFI_PEI_SERVICES     **PeiServices
> +  )
> +{
> +  DEBUG ((DEBUG_INFO,"SMMU CONFIG........."));
> +  (VOID)SmmuConfigForBios ();
> +  DEBUG ((DEBUG_INFO,"Done\n"));
> +
> +  DEBUG ((DEBUG_INFO,"AP CONFIG........."));
> +  (VOID)QResetAp ();
> +  DEBUG ((DEBUG_INFO,"Done\n"));
> +
> +  DEBUG ((DEBUG_INFO,"MN CONFIG........."));
> +  (VOID)MN_CONFIG ();
> +  DEBUG ((DEBUG_INFO,"Done\n"));
> +
> +  return EFI_SUCCESS;
> +}
> +
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 33/43] Platform/Hisilicon/D06: Add PciHostBridgeLib
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 33/43] Platform/Hisilicon/D06: Add PciHostBridgeLib Ming Huang
@ 2018-08-22 15:09   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 15:09 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:53PM +0800, Ming Huang wrote:
> PciHostBridgeLib which is need by PciHostBridgeDxe, provide
> root bridges and deal with resource conflict.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

All of my comments from v1 have been addressed.
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

/
    Leif

> ---
>  Platform/Hisilicon/D06/D06.dsc                                       |   2 +-
>  Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.inf |  36 ++
>  Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.c   | 635 ++++++++++++++++++++
>  3 files changed, 672 insertions(+), 1 deletion(-)


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 18/43] Hisilicon/D06: Add Hi1620OemConfigUiLib
  2018-08-22 14:14   ` Leif Lindholm
@ 2018-08-22 15:11     ` Ming
  0 siblings, 0 replies; 93+ messages in thread
From: Ming @ 2018-08-22 15:11 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Yang XinYi



On 8/22/2018 10:14 PM, Leif Lindholm wrote:
> On Tue, Aug 14, 2018 at 04:08:38PM +0800, Ming Huang wrote:
>> From: Yang XinYi <yangxingyi@huawei.com>
>>
>> This library is added for oem setup menu item.
>> Setup item include:
>> 1 DDR option item;
>> 2 BMC option item;
>> 3 Ras option item;
>> 4 Misc option item;
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Yang XinYi <yangxingyi@huawei.com>
>> ---
>>  Silicon/Hisilicon/HisiPkg.dec                                           |   1 +
>>  Platform/Hisilicon/D06/D06.dsc                                          |   5 +-
>>  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf       |   2 +-
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf        |  68 ++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h               | 142 ++++++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h             |  64 ++++
>>  Silicon/Hisilicon/Include/Library/OemConfigData.h                       |  84 +++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c               | 363 ++++++++++++++++++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.hfr          | 154 +++++++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.uni          | 103 ++++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr            |  41 +++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni            |  27 ++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.uni        |  24 ++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLibStrings.uni |  42 +++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigVfr.Vfr          |  89 +++++
> 
> Ah, I didn't spot thie before - but can you please rename this one
> from
> .Vfr to
> .vfr
> 
> to align with the others?

OK, do it in v4.

> 
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfig.hfr            | 219 ++++++++++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfigStrings.uni     | 111 ++++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PciePortConfig.hfr        | 167 +++++++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr             | 172 ++++++++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.uni             |  85 +++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.hfr            |  81 +++++
>>  Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.uni            |  34 ++
>>  22 files changed, 2076 insertions(+), 2 deletions(-)
>>
>> diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec
>> index b56a6a6af7..858b840a57 100644
>> --- a/Silicon/Hisilicon/HisiPkg.dec
>> +++ b/Silicon/Hisilicon/HisiPkg.dec
>> @@ -44,6 +44,7 @@
>>    gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}
>>  
>>    gHisiEfiMemoryMapGuid  = {0xf8870015, 0x6994, 0x4b98, {0x95, 0xa2, 0xbd, 0x56, 0xda, 0x91, 0xc0, 0x7f}}
>> +  gOemConfigGuid = {0x42927b59, 0x58fc, 0x41be, {0x8f, 0x59, 0xd1, 0x7c, 0x02, 0x1a, 0x70, 0x13}}
>>    gVersionInfoHobGuid = {0xe13a14c, 0x859c, 0x4f22, {0x82, 0xbd, 0x18, 0xe, 0xe1, 0x42, 0x12, 0xbf}}
>>    gHisiOemVariableGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}
>>    gOemBootVariableGuid = {0xb7784577, 0x5aaf, 0x4557, {0xa1, 0x99, 0xd4, 0xa4, 0x2f, 0x45, 0x06, 0xf8}}
>> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
>> index 9d4a86a4f4..bec422670d 100644
>> --- a/Platform/Hisilicon/D06/D06.dsc
>> +++ b/Platform/Hisilicon/D06/D06.dsc
>> @@ -330,7 +330,10 @@
>>    #ACPI
>>    #
>>    MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
>> -  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
>> +  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf {
>> +    <LibraryClasses>
>> +    NULL|Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
>> +  }
>>  
>>    Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
>>    Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>> diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
>> index e268a56bbd..281a4f2ebd 100644
>> --- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
>> +++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
>> @@ -56,7 +56,7 @@
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile    ## CONSUMES
>>  
>>  [Depex]
>> -  gEfiAcpiTableProtocolGuid
>> +  gEfiAcpiTableProtocolGuid AND gEfiVariableWriteArchProtocolGuid
>>  
>>  [UserExtensions.TianoCore."ExtraFiles"]
>>    AcpiPlatformExtra.uni
>> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
>> new file mode 100644
>> index 0000000000..fba619e9ba
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
>> @@ -0,0 +1,68 @@
>> +## @file
>> +#  OEM config Library used by BDS
>> +#
>> +#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +#  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +#  This program and the accompanying materials are licensed and made available under
>> +#  the terms and conditions of the BSD License that accompanies this distribution.
>> +#  The full text of the license may be found at
>> +#  http://opensource.org/licenses/bsd-license.php.
>> +#
>> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +#
>> +##
>> +[Defines]
>> +  INF_VERSION                    = 0x0001001A
>> +  BASE_NAME                      = OemConfigUiLib
>> +  MODULE_UNI_FILE                = OemConfigUiLib.uni
>> +  FILE_GUID                      = 32B373AC-00B6-471b-B3AE-6E4A4501F6BA
>> +  MODULE_TYPE                    = DXE_DRIVER
>> +  VERSION_STRING                 = 1.0
>> +  LIBRARY_CLASS                  = NULL|DXE_DRIVER UEFI_APPLICATION
>> +  CONSTRUCTOR                    = OemConfigUiLibConstructor
>> +  DESTRUCTOR                     = OemConfigUiLibDestructor
>> +
>> +[Sources]
>> +  iBMCConfig.hfr
>> +  iBMCConfig.uni
>> +  MemoryConfig.hfr
>> +  MemoryConfig.uni
>> +  MiscConfig.hfr
>> +  MiscConfig.uni
>> +  OemConfig.c
>> +  OemConfig.h
>> +  OemConfigUiLibStrings.uni
>> +  OemConfigVfr.Vfr
>> +  PcieConfig.hfr
>> +  PcieConfigStrings.uni
>> +  PciePortConfig.hfr
>> +  RasConfig.hfr
>> +  RasConfig.uni
>> +
>> +[Packages]
>> +  MdeModulePkg/MdeModulePkg.dec
>> +  MdePkg/MdePkg.dec
>> +  Silicon/Hisilicon/HisiPkg.dec
>> +
>> +[LibraryClasses]
>> +  BaseLib
>> +  BaseMemoryLib
>> +  DebugLib
>> +  DevicePathLib
>> +  HiiLib
>> +  MemoryAllocationLib
>> +  PrintLib
>> +  UefiBootServicesTableLib
>> +  UefiHiiServicesLib
>> +  UefiRuntimeServicesTableLib
>> +
>> +[Guids]
>> +  gEfiHiiPlatformSetupFormsetGuid               ## CONSUMES ## GUID (Indicate the formset class guid to be displayed)
>> +  gEfiIfrFrontPageGuid                          ## CONSUMES ## GUID (Indicate the formset in this library need to dispaly in which page)
>> +  gEfiIfrTianoGuid                              ## CONSUMES ## GUID (Extended IFR Guid Opcode)
>> +  gOemConfigGuid
>> +  gVersionInfoHobGuid
>> +
>> +[Protocols]
>> +  gEfiHiiConfigAccessProtocolGuid               ## CONSUMES
>> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h
>> new file mode 100644
>> index 0000000000..f91400150c
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h
>> @@ -0,0 +1,142 @@
>> +/** @file
>> +The Oem config reference implement
>> +
>> +Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +This program and the accompanying materials
>> +are licensed and made available under the terms and conditions of the BSD License
>> +which accompanies this distribution.  The full text of the license may be found at
>> +http://opensource.org/licenses/bsd-license.php
>> +
>> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +
>> +**/
>> +
>> +#ifndef _OEM_CONFIG_H_
>> +#define _OEM_CONFIG_H_
>> +
>> +#include <Guid/HiiPlatformSetupFormset.h>
>> +#include <Guid/MdeModuleHii.h>
>> +#include <Guid/VersionInfoHobGuid.h>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/BaseLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/DevicePathLib.h>
>> +#include <Library/HiiLib.h>
>> +#include <Library/HobLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include "Library/OemConfigData.h"
>> +#include <Library/PcdLib.h>
>> +#include <Library/PrintLib.h>
>> +#include <Library/UefiBootServicesTableLib.h>
>> +#include <Library/UefiHiiServicesLib.h>
>> +#include <Library/UefiRuntimeServicesTableLib.h>
>> +#include <Pi/PiFirmwareVolume.h>
>> +#include <Protocol/HiiConfigAccess.h>
>> +
>> +//
>> +// These are the VFR compiler generated data representing our VFR data.
>> +//
>> +extern UINT8  OemConfigVfrBin[];
>> +
>> +//
>> +// HII specific Vendor Device Path definition.
>> +//
>> +typedef struct {
>> +  VENDOR_DEVICE_PATH          VendorDevicePath;
>> +  EFI_DEVICE_PATH_PROTOCOL    End;
>> +} HII_VENDOR_DEVICE_PATH;
>> +
>> +#define OEM_CONFIG_CALLBACK_DATA_SIGNATURE  SIGNATURE_32 ('O', 'E', 'M', 'C')
>> +typedef struct {
>> +  UINTN                             Signature;
>> +  EFI_HII_HANDLE                    HiiHandle;
>> +  EFI_HANDLE                        DriverHandle;
>> +  EFI_HII_CONFIG_ACCESS_PROTOCOL    ConfigAccess;
>> +} OEM_CONFIG_CALLBACK_DATA;
>> +
>> +/**
>> +  This function allows a caller to extract the current configuration for one
>> +  or more named elements from the target driver.
>> +
>> +
>> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>> +  @param Request         A null-terminated Unicode string in <ConfigRequest> format.
>> +  @param Progress        On return, points to a character in the Request string.
>> +                         Points to the string's null terminator if request was successful.
>> +                         Points to the most recent '&' before the first failing name/value
>> +                         pair (or the beginning of the string if the failure is in the
>> +                         first name/value pair) if the request was not successful.
>> +  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which
>> +                         has all values filled in for the names in the Request string.
>> +                         String to be allocated by the called function.
>> +
>> +  @retval  EFI_SUCCESS            The Results is filled with the requested values.
>> +  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.
>> +  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
>> +  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +OemExtractConfig (
>> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
>> +  IN  CONST EFI_STRING                       Request,
>> +  OUT       EFI_STRING                       *Progress,
>> +  OUT       EFI_STRING                       *Results
>> +  );
>> +
>> +/**
>> +  This function processes the results of changes in configuration.
>> +
>> +
>> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>> +  @param Configuration   A null-terminated Unicode string in <ConfigResp> format.
>> +  @param Progress        A pointer to a string filled in with the offset of the most
>> +                         recent '&' before the first failing name/value pair (or the
>> +                         beginning of the string if the failure is in the first
>> +                         name/value pair) or the terminating NULL if all was successful.
>> +
>> +  @retval  EFI_SUCCESS            The Results is processed successfully.
>> +  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
>> +  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +OemRouteConfig (
>> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
>> +  IN  CONST EFI_STRING                       Configuration,
>> +  OUT       EFI_STRING                       *Progress
>> +  );
>> +
>> +/**
>> +  This function is invoked if user selected a interactive opcode from Device Manager's
>> +  Formset. If user set VBIOS, the new value is saved to EFI variable.
>> +
>> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>> +  @param Action          Specifies the type of action taken by the browser.
>> +  @param QuestionId      A unique value which is sent to the original exporting driver
>> +                         so that it can identify the type of data to expect.
>> +  @param Type            The type of value for the question.
>> +  @param Value           A pointer to the data being sent to the original exporting driver.
>> +  @param ActionRequest   On return, points to the action requested by the callback function.
>> +
>> +  @retval  EFI_SUCCESS           The callback successfully handled the action.
>> +  @retval  EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +OemCallback (
>> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
>> +  IN        EFI_BROWSER_ACTION               Action,
>> +  IN        EFI_QUESTION_ID                  QuestionId,
>> +  IN        UINT8                            Type,
>> +  IN        EFI_IFR_TYPE_VALUE               *Value,
>> +  OUT       EFI_BROWSER_ACTION_REQUEST       *ActionRequest
>> +  );
>> +
>> +VOID GetReleaseTime (EFI_TIME *Time);
>> +#endif
>> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h
>> new file mode 100644
>> index 0000000000..792e544c22
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h
>> @@ -0,0 +1,64 @@
>> +/** @file
>> +
>> +Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +This program and the accompanying materials
>> +are licensed and made available under the terms and conditions of the BSD License
>> +which accompanies this distribution.  The full text of the license may be found at
>> +http://opensource.org/licenses/bsd-license.php
>> +
>> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +
>> +Module Name:
>> +
>> +  OemConfigUi.h
>> +
>> +Abstract:
>> +
>> +  NVData structure used by the OEM Config.
>> +
>> +Revision History:
>> +
>> +
>> +**/
>> +
>> +#ifndef _OEM_CONFIG_UI_H_
>> +#define _OEM_CONFIG_UI_H_
>> +
>> +#include <Uefi/UefiMultiPhase.h>
>> +
>> +#define OEM_CONFIG_FORM_ID                   1
>> +#define MEMORY_CONFIG_FORM_ID                2
>> +#define IBMC_CONFIG_FORM_ID                  3
>> +#define PCIE_CONFIG_FORM_ID                  4
>> +#define MISC_CONFIG_FORM_ID                  5
>> +#define RAS_CONFIG_FORM_ID                   6
>> +
>> +#define VFR_FORMID_PCIE_SOCKET0              0x4100
>> +#define VFR_FORMID_PCIE_SOCKET1              0x4200
>> +#define VFR_FORMID_PCIE_PORT0                0x4000
>> +#define VFR_FORMID_PCIE_PORT1                0x4001
>> +#define VFR_FORMID_PCIE_PORT2                0x4002
>> +#define VFR_FORMID_PCIE_PORT3                0x4003
>> +#define VFR_FORMID_PCIE_PORT4                0x4004
>> +#define VFR_FORMID_PCIE_PORT5                0x4005
>> +#define VFR_FORMID_PCIE_PORT6                0x4006
>> +#define VFR_FORMID_PCIE_PORT7                0x4007
>> +#define VFR_FORMID_PCIE_PORT8                0x4008
>> +#define VFR_FORMID_PCIE_PORT9                0x4009
>> +#define VFR_FORMID_PCIE_PORT10               0x4010
>> +#define VFR_FORMID_PCIE_PORT11               0x4011
>> +#define VFR_FORMID_PCIE_PORT12               0x4012
>> +#define VFR_FORMID_PCIE_PORT13               0x4013
>> +#define VFR_FORMID_PCIE_PORT14               0x4014
>> +#define VFR_FORMID_PCIE_PORT15               0x4015
>> +
>> +#define VFR_FORMID_MEMORY_RAS                0x6100
>> +#define VFR_FORMID_CORRECT_ERROR             0x6101
>> +#define VFR_FORMID_PCIE_RAS                  0x6200
>> +
>> +#define RMT_PATTERN_LENGTH                   256
>> +
>> +
>> +#endif
>> diff --git a/Silicon/Hisilicon/Include/Library/OemConfigData.h b/Silicon/Hisilicon/Include/Library/OemConfigData.h
>> new file mode 100644
>> index 0000000000..478821ae2c
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Include/Library/OemConfigData.h
>> @@ -0,0 +1,84 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2017 - 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2017 - 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +
>> +#ifndef _OEM_CONFIG_DATA_H_
>> +#define _OEM_CONFIG_DATA_H_
>> +
>> +#define PCIE_MAX_TOTAL_PORTS                 16
>> +#define OEM_CONFIG_NAME                      L"OemConfig"
>> +#define PLATFORM_SETUP_VARIABLE_FLAG         (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE)
>> +
>> +#pragma pack(1)
>> +typedef struct {
>> +  /*Memory Config*/
>> +  UINT8         DdrDebugLevel;
>> +  UINT8         DdrFreqLimit;
>> +  UINT8         DdrRefreshSupport;
>> +  UINT8         DdrRefreshRate;
>> +  UINT8         RankMargin;
>> +  UINT8         RankMarginMode;
>> +  UINT32        rmtPatternLength;
>> +  UINT8         perbitmargin;
>> +  UINT8         CaMargin;
>> +  UINT8         CaVrefMarginOption;
>> +  UINT8         NumaEn;
>> +  UINT8         HwMemTest;
>> +  UINT8         DieInterleaving;
>> +  UINT8         ChannelInterleaving;
>> +  UINT8         RankInterleaving;
>> +  UINT8         EccSupport;
>> +  /*iBMC Config*/
>> +  UINT8         BmcWdtEnable;
>> +  UINT8         BmcWdtTimeout;
>> +  UINT8         BmcWdtAction;
>> +  UINT8         OSWdtEnable;
>> +  UINT8         OSWdtTimeout;
>> +  UINT8         OSWdtAction;
>> +  /*PCIe Config*/
>> +  UINT8         PcieSRIOVSupport;
>> +  UINT8         PciePort[PCIE_MAX_TOTAL_PORTS];
>> +  UINT8         PcieLinkSpeedPort[PCIE_MAX_TOTAL_PORTS];
>> +  UINT8         PcieLinkDeEmphasisPort[PCIE_MAX_TOTAL_PORTS];
>> +  UINT8         PcieLinkStatusPort[PCIE_MAX_TOTAL_PORTS];
>> +  UINT8         PcieLinkSpeedRateStatusPort[PCIE_MAX_TOTAL_PORTS];
>> +  UINT8         PcieLinkMaxPort[PCIE_MAX_TOTAL_PORTS];
>> +  UINT8         PcieMaxPayloadSizePort[PCIE_MAX_TOTAL_PORTS];
>> +  UINT8         PcieAspmPort[PCIE_MAX_TOTAL_PORTS];
>> +  /*Misc Config*/
>> +  UINT8         EnableSmmu;
>> +  UINT8         EnableFdtTable;
>> +  UINT8         EnableSpcr;
>> +  /*RAS Config*/
>> +  UINT8         EnRasSupport;
>> +  UINT8         EnPoison;
>> +  UINT8         CheckAlgorithm;
>> +  UINT8         PatrolScrub;
>> +  UINT8         PatrolScrubDuration;
>> +  UINT8         DemandScrubMode;
>> +  UINT8         CorrectErrorThreshold;
>> +  UINT8         AdvanceDeviceCorrection;
>> +  UINT8         RankSparing;
>> +  UINT8         FunnelPeriod;
>> +  UINT8         DpcFeature;
>> +  UINT8         EcrcFeature;
>> +  UINT8         CompletionTimeout;
>> +  UINT8         CompletionTimeoutValue;
>> +  UINT8         HotPlug;
>> +
>> +} OEM_CONFIG_DATA;
>> +#pragma pack()
>> +
>> +#endif
>> diff --git a/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
>> new file mode 100644
>> index 0000000000..1e3635307c
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
>> @@ -0,0 +1,363 @@
>> +/** @file
>> +The OEM config reference implementation
>> +
>> +Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +This program and the accompanying materials
>> +are licensed and made available under the terms and conditions of the BSD License
>> +which accompanies this distribution.  The full text of the license may be found at
>> +http://opensource.org/licenses/bsd-license.php
>> +
>> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +
>> +**/
>> +
>> +#include "OemConfig.h"
>> +
>> +OEM_CONFIG_CALLBACK_DATA    mOemConfigPrivate = {
>> +  OEM_CONFIG_CALLBACK_DATA_SIGNATURE,
>> +  NULL,
>> +  NULL,
>> +  {
>> +    OemExtractConfig,
>> +    OemRouteConfig,
>> +    OemCallback
>> +  }
>> +};
>> +
>> +HII_VENDOR_DEVICE_PATH  mOemHiiVendorDevicePath = {
>> +  {
>> +    {
>> +      HARDWARE_DEVICE_PATH,
>> +      HW_VENDOR_DP,
>> +      {
>> +        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
>> +        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
>> +      }
>> +    },
>> +    { 0x874c4dcb, 0x08ec, 0x4fe6, { 0xb5, 0x8e, 0x3a, 0x9e, 0x1c, 0x26, 0x70, 0xb9 } }
>> +  },
>> +  {
>> +    END_DEVICE_PATH_TYPE,
>> +    END_ENTIRE_DEVICE_PATH_SUBTYPE,
>> +    {
>> +      (UINT8) (END_DEVICE_PATH_LENGTH),
>> +      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
>> +    }
>> +  }
>> +};
>> +
>> +
>> +
>> +
>> +
>> +
>> +/**
>> +  This function allows a caller to extract the current configuration for one
>> +  or more named elements from the target driver.
>> +
>> +
>> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>> +  @param Request         A null-terminated Unicode string in <ConfigRequest> format.
>> +  @param Progress        On return, points to a character in the Request string.
>> +                         Points to the string's null terminator if request was successful.
>> +                         Points to the most recent '&' before the first failing name/value
>> +                         pair (or the beginning of the string if the failure is in the
>> +                         first name/value pair) if the request was not successful.
>> +  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which
>> +                         has all values filled in for the names in the Request string.
>> +                         String to be allocated by the called function.
>> +
>> +  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.
>> +  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +OemExtractConfig (
>> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
>> +  IN  CONST EFI_STRING                       Request,
>> +  OUT EFI_STRING                             *Progress,
>> +  OUT EFI_STRING                             *Results
>> +  )
>> +{
>> +  if (Progress == NULL || Results == NULL) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +  *Progress = Request;
>> +  return EFI_NOT_FOUND;
>> +}
>> +
>> +/**
>> +  This function processes the results of changes in configuration.
>> +
>> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>> +  @param Configuration   A null-terminated Unicode string in <ConfigResp> format.
>> +  @param Progress        A pointer to a string filled in with the offset of the most
>> +                         recent '&' before the first failing name/value pair (or the
>> +                         beginning of the string if the failure is in the first
>> +                         name/value pair) or the terminating NULL if all was successful.
>> +
>> +  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.
>> +  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +OemRouteConfig (
>> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
>> +  IN  CONST EFI_STRING                       Configuration,
>> +  OUT EFI_STRING                             *Progress
>> +  )
>> +{
>> +  if (Configuration == NULL || Progress == NULL) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  *Progress = Configuration;
>> +
>> +  return EFI_NOT_FOUND;
>> +}
>> +
>> +/**
>> +  This function is invoked if user selected a interactive opcode from Device Manager's
>> +  Formset. If user set VBIOS, the new value is saved to EFI variable.
>> +
>> +  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
>> +  @param Action          Specifies the type of action taken by the browser.
>> +  @param QuestionId      A unique value which is sent to the original exporting driver
>> +                         so that it can identify the type of data to expect.
>> +  @param Type            The type of value for the question.
>> +  @param Value           A pointer to the data being sent to the original exporting driver.
>> +  @param ActionRequest   On return, points to the action requested by the callback function.
>> +
>> +  @retval  EFI_SUCCESS           The callback successfully handled the action.
>> +  @retval  EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +OemCallback (
>> +  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,
>> +  IN  EFI_BROWSER_ACTION                     Action,
>> +  IN  EFI_QUESTION_ID                        QuestionId,
>> +  IN  UINT8                                  Type,
>> +  IN  EFI_IFR_TYPE_VALUE                     *Value,
>> +  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest
>> +  )
>> +{
>> +  if (Action != EFI_BROWSER_ACTION_CHANGING) {
>> +    //
>> +    // Do nothing for other UEFI Action. Only do call back when data is changed.
>> +    //
>> +    return EFI_UNSUPPORTED;
>> +  }
>> +  if ((Value == NULL) || (ActionRequest == NULL)) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +/**
>> +  Install Boot Manager Menu driver.
>> +
>> +  @param ImageHandle     The image handle.
>> +  @param SystemTable     The system table.
>> +
>> +  @retval  EFI_SUCEESS  Install Boot manager menu success.
>> +  @retval  Other        Return error status.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +OemConfigUiLibConstructor (
>> +  IN EFI_HANDLE                            ImageHandle,
>> +  IN EFI_SYSTEM_TABLE                      *SystemTable
>> +  )
>> +{
>> +  EFI_STATUS                  Status;
>> +  OEM_CONFIG_DATA             Configuration;
>> +  VOID                        *Hob;
>> +  VERSION_INFO                *VersionInfo;
>> +  UINTN                       BufSize;
>> +  BOOLEAN                     Action;
>> +  EFI_STRING                  ConfigRequestHdr;
>> +  EFI_TIME                    Time = {0};
>> +  CHAR16                      TmpString[0x100] = {0};
>> +
>> +  mOemConfigPrivate.DriverHandle = NULL;
>> +  Status = gBS->InstallMultipleProtocolInterfaces (
>> +                  &mOemConfigPrivate.DriverHandle,
>> +                  &gEfiDevicePathProtocolGuid,
>> +                  &mOemHiiVendorDevicePath,
>> +                  &gEfiHiiConfigAccessProtocolGuid,
>> +                  &mOemConfigPrivate.ConfigAccess,
>> +                  NULL
>> +                  );
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +
>> +  //
>> +  // Publish our HII data.
>> +  //
>> +  mOemConfigPrivate.HiiHandle = HiiAddPackages (
>> +                                   &gOemConfigGuid,
>> +                                   mOemConfigPrivate.DriverHandle,
>> +                                   OemConfigVfrBin,
>> +                                   OemConfigUiLibStrings,
>> +                                   NULL
>> +                                   );
>> +  if (mOemConfigPrivate.HiiHandle == NULL) {
>> +    DEBUG ((DEBUG_ERROR, "OemConfigUiLibConstructor(), Fail to Add Oem Hii Package.\n"));
> 
> Sorry, missed this one first time around:
> Please use %a and __FUNCTION__ instead of hardcoding the function name.

Modify it in v4.

> 
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +  //
>> +  //BIOS Build Time Init
>> +  //
>> +  Hob = GetFirstGuidHob (&gVersionInfoHobGuid);
>> +  if (Hob == NULL) {
>> +    DEBUG ((DEBUG_ERROR, "[%a]:[%d] Version information HOB not found!\n",
>> +      __FILE__, __LINE__));
>> +    return EFI_NOT_FOUND;
>> +  }
>> +  VersionInfo = GET_GUID_HOB_DATA (Hob);
>> +  Time = VersionInfo->BuildTime;
>> +  UnicodeSPrint (
>> +    TmpString,
>> +    sizeof (TmpString),
>> +    L"%02d/%02d/%04d %02d:%02d",
>> +    Time.Month,
>> +    Time.Day,
>> +    Time.Year,
>> +    Time.Hour,
>> +    Time.Minute
>> +    );
>> +  HiiSetString (
>> +    mOemConfigPrivate.HiiHandle,
>> +    STRING_TOKEN (STR_MISC_BIOS_BUILDTIME),
>> +    TmpString,
>> +    "en-US"
>> +    );
>> +  //
>> +  // Check Oem Config Variable.
>> +  //
>> +  ConfigRequestHdr = HiiConstructConfigHdr (
>> +                       &gOemConfigGuid,
>> +                       OEM_CONFIG_NAME,
>> +                       mOemConfigPrivate.DriverHandle
>> +                       );
>> +  ZeroMem (&Configuration, sizeof (OEM_CONFIG_DATA));
>> +  BufSize = sizeof (OEM_CONFIG_DATA);
>> +  Status = gRT->GetVariable (
>> +                  OEM_CONFIG_NAME,
>> +                  &gOemConfigGuid,
>> +                  NULL,
>> +                  &BufSize,
>> +                  &Configuration
>> +                  );
>> +  if (EFI_ERROR (Status)) {
>> +    Action = HiiSetToDefaults (ConfigRequestHdr, EFI_HII_DEFAULT_CLASS_STANDARD);
>> +    if (!Action) {
>> +      //
>> +      //Set the default value of the DDR option
>> +      //
>> +      Configuration.DdrDebugLevel = 0;
>> +      Configuration.DdrFreqLimit = 0;
>> +      Configuration.DdrRefreshSupport = 0;
>> +      Configuration.DdrRefreshRate = 0;
>> +      Configuration.RankMargin = 0;
>> +      Configuration.RankMarginMode = 2;
>> +      Configuration.rmtPatternLength = 256;
>> +      Configuration.perbitmargin = 0x0;
>> +      Configuration.CaMargin = 0x0;
>> +      Configuration.CaVrefMarginOption = 0x0;
>> +      Configuration.NumaEn = 1;
>> +      Configuration.HwMemTest = 0;
>> +      Configuration.DieInterleaving = 0;
>> +      Configuration.ChannelInterleaving = 1;
>> +      Configuration.RankInterleaving = 2;
>> +      Configuration.EccSupport = 0;
>> +      //
>> +      //Set the default value of the BMC option
>> +      //
>> +      Configuration.BmcWdtEnable = 0;
>> +      Configuration.BmcWdtTimeout = 15;
>> +      Configuration.BmcWdtAction = 1;
>> +      Configuration.OSWdtEnable = 0;
>> +      Configuration.OSWdtTimeout = 5;
>> +      Configuration.OSWdtAction = 1;
> 
> Where did the PCIe go?

PCIe is not ready now, so the PCIe item hide.
The PCIe hunk source is not applicable for D06, so delete it.

> 
> /
>     Leif
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 23/43] Silicon/Hisilicon/D06: Add I2C delay for HNS auto config
  2018-08-22 14:27   ` Leif Lindholm
@ 2018-08-22 15:16     ` Ming
  2018-08-22 16:46       ` Leif Lindholm
  0 siblings, 1 reply; 93+ messages in thread
From: Ming @ 2018-08-22 15:16 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu



On 8/22/2018 10:27 PM, Leif Lindholm wrote:
> On Tue, Aug 14, 2018 at 04:08:43PM +0800, Ming Huang wrote:
>> Because I2C Port5 salve device connect under I2C extender
>> (9545 device), it will cost more time to access I2C slave
>> device, so add delay time for HNS auto config.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ming Huang <ming.huang@linaro.org>
>> ---
>>  Silicon/Hisilicon/Library/I2CLib/I2CHw.h  |  3 +++
>>  Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 21 +++++++++++++++-----
>>  2 files changed, 19 insertions(+), 5 deletions(-)
> 
> Like previous patch, please change subject line - this affects d03,
> d05, d06.
> 
> Silicon/Hisilicon: Add I2CLib delay for HNS auto config

Should this patch reorder before the first D06 patch ?

> 
>> diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
>> index fa954c7937..d77aea509e 100644
>> --- a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
>> +++ b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
>> @@ -19,6 +19,9 @@
>>  #include <Uefi.h>
>>  #include <Library/IoLib.h>
>>  
>> +// The HNS I2C port 5 is under I2C extender
>> +#define I2C_EXTENDER_PORT_HNS        5
>> +
>>  #define I2C_READ_TIMEOUT             500
>>  #define I2C_DRV_ONCE_WRITE_BYTES_NUM 8
>>  #define I2C_DRV_ONCE_READ_BYTES_NUM  8
>> diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
>> index d67ddc7f9b..59633106ce 100644
>> --- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
>> +++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
>> @@ -258,8 +258,13 @@ CheckI2CTimeOut (
>>    if (Transfer == I2CTx) {
>>      Fifo = I2C_GetTxStatus (Socket, Port);
>>      while (Fifo != 0) {
>> -      // This is a empirical value for I2C delay. MemoryFance is no need here.
>> -      I2C_Delay (2);
>> +      if (Port == I2C_EXTENDER_PORT_HNS) {
>> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
> 
> MemoryFance ->
> MemoryFence
> 
> (You may want to search and replace that on the whole set.)
> 
> With that:
> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

Replace they in v4.
Thanks.

> 
> /
>     Leif
> 
>> +        I2C_Delay (1000);
>> +      } else {
>> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
>> +        I2C_Delay (2);
>> +      }
>>        if (++Times > I2C_READ_TIMEOUT) {
>>          (VOID)I2C_Disable (Socket, Port);
>>          return EFI_TIMEOUT;
>> @@ -269,8 +274,13 @@ CheckI2CTimeOut (
>>    } else {
>>      Fifo = I2C_GetRxStatus (Socket, Port);
>>      while (Fifo == 0) {
>> -      // This is a empirical value for I2C delay. MemoryFance is no need here.
>> -      I2C_Delay (2);
>> +      if (Port == I2C_EXTENDER_PORT_HNS) {
>> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
>> +        I2C_Delay (1000);
>> +      } else {
>> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
>> +        I2C_Delay (2);
>> +      }
>>        if (++Times > I2C_READ_TIMEOUT) {
>>          (VOID)I2C_Disable (Socket, Port);
>>          return EFI_TIMEOUT;
>> @@ -369,7 +379,8 @@ I2CWrite(
>>      Times = 0;
>>      Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
>>      while (Fifo > I2C_TXRX_THRESHOLD) {
>> -      I2C_Delay (2);
>> +      // This is a empirical value for I2C delay. MemoryFance is no need here.
>> +      I2C_Delay (1000);
>>        if (++Times > I2C_READ_TIMEOUT) {
>>          (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
>>          return EFI_TIMEOUT;
>> -- 
>> 2.17.0
>>


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 34/43] Hisilicon/D06: add apei driver
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 34/43] Hisilicon/D06: add apei driver Ming Huang
@ 2018-08-22 15:31   ` Leif Lindholm
  2018-08-23  7:35     ` Ming
  0 siblings, 1 reply; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 15:31 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Luqi Jiang

On Tue, Aug 14, 2018 at 04:08:54PM +0800, Ming Huang wrote:
> From: Luqi Jiang <jiangluqi@huawei.com>
> 
> This driver provide a means for the platform to
> convey error information to OSPM.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Luqi Jiang <jiangluqi@huawei.com>
> ---
>  Platform/Hisilicon/D06/D06.dsc                           |   1 +
>  Platform/Hisilicon/D06/D06.fdf                           |   1 +
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf           |  64 ++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h             |  41 +++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h        |  43 +++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h        | 146 ++++++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h | 110 ++++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h        | 146 ++++++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h        |  59 +++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h    |  43 +++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c             | 108 ++++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c        |  92 +++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c        | 349 ++++++++++++++++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c | 330 +++++++++++++++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c        | 374 ++++++++++++++++++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c        | 119 +++++++
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c    | 337 ++++++++++++++++++
>  17 files changed, 2363 insertions(+)

OK, so I was a bit terse in my original comment.
But all of these files need to be named approprietly - with an
upper-case first letter.

bert.h ->
Bert.h
einj.h ->
Einj.h

and so on.

More comments inline.

> 
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index c6de9f04ad..9550e0d497 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -340,6 +340,7 @@
>    Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
>    Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>  
> +  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
>    Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
>    #
>    # Usb Support
> diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
> index bd3ea47226..90379b8558 100644
> --- a/Platform/Hisilicon/D06/D06.fdf
> +++ b/Platform/Hisilicon/D06/D06.fdf
> @@ -251,6 +251,7 @@ READ_LOCK_STATUS   = TRUE
>  
>    INF RuleOverride=ACPITABLE Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
>    INF Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
> +  INF Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
>  
>    INF Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
>  
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
> new file mode 100644
> index 0000000000..7a75968da1
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
> @@ -0,0 +1,64 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +[defines]
> +  INF_VERSION                    = 0x0001001A
> +  BASE_NAME                      = AcpiApei
> +  FILE_GUID                      = E9570C39-EF68-4fc6-B921-C1954A87CCD2
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = ApeiEntryPoint
> +
> +[sources.common]
> +  Apei.c
> +  Bert/bert.c
> +  Bert/bert.h
> +  Einj/einj.c
> +  Einj/einj.h
> +  Erst/erst.c
> +  Erst/erst.h
> +  Hest/hest.c
> +  Hest/hest.h
> +  ErrorSource/Ghes.c
> +  ErrorSource/Ghes.h
> +  OemApeiHi1620.c
> +
> +[Packages]
> +  ArmPkg/ArmPkg.dec
> +  MdePkg/MdePkg.dec
> +  Silicon/Hisilicon/HisiPkg.dec
> +
> +[LibraryClasses]
> +  ArmSmcLib
> +  BaseMemoryLib
> +  DebugLib
> +  HobLib
> +  TimerLib
> +  UefiDriverEntryPoint
> +  UefiRuntimeServicesTableLib
> +
> +[Guids]
> +  gOemConfigGuid
> +
> +[Protocols]
> +  gEfiAcpiSdtProtocolGuid
> +  gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
> +
> +[Pcd]
> +  gHisiTokenSpaceGuid.PcdCpldBaseAddress
> +  gHisiTokenSpaceGuid.PcdTrustedFirmwareEnable
> +
> +[Depex]
> +  gEfiAcpiTableProtocolGuid AND gEfiAcpiSdtProtocolGuid
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h
> new file mode 100644
> index 0000000000..ed8ec417cb
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h
> @@ -0,0 +1,41 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +#ifndef _APEI_H_
> +#define _APEI_H_
> +
> +#include <IndustryStandard/Acpi.h>
> +#include <Protocol/AcpiSystemDescriptionTable.h>
> +#include <Protocol/AcpiTable.h>
> +
> +#define EFI_ACPI_MAX_NUM_TABLES         20
> +#define PRIVATE_ARM_SMC_ID_APEI         0x83000100
> +#define PRIVATE_ARM_SMC_ID_APEI_S       0x83000101
> +
> +typedef struct {
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *HestCorrectedErrorGhesV2;
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *HestFatalErrorGhesV2;
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *HestRecoverableErrorGhesV2;
> +  EFI_PHYSICAL_ADDRESS                                            HestTableAddress;
> +  EFI_PHYSICAL_ADDRESS                                            EinjTableAddress;
> +  EFI_PHYSICAL_ADDRESS                                            EinjDataStruct;
> +  VOID                                                            *ErstContext;
> +} APEI_TRUSTED_FIRMWARE_STRUCTURE;
> +
> +extern EFI_ACPI_TABLE_PROTOCOL       *mAcpiTableProtocol;
> +extern EFI_ACPI_SDT_PROTOCOL         *mAcpiSdtProtocol;
> +extern APEI_TRUSTED_FIRMWARE_STRUCTURE     *mApeiTrustedfirmwareData;
> +
> +
> +#endif    // _APEI_H_
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h
> new file mode 100644
> index 0000000000..36a0c58966
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h
> @@ -0,0 +1,43 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef _BERT_H_
> +#define _BERT_H_
> +
> +#include "Apei.h"
> +#include <Guid/Cper.h>
> +
> +typedef struct _BERT_CONTEXT {
> +  EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER   *BertHeader;
> +  VOID                                          *Block;
> +  UINT32                                        BlockSize;
> +} BERT_CONTEXT;
> +
> +EFI_STATUS
> +OemInitBertTable (
> +  IN EFI_HANDLE    ImageHandle
> +);
> +VOID
> +BertSetAcpiTable (
> +  IN BERT_CONTEXT *Context
> +);
> +EFI_STATUS
> +BertHeaderCreator (
> +  BERT_CONTEXT  *Context,
> +  UINT32        ErrorBlockSize
> +);
> +
> +
> +#endif    // _BERT_H_
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h
> new file mode 100644
> index 0000000000..85aa52f450
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h
> @@ -0,0 +1,146 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef _EINJ_H_
> +#define _EINJ_H_
> +
> +#include "Apei.h"
> +
> +#define EINJ_ACTION_NO             10
> +#define EINJ_BEGIN_OPERATION_VALUE 0xFFFF
> +#define EINJ_END_OPERATION_VALUE   0
> +#define EINJ_WRITE_MASK            0xFFFFFFFF
> +#define EINJ_READ_VALUE            0xFFFF
> +#define EINJ_READ_MASK             0xFFFFFFFF
> +
> +#define EINJ_TRIGGER_ERROR_ACTION_NO                                    1
> +
> +#define EFI_ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS                       0x08
> +#define EFI_ACPI_EINJ_GET_EXCUTE_OPERATION_TIMINGS                      0x09
> +
> +
> +extern EFI_ACPI_TABLE_PROTOCOL            *mAcpiTableProtocol;
> +extern EFI_ACPI_SDT_PROTOCOL              *mAcpiSdtProtocol;
> +extern APEI_TRUSTED_FIRMWARE_STRUCTURE    *mApeiTrustedfirmwareData;
> +
> +//
> +// Error Type Definition
> +//
> +#define EINJ_PROCESSOR_CORRECTABLE                                      BIT0
> +#define EINJ_PROCESSOR_UNCORRECTABLE_NONFATAL                           BIT1
> +#define EINJ_PROCESSOR_UNCORRECTABLE_FATAL                              BIT2
> +#define EINJ_MEMORY_CORRECTABLE                                         BIT3
> +#define EINJ_MEMORY_UNCORRECTABLE_NONFATAL                              BIT4
> +#define EINJ_MEMORY_UNCORRECTABLE_FATAL                                 BIT5
> +#define EINJ_PCIE_CORRECTABLE                                           BIT6
> +#define EINJ_PCIE_UNCORRECTABLE_NONFATAL                                BIT7
> +#define EINJ_PCIE_UNCORRECTABLE_FATAL                                   BIT8
> +#define EINJ_PLATFORM_CORRECTABLE                                       BIT9
> +#define EINJ_PLATFORM_UNCORRECTABLE_NONFATAL                            BIT10
> +#define EINJ_PLATFORM_UNCORRECTABLE_FATAL                               BIT11
> +#define EINJ_VENDOR_DEFINED_ERROR_TYPE                                  BIT31
> +
> +#define EINJ_PROCESSOR_APIC_VALID                                       BIT0
> +#define EINJ_MEMORY_ADDRESS_VALID                                       BIT1
> +#define EINJ_PCIE_SBDF_VALID                                            BIT2
> +
> +///
> +/// EINJ Table
> +///
> +typedef struct {
> +  EFI_ACPI_6_0_ERROR_INJECTION_TABLE_HEADER        EinjTableHeader;
> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY    EinjInstructionEntry[EINJ_ACTION_NO];
> +} EINJ_TABLE;
> +
> +typedef struct {
> +  EFI_ACPI_6_0_EINJ_TRIGGER_ACTION_TABLE           TriggerErrorHeader;
> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY    ErrorInstructionEntry[EINJ_TRIGGER_ERROR_ACTION_NO];
> +} EINJ_TRIGGER_ERROR_ACTION;
> +
> +typedef struct {
> +  UINT32 Reserved: 8;
> +  UINT32 Function: 3;
> +  UINT32 Device: 5;
> +  UINT32 PrimaryOrDeviceBus: 8;
> +  UINT32 Segment: 8;
> +} EINJ_PCIE_SBDF;
> +
> +typedef struct {
> +  UINT32         ErrorType;
> +  UINT32         VendorErrorTypeOffset;
> +  UINT32         Flags;
> +  UINT32         ApicId;
> +  UINT64         MemAddress;
> +  UINT64         MemAddressRange;
> +  EINJ_PCIE_SBDF PcieSBDF;
> +} EINJ_SET_ERROR_TYPE_WITH_ADDRESS;
> +
> +typedef struct {
> +  UINT32 Length;
> +  UINT32 SBDF;
> +  UINT16 VendorId;
> +  UINT16 DeviceId;
> +  UINT8  RevId;
> +  UINT8  Reserved[3];
> +} EINJ_VENDOR_ERROR_TYPE;
> +
> +typedef struct {
> +  UINT64                           OperationBegin;
> +  UINT64                           ErrorType;
> +  UINT64                           ErrorCapabilities;
> +  UINT64                           BusyStatus;
> +  UINT64                           CommandStatus;
> +  UINT64                           Timming;

Is this a typo for "Timing"?

> +  EINJ_TRIGGER_ERROR_ACTION        *TriggerErrorActionTablePtr;
> +  EINJ_SET_ERROR_TYPE_WITH_ADDRESS ErrorTypeWithAddress;
> +  EINJ_VENDOR_ERROR_TYPE           VendorErrorTypeExtension;
> +  EINJ_TRIGGER_ERROR_ACTION        TriggerErrorActionTable;
> +} EINJ_DATA_STRUCTURE;
> +
> +// V2
> +typedef struct _EINJ_CONTEXT {
> +  EINJ_TABLE                                    *EINJ;
> +  EINJ_DATA_STRUCTURE                           *EinjData;
> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY *GetErrorTypeEntry;
> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY *ExecuteOperationEntry;
> +} EINJ_CONTEXT;
> +
> +
> +EFI_STATUS
> +InitEinjTable(VOID);
> +// Version2
> +EFI_STATUS
> +EinjConfigErrorInjectCapability(
> +  EINJ_CONTEXT  *Context,
> +  UINT32        BitsSupportedErrorType
> +);
> +EFI_STATUS
> +EinjHeaderCreator(
> +  EINJ_CONTEXT  *Context
> +);
> +/***OEM***/
> +EFI_STATUS
> +OemInitEinjTable(VOID);
> +EFI_STATUS
> +OemEinjConfigExecuteOperationEntry(
> +  EINJ_CONTEXT *Context
> +);
> +VOID
> +EinjSetAcpiTable(
> +  EINJ_CONTEXT *Context
> +);
> +
> +
> +#endif    // _EINJ_H_
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h
> new file mode 100644
> index 0000000000..44cd1f9577
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h
> @@ -0,0 +1,110 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef GENERIC_HARDWARE_ERROR_SOURCE
> +#define GENERIC_HARDWARE_ERROR_SOURCE
> +#include "Apei.h"
> +
> +
> +typedef struct {
> +  UINT64 AckRegister;
> +  UINT64 ErrorStatusBlockAddress;
> +} GHES_REGISTER;
> +
> +typedef enum {
> +  PROCESSOR_GENERIC   = 0,
> +  PROCESSOR_IA32_X64  = 1,
> +  PROCESSOR_IPF       = 2,
> +  PROCESSOR_ARM       = 3,
> +  PLATFORM_MEMORY     = 4,
> +  PLATFORM_MEMORY2    = 5,
> +  PCIE_EXPRESS        = 6,
> +  FIRMWARE_ERROR      = 7,
> +  PCI_BUS             = 8,
> +  PCI_COMPONENT       = 9
> +} EFI_CPER_SECTION_TYPE;
> +typedef enum {
> +  RECOVERABLE = 0,
> +  FATAL = 1,
> +  CORRECTED = 2,
> +  NONE = 3
> +} ERROR_SEVERITY;
> +
> +EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE*
> +ErrorBlockInitial(
> +  VOID   *Block,
> +  UINT32 Severity
> +);
> +BOOLEAN ErrorBlockAddErrorData (
> +  IN VOID                  *ErrorBlock,
> +  IN UINT32                MaxBlockLength,
> +  IN EFI_CPER_SECTION_TYPE TypeOfErrorData,
> +  IN VOID                  *GenericErrorData,
> +  IN UINT32                SizeOfGenericErrorData,
> +  IN ERROR_SEVERITY        ErrorSeverity,
> +  IN BOOLEAN               Correctable
> +);
> +BOOLEAN ErrorBlockAddErrorData (
> +  IN VOID                  *ErrorBlock,
> +  IN UINT32                MaxBlockLength,
> +  IN EFI_CPER_SECTION_TYPE TypeOfErrorData,
> +  IN VOID                  *GenericErrorData,
> +  IN UINT32                SizeOfGenericErrorData,
> +  IN ERROR_SEVERITY        ErrorSeverity,
> +  IN BOOLEAN               Correctable
> +);
> +
> +VOID
> +GhesV2Initial (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *GhesV2,
> +  UINT32                                                          BlockLength
> +);
> +
> +/**
> +@param type - one of HARDWARE_ERROR_NOTIFICATION Type, GSIV For ARM,and SCI for X86,
> +              Notice: Windows OS hadn't support to GSIV, 20171026
> +*/
> +VOID
> +GhesV2AddNotification (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *This,
> +  UINT8                                                           Type
> +);
> +
> +
> +EFI_STATUS
> +GhesV2LinkErrorBlock (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *GhesV2,
> +  GHES_REGISTER                                                  *Register,
> +  VOID                                                           *ErrorBlock
> +);
> +VOID
> +GhesV1Initial (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *GhesV1,
> +  UINT32                                               BlockLength
> +);
> +VOID
> +GhesV1AddNotification (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
> +  UINT8                                                Type
> +);
> +EFI_STATUS
> +GhesV1LinkErrorBlock (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
> +  UINT64                                               *ptrBlockAddress,
> +  VOID                                                 *ErrorBlock
> +);
> +
> +
> +#endif
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h
> new file mode 100644
> index 0000000000..ca43c83fa0
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h
> @@ -0,0 +1,146 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef _ERST_H_
> +#define _ERST_H_
> +
> +#include "Apei.h"
> +
> +#define ERST_STATUS_SUCCESS                 EFI_ACPI_6_1_ERST_STATUS_SUCCESS
> +#define ERST_STATUS_NOT_ENOUGH_SPACE        EFI_ACPI_6_1_ERST_STATUS_NOT_ENOUGH_SPACE
> +#define ERST_STATUS_HARDWARE_NOT_AVAILABLE  EFI_ACPI_6_1_ERST_STATUS_HARDWARE_NOT_AVAILABLE
> +#define ERST_STATUS_FAILED                  EFI_ACPI_6_1_ERST_STATUS_FAILED
> +#define ERST_STATUS_RECORD_STORE_EMPTY      EFI_ACPI_6_1_ERST_STATUS_RECORD_STORE_EMPTY
> +#define ERST_STATUS_RECORD_NOT_FOUND        EFI_ACPI_6_1_ERST_STATUS_RECORD_NOT_FOUND
> +
> +#define ERST_BEGIN_WRITE_VALUE              0x01
> +#define ERST_BEGIN_WRITE_MASK               0xFFFFFFFFFFFFFFFF
> +#define ERST_BEGIN_READ_VALUE               0x02
> +#define ERST_BEGIN_READ_MASK                0xFFFFFFFFFFFFFFFF
> +#define ERST_BEGIN_CLEAR_VALUE              0x03
> +#define ERST_BEGIN_CLEAR_MASK               0xFFFFFFFFFFFFFFFF
> +#define ERST_END_OPERATION_VALUE            0x04
> +#define ERST_END_OPERATION_MASK             0xFFFFFFFFFFFFFFFF
> +#define ERST_MASK                           0xFFFFFFFFFFFFFFFF
> +
> +#define ERST_BEGIN_WRITE_OPERATION          EFI_ACPI_6_1_ERST_BEGIN_WRITE_OPERATION
> +#define ERST_BEGIN_READ_OPERATION           EFI_ACPI_6_1_ERST_BEGIN_READ_OPERATION
> +#define ERST_BEGIN_CLEAR_OPERATION          EFI_ACPI_6_1_ERST_BEGIN_CLEAR_OPERATION
> +#define ERST_END_OPERATION                  EFI_ACPI_6_1_ERST_END_OPERATION
> +#define ERST_BEGIN_DUMMY_WRITE_OPERATION    EFI_ACPI_6_1_ERST_BEGIN_DUMMY_WRITE_OPERATION
> +
> +#define ERST_ACTION_NO                      16
> +
> +#define ERST_RECORD_FREE                    0x00
> +#define ERST_RECORD_INUSE                   0x01
> +
> +#define ERST_RECORD_STORE_IN_NVRAM          0
> +#define ERST_RECORD_STORE_IN_MEM            1
> +#define ERST_RECORD_STORE_IN_SPI_FLASH      2
> +
> +#define ERST_LOG_ATTR_NVRAM                 0x02
> +
> +typedef struct {
> +  UINT64 OperationId;
> +  UINT64 RecordOffset;
> +  UINT64 BusyStatus;
> +  UINT64 CommandStatus;
> +  UINT64 GetRecordId;
> +  UINT64 SetRecordId;
> +  UINT64 RecordCount;
> +  UINT64 DummyWrite;
> +  UINT64 Reserved;
> +  UINT64 ErrorLogAddrRange;
> +  UINT64 ErrorLogAddrRangeLength;
> +  UINT64 ErrorLogAttributes;
> +  UINT64 NvRamLogAddrNext;
> +  UINT64 NvRamLogSizeRemain;
> +} ERST_DATA_STRUCTURE;
> +
> +typedef struct {
> +  UINT16 Signature;
> +  UINT16 Data0;
> +  UINT16 Data1;
> +  UINT8  Data2;
> +  UINT8  Attributes; //0: free
> +} ERST_ERROR_RECORD_INFO;
> +
> +///
> +/// ERST Table
> +///
> +
> +
> +
> +typedef struct _ERST_CONTEXT {
> +  UINT64 Operation;                  // WRITE,READ,CLEAR,END,
> +  UINT64 DummyWrite;                 //DUMMY_WRITE_OPEATION
> +  UINT64 RecordOffset;               // Offset form the buffer(error log  adress range)
> +  UINT32 BusyStatus;
> +  UINT32 CommandStatus;
> +  UINT64 KeyRecordId;                //OS Set the Record ID To Read/Write/Search
> +  UINT64 MaxTimeOfExecuteOperation;
> +  UINT64 RecordCount;                // Num of Record In NVRAM
> +  UINT64 ErrorLogAddressRange;       // Address Of Range Top
> +  UINT64 ErrorLogAddressRangeLength; // Address Of Range Top
> +  UINT64 ErrorLogAttributes;
> +  VOID   *NvRamLogAddrRange;
> +  UINT64 NvRamLogAddrRangeLength;
> +  UINT64 NvRamRecordOffset;
> +  UINT64 NvRamNextVallidRecordId;    //Get RecordId entry
> +  UINT64 NvRamNextValidRecordOffset;
> +  UINT64 NvRamAllRecordLength;
> +} ERST_RT_CONTEXT;
> +
> +typedef struct _ERST_BOOT_CONTEXT {
> +  EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER *ErstHeader;
> +  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY    *ExecuteOperationEntry;
> +  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY    *GetErrorLogAddrRangeAttributes;
> +  ERST_RT_CONTEXT                                      *Rt;
> +} ERST_BOOT_CONTEXT;
> +
> +extern EFI_ACPI_TABLE_PROTOCOL              *mAcpiTableProtocol;
> +extern APEI_TRUSTED_FIRMWARE_STRUCTURE      *mApeiTrustedfirmwareData;
> +
> +EFI_STATUS
> +ErstHeaderCreator(
> +  ERST_BOOT_CONTEXT  *Context,
> +  UINT64             BufferSize,//ERST_DATASTORE_SIZE
> +  VOID               *NvRamAddrRange,
> +  UINT64             NvRamAllRecordLength,
> +  UINT64             NvRamAddrRangeLength
> +);
> +
> +VOID
> +SetAttributeOfErrorLogAddressRange (
> +  ERST_BOOT_CONTEXT  *Context,
> +  UINT64             Attribute
> +);

The definition of this function has been deleted, so please delete the
declaration as well.

> +
> +/***OEM***/
> +EFI_STATUS
> +OemInitErstTable (VOID);
> +
> +EFI_STATUS
> +OemErstConfigExecuteOperationEntry (
> +  ERST_BOOT_CONTEXT *Context
> +);
> +
> +VOID
> +ErstSetAcpiTable (
> +  ERST_BOOT_CONTEXT *Context
> +);
> +
> +
> +#endif    // _ERST_H_
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h
> new file mode 100644
> index 0000000000..94f66496e6
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h
> @@ -0,0 +1,59 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef _HEST_H_
> +#define _HEST_H_
> +
> +#include "Apei.h"
> +
> +
> +typedef struct _HEST_CONTEXT {
> +  EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER  *HestHeader;         // pointer to hest header
> +  UINT32                                           OccupiedMemorySize; // allocated memory size for hest
> +  VOID                                             *KeyErrorSource;     // key error source, valtile
> +} HEST_CONTEXT;
> +
> +EFI_STATUS
> +HestAddErrorSourceDescriptor (
> +  IN OUT HEST_CONTEXT  *Context,
> +  IN VOID              *ErrorSourceDescriptor,
> +  IN UINT32            SizeOfDescriptor
> +);
> +VOID
> +HestSetAcpiTable (
> +  IN HEST_CONTEXT *Context
> +);
> +EFI_STATUS
> +HestHeaderCreator (
> +  HEST_CONTEXT  *Context,
> +  UINT32        PreAllocatedHestSize
> +);
> +
> +/**
> +* OEM Interface declaration
> +* 1.Interface is not realized default
> +* 2.OEM should implement this interface
> +*/
> +extern
> +VOID
> +OemHestInitialNotification (VOID);
> +
> +extern
> +EFI_STATUS
> +OemInitHestTable(
> +  IN EFI_HANDLE ImageHandle
> +);
> +
> +#endif    // _HEST_H_
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h
> new file mode 100644
> index 0000000000..e6fb386a62
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h
> @@ -0,0 +1,43 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#ifndef OEM_APEI_HI1620_H_H
> +#define OEM_APEI_HI1620_H_H
> +#define GPIO0_BASE             0x94100000
> +#define GPIO1_BASE             0x94110000
> +#define GPIO_INT_MASK          0x34
> +#define GPIO_INT_EN            0x30
> +#define GPIO_SWPORT_DDR        0x04
> +#define GPIO_INT_TYPE          0x38
> +#define GPIO_INT_POLARITY      0x3c
> +#define GPIO_LS_SYNC           0x60
> +#define GPIO_INT_COMB          0xffc
> +#define IOMUX_REG_BASE         0x94190000
> +#define IOMG051                0xCC
> +#define IOMG052                0xD0
> +#define PAD_EX_INT1            0x4
> +#define CPLD_GPIO10_INT_OFFSET 0xfc
> +#define CPLD_BASE_ADDR         0x80000000
> +#define CPLD_MASK              0x01030000
> +#define CPLD_VALUE             0x01020000
> +
> +#define MAX_GHES                          3
> +#define GENERIC_HARDWARE_ERROR_BLOCK_SIZE 0x1000
> +#define HEST_TABLE_SIZE                   0x2000
> +#define BOOT_ERROR_REGION_SIZE            0x1000
> +#define GPIO_HEST_NOTIFIED_PIN            BIT8
> +
> +#define ERST_DATASTORE_SIZE               0x2000
> +#endif
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c
> new file mode 100644
> index 0000000000..8769d88bff
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c
> @@ -0,0 +1,108 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +#include <Library/ArmSmcLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/OemConfigData.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
> +#include "Apei.h"
> +#include "PlatformArch.h"

Please use <PlatformArch.h> to avoid is looking like there is a
separate copy in the same directory as this source file.
Applies throughout this patch.

> +#include "bert.h"
> +#include "einj.h"
> +#include "erst.h"
> +#include "hest.h"
> +
> +EFI_ACPI_TABLE_PROTOCOL        *mAcpiTableProtocol = NULL;
> +EFI_ACPI_SDT_PROTOCOL          *mAcpiSdtProtocol = NULL;
> +APEI_TRUSTED_FIRMWARE_STRUCTURE      *mApeiTrustedfirmwareData;
> +
> +EFI_STATUS
> +EFIAPI
> +ApeiEntryPoint (
> +  IN EFI_HANDLE          ImageHandle,
> +  IN EFI_SYSTEM_TABLE    *SystemTable
> +)
> +{
> +  EFI_STATUS              Status;
> +  ARM_SMC_ARGS            SmcRegs = {0};
> +  UINTN                   Size = sizeof (OEM_CONFIG_DATA);
> +  OEM_CONFIG_DATA         SetupData;
> +
> +  Status = gRT->GetVariable (
> +             OEM_CONFIG_NAME,
> +             &gOemConfigGuid,
> +             NULL,
> +             &Size,
> +             &SetupData
> +             );
> +  if (EFI_ERROR (Status)) {
> +    SetupData.EnRasSupport = 1;
> +    DEBUG ((DEBUG_ERROR, "[%a]GetVariable %r.Get default variable value\n",
> +      __FUNCTION__, Status));
> +  }
> +  if (!SetupData.EnRasSupport) {
> +    return EFI_ABORTED;
> +  }
> +  if (PcdGet64 (PcdTrustedFirmwareEnable) == 0) {
> +    return EFI_ABORTED;
> +  }
> +  Status = gBS->LocateProtocol (
> +                  &gEfiAcpiTableProtocolGuid,
> +                  NULL,
> +                  (VOID**)&mAcpiTableProtocol);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  Status = gBS->LocateProtocol (
> +                &gEfiAcpiSdtProtocolGuid,
> +                NULL,
> +                (VOID**)&mAcpiSdtProtocol);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  Status = gBS->AllocatePool (
> +             EfiReservedMemoryType,
> +             sizeof (APEI_TRUSTED_FIRMWARE_STRUCTURE),
> +             (VOID**)&mApeiTrustedfirmwareData
> +           );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  gBS->SetMem (
> +    mApeiTrustedfirmwareData,
> +    sizeof (APEI_TRUSTED_FIRMWARE_STRUCTURE),
> +    0
> +  );
> +  Status = EFI_SUCCESS;
> +  Status |= OemInitBertTable (ImageHandle);
> +  Status |= OemInitHestTable (ImageHandle);
> +  Status |= OemInitErstTable ();
> +  Status |= OemInitEinjTable ();
> +  // smc call
> +  DEBUG ((DEBUG_INFO, "[%a]:[%dL]: %r\n", __FUNCTION__, __LINE__, Status));
> +  if (Status == EFI_SUCCESS) {
> +    SmcRegs.Arg0 = PRIVATE_ARM_SMC_ID_APEI;
> +    SmcRegs.Arg1 = (UINTN)mApeiTrustedfirmwareData;
> +    ArmCallSmc (&SmcRegs);
> +  }
> +  DEBUG ((DEBUG_INFO, "Acpi Apei init done.\n"));
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c
> new file mode 100644
> index 0000000000..2953e22690
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c
> @@ -0,0 +1,92 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#include "bert.h"
> +#include "ErrorSource/Ghes.h"
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include "PlatformArch.h"
> +
> +VOID
> +BertSetAcpiTable (
> +  IN BERT_CONTEXT *Context
> +)
> +{
> +  UINTN          AcpiTableHandle;
> +  EFI_STATUS     Status;
> +  if (Context == NULL) {
> +    return;
> +  }
> +  EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER* Bert = Context->BertHeader;
> +  Bert->Header.Checksum = CalculateCheckSum8 ((UINT8*)(Bert), Bert->Header.Length);
> +  AcpiTableHandle = 0;
> +  Status = mAcpiTableProtocol->InstallAcpiTable (
> +                                 mAcpiTableProtocol,
> +                                 Bert,
> +                                 Bert->Header.Length,
> +                                 &AcpiTableHandle);
> +  ASSERT_EFI_ERROR (Status);
> +  return;
> +}
> +
> +BOOLEAN
> +BertAddGenericErrorData (
> +  IN EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER *Bert,
> +  IN EFI_CPER_SECTION_TYPE                       TypeOfErrorData,
> +  IN VOID                                        *GenericErrorData,
> +  IN UINT32                                      SizeOfGenericErrorData,
> +  IN ERROR_SEVERITY                              ErrorSeverity,
> +  IN BOOLEAN                                     Correctable
> +)
> +{
> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: \n", __FUNCTION__, __LINE__));

Isn't this adding error data for somewhere else?
If so, shouldn't that be giving an error message?
This one amounts to "I'm logging that there was an error somewhere".

> +  BOOLEAN Status = ErrorBlockAddErrorData (
> +                     (VOID*)Bert->BootErrorRegion,
> +                     Bert->BootErrorRegionLength,
> +                     TypeOfErrorData,
> +                     GenericErrorData,
> +                     SizeOfGenericErrorData,
> +                     ErrorSeverity,
> +                     Correctable);
> +  return Status;
> +}
> +
> +EFI_STATUS
> +BertHeaderCreator (
> +  IN BERT_CONTEXT  *Context,
> +  IN UINT32        ErrorBlockSize
> +)
> +{
> +  if (Context == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  Context->BertHeader = AllocateZeroPool (sizeof (EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER));
> +  Context->Block = AllocateReservedZeroPool (ErrorBlockSize);
> +  Context->BlockSize = ErrorBlockSize;
> +  *Context->BertHeader = (EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER) {
> +    ARM_ACPI_HEADER (
> +      EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_SIGNATURE,
> +      EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER,
> +      EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_REVISION
> +      ),
> +    Context->BlockSize,
> +    (UINT64)Context->Block
> +  };
> +  return EFI_SUCCESS;
> +}
> +
> +
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c
> new file mode 100644
> index 0000000000..c53f4cdb3c
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c
> @@ -0,0 +1,349 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +#include "einj.h"
> +#include <IndustryStandard/Acpi62.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include "OemApeiHi1620.h"
> +#include "PlatformArch.h"
> +
> +
> +EINJ_TABLE mEinj = {
> +  {
> +    ARM_ACPI_HEADER (
> +      EFI_ACPI_6_0_ERROR_INJECTION_TABLE_SIGNATURE,
> +      EFI_ACPI_6_0_ERROR_INJECTION_TABLE_HEADER,
> +      EFI_ACPI_6_0_ERROR_INJECTION_TABLE_REVISION
> +    ),
> +    sizeof (EFI_ACPI_6_0_ERROR_INJECTION_TABLE_HEADER),
> +    0x0,
> +    {
> +      0x0,
> +      0x0,
> +      0x0
> +    },
> +    EINJ_ACTION_NO
> +  },
> +  {
> +    {
> +      // 0 EFI_ACPI_6_0_EINJ_BEGIN_INJECTION_OPERATION
> +      EFI_ACPI_6_0_EINJ_BEGIN_INJECTION_OPERATION,
> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER_VALUE,
> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      EINJ_BEGIN_OPERATION_VALUE,
> +      EINJ_WRITE_MASK
> +    },
> +    {
> +      // 1 EFI_ACPI_6_0_EINJ_GET_TRIGGER_ERROR_ACTION_TABLE
> +      EFI_ACPI_6_0_EINJ_GET_TRIGGER_ERROR_ACTION_TABLE,
> +      EFI_ACPI_6_0_EINJ_READ_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      EINJ_READ_MASK
> +    },
> +    {
> +      // 2 EFI_ACPI_6_0_EINJ_SET_ERROR_TYPE
> +      EFI_ACPI_6_0_EINJ_SET_ERROR_TYPE,
> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER,
> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      EINJ_WRITE_MASK
> +    },
> +    {
> +      // 3 EFI_ACPI_6_0_EINJ_GET_ERROR_TYPE
> +      EFI_ACPI_6_0_EINJ_GET_ERROR_TYPE,
> +      EFI_ACPI_6_0_EINJ_READ_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      0xFFFFFFFF
> +    },
> +    {
> +      // 4 EFI_ACPI_6_0_EINJ_END_OPERATION
> +      EFI_ACPI_6_0_EINJ_END_OPERATION,
> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER_VALUE,
> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      EINJ_END_OPERATION_VALUE,
> +      0xFFFFFFFF
> +    },
> +    {
> +      // 5 EFI_ACPI_6_0_EINJ_EXECUTE_OPERATION
> +      EFI_ACPI_6_0_EINJ_EXECUTE_OPERATION,
> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER_VALUE,
> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        32,
> +        0,
> +        EFI_ACPI_6_0_DWORD,
> +        GPIO1_BASE + GPIO_INT_MASK //0x40070008//0x4d000F00//GPIO0_BASE + GPIO0_SWPORT_DR_OFFSET
> +      },
> +      0,
> +      0xFFFFFFFF //BIT0
> +    },
> +    {
> +      // 6 EFI_ACPI_6_0_EINJ_CHECK_BUSY_STATUS
> +      EFI_ACPI_6_0_EINJ_CHECK_BUSY_STATUS,
> +      EFI_ACPI_6_0_EINJ_READ_REGISTER_VALUE,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0x01,
> +      0x01
> +    },
> +    {
> +      // 7 EFI_ACPI_6_0_EINJ_GET_COMMAND_STATUS
> +      EFI_ACPI_6_0_EINJ_GET_COMMAND_STATUS,
> +      EFI_ACPI_6_0_EINJ_READ_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      0x3
> +    },
> +    {
> +      // 8 EFI_ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS
> +      EFI_ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS,
> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER,
> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      0xFFFFFF
> +    },
> +    {
> +      // 9 EFI_ACPI_EINJ_GET_EXCUTE_OPERATION_TIMINGS
> +      EFI_ACPI_EINJ_GET_EXCUTE_OPERATION_TIMINGS,
> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER,
> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      0xFFFFFF
> +    }
> +  }
> +};
> +
> +EINJ_TRIGGER_ERROR_ACTION mEinjTriggerErrorAction = {
> +  {
> +    sizeof (EFI_ACPI_6_0_EINJ_TRIGGER_ACTION_TABLE),
> +    0,
> +    sizeof (EINJ_TRIGGER_ERROR_ACTION),
> +    EINJ_TRIGGER_ERROR_ACTION_NO
> +  },
> +  {
> +    {
> +      EFI_ACPI_6_0_EINJ_TRIGGER_ERROR,
> +      EFI_ACPI_6_0_EINJ_NOOP,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_DWORD,
> +        0
> +      },
> +      0,
> +      0
> +    }
> +  }
> +};
> +
> +
> +VOID
> +EinjSetAcpiTable (
> +  EINJ_CONTEXT *Context
> +)
> +{
> +  UINTN                   AcpiTableHandle;
> +  EFI_STATUS              Status;
> +  UINT8                   Checksum;
> +  EFI_ACPI_SDT_HEADER     *Table;
> +  EFI_ACPI_TABLE_VERSION  TableVersion;
> +  UINTN                   TableKey;
> +  UINTN                   i;
> +
> +  Context->EINJ->EinjTableHeader.Header.Length = sizeof (EINJ_TABLE);
> +  Checksum = CalculateCheckSum8 (
> +               (UINT8*)(Context->EINJ),
> +               Context->EINJ->EinjTableHeader.Header.Length);
> +  Context->EINJ->EinjTableHeader.Header.Checksum = Checksum;
> +  AcpiTableHandle = 0;
> +  Status = mAcpiTableProtocol->InstallAcpiTable (
> +             mAcpiTableProtocol,
> +             Context->EINJ,
> +             Context->EINJ->EinjTableHeader.Header.Length,
> +             &AcpiTableHandle
> +           );
> +  for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) {
> +    Status = mAcpiSdtProtocol->GetAcpiTable (i, &Table, &TableVersion, &TableKey);
> +    if (EFI_ERROR (Status)) {
> +      break;
> +    }
> +    if (Table->Signature != EFI_ACPI_6_0_ERROR_INJECTION_TABLE_SIGNATURE) {
> +      continue;
> +    }
> +    mApeiTrustedfirmwareData->EinjTableAddress = (EFI_PHYSICAL_ADDRESS)Table;
> +    mApeiTrustedfirmwareData->EinjDataStruct = (EFI_PHYSICAL_ADDRESS)Context->EinjData;
> +  }
> +  ASSERT_EFI_ERROR (Status) ;
> +}
> +//V2
> +EFI_STATUS
> +EinjHeaderCreator (
> +  EINJ_CONTEXT *Context
> +)
> +{
> +  EFI_STATUS           Status;
> +  EINJ_DATA_STRUCTURE  *EinjData = NULL;
> +  Status = gBS->AllocatePool (
> +             EfiReservedMemoryType,
> +             sizeof (EINJ_DATA_STRUCTURE),
> +             (VOID**)&EinjData
> +           );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  gBS->SetMem (
> +    EinjData,
> +    sizeof (EINJ_DATA_STRUCTURE),
> +    0
> +  );
> +
> +  DEBUG ((DEBUG_INFO, "EINJ EinjData is at 0x%X,size =0x%x\n",
> +          EinjData, sizeof (EINJ_DATA_STRUCTURE)));
> +  EinjData->TriggerErrorActionTablePtr =
> +    (EINJ_TRIGGER_ERROR_ACTION*)(&(EinjData->TriggerErrorActionTable));
> +  gBS->CopyMem (
> +         EinjData->TriggerErrorActionTablePtr,
> +         &mEinjTriggerErrorAction,
> +         sizeof (EINJ_TRIGGER_ERROR_ACTION));
> +  EinjData->OperationBegin = 0;
> +  EinjData->ErrorType = 0;
> +  EinjData->ErrorCapabilities = 0xFFF;
> +  EinjData->BusyStatus = 0;
> +  EinjData->CommandStatus = 0;
> +  mEinj.EinjInstructionEntry[0].RegisterRegion.Address =
> +    (UINT64)(&(EinjData->OperationBegin));
> +  mEinj.EinjInstructionEntry[1].RegisterRegion.Address =
> +    (UINT64)(&(EinjData->TriggerErrorActionTablePtr));
> +  mEinj.EinjInstructionEntry[2].RegisterRegion.Address =
> +    (UINT64)(&(EinjData->ErrorType));
> +  mEinj.EinjInstructionEntry[3].RegisterRegion.Address =
> +    (UINT64)(&(EinjData->ErrorCapabilities));
> +  mEinj.EinjInstructionEntry[4].RegisterRegion.Address =
> +    (UINT64)(&(EinjData->OperationBegin));
> +  mEinj.EinjInstructionEntry[6].RegisterRegion.Address =
> +    (UINT64)(&(EinjData->BusyStatus));
> +  mEinj.EinjInstructionEntry[7].RegisterRegion.Address =
> +    (UINT64)(&(EinjData->CommandStatus));
> +  mEinj.EinjInstructionEntry[8].RegisterRegion.Address =
> +    (UINT64)(&(EinjData->ErrorTypeWithAddress));
> +  mEinj.EinjInstructionEntry[9].RegisterRegion.Address =
> +    (UINT64)(&(EinjData->Timming));
> +  EinjData->ErrorTypeWithAddress.VendorErrorTypeOffset =
> +    (UINT32)((UINTN)&(EinjData->VendorErrorTypeExtension) -
> +    (UINTN)&(EinjData->ErrorTypeWithAddress));
> +  Context->EinjData = EinjData;
> +  Context->EINJ = &mEinj;
> +  Context->ExecuteOperationEntry = &mEinj.EinjInstructionEntry[5];
> +  Context->GetErrorTypeEntry = &mEinj.EinjInstructionEntry[3];
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +EinjConfigErrorInjectCapability (
> +  EINJ_CONTEXT* Context,
> +  UINT32        BitsSupportedErrorType
> +)
> +{
> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY* KeyEntry;
> +  UINT32*                                        EinjCapablity;
> +
> +  KeyEntry = Context->GetErrorTypeEntry;
> +  EinjCapablity = (UINT32*)KeyEntry->RegisterRegion.Address;
> +  *EinjCapablity = BitsSupportedErrorType;
> +  KeyEntry->Value = BitsSupportedErrorType;
> +  return EFI_SUCCESS;
> +}
> +
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c
> new file mode 100644
> index 0000000000..6d69b90e9b
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c
> @@ -0,0 +1,330 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#include <Guid/Cper.h>
> +#include "Ghes.h"
> +#include <Library/DebugLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +
> +#define READ_ACK_PRESERVE 0xFFFFFFFE
> +#define READ_ACK_WRITE 0x1
> +
> +EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE*
> +ErrorBlockInitial (
> +  VOID   *Block,
> +  UINT32 Severity
> +)
> +{
> +  EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE* BlockHeader = Block;
> +  BlockHeader->BlockStatus = (EFI_ACPI_6_1_ERROR_BLOCK_STATUS) {0, 0, 0, 0, 0};
> +  BlockHeader->RawDataOffset = 0;
> +  BlockHeader->RawDataLength = 0;
> +  BlockHeader->DataLength = 0;
> +  BlockHeader->ErrorSeverity = Severity;
> +  return BlockHeader;
> +}
> +
> +
> +BOOLEAN
> +ErrorBlockUpdateStatusStructure (
> +  VOID *ErrorBlock
> +)
> +{
> +  if (ErrorBlock == NULL) {
> +    return FALSE;
> +  }
> +  IN EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE *BlockHeader =  ErrorBlock;
> +  VOID *EntriesBegin = ErrorBlock + sizeof (EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE);
> +  if (BlockHeader->BlockStatus.ErrorDataEntryCount == 0) {
> +    gBS->SetMem (EntriesBegin, BlockHeader->DataLength, 0);
> +    BlockHeader->RawDataLength = 0;
> +    BlockHeader->RawDataOffset = 0;
> +    BlockHeader->DataLength = 0;
> +  }
> +  return TRUE;
> +}
> +
> +
> +BOOLEAN
> +ErrorBlockAddErrorData (
> +  IN VOID                  *ErrorBlock,
> +  IN UINT32                MaxBlockLength,
> +  IN EFI_CPER_SECTION_TYPE TypeOfErrorData,
> +  IN VOID                  *GenericErrorData,
> +  IN UINT32                SizeOfGenericErrorData,
> +  IN ERROR_SEVERITY        ErrorSeverity,
> +  IN BOOLEAN               Correctable
> +)
> +{
> +  if (ErrorBlock == NULL || GenericErrorData == NULL) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]Invalid Param \n", __FUNCTION__, __LINE__));
> +    return FALSE;
> +  }
> +  EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE*  Entry;
> +  EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE* BlockHeader = ErrorBlock;
> +  EFI_ACPI_6_1_ERROR_BLOCK_STATUS* BlockStatus = &BlockHeader->BlockStatus;
> +  (VOID)ErrorBlockUpdateStatusStructure (ErrorBlock);
> +  UINT32 ExpectedNewDataLength = BlockHeader->DataLength +
> +           sizeof (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE) +
> +           SizeOfGenericErrorData;
> +  if (sizeof (EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE) + ExpectedNewDataLength >
> +      MaxBlockLength) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]Out of BlockSize \n", __FUNCTION__, __LINE__));
> +    return FALSE;
> +  }
> +  // guid
> +  EFI_GUID Guid;
> +  switch (TypeOfErrorData) {
> +    case PROCESSOR_GENERIC:
> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PROCESSOR_GENERIC_GUID;
> +      break;
> +    case PROCESSOR_ARM:
> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PROCESSOR_SPECIFIC_ARM_GUID;
> +      break;
> +    case PLATFORM_MEMORY:
> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PLATFORM_MEMORY_GUID;
> +      break;
> +    case PLATFORM_MEMORY2:
> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PLATFORM_MEMORY2_GUID;
> +      break;
> +    case PCIE_EXPRESS:
> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PCIE_GUID;
> +      break;
> +    case FIRMWARE_ERROR:
> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_FW_ERROR_RECORD_GUID;
> +      break;
> +    case PCI_BUS:
> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PCI_PCIX_BUS_GUID;
> +      break;
> +    case PCI_COMPONENT:
> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PCI_DEVICE_GUID;
> +      break;
> +    default:
> +      return FALSE;
> +  }
> +  //Block Status
> +  if (Correctable == TRUE) {
> +    if (BlockStatus->CorrectableErrorValid == 0) {
> +      BlockStatus->CorrectableErrorValid = 1;
> +    } else {
> +      BlockStatus->MultipleCorrectableErrors = 1;
> +    }
> +  } else {
> +    if (BlockStatus->UncorrectableErrorValid == 0) {
> +      BlockStatus->UncorrectableErrorValid = 1;
> +    } else {
> +      BlockStatus->MultipleUncorrectableErrors = 1;
> +    }
> +  }
> +  BlockStatus->ErrorDataEntryCount++;
> +  // Entry
> +  Entry = (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE*)(ErrorBlock +
> +           sizeof (EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE) +
> +           BlockHeader->DataLength);
> +  gBS->SetMem (Entry, sizeof (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE), 0);
> +  gBS->CopyMem (&Entry->SectionType, &Guid, sizeof (EFI_GUID));
> +  Entry->ErrorSeverity = ErrorSeverity;
> +  Entry->Revision = EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_REVISION;
> +  Entry->ErrorDataLength = SizeOfGenericErrorData;
> +  VOID*  GenericErrorDataFollowEntry = (VOID*)Entry +
> +           sizeof (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE);
> +  gBS->CopyMem (
> +         GenericErrorDataFollowEntry,
> +         GenericErrorData,
> +         SizeOfGenericErrorData);
> +  // BlockHeader
> +  BlockHeader->RawDataOffset = 0;
> +  BlockHeader->RawDataLength = 0;
> +  BlockHeader->DataLength = ExpectedNewDataLength;
> +  return TRUE;
> +}
> +
> +VOID
> +GhesV2Initial (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *GhesV2,
> +  UINT32                                                         BlockLength
> +)
> +{
> +  if (GhesV2 == NULL) {
> +    return;
> +  }
> +  *GhesV2 = (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE) {
> +    .Type = EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_VERSION_2,
> +    .SourceId = 0,
> +    .RelatedSourceId = 0xFFFF,
> +    .Flags = 0,
> +    .Enabled = 1,
> +    .NumberOfRecordsToPreAllocate = 1,//ERROR BLOCK
> +    .MaxSectionsPerRecord = 1,// Num Entries(section)
> +    .MaxRawDataLength = BlockLength, // Max Size Of a Raw Data
> +    .ErrorStatusAddress = {
> +      .AddressSpaceId = EFI_ACPI_6_1_SYSTEM_MEMORY,
> +      .RegisterBitWidth = 64,
> +      .RegisterBitOffset = 0,
> +      .AccessSize = EFI_ACPI_6_1_QWORD,
> +      .Address = 0
> +    },
> +    .NotificationStructure = {
> +      .Type = EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV,
> +      .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE),
> +      .ConfigurationWriteEnable = {0, 0, 0, 0, 0, 0, 0} ,
> +      .PollInterval = 0,
> +      .Vector = 0,
> +      .SwitchToPollingThresholdValue = 0,
> +      .SwitchToPollingThresholdWindow = 0,
> +      .ErrorThresholdValue = 0,
> +      .ErrorThresholdWindow = 0
> +    },
> +    .ErrorStatusBlockLength = BlockLength,
> +    .ReadAckRegister = {
> +      .AddressSpaceId = EFI_ACPI_6_1_SYSTEM_MEMORY,
> +      .RegisterBitWidth = 64,
> +      .RegisterBitOffset = 0,
> +      .AccessSize = EFI_ACPI_6_1_QWORD,
> +      .Address = 0
> +    },
> +    .ReadAckPreserve = READ_ACK_PRESERVE,
> +    .ReadAckWrite = READ_ACK_WRITE
> +  };
> +  return;
> +}
> +
> +VOID
> +GhesV2AddNotification (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *This,
> +  UINT8                                                           Type
> +)
> +{
> +  This->NotificationStructure = (EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_STRUCTURE) {
> +    .Type = Type,
> +    .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE),
> +    .ConfigurationWriteEnable = {
> +      .Type = 0,
> +      .PollInterval = 1,
> +      .SwitchToPollingThresholdValue = 1,
> +      .SwitchToPollingThresholdWindow = 1,
> +      .ErrorThresholdValue = 1,
> +      .ErrorThresholdWindow = 1
> +    },
> +    .PollInterval = 20,
> +    .Vector = 0,
> +    .SwitchToPollingThresholdValue = 0,
> +    .SwitchToPollingThresholdWindow = 0,
> +    .ErrorThresholdValue = 0,
> +    .ErrorThresholdWindow = 0
> +  };
> +  return;
> +}
> +
> +EFI_STATUS
> +GhesV2LinkErrorBlock (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *GhesV2,
> +  GHES_REGISTER                                                  *Register,
> +  VOID                                                           *ErrorBlock
> +)
> +{
> +  if (ErrorBlock == NULL || Register == NULL || GhesV2 == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Register->ErrorStatusBlockAddress = (UINTN)ErrorBlock;
> +  GhesV2->ErrorStatusAddress.Address = (UINTN)&(Register->ErrorStatusBlockAddress);
> +  Register->AckRegister = READ_ACK_WRITE;
> +  GhesV2->ReadAckRegister.Address = (UINT64)&(Register->AckRegister);
> +  return EFI_SUCCESS;
> +}
> +
> +
> +VOID GhesV1Initial (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *GhesV1,
> +  UINT32 BlockLength
> +)
> +{
> +  if (GhesV1 == NULL) {
> +    return;
> +  }
> +  *GhesV1 = (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE) {
> +    .Type = EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR,
> +    .SourceId = 0,
> +    .RelatedSourceId = 0xFFFF,
> +    .Flags = 0,
> +    .Enabled = 1,
> +    .NumberOfRecordsToPreAllocate = 1,//ERROR BLOCK
> +    .MaxSectionsPerRecord = 1,// Num Entries(section)
> +    .MaxRawDataLength = BlockLength, // Max Size Of a Raw Data
> +    .ErrorStatusAddress = {
> +      .AddressSpaceId = EFI_ACPI_6_1_SYSTEM_MEMORY,
> +      .RegisterBitWidth = 64,
> +      .RegisterBitOffset = 0,
> +      .AccessSize = EFI_ACPI_6_1_QWORD,
> +      .Address = 0
> +    },
> +    .NotificationStructure = {
> +      .Type = EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV,
> +      .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE),
> +      .ConfigurationWriteEnable = {0, 0, 0, 0, 0, 0, 0},
> +      .PollInterval = 0,
> +      .Vector = 0,
> +      .SwitchToPollingThresholdValue = 0,
> +      .SwitchToPollingThresholdWindow = 0,
> +      .ErrorThresholdValue = 0,
> +      .ErrorThresholdWindow = 0
> +    },
> +    .ErrorStatusBlockLength = BlockLength,
> +  };
> +  return;
> +}
> +
> +VOID
> +GhesV1AddNotification (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
> +  UINT8                                                Type
> +)
> +{
> +  This->NotificationStructure = (EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_STRUCTURE) {
> +    .Type = Type,
> +    .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE),
> +    .ConfigurationWriteEnable = {
> +      .Type = 0,
> +      .PollInterval = 1,
> +      .SwitchToPollingThresholdValue = 1,
> +      .SwitchToPollingThresholdWindow = 1,
> +      .ErrorThresholdValue = 1,
> +      .ErrorThresholdWindow = 1
> +    },
> +    .PollInterval = 20,
> +    .Vector = 0,
> +    .SwitchToPollingThresholdValue = 0,
> +    .SwitchToPollingThresholdWindow = 0,
> +    .ErrorThresholdValue = 0,
> +    .ErrorThresholdWindow = 0
> +  };
> +  return;
> +}
> +
> +EFI_STATUS GhesV1LinkErrorBlock (
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
> +  UINT64                                               *ptrBlockAddress,
> +  VOID                                                 *ErrorBlock
> +)
> +{
> +  if (ErrorBlock == NULL || ptrBlockAddress == NULL || This == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  *ptrBlockAddress = (UINTN)ErrorBlock;
> +  This->ErrorStatusAddress.Address = (UINTN) ptrBlockAddress;
> +  return EFI_SUCCESS;
> +}
> +
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c
> new file mode 100644
> index 0000000000..80d7d43c5b
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c
> @@ -0,0 +1,374 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +#include "erst.h"
> +#include <Guid/Cper.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include "PlatformArch.h"
> +
> +typedef struct {
> +  EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER ErstTableHeader;
> +  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY    ErstInstructionEntry[ERST_ACTION_NO];
> +} ERST_TABLE;
> +
> +ERST_TABLE mErst = {
> +  {
> +    ARM_ACPI_HEADER (
> +      EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_SIGNATURE,
> +      EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_HEADER,
> +      EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_REVISION
> +    ),
> +    sizeof (EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_HEADER),
> +    {
> +      0x0,
> +      0x0,
> +      0x0,
> +      0x0
> +    },
> +    ERST_ACTION_NO,
> +  },
> +  {
> +    {
> +      // 0 EFI_ACPI_6_0_ERST_BEGIN_WRITE_OPERATION
> +      EFI_ACPI_6_0_ERST_BEGIN_WRITE_OPERATION,
> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      ERST_BEGIN_WRITE_VALUE,
> +      ERST_BEGIN_WRITE_MASK
> +    },
> +    {
> +      // 1 EFI_ACPI_6_0_ERST_BEGIN_READ_OPERATION
> +      EFI_ACPI_6_0_ERST_BEGIN_READ_OPERATION,
> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      ERST_BEGIN_READ_VALUE,
> +      ERST_BEGIN_READ_MASK
> +    },
> +    {
> +      // 2 EFI_ACPI_6_0_ERST_BEGIN_CLEAR_OPERATION
> +      EFI_ACPI_6_0_ERST_BEGIN_CLEAR_OPERATION,
> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      ERST_BEGIN_CLEAR_VALUE,
> +      ERST_BEGIN_CLEAR_MASK
> +    },
> +    {
> +      // 3 EFI_ACPI_6_0_ERST_END_OPERATION
> +      EFI_ACPI_6_0_ERST_END_OPERATION,
> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
> +      EFI_ACPI_6_0_ERST_PRESERVE_REGISTER,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      ERST_END_OPERATION_VALUE,
> +      ERST_END_OPERATION_MASK
> +    },
> +    {
> +      // 4 EFI_ACPI_6_0_ERST_SET_RECORD_OFFSET
> +      EFI_ACPI_6_0_ERST_SET_RECORD_OFFSET,
> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    },
> +    {
> +      // 5 EFI_ACPI_6_0_ERST_EXECUTE_OPERATION
> +      EFI_ACPI_6_0_ERST_EXECUTE_OPERATION,
> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_DWORD,
> +        0x94730000
> +      },
> +      0x0002,
> +      0x0002
> +    },
> +    {
> +      // 6 EFI_ACPI_6_0_ERST_CHECK_BUSY_STATUS
> +      EFI_ACPI_6_0_ERST_CHECK_BUSY_STATUS,
> +      EFI_ACPI_6_0_ERST_READ_REGISTER_VALUE,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0x00000001,
> +      0x00000001
> +    },
> +    {
> +      // 7 EFI_ACPI_6_0_ERST_GET_COMMAND_STATUS
> +      EFI_ACPI_6_0_ERST_GET_COMMAND_STATUS,
> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    },
> +    {
> +      // 8 EFI_ACPI_6_0_ERST_GET_RECORD_IDENTIFIER
> +      EFI_ACPI_6_0_ERST_GET_RECORD_IDENTIFIER,
> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    },
> +    {
> +      // 9 EFI_ACPI_6_0_ERST_SET_RECORD_IDENTIFIER
> +      EFI_ACPI_6_0_ERST_SET_RECORD_IDENTIFIER,
> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    },
> +    {
> +      // A EFI_ACPI_6_0_ERST_GET_RECORD_COUNT
> +      EFI_ACPI_6_0_ERST_GET_RECORD_COUNT,
> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    },
> +    {
> +      // B EFI_ACPI_6_0_ERST_BEGIN_DUMMY_WRITE_OPERATION
> +      EFI_ACPI_6_0_ERST_BEGIN_DUMMY_WRITE_OPERATION,
> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    },
> +    {
> +      // C RESERVED
> +      0x0C,
> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    },
> +    {
> +      // D EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE
> +      EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE,
> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    },
> +    {
> +      // E EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_LENGTH
> +      EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_LENGTH,
> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    },
> +    {
> +      // F EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_ATTRIBUTES
> +      EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_ATTRIBUTES,
> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
> +      0,
> +      0,
> +      {
> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
> +        64,
> +        0,
> +        EFI_ACPI_6_0_QWORD,
> +        0
> +      },
> +      0,
> +      ERST_MASK
> +    }
> +  }
> +};
> +
> +VOID
> +ErstSetAcpiTable (
> +  ERST_BOOT_CONTEXT *Context
> +)
> +{
> +  UINTN                     AcpiTableHandle;
> +  EFI_STATUS                Status;
> +  UINT8                     Checksum;
> +  mErst.ErstTableHeader.Header.Length = sizeof (ERST_TABLE);
> +  Checksum = CalculateCheckSum8 ((UINT8*)(&mErst), mErst.ErstTableHeader.Header.Length);
> +  mErst.ErstTableHeader.Header.Checksum = Checksum;
> +  AcpiTableHandle = 0;
> +  Status = mAcpiTableProtocol->InstallAcpiTable (
> +             mAcpiTableProtocol,
> +             &mErst,
> +             mErst.ErstTableHeader.Header.Length,
> +             &AcpiTableHandle
> +             );
> +  ASSERT_EFI_ERROR (Status) ;
> +}
> +
> +EFI_STATUS
> +ErstHeaderCreator (
> +  ERST_BOOT_CONTEXT  *Context,
> +  UINT64             BufferSize,//ERST_DATASTORE_SIZE
> +  VOID               *NvRamAddrRange,
> +  UINT64             NvRamAllRecordLength,
> +  UINT64             NvRamAddrRangeLength
> +)
> +{
> +  EFI_STATUS            Status = EFI_SUCCESS;
> +  ERST_RT_CONTEXT       *ErstRtCtx;
> +  //
> +  ErstRtCtx = AllocateReservedZeroPool (sizeof (ERST_RT_CONTEXT));
> +  ErstRtCtx->Operation = ERST_END_OPERATION;
> +  ErstRtCtx->RecordOffset = 0;
> +  ErstRtCtx->BusyStatus = 0;
> +  ErstRtCtx->CommandStatus = 0;
> +  ErstRtCtx->KeyRecordId = 0;
> +  ErstRtCtx->MaxTimeOfExecuteOperation = MAX_UINT64;
> +  ErstRtCtx->RecordCount = 0;
> +  ErstRtCtx->ErrorLogAddressRange = (UINT64)AllocateReservedZeroPool (BufferSize);
> +  ErstRtCtx->ErrorLogAddressRangeLength = BufferSize;
> +  ErstRtCtx->ErrorLogAttributes = 0;
> +  ErstRtCtx->NvRamLogAddrRange = NvRamAddrRange;
> +  ErstRtCtx->NvRamLogAddrRangeLength = NvRamAddrRangeLength;
> +  ErstRtCtx->NvRamRecordOffset = 0;
> +  ErstRtCtx->NvRamNextVallidRecordId = MAX_UINT64;
> +  ErstRtCtx->NvRamNextValidRecordOffset = 0;
> +  ErstRtCtx->NvRamAllRecordLength = NvRamAllRecordLength;
> +  mErst.ErstInstructionEntry[0].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
> +  mErst.ErstInstructionEntry[1].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
> +  mErst.ErstInstructionEntry[2].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
> +  mErst.ErstInstructionEntry[3].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
> +  mErst.ErstInstructionEntry[4].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->RecordOffset));
> +  mErst.ErstInstructionEntry[6].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->BusyStatus));
> +  mErst.ErstInstructionEntry[7].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->CommandStatus));
> +  mErst.ErstInstructionEntry[8].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->NvRamNextVallidRecordId));
> +  mErst.ErstInstructionEntry[9].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->KeyRecordId));
> +  mErst.ErstInstructionEntry[10].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->RecordCount));
> +  mErst.ErstInstructionEntry[11].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->DummyWrite));
> +  mErst.ErstInstructionEntry[12].RegisterRegion.Address = 0;
> +  mErst.ErstInstructionEntry[13].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->ErrorLogAddressRange));
> +  mErst.ErstInstructionEntry[14].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->ErrorLogAddressRangeLength));
> +  mErst.ErstInstructionEntry[15].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->ErrorLogAttributes));
> +  Context->ErstHeader = (EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER*)&mErst;
> +  Context->ExecuteOperationEntry = &(mErst.ErstInstructionEntry[5]);
> +  Context->GetErrorLogAddrRangeAttributes = &(mErst.ErstInstructionEntry[15]);
> +  Context->Rt = ErstRtCtx;
> +  return Status;
> +};
> +
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c
> new file mode 100644
> index 0000000000..eea73af229
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c
> @@ -0,0 +1,119 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#include "ErrorSource/Ghes.h"
> +#include "hest.h"
> +#include <IndustryStandard/Acpi62.h>
> +#include <Library/BaseLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include "PlatformArch.h"
> +
> +EFI_STATUS HestAddErrorSourceDescriptor (
> +  IN OUT HEST_CONTEXT  *Context,
> +  IN VOID              *ErrorSourceDescriptor,
> +  IN UINT32            SizeOfDescriptor
> +)
> +{
> +  UINT16                                          *pSourceId;
> +  VOID                                            *Descriptor;
> +  EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeader;
> +
> +  if ((Context == NULL) || (ErrorSourceDescriptor == NULL)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  HestHeader = Context->HestHeader;
> +  if (HestHeader->Header.Length + SizeOfDescriptor > Context->OccupiedMemorySize) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: Hest Size Too small\n", __FUNCTION__, __LINE__));
> +    return EFI_BUFFER_TOO_SMALL;
> +  }
> +  Descriptor = (UINT8*)HestHeader + HestHeader->Header.Length;
> +  gBS->CopyMem ((VOID*)Descriptor , ErrorSourceDescriptor, SizeOfDescriptor);
> +  pSourceId = Descriptor + sizeof (UINT16);
> +  *pSourceId = HestHeader->ErrorSourceCount;
> +  HestHeader->Header.Length += SizeOfDescriptor;
> +  HestHeader->ErrorSourceCount++;
> +  Context->KeyErrorSource = Descriptor;
> +  return EFI_SUCCESS;
> +}
> +
> +VOID
> +HestSetAcpiTable (
> +  IN HEST_CONTEXT  *Context
> +)
> +{
> +  UINTN                     AcpiTableHandle;
> +  EFI_STATUS                Status;
> +  UINT8                     Checksum;
> +  EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeader;
> +  EFI_ACPI_SDT_HEADER       *Table;
> +  EFI_ACPI_TABLE_VERSION    TableVersion;
> +  UINTN                     TableKey;
> +  UINT32                    Index;
> +  if (Context == NULL) {
> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: ERROR\n", __FUNCTION__, __LINE__));
> +    return;
> +  }
> +
> +  HestHeader = Context->HestHeader;
> +  Checksum = CalculateCheckSum8 ((UINT8*)(HestHeader),  HestHeader->Header.Length);
> +  HestHeader->Header.Checksum = Checksum;
> +  AcpiTableHandle = 0;
> +  // see AcpiTableProtocol.c InstallAcpiTable
> +  Status = mAcpiTableProtocol->InstallAcpiTable (
> +                                  mAcpiTableProtocol,
> +                                  HestHeader,
> +                                  HestHeader->Header.Length,
> +                                  &AcpiTableHandle);
> +  for (Index = 0; Index < EFI_ACPI_MAX_NUM_TABLES; Index++) {
> +    Status = mAcpiSdtProtocol->GetAcpiTable (Index, &Table, &TableVersion, &TableKey);
> +    if (EFI_ERROR (Status)) {
> +      break;
> +    }
> +    if (Table->Signature != EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE) {
> +      continue;
> +    }
> +    mApeiTrustedfirmwareData->HestTableAddress = (EFI_PHYSICAL_ADDRESS)Table;
> +    DEBUG ((DEBUG_ERROR, "Acpi HestSetAcpiTable Table = 0x%x.\n", (EFI_PHYSICAL_ADDRESS)Table));
> +  }
> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]:OUT %llx, IN %llx \n", __FUNCTION__, __LINE__,
> +          AcpiTableHandle, Context->HestHeader));

This does not look like an error - should it really be of the ERROR
debug level? Better to move it to INFO.
The same applies to similar functions for the other tables.

> +  return;
> +}
> +
> +EFI_STATUS
> +HestHeaderCreator (
> +  HEST_CONTEXT  *Context,
> +  UINT32        PreAllocatedHestSize
> +)
> +{
> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: \n", __FUNCTION__, __LINE__));

Why this message?

> +  if (PreAllocatedHestSize < sizeof (EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER)) {
> +    return EFI_BUFFER_TOO_SMALL;
> +  }
> +  Context->HestHeader = AllocateReservedZeroPool (PreAllocatedHestSize);
> +  *Context->HestHeader = (EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER) {
> +   ARM_ACPI_HEADER (
> +      EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE,
> +      EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER,
> +      EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_REVISION
> +    ),
> +    0x0
> +  };
> +  Context->KeyErrorSource = Context->HestHeader + 1;
> +  Context->OccupiedMemorySize = PreAllocatedHestSize;
> +  return EFI_SUCCESS;
> +}
> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c
> new file mode 100644
> index 0000000000..de972b8a9e
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c
> @@ -0,0 +1,337 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#include <Guid/Cper.h>
> +#include <IndustryStandard/Acpi62.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IoLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +
> +#include "Bert/bert.h"
> +#include "Einj/einj.h"
> +#include "ErrorSource/Ghes.h"
> +#include "Erst/erst.h"
> +#include "Hest/hest.h"
> +#include "OemApeiHi1620.h"
> +
> +VOID
> +GpioCombInit (
> +  UINTN  Base,
> +  UINT32 Pin
> +)
> +{
> +  UINT32 Val = MmioRead32 (Base + GPIO_INT_MASK);
> +  MmioWrite32 (Base + GPIO_INT_MASK, Val | Pin);
> +  Val = MmioRead32 (Base + GPIO_INT_EN);
> +  MmioWrite32 (Base + GPIO_INT_EN, Val | Pin);
> +  Val = MmioRead32 (Base + GPIO_SWPORT_DDR);
> +  MmioWrite32 (Base + GPIO_SWPORT_DDR, Val & (~Pin));
> +  Val = MmioRead32 (Base + GPIO_INT_TYPE);
> +  MmioWrite32 (Base + GPIO_INT_TYPE, Val & (~Pin));
> +  Val = MmioRead32 (Base + GPIO_INT_POLARITY);
> +  MmioWrite32 (Base + GPIO_INT_POLARITY, Val | Pin);
> +  Val = MmioRead32 (Base + GPIO_LS_SYNC);
> +  MmioWrite32 (Base + GPIO_LS_SYNC, Val & (~Pin));
> +  MmioWrite32 (Base + GPIO_INT_COMB, 1);
> +  return;
> +}
> +/************************************************
> +*************** HEST ***************
> +************************************************/
> +
> +/*****************************************************************************
> +* @param EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE* GhesV2,Vector of GhesV2
> +* @param UINT8 NumOfGhesV2
> +* @param_out
> +* @retval EFI_STATUS
> +*****************************************************************************/
> +EFI_STATUS
> +GhesV2ContextForHest (
> +  IN EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE GhesV2[MAX_GHES],
> +  IN UINT8                                                          NumOfGhesV2
> +)
> +{
> +  // ensuce the size is expected
> +  if ((GhesV2 == NULL) || (NumOfGhesV2 != MAX_GHES)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  UINT8  NumOfBlockPerGhes = 1;
> +  UINT8  Iter = 0;
> +  UINT32 BlockMemorySize;
> +  UINT32 ErrorSeverityArray[MAX_GHES] = {
> +           EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTABLE,
> +           EFI_ACPI_6_2_ERROR_SEVERITY_FATAL,
> +           EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTED};
> +  VOID   *ErrorBlockHead;
> +  VOID   *ErrorBlock;
> +  VOID   *BlockMemory;
> +  GHES_REGISTER  *GhesRegisters;
> +  EFI_STATUS     Status = EFI_SUCCESS;
> +
> +  BlockMemorySize = MAX_GHES *
> +    (sizeof (GHES_REGISTER) + NumOfBlockPerGhes * GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
> +  Status = gBS->AllocatePool (
> +             EfiReservedMemoryType,
> +             BlockMemorySize,
> +             &BlockMemory
> +           );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  gBS->SetMem (BlockMemory, BlockMemorySize, 0);
> +  GhesRegisters = BlockMemory;
> +  ErrorBlockHead = BlockMemory + MAX_GHES * sizeof (GHES_REGISTER);
> +  ErrorBlock = ErrorBlockHead;
> +  for (Iter = 0; Iter < MAX_GHES; Iter++) {
> +    GhesV2Initial (&GhesV2[Iter], GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
> +    GhesV2AddNotification (&GhesV2[Iter], EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV);
> +    ErrorBlockInitial (ErrorBlock, ErrorSeverityArray[Iter]);
> +    GhesV2LinkErrorBlock (&GhesV2[Iter], &GhesRegisters[Iter], ErrorBlock);
> +    ErrorBlock += GhesV2[Iter].ErrorStatusBlockLength;
> +  }
> +  return EFI_SUCCESS;
> +}
> +/*****************************************************************************
> +* @param EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE* GhesV2,Vector of GhesV2
> +* @param UINT8 NumOfGhesV2
> +* @param_out
> +* @retval EFI_STATUS
> +*****************************************************************************/
> +
> +EFI_STATUS
> +GhesV1ContextForHest (
> +  IN EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE GhesV1[MAX_GHES],
> +  IN UINT8                                                NumOfGhesV1
> +)
> +{
> +  // ensuce the size is expected
> +  if ((GhesV1 == NULL) || (NumOfGhesV1 != MAX_GHES)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  UINT8      NumOfBlockPerGhes = 1;
> +  UINT8      Iter = 0;
> +  UINT32     BlockMemorySize = MAX_GHES *
> +             (sizeof (UINT64) + NumOfBlockPerGhes * GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
> +  UINT32     ErrorSeverityArray[MAX_GHES] = {
> +             EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTABLE,
> +             EFI_ACPI_6_2_ERROR_SEVERITY_FATAL,
> +             EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTED};
> +  VOID       *ErrorBlockHead;
> +  VOID       *ErrorBlock;
> +  VOID       *BlockMemory;
> +  UINT64     *ptrBlockAddress;
> +  EFI_STATUS Status = EFI_SUCCESS;
> +  Status = gBS->AllocatePool (
> +             EfiReservedMemoryType,
> +             BlockMemorySize,
> +             &BlockMemory
> +           );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  gBS->SetMem (BlockMemory, BlockMemorySize, 0);
> +  ptrBlockAddress = BlockMemory;
> +  ErrorBlockHead = BlockMemory + MAX_GHES * sizeof (UINT64);
> +  ErrorBlock = ErrorBlockHead;
> +  for (Iter = 0; Iter < MAX_GHES; Iter++) {
> +    GhesV1Initial (&GhesV1[Iter], GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
> +    GhesV1AddNotification (&GhesV1[Iter], EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV);
> +    ErrorBlockInitial (ErrorBlock, ErrorSeverityArray[Iter]);
> +    GhesV1LinkErrorBlock (&GhesV1[Iter], &ptrBlockAddress[Iter], ErrorBlock);
> +    ErrorBlock += GhesV1[Iter].ErrorStatusBlockLength;
> +  }
> +  return EFI_SUCCESS;
> +}
> +
> +VOID
> +OemHestInitialNotification ()
> +{
> +  // GPIO init
> +  // use int_msk to simulate
> +  UINTN Base = IOMUX_REG_BASE;
> +  //GPIO9, in document 'PhosphorV680 Totemiomux' iomg051,
> +  //Set GPIO9 to pad_ex_int1
> +  MmioWrite32 (Base + IOMG051, PAD_EX_INT1);
> +  return;
> +}
> +
> +VOID
> +OemEinjInitialNotification ()
> +{
> +  UINTN Base = IOMUX_REG_BASE;
> +  //use TB_GPIO_PIN10 for EINJ
> +  MmioWrite32 (Base + IOMG052, PAD_EX_INT1);
> +  return;
> +}
> +
> +EFI_STATUS
> +OemInitHestTable (
> +  IN EFI_HANDLE         ImageHandle
> +)
> +{
> +  EFI_STATUS                                                     Status = EFI_SUCCESS;
> +  HEST_CONTEXT                                                   HestContext;
> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE GhesV2[MAX_GHES];
> +  Status = HestHeaderCreator (&HestContext, HEST_TABLE_SIZE);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  Status = GhesV2ContextForHest(GhesV2, MAX_GHES);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  Status |= HestAddErrorSourceDescriptor (
> +              &HestContext,
> +              &GhesV2[0],
> +              sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)
> +              );
> +  mApeiTrustedfirmwareData->HestRecoverableErrorGhesV2 = HestContext.KeyErrorSource;
> +  Status |= HestAddErrorSourceDescriptor (
> +              &HestContext,
> +              &GhesV2[1],
> +              sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)
> +              );
> +  mApeiTrustedfirmwareData->HestFatalErrorGhesV2 = HestContext.KeyErrorSource;
> +  Status |= HestAddErrorSourceDescriptor (
> +              &HestContext,
> +              &GhesV2[2],
> +              sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)
> +              );
> +  mApeiTrustedfirmwareData->HestCorrectedErrorGhesV2 = HestContext.KeyErrorSource;
> +  OemHestInitialNotification ();
> +  HestSetAcpiTable (&HestContext);
> +  return Status;
> +}
> +/************************************************
> +*************** BERT ***************
> +************************************************/
> +
> +EFI_STATUS
> +OemInitBertTable (
> +  IN EFI_HANDLE ImageHandle
> +)
> +{
> +  BERT_CONTEXT Context;
> +  BOOLEAN      Status;
> +  Status = BertHeaderCreator (&Context, BOOT_ERROR_REGION_SIZE);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  ErrorBlockInitial (Context.Block, EFI_ACPI_6_2_ERROR_SEVERITY_NONE);
> +  BertSetAcpiTable (&Context);
> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: %r\n", __FUNCTION__, __LINE__, Status));

This does not look like an error case.

> +  return EFI_SUCCESS;
> +}
> +/************************************************
> +*************** EINJ ***************
> +************************************************/
> +EFI_STATUS
> +OemEinjConfigExecuteOperationEntry (
> +  EINJ_CONTEXT *Context
> +)
> +{
> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY* KeyEntry = Context->ExecuteOperationEntry;
> +  OemEinjInitialNotification ();
> +  //use TB_GPIO_PIN10 for EINJ
> +  KeyEntry->RegisterRegion.Address = PcdGet64 (PcdCpldBaseAddress) + CPLD_GPIO10_INT_OFFSET;
> +  KeyEntry->Mask = CPLD_MASK;
> +  KeyEntry->Value = CPLD_VALUE;
> +  return EFI_SUCCESS;
> +}
> +
> +EFI_STATUS
> +OemInitEinjTable (
> +)
> +{
> +  EFI_STATUS    Status;
> +  EINJ_CONTEXT  Context;
> +  Status = EinjHeaderCreator (&Context);
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +  (VOID)EinjConfigErrorInjectCapability (&Context, 0xFFF);// TBD
> +  (VOID)OemEinjConfigExecuteOperationEntry (&Context);
> +  EinjSetAcpiTable (&Context);
> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: %d\n", __FUNCTION__, __LINE__, Status));

This does not look like an error case.

/
    Leif

> +  return EFI_SUCCESS;
> +}
> +/************************************************
> +*************** ERST ***************
> +************************************************/
> +
> +EFI_STATUS
> +OemErstConfigExecuteOperationEntry (
> +  ERST_BOOT_CONTEXT *Context
> +)
> +{
> +  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY *KeyEntry;
> +  KeyEntry = Context->ExecuteOperationEntry;
> +  KeyEntry->RegisterRegion.Address = GPIO1_BASE + GPIO_INT_MASK;
> +  KeyEntry->Value = 0x10;
> +  KeyEntry->Mask = 0xFFFFFFFF;
> +  GpioCombInit (GPIO1_BASE, 0xFFFF);
> +  return EFI_SUCCESS;
> +}
> +
> +BOOLEAN
> +GetNvRamRegion (
> +  OUT  VOID  **NvRamAddrRange,
> +  OUT UINT64 *NvRamAddrRangeLength
> +)
> +{
> +  UINT32 Store = ERST_RECORD_STORE_IN_MEM;
> +  switch (Store) {
> +    case (ERST_RECORD_STORE_IN_NVRAM):
> +      break;
> +    case (ERST_RECORD_STORE_IN_MEM):
> +      * NvRamAddrRangeLength = ERST_DATASTORE_SIZE;
> +      * NvRamAddrRange = AllocateReservedZeroPool (ERST_DATASTORE_SIZE);
> +      break;
> +    case (ERST_RECORD_STORE_IN_SPI_FLASH):
> +      break;
> +    default:
> +      ;
> +  }
> +  return TRUE;
> +}
> +
> +/***OEM***/
> +EFI_STATUS
> +OemInitErstTable (
> +)
> +{
> +  EFI_STATUS        Status = ERST_STATUS_SUCCESS;
> +  ERST_BOOT_CONTEXT Context;
> +  UINT64            BufferSize = ERST_DATASTORE_SIZE;
> +  VOID              *NvRamAddrRange;
> +  UINT64            NvRamAddrRangeLength;
> +  UINT64            NvRamAllRecordLength;
> +
> +  GetNvRamRegion (&NvRamAddrRange, &NvRamAddrRangeLength);
> +  NvRamAllRecordLength = 0;
> +  Status = ErstHeaderCreator (
> +             &Context,
> +             BufferSize,
> +             NvRamAddrRange,
> +             NvRamAllRecordLength,
> +             NvRamAddrRangeLength);
> +  OemErstConfigExecuteOperationEntry (&Context);
> +  mApeiTrustedfirmwareData->ErstContext = (VOID*)Context.Rt;
> +  ErstSetAcpiTable (&Context);
> +  return Status;
> +};
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 35/43] Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 35/43] Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h Ming Huang
@ 2018-08-22 15:33   ` Leif Lindholm
  2018-08-23  7:39     ` Ming
  0 siblings, 1 reply; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 15:33 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:55PM +0800, Ming Huang wrote:
> Add some Lpc macro to LpcLib.h for D06.
> 

Unaddressed feedback from v1:

I have no issue with this patch, but can you explain when these macros
are intended to be used? And if in this set, move this patch
immediately before the patch than needs it?

Again, this patch is not D06 specific, and the subject should reflect that.

/
    Leif

> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Silicon/Hisilicon/Include/Library/LpcLib.h | 51 +++++++++++++++++++-
>  1 file changed, 49 insertions(+), 2 deletions(-)
> 
> diff --git a/Silicon/Hisilicon/Include/Library/LpcLib.h b/Silicon/Hisilicon/Include/Library/LpcLib.h
> index 236a52ba45..5cf08ccde1 100755
> --- a/Silicon/Hisilicon/Include/Library/LpcLib.h
> +++ b/Silicon/Hisilicon/Include/Library/LpcLib.h
> @@ -1,7 +1,7 @@
>  /** @file
>  *
> -*  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
> -*  Copyright (c) 2016, Linaro Limited. All rights reserved.
> +*  Copyright (c) 2016-2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2016-2018, Linaro Limited. All rights reserved.
>  *
>  *  This program and the accompanying materials
>  *  are licensed and made available under the terms and conditions of the BSD License
> @@ -18,6 +18,53 @@
>  
>  #include <Uefi.h>
>  
> +#define PCIE_SUBSYS_IOMUX       0x201100000
> +#define PCIE_SUBSYS_IOMG019     (PCIE_SUBSYS_IOMUX + 0x48)
> +#define PCIE_SUBSYS_IOMG020     (PCIE_SUBSYS_IOMUX + 0x4C)
> +#define PCIE_SUBSYS_IOMG021     (PCIE_SUBSYS_IOMUX + 0x50)
> +#define PCIE_SUBSYS_IOMG022     (PCIE_SUBSYS_IOMUX + 0x54)
> +#define PCIE_SUBSYS_IOMG023     (PCIE_SUBSYS_IOMUX + 0x58)
> +#define PCIE_SUBSYS_IOMG024     (PCIE_SUBSYS_IOMUX + 0x5C)
> +#define PCIE_SUBSYS_IOMG025     (PCIE_SUBSYS_IOMUX + 0x60)
> +#define PCIE_SUBSYS_IOMG028     (PCIE_SUBSYS_IOMUX + 0x6C)
> +
> +#define IO_MGMT_SUBCTRL_BASE    0x201070000
> +#define SC_LPC_RESET_REQ_REG    (IO_MGMT_SUBCTRL_BASE + 0x0a58)
> +#define SC_LPC_RESET_DREQ_REG   (IO_MGMT_SUBCTRL_BASE + 0x0a5c)
> +#define SC_LPC_SEL              (IO_MGMT_SUBCTRL_BASE + 0x2400)
> +
> +
> +#define LPCD06_BASE             0x201190000
> +#define LPC_FIRM_SPACE0_CFG     (LPCD06_BASE + 0x100)
> +#define LPC_FIRM_SPACE1_CFG     (LPCD06_BASE + 0x104)
> +#define LPC_FIRM_SPACE2_CFG     (LPCD06_BASE + 0x108)
> +#define LPC_FIRM_SPACE3_CFG     (LPCD06_BASE + 0x10C)
> +#define LPC_FIRM_SPACE4_CFG     (LPCD06_BASE + 0x110)
> +#define LPC_FIRM_SPACE5_CFG     (LPCD06_BASE + 0x114)
> +#define LPC_FIRM_SPACE6_CFG     (LPCD06_BASE + 0x118)
> +#define LPC_FIRM_SPACE7_CFG     (LPCD06_BASE + 0x11C)
> +#define LPC_MEM_SPACE0_CFG      (LPCD06_BASE + 0x120)
> +#define LPC_MEM_SPACE1_CFG      (LPCD06_BASE + 0x124)
> +#define LPC_MEM_SPACE2_CFG      (LPCD06_BASE + 0x128)
> +#define LPC_MEM_SPACE3_CFG      (LPCD06_BASE + 0x12C)
> +#define LPC_MEM_SPACE4_CFG      (LPCD06_BASE + 0x130)
> +#define LPC_MEM_SPACE5_CFG      (LPCD06_BASE + 0x134)
> +#define LPC_MEM_SPACE6_CFG      (LPCD06_BASE + 0x138)
> +
> +#define LPCD06_START_REG        (LPCD06_BASE + 0x00)
> +#define LPCD06_OP_STATUS_REG    (LPCD06_BASE + 0x04)
> +#define LPCD06_IRQ_ST_REG       (LPCD06_BASE + 0x08)
> +#define LPCD06_OP_LEN_REG       (LPCD06_BASE + 0x10)
> +#define LPCD06_CMD_REG          (LPCD06_BASE + 0x14)
> +#define LPCD06_ADDR_REG         (LPCD06_BASE + 0x20)
> +#define LPCD06_WDATA_REG        (LPCD06_BASE + 0x24)
> +#define LPCD06_RDATA_REG        (LPCD06_BASE + 0x28)
> +
> +#define LPC_SIRQ_CTR0           (LPCD06_BASE + 0x80)
> +#define LPC_SIRQ_CTR1           (LPCD06_BASE + 0x84)
> +#define LPC_SIRQ_INT_MASK       (LPCD06_BASE + 0x94)
> +
> +
>  #define PCIE_SUBSYS_IO_MUX      0xA0170000
>  #define PCIE_SUBSYS_IOMG033     (PCIE_SUBSYS_IO_MUX + 0x84)
>  #define PCIE_SUBSYS_IOMG035     (PCIE_SUBSYS_IO_MUX + 0x8C)
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 37/43] Silicon/Hisilicon/D06: Modify for close slave core clock.
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 37/43] Silicon/Hisilicon/D06: Modify for close slave core clock Ming Huang
@ 2018-08-22 15:44   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 15:44 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, ZhenYao

On Tue, Aug 14, 2018 at 04:08:57PM +0800, Ming Huang wrote:
> From: ZhenYao <yaozhen6@huawei.com>
> 
> When BIOS booting, the power consumption is too high, so need close
> some clusters clock that don't work to reduce power consumption.
> 
> The implementation of functions is in edk2-non-osi.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: ZhenYao <yaozhen6@huawei.com>

This patch is not in Silicon/Hisilicon/D06. Fix the subject please.

> ---
>  Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h b/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
> index ec2b9a36e7..3ccfc6bee3 100644
> --- a/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
> +++ b/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
> @@ -102,5 +102,8 @@ VOID PlatformEventBroadcastConfig(VOID);
>  UINTN GetDjtagRegBase(UINT32 NodeId);
>  VOID LlcCleanInvalidateAsm(VOID);
>  VOID PlatformMdioInit(VOID);
> +VOID DisableClusterClock(UINTN CpuClusterBase);
> +VOID EnableClusterClock(UINTN CpuClusterBase);
> +VOID DisableSocketClock (UINT8 Skt);
>  
>  #endif
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 38/43] Silicon/Hisilicon/D06: Add I2C Bus Exception handle function
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 38/43] Silicon/Hisilicon/D06: Add I2C Bus Exception handle function Ming Huang
@ 2018-08-22 15:45   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 15:45 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:58PM +0800, Ming Huang wrote:
> During the period of I2c accessing, if the board is reset
> unexpectedly, and because the I2c client can not reset,
> the SDA will be always pull down, then it cause I2C bus
> Exception.
> 
> Follow the Hi1620 I2C FS chapter 1.8.2 design, add I2C
> Bus Exception handle function. It will Config SCL and SDA
> to GPIO, and set the reversal frequency of SCL to 10KHz.
> 
> The implementation of functions is in edk2-non-osi.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

This change is not in Silicon/Hisilicon/D06, please fix the subject
line.

/
    Leif

> ---
>  Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h b/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
> index 3ccfc6bee3..a232e52ed7 100644
> --- a/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
> +++ b/Silicon/Hisilicon/Include/Library/PlatformSysCtrlLib.h
> @@ -106,4 +106,7 @@ VOID DisableClusterClock(UINTN CpuClusterBase);
>  VOID EnableClusterClock(UINTN CpuClusterBase);
>  VOID DisableSocketClock (UINT8 Skt);
>  
> +EFI_STATUS EFIAPI HandleI2CException (UINT32 Socket, UINT32 Port);
> +EFI_STATUS EFIAPI HandleI2CExceptionBySocket (UINT32 Socket);
> +
>  #endif
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 43/43] Platform/Hisilicon/D0x: Update version string to 18.08
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 43/43] Platform/Hisilicon/D0x: Update version string to 18.08 Ming Huang
@ 2018-08-22 16:09   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 16:09 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:09:03PM +0800, Ming Huang wrote:
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---
>  Platform/Hisilicon/D03/D03.dsc | 2 +-
>  Platform/Hisilicon/D05/D05.dsc | 2 +-
>  Platform/Hisilicon/D06/D06.dsc | 4 ++--
>  3 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/Platform/Hisilicon/D03/D03.dsc b/Platform/Hisilicon/D03/D03.dsc
> index c12790ba59..add15b7f93 100644
> --- a/Platform/Hisilicon/D03/D03.dsc
> +++ b/Platform/Hisilicon/D03/D03.dsc
> @@ -174,7 +174,7 @@
>    !ifdef $(FIRMWARE_VER)
>      gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"$(FIRMWARE_VER)"
>    !else
> -    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.02 for Hisilicon D03"
> +    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.08 for Hisilicon D03"
>    !endif
>  
>    gHisiTokenSpaceGuid.PcdBiosVersionString|L"10.01.01T18"
> diff --git a/Platform/Hisilicon/D05/D05.dsc b/Platform/Hisilicon/D05/D05.dsc
> index 94d386582e..76c0bd421e 100644
> --- a/Platform/Hisilicon/D05/D05.dsc
> +++ b/Platform/Hisilicon/D05/D05.dsc
> @@ -192,7 +192,7 @@
>    !ifdef $(FIRMWARE_VER)
>      gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"$(FIRMWARE_VER)"
>    !else
> -    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.02 for Hisilicon D05"
> +    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.08 for Hisilicon D05"
>    !endif
>  
>    gHisiTokenSpaceGuid.PcdBiosVersionString|L"10.01.01T18"
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index 544039e450..09197922ad 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -165,12 +165,12 @@
>    !ifdef $(FIRMWARE_VER)
>      gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"$(FIRMWARE_VER)"
>    !else
> -    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Hisilicon D06 UEFI RC0 - B308 (V0.38)"
> +    gEfiMdeModulePkgTokenSpaceGuid.PcdFirmwareVersionString|L"Development build 18.08 for Hisilicon D06"
>    !endif
>  
>    gHisiTokenSpaceGuid.PcdBiosVersionString|L"10.01.01T18"
>  
> -  gHisiTokenSpaceGuid.PcdBiosVersionForBmc|L"0.38"
> +  gHisiTokenSpaceGuid.PcdBiosVersionForBmc|L"0.42"
>  
>    gHisiTokenSpaceGuid.PcdSystemProductName|L"D06"
>    gHisiTokenSpaceGuid.PcdSystemVersion|L"VER.A"
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 41/43] Hisilicon/D06: Add PciPlatformLib
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 41/43] Hisilicon/D06: Add PciPlatformLib Ming Huang
@ 2018-08-22 16:12   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 16:12 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:09:01PM +0800, Ming Huang wrote:
> Add a Null PciPlatformLib for build D06. The switch generic
> PciHostBridge patch set add two api for PciPlatform driver,
> so need to implement the two api for D06.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

> ---
>  Platform/Hisilicon/D06/D06.dsc                                                 |  1 +
>  Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf | 30 +++++++++
>  Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c   | 67 ++++++++++++++++++++
>  3 files changed, 98 insertions(+)
> 
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index fad6fcc747..053ea894d5 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -95,6 +95,7 @@
>    FileExplorerLib|MdeModulePkg/Library/FileExplorerLib/FileExplorerLib.inf
>  !endif
>    PciExpressLib|MdePkg/Library/BasePciExpressLib/BasePciExpressLib.inf
> +  PciPlatformLib|Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf
>  
>  [LibraryClasses.common.SEC]
>    ArmPlatformLib|Silicon/Hisilicon/Library/ArmPlatformLibHisilicon/ArmPlatformLibSec.inf
> diff --git a/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf b/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf
> new file mode 100644
> index 0000000000..7648322522
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf
> @@ -0,0 +1,30 @@
> +## @file
> +# PCI Segment Library for Hisilicon Hi1610/Hi1616 SoC with multiple RCs
> +#
> +# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
> +# Copyright (c) 2017 - 2018, Linaro Ltd. All rights reserved.<BR>
> +# Copyright (c) 2018, Hisilicon Ltd. All rights reserved.<BR>
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and conditions of the BSD License
> +#  which accompanies this distribution. The full text of the license may be found at
> +#  http://opensource.org/licenses/bsd-license.php.
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001001A
> +  BASE_NAME                      = Hi1620PciPlatformLib
> +  FILE_GUID                      = 29ba30da-68bc-46a5-888f-c65dabb67fd8
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = PciPlatformLib
> +
> +[Sources]
> +  Hi1620PciPlatformLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> diff --git a/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c b/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c
> new file mode 100644
> index 0000000000..ff77974c0f
> --- /dev/null
> +++ b/Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c
> @@ -0,0 +1,67 @@
> +/** @file
> +*
> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +*
> +*  This program and the accompanying materials
> +*  are licensed and made available under the terms and conditions of the BSD License
> +*  which accompanies this distribution.  The full text of the license may be found at
> +*  http://opensource.org/licenses/bsd-license.php
> +*
> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +*
> +**/
> +
> +#include <Uefi.h>
> +#include <Protocol/PciPlatform.h>
> +
> +
> +/*++
> +
> +Routine Description:
> +
> +  Perform Platform initialization first in PciPlatform.
> +
> +Arguments:
> +
> +Returns:
> +
> + VOID.
> +
> +--*/
> +VOID
> +EFIAPI
> +PciInitPlatform (
> +  VOID
> +  )
> +{
> +  return;
> +}
> +
> +/*++
> +
> +Routine Description:
> +
> +  Perform Platform initialization by the phase indicated.
> +
> +Arguments:
> +
> +  HostBridge    -  The associated PCI host bridge handle.
> +  Phase         -  The phase of the PCI controller enumeration.
> +  ChipsetPhase  -  Defines the execution phase of the PCI chipset driver.
> +
> +Returns:
> +
> +--*/
> +VOID
> +EFIAPI
> +PhaseNotifyPlatform (
> +  IN  EFI_HANDLE                                     HostBridge,
> +  IN  EFI_PCI_HOST_BRIDGE_RESOURCE_ALLOCATION_PHASE  Phase,
> +  IN  EFI_PCI_CHIPSET_EXECUTION_PHASE                ChipsetPhase
> +  )
> +{
> +  return;
> +}
> +
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 12/43] Platform/Hisilicon/D06: Add edk2-non-osi components for D06
  2018-08-22 14:54     ` Ming
@ 2018-08-22 16:43       ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 16:43 UTC (permalink / raw)
  To: Ming
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Wed, Aug 22, 2018 at 10:54:54PM +0800, Ming wrote:
> 
> 
> On 8/22/2018 5:49 PM, Leif Lindholm wrote:
> > On Tue, Aug 14, 2018 at 04:08:32PM +0800, Ming Huang wrote:
> >> Add PcdCoreCount to fix build issue while add binary components.
> > 
> > This commit message fails to describe what is being done, apart from a
> > single thing that should be a separate patch.
> > 
> > Pleas add a proper commit message describing which components are
> > being imported.
> > 
> >> Contributed-under: TianoCore Contribution Agreement 1.1
> >> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> >> ---
> >>  Platform/Hisilicon/D06/D06.dsc                                                 |  7 +++++++
> >>  Platform/Hisilicon/D06/D06.fdf                                                 | 17 +++++++++++++++++
> >>  Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf |  2 ++
> >>  3 files changed, 26 insertions(+)
> >>
> > 
> >> diff --git a/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf b/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
> >> index 2275586ff3..a47806f391 100644
> >> --- a/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
> >> +++ b/Silicon/Hisilicon/Drivers/Smbios/ProcessorSubClassDxe/ProcessorSubClassDxe.inf
> >> @@ -28,6 +28,7 @@
> >>  
> >>  [Packages]
> >>    ArmPkg/ArmPkg.dec
> >> +  ArmPlatformPkg/ArmPlatformPkg.dec
> >>    MdePkg/MdePkg.dec
> >>    MdeModulePkg/MdeModulePkg.dec
> >>    IntelFrameworkPkg/IntelFrameworkPkg.dec
> >> @@ -52,6 +53,7 @@
> >>    gEfiSmbiosProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
> >>  
> >>  [Pcd]
> >> +  gArmPlatformTokenSpaceGuid.PcdCoreCount
> >>    gHisiTokenSpaceGuid.PcdCPUInfo
> >>    gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz
> > 
> > And please submit this as a separate patch, explaining why the change
> > is needed. If it is only needed by one of the binary modules imported
> > as part of the current patch, place it immediately preceding this.
> > 
> > If it resolves some other issue, please insert it as early in the set
> > as possible.
> 
> Silicon/Hisilicon/Hi1620/Library/PlatformSysCtrlLibHi1620 add a function
> which use the PcdCoreCount and the function is used by ProcessorSubClassDxe.
> Should I add gArmPlatformTokenSpaceGuid.PcdCoreCount to
> Silicon/Hisilicon/Hi1620/Library/PlatformSysCtrlLibHi1620/PlatformSysCtrlLibHi1620.inf ?
> And delete the commit message in this patch ?

Yes please - that sounds like the correct solution.

/
    Leif


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 23/43] Silicon/Hisilicon/D06: Add I2C delay for HNS auto config
  2018-08-22 15:16     ` Ming
@ 2018-08-22 16:46       ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 16:46 UTC (permalink / raw)
  To: Ming
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Wed, Aug 22, 2018 at 11:16:26PM +0800, Ming wrote:
> 
> 
> On 8/22/2018 10:27 PM, Leif Lindholm wrote:
> > On Tue, Aug 14, 2018 at 04:08:43PM +0800, Ming Huang wrote:
> >> Because I2C Port5 salve device connect under I2C extender
> >> (9545 device), it will cost more time to access I2C slave
> >> device, so add delay time for HNS auto config.
> >>
> >> Contributed-under: TianoCore Contribution Agreement 1.1
> >> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> >> ---
> >>  Silicon/Hisilicon/Library/I2CLib/I2CHw.h  |  3 +++
> >>  Silicon/Hisilicon/Library/I2CLib/I2CLib.c | 21 +++++++++++++++-----
> >>  2 files changed, 19 insertions(+), 5 deletions(-)
> > 
> > Like previous patch, please change subject line - this affects d03,
> > d05, d06.
> > 
> > Silicon/Hisilicon: Add I2CLib delay for HNS auto config
> 
> Should this patch reorder before the first D06 patch ?

Yes please.

/
    Leif

> > 
> >> diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
> >> index fa954c7937..d77aea509e 100644
> >> --- a/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
> >> +++ b/Silicon/Hisilicon/Library/I2CLib/I2CHw.h
> >> @@ -19,6 +19,9 @@
> >>  #include <Uefi.h>
> >>  #include <Library/IoLib.h>
> >>  
> >> +// The HNS I2C port 5 is under I2C extender
> >> +#define I2C_EXTENDER_PORT_HNS        5
> >> +
> >>  #define I2C_READ_TIMEOUT             500
> >>  #define I2C_DRV_ONCE_WRITE_BYTES_NUM 8
> >>  #define I2C_DRV_ONCE_READ_BYTES_NUM  8
> >> diff --git a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> >> index d67ddc7f9b..59633106ce 100644
> >> --- a/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> >> +++ b/Silicon/Hisilicon/Library/I2CLib/I2CLib.c
> >> @@ -258,8 +258,13 @@ CheckI2CTimeOut (
> >>    if (Transfer == I2CTx) {
> >>      Fifo = I2C_GetTxStatus (Socket, Port);
> >>      while (Fifo != 0) {
> >> -      // This is a empirical value for I2C delay. MemoryFance is no need here.
> >> -      I2C_Delay (2);
> >> +      if (Port == I2C_EXTENDER_PORT_HNS) {
> >> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
> > 
> > MemoryFance ->
> > MemoryFence
> > 
> > (You may want to search and replace that on the whole set.)
> > 
> > With that:
> > Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
> 
> Replace they in v4.
> Thanks.
> 
> > 
> > /
> >     Leif
> > 
> >> +        I2C_Delay (1000);
> >> +      } else {
> >> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
> >> +        I2C_Delay (2);
> >> +      }
> >>        if (++Times > I2C_READ_TIMEOUT) {
> >>          (VOID)I2C_Disable (Socket, Port);
> >>          return EFI_TIMEOUT;
> >> @@ -269,8 +274,13 @@ CheckI2CTimeOut (
> >>    } else {
> >>      Fifo = I2C_GetRxStatus (Socket, Port);
> >>      while (Fifo == 0) {
> >> -      // This is a empirical value for I2C delay. MemoryFance is no need here.
> >> -      I2C_Delay (2);
> >> +      if (Port == I2C_EXTENDER_PORT_HNS) {
> >> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
> >> +        I2C_Delay (1000);
> >> +      } else {
> >> +        // This is a empirical value for I2C delay. MemoryFance is no need here.
> >> +        I2C_Delay (2);
> >> +      }
> >>        if (++Times > I2C_READ_TIMEOUT) {
> >>          (VOID)I2C_Disable (Socket, Port);
> >>          return EFI_TIMEOUT;
> >> @@ -369,7 +379,8 @@ I2CWrite(
> >>      Times = 0;
> >>      Fifo = I2C_GetTxStatus (I2cInfo->Socket, I2cInfo->Port);
> >>      while (Fifo > I2C_TXRX_THRESHOLD) {
> >> -      I2C_Delay (2);
> >> +      // This is a empirical value for I2C delay. MemoryFance is no need here.
> >> +      I2C_Delay (1000);
> >>        if (++Times > I2C_READ_TIMEOUT) {
> >>          (VOID)I2C_Disable (I2cInfo->Socket, I2cInfo->Port);
> >>          return EFI_TIMEOUT;
> >> -- 
> >> 2.17.0
> >>


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 40/43] Silicon/Hisilicon/setup: Support SMMU switch
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 40/43] Silicon/Hisilicon/setup: Support SMMU switch Ming Huang
@ 2018-08-22 18:42   ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 18:42 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

Please correct the subject as per my prevoious comments on this.

On the whole, I think the enable/disable SMMU is a likely enough
scenario that we should probably have some core functionality for it
like for SPCR. For now I'm OK with this.

On Tue, Aug 14, 2018 at 04:09:00PM +0800, Ming Huang wrote:
> Select without SMMU iort while SMMU item is disable,
> Select with SMMU iort while SMMU item is enable.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c | 88 ++++++++++++++++++++
>  1 file changed, 88 insertions(+)
> 
> diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> index 32878ca4f9..e0c29e0f57 100644
> --- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> +++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> @@ -24,6 +24,90 @@
>  
>  #define CORECOUNT(X) ((X) * CORE_NUM_PER_SOCKET)
>  
> +#define FIELD_IORT_NODE_OFFSET     40
> +
> +typedef enum {
> +  NodeTypeIts = 0,
> +  NodeTypeNameComponent,
> +  NodeTypePciRC,
> +  NodeTypeSmmuV1,
> +  NodeTypeSmmuV3,
> +  NodeTypePMCG
> +} IORT_NODE_TYPE;
> +
> +#pragma pack(1)
> +typedef struct {
> +  UINT8   Type;
> +  UINT16  Length;
> +  UINT8   Revision;
> +  UINT32  Reserved;
> +  UINT32  IdMapNumber;
> +  UINT32  IdArrayOffset;
> +} IORT_NODE_HEAD;
> +#pragma pack()
> +
> +BOOLEAN
> +IsIortWithSmmu (
> +  IN EFI_ACPI_DESCRIPTION_HEADER      *TableHeader
> +  )
> +{
> +  UINT32           *NodeOffset;
> +  UINT32           NextOffset;
> +  IORT_NODE_HEAD   *Node;
> +
> +  NodeOffset = (UINT32 *)((UINT8 *)TableHeader + FIELD_IORT_NODE_OFFSET);
> +  NextOffset = *NodeOffset;
> +
> +  while (NextOffset < TableHeader->Length) {
> +    Node = (IORT_NODE_HEAD *)((UINT8 *)TableHeader + NextOffset);
> +    NextOffset += Node->Length;
> +
> +    if ((Node->Type == NodeTypeSmmuV1) || (Node->Type == NodeTypeSmmuV3)) {
> +      return TRUE;
> +    }
> +  }
> +
> +  return FALSE;
> +}
> +
> +EFI_STATUS
> +SelectIort (
> +  IN EFI_ACPI_DESCRIPTION_HEADER      *TableHeader
> +  )
> +{
> +  EFI_STATUS          Status;
> +  UINTN               Size;
> +  OEM_CONFIG_DATA     Configuration;
> +
> +  Configuration.EnableSmmu = 0;
> +  Size = sizeof (OEM_CONFIG_DATA);
> +  Status = gRT->GetVariable (
> +                  OEM_CONFIG_NAME,
> +                  &gOemConfigGuid,
> +                  NULL,
> +                  &Size,
> +                  &Configuration
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    DEBUG ((DEBUG_ERROR, "Get OemConfig variable (%r).\n", Status));
> +  }
> +
> +  Status =  EFI_SUCCESS;
> +  if (IsIortWithSmmu (TableHeader)) {
> +    if (!Configuration.EnableSmmu) {
> +      Status = EFI_ABORTED;
> +    }
> +  } else {
> +    if (Configuration.EnableSmmu) {
> +      Status = EFI_ABORTED;
> +    }
> +  }
> +  DEBUG ((DEBUG_INFO, "SmmuEnable=%x, return %r for Iort table.\n",
> +          Configuration.EnableSmmu, Status));
> +
> +  return Status;
> +}
> +
>  STATIC
>  VOID
>  RemoveUnusedMemoryNode (
> @@ -151,6 +235,10 @@ UpdateAcpiTable (
>    case EFI_ACPI_6_0_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE:
>      Status = UpdateSlit (TableHeader);
>      break;
> +

Drop this blank line.

/
    Leif

> +  case EFI_ACPI_6_2_IO_REMAPPING_TABLE_SIGNATURE:
> +    Status = SelectIort (TableHeader);
> +    break;
>    case EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE:
>      Status = IsNeedSpcr (TableHeader);
>      break;
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 36/43] Platform/Hisilicon/D06: Add capsule upgrade support
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 36/43] Platform/Hisilicon/D06: Add capsule upgrade support Ming Huang
@ 2018-08-22 18:42   ` Leif Lindholm
  2018-08-24 14:43     ` Ard Biesheuvel
  0 siblings, 1 reply; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 18:42 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Tue, Aug 14, 2018 at 04:08:56PM +0800, Ming Huang wrote:
> This module support updating the boot CPU firmware only.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>

As I said on v1, I have no further comments on this.
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>

Ard may have something to add.

/
    Leif

> ---
>  Platform/Hisilicon/D06/D06.dsc                                                           | 14 ++++
>  Platform/Hisilicon/D06/D06.fdf                                                           | 72 ++++++++++++++++-
>  Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf     | 50 ++++++++++++
>  Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c    | 70 +++++++++++++++++
>  Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini | 46 +++++++++++
>  Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc    | 81 ++++++++++++++++++++
>  6 files changed, 332 insertions(+), 1 deletion(-)
> 
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index 9550e0d497..fad6fcc747 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -121,6 +121,11 @@
>    gHisiTokenSpaceGuid.PcdIsItsSupported|TRUE
>    gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE
>    gEfiMdeModulePkgTokenSpaceGuid.PcdHiiOsRuntimeSupport|FALSE
> +[PcdsDynamicExDefault.common.DEFAULT]
> +  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor|{0x0}|VOID*|0x100
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid|{0x29, 0x3d, 0x4b, 0xd3, 0x85, 0x00, 0xb3, 0x4a, 0x8b, 0xe8, 0x84, 0x18, 0x8c, 0xc5, 0x04, 0x89}
> +  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareFileGuid|{0xcf, 0x4f, 0x2e, 0x64, 0xf7, 0x2d, 0x15, 0x44, 0x8b, 0x70, 0xa0, 0x39, 0x09, 0xc5, 0x7b, 0x55}
> +
>  
>  [PcdsFixedAtBuild.common]
>    gArmPlatformTokenSpaceGuid.PcdCoreCount|48
> @@ -266,6 +271,7 @@
>    Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
>    Silicon/Hisilicon/Drivers/VersionInfoPeim/VersionInfoPeim.inf
>  
> +  Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
>    MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
>      <LibraryClasses>
>        NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
> @@ -386,6 +392,8 @@
>    MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
>    MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
>    MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
> +  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
> +  MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
>    #
>    # FAT filesystem + GPT/MBR partitioning
>    #
> @@ -434,6 +442,12 @@
>    MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
>    MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
>    MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
> +  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf {
> +    <LibraryClasses>
> +      FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf
> +  }
> +
> +  MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
>  
>    #
>    # UEFI application (Shell Embedded Boot Loader)
> diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
> index 90379b8558..8c3f4f9932 100644
> --- a/Platform/Hisilicon/D06/D06.fdf
> +++ b/Platform/Hisilicon/D06/D06.fdf
> @@ -308,7 +308,9 @@ READ_LOCK_STATUS   = TRUE
>    INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
>  
>    INF Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
> -  INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
> +  INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
> +  INF MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
> +
>    #
>    # Build Shell from latest source code instead of prebuilt binary
>    #
> @@ -364,11 +366,79 @@ READ_LOCK_STATUS   = TRUE
>  
>    INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>  
> +  INF RuleOverride = FMP_IMAGE_DESC Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
>    FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
>      SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
>        SECTION FV_IMAGE = FVMAIN
>      }
>    }
> +[FV.CapsuleDispatchFv]
> +FvAlignment        = 16
> +ERASE_POLARITY     = 1
> +MEMORY_MAPPED      = TRUE
> +STICKY_WRITE       = TRUE
> +LOCK_CAP           = TRUE
> +LOCK_STATUS        = TRUE
> +WRITE_DISABLED_CAP = TRUE
> +WRITE_ENABLED_CAP  = TRUE
> +WRITE_STATUS       = TRUE
> +WRITE_LOCK_CAP     = TRUE
> +WRITE_LOCK_STATUS  = TRUE
> +READ_DISABLED_CAP  = TRUE
> +READ_ENABLED_CAP   = TRUE
> +READ_STATUS        = TRUE
> +READ_LOCK_CAP      = TRUE
> +READ_LOCK_STATUS   = TRUE
> +
> +  INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf
> +
> +[FV.SystemFirmwareUpdateCargo]
> +FvAlignment        = 16
> +ERASE_POLARITY     = 1
> +MEMORY_MAPPED      = TRUE
> +STICKY_WRITE       = TRUE
> +LOCK_CAP           = TRUE
> +LOCK_STATUS        = TRUE
> +WRITE_DISABLED_CAP = TRUE
> +WRITE_ENABLED_CAP  = TRUE
> +WRITE_STATUS       = TRUE
> +WRITE_LOCK_CAP     = TRUE
> +WRITE_LOCK_STATUS  = TRUE
> +READ_DISABLED_CAP  = TRUE
> +READ_ENABLED_CAP   = TRUE
> +READ_STATUS        = TRUE
> +READ_LOCK_CAP      = TRUE
> +READ_LOCK_STATUS   = TRUE
> +
> +  FILE RAW = 642e4fcf-2df7-4415-8b70-a03909c57b55 { # PcdEdkiiSystemFirmwareFileGuid
> +    FD = D06
> +  }
> +
> +  FILE RAW = ce57b167-b0e4-41e8-a897-5f4feb781d40 { # gEdkiiSystemFmpCapsuleDriverFvFileGuid
> +    FV = CapsuleDispatchFv
> +  }
> +
> +  FILE RAW = 812136D3-4D3A-433A-9418-29BB9BF78F6E { # gEdkiiSystemFmpCapsuleConfigFileGuid
> +    Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
> +  }
> +
> +[FmpPayload.FmpPayloadSystemFirmwarePkcs7]
> +IMAGE_HEADER_INIT_VERSION = 0x02
> +IMAGE_TYPE_ID             = df8fe8d1-e937-45b8-9691-c4b5e183874e # PcdSystemFmpCapsuleImageTypeIdGuid
> +IMAGE_INDEX               = 0x1
> +HARDWARE_INSTANCE         = 0x0
> +MONOTONIC_COUNT           = 0x1
> +CERTIFICATE_GUID          = 4AAFD29D-68DF-49EE-8AA9-347D375665A7 # PKCS7
> +
> +  FV = SystemFirmwareUpdateCargo
> +
> +[Capsule.D06FirmwareUpdateCapsuleFmpPkcs7]
> +CAPSULE_GUID                = 6dcbd5ed-e82d-4c44-bda1-7194199ad92a # gEfiFmpCapsuleGuid
> +CAPSULE_HEADER_SIZE         = 0x20
> +CAPSULE_HEADER_INIT_VERSION = 0x1
> +
> +  FMP_PAYLOAD = FmpPayloadSystemFirmwarePkcs7
> +
>  
>  !include Silicon/Hisilicon/Hisilicon.fdf.inc
>  
> diff --git a/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
> new file mode 100644
> index 0000000000..fc1832fa5f
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
> @@ -0,0 +1,50 @@
> +## @file
> +#  System Firmware descriptor.
> +#
> +#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +#  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +#  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and conditions of the BSD License
> +#  which accompanies this distribution.  The full text of the license may be found at
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x0001001A
> +  BASE_NAME                      = SystemFirmwareDescriptor
> +  FILE_GUID                      = 90B2B846-CA6D-4D6E-A8D3-C140A8E110AC
> +  MODULE_TYPE                    = PEIM
> +  VERSION_STRING                 = 1.0
> +  ENTRY_POINT                    = SystemFirmwareDescriptorPeimEntry
> +
> +[Sources]
> +  SystemFirmwareDescriptorPei.c
> +  SystemFirmwareDescriptor.aslc
> +
> +[Packages]
> +  ArmPkg/ArmPkg.dec
> +  ArmPlatformPkg/ArmPlatformPkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  MdePkg/MdePkg.dec
> +  SignedCapsulePkg/SignedCapsulePkg.dec
> +
> +[LibraryClasses]
> +  DebugLib
> +  PcdLib
> +  PeimEntryPoint
> +  PeiServicesLib
> +
> +[FixedPcd]
> +  gArmTokenSpaceGuid.PcdFdSize
> +
> +[Pcd]
> +  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor
> +
> +[Depex]
> +  TRUE
> diff --git a/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
> new file mode 100644
> index 0000000000..27c0a718f8
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
> @@ -0,0 +1,70 @@
> +/** @file
> +  System Firmware descriptor producer.
> +
> +  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD License
> +  which accompanies this distribution.  The full text of the license may be found at
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <PiPei.h>
> +#include <Guid/EdkiiSystemFmpCapsule.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Protocol/FirmwareManagement.h>
> +
> +/**
> +  Entrypoint for SystemFirmwareDescriptor PEIM.
> +
> +  @param[in]  FileHandle  Handle of the file being invoked.
> +  @param[in]  PeiServices Describes the list of possible PEI Services.
> +
> +  @retval EFI_SUCCESS            PPI successfully installed.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SystemFirmwareDescriptorPeimEntry (
> +  IN EFI_PEI_FILE_HANDLE     FileHandle,
> +  IN CONST EFI_PEI_SERVICES  **PeiServices
> +  )
> +{
> +  EFI_STATUS                              Status;
> +  EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR  *Descriptor;
> +  UINTN                                   Size;
> +  UINTN                                   Index;
> +  UINT32                                  AuthenticationStatus;
> +
> +  //
> +  // Search RAW section.
> +  //
> +
> +  Index = 0;
> +  while (TRUE) {
> +    Status = PeiServicesFfsFindSectionData3 (EFI_SECTION_RAW, Index, FileHandle, (VOID **)&Descriptor, &AuthenticationStatus);
> +    if (EFI_ERROR (Status)) {
> +      // Should not happen, must something wrong in FDF.
> +      DEBUG ((DEBUG_ERROR, "Not found SystemFirmwareDescriptor in fdf !\n"));
> +      return EFI_NOT_FOUND;
> +    }
> +    if (Descriptor->Signature == EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE) {
> +      break;
> +    }
> +    Index++;
> +  }
> +
> +  DEBUG ((DEBUG_INFO, "EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR size - 0x%x\n", Descriptor->Length));
> +
> +  Size = Descriptor->Length;
> +  PcdSetPtrS (PcdEdkiiSystemFirmwareImageDescriptor, &Size, Descriptor);
> +
> +  return EFI_SUCCESS;
> +}
> diff --git a/Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini b/Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
> new file mode 100644
> index 0000000000..80f253b235
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
> @@ -0,0 +1,46 @@
> +#
> +#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +#  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +#  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> +#
> +#  This program and the accompanying materials
> +#  are licensed and made available under the terms and conditions of the BSD License
> +#  which accompanies this distribution.  The full text of the license may be found at
> +#  http://opensource.org/licenses/bsd-license.php
> +#
> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +#
> +##
> +
> +[Head]
> +NumOfUpdate = 3
> +NumOfRecovery = 0
> +Update0 = SysFvMain
> +Update1 = SysCustom
> +Update2 = SysNvRam
> +
> +[SysFvMain]
> +FirmwareType  = 0             # 0 - SystemFirmware, 1 - NvRam
> +AddressType   = 0             # 0 - relative address, 1 - absolute address.
> +BaseAddress   = 0x00000000    # Base address offset on flash
> +Length        = 0x003C0000    # Length
> +ImageOffset   = 0x00000000    # Image offset of this SystemFirmware image
> +FileGuid      = 642e4fcf-2df7-4415-8b70-a03909c57b55  # PcdEdkiiSystemFirmwareFileGuid
> +
> +[SysCustom]
> +FirmwareType  = 0             # 0 - SystemFirmware, 1 - NvRam
> +AddressType   = 0             # 0 - relative address, 1 - absolute address.
> +BaseAddress   = 0x003F0000    # Base address offset on flash
> +Length        = 0x00010000    # Length
> +ImageOffset   = 0x003F0000    # Image offset of this SystemFirmware image
> +FileGuid      = 642e4fcf-2df7-4415-8b70-a03909c57b55  # PcdEdkiiSystemFirmwareFileGuid
> +
> +[SysNvRam]
> +FirmwareType  = 1             # 0 - SystemFirmware, 1 - NvRam
> +AddressType   = 0             # 0 - relative address, 1 - absolute address.
> +BaseAddress   = 0x003C0000    # Base address offset on flash
> +Length        = 0x00020000    # Length
> +ImageOffset   = 0x003C0000    # Image offset of this SystemFirmware image
> +FileGuid      = 642e4fcf-2df7-4415-8b70-a03909c57b55  # PcdEdkiiSystemFirmwareFileGuid
> +
> diff --git a/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
> new file mode 100644
> index 0000000000..36175338dd
> --- /dev/null
> +++ b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
> @@ -0,0 +1,81 @@
> +/** @file
> +  System Firmware descriptor.
> +
> +  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
> +  Copyright (c) 2018, Linaro Limited. All rights reserved.
> +  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
> +
> +  This program and the accompanying materials
> +  are licensed and made available under the terms and conditions of the BSD License
> +  which accompanies this distribution.  The full text of the license may be found at
> +  http://opensource.org/licenses/bsd-license.php
> +
> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include <PiPei.h>
> +#include <Guid/EdkiiSystemFmpCapsule.h>
> +#include <Protocol/FirmwareManagement.h>
> +
> +#define PACKAGE_VERSION                     0xFFFFFFFF
> +#define PACKAGE_VERSION_STRING              L"Unknown"
> +
> +#define CURRENT_FIRMWARE_VERSION            0x00000002
> +#define CURRENT_FIRMWARE_VERSION_STRING     L"0x00000002"
> +#define LOWEST_SUPPORTED_FIRMWARE_VERSION   0x00000001
> +
> +#define IMAGE_ID                            SIGNATURE_64('H','W','A', 'R', 'M', '_', 'F', 'd')
> +#define IMAGE_ID_STRING                     L"ARMPlatformFd"
> +
> +// PcdSystemFmpCapsuleImageTypeIdGuid
> +#define IMAGE_TYPE_ID_GUID                  { 0xdf8fe8d1, 0xe937, 0x45b8, { 0x96, 0x91, 0xc4, 0xb5, 0xe1, 0x83, 0x87, 0x4e } }
> +
> +typedef struct {
> +  EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR  Descriptor;
> +  // real string data
> +  CHAR16                                  ImageIdNameStr[ARRAY_SIZE (IMAGE_ID_STRING)];
> +  CHAR16                                  VersionNameStr[ARRAY_SIZE (CURRENT_FIRMWARE_VERSION_STRING)];
> +  CHAR16                                  PackageVersionNameStr[ARRAY_SIZE (PACKAGE_VERSION_STRING)];
> +} IMAGE_DESCRIPTOR;
> +
> +IMAGE_DESCRIPTOR mImageDescriptor =
> +{
> +  {
> +    EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE,
> +    sizeof (EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR),
> +    sizeof (IMAGE_DESCRIPTOR),
> +    PACKAGE_VERSION,                                       // PackageVersion
> +    OFFSET_OF (IMAGE_DESCRIPTOR, PackageVersionNameStr),   // PackageVersionName
> +    1,                                                     // ImageIndex;
> +    {0x0},                                                 // Reserved
> +    IMAGE_TYPE_ID_GUID,                                    // ImageTypeId;
> +    IMAGE_ID,                                              // ImageId;
> +    OFFSET_OF (IMAGE_DESCRIPTOR, ImageIdNameStr),          // ImageIdName;
> +    CURRENT_FIRMWARE_VERSION,                              // Version;
> +    OFFSET_OF (IMAGE_DESCRIPTOR, VersionNameStr),          // VersionName;
> +    {0x0},                                                 // Reserved2
> +    FixedPcdGet32 (PcdFdSize),                             // Size;
> +    IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
> +      IMAGE_ATTRIBUTE_RESET_REQUIRED |
> +      IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
> +      IMAGE_ATTRIBUTE_IN_USE,                              // AttributesSupported;
> +    IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
> +      IMAGE_ATTRIBUTE_RESET_REQUIRED |
> +      IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
> +      IMAGE_ATTRIBUTE_IN_USE,                              // AttributesSetting;
> +    0x0,                                                   // Compatibilities;
> +    LOWEST_SUPPORTED_FIRMWARE_VERSION,                     // LowestSupportedImageVersion;
> +    0x00000000,                                            // LastAttemptVersion;
> +    0,                                                     // LastAttemptStatus;
> +    {0x0},                                                 // Reserved3
> +    0,                                                     // HardwareInstance;
> +  },
> +  // real string data
> +  {IMAGE_ID_STRING},
> +  {CURRENT_FIRMWARE_VERSION_STRING},
> +  {PACKAGE_VERSION_STRING},
> +};
> +
> +VOID* CONST ReferenceAcpiTable = &mImageDescriptor;
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 42/43] Hisilicon/D06: Add edk2-non-osi Shell components
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 42/43] Hisilicon/D06: Add edk2-non-osi Shell components Ming Huang
@ 2018-08-22 18:48   ` Leif Lindholm
  2018-08-23  8:37     ` Ming
  0 siblings, 1 reply; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 18:48 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

So, on the whole, I am really not happy for any of these commands to
go into 18.08. I understand they may be handy for development, but I
do not understand why they make sense to upstream.

On Tue, Aug 14, 2018 at 04:09:02PM +0800, Ming Huang wrote:
> Add Hisilicon Oem Shell libraries for some commands,such as
> biosupdate, getmac, setmac, provision, acpistartos, brdinfo,
> sfpinfo.
> 
> biosupdate example:
> ifconfig -s eth2 static 192.168.2.68 255.255.255.0 192.168.2.1
> biosupdate serverIp -u user -p password -f D06.fd -m master
> 
> acpistartos example:
> ifconfig -s eth2 static 192.168.2.69 255.255.255.0 192.168.2.1
> provision serverIp -u user -p password -f os\Image -a 0x80000
> 2
> provision serverIp -u user -p password -f os\minifs.cpio.gz -a 0x07000000
> 2
> acpistartos
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> ---
>  Silicon/Hisilicon/HisiPkg.dec  | 4 ++++
>  Platform/Hisilicon/D06/D06.dsc | 2 ++
>  2 files changed, 6 insertions(+)
> 
> diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec
> index 858b840a57..010d501914 100644
> --- a/Silicon/Hisilicon/HisiPkg.dec
> +++ b/Silicon/Hisilicon/HisiPkg.dec
> @@ -39,6 +39,7 @@
>    gPlatformSasProtocolGuid = {0x40e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x5d}}
>    gHisiPlatformSasProtocolGuid = {0x20e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x6d}}
>    gHisiSnpPlatformProtocolGuid = {0x81321f27, 0xff58, 0x4a1d, {0x99, 0x97, 0xd, 0xcc, 0xfa, 0x82, 0xf4, 0x6f}}
> +  gOemNicProtocolGuid = {0xb5903955, 0x31e9, 0x4aaf, {0xb2, 0x83, 0x7, 0x9f, 0x3c, 0xc4, 0x71, 0x66}}
>  
>  [Guids]
>    gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}
> @@ -49,6 +50,8 @@
>    gHisiOemVariableGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}
>    gOemBootVariableGuid = {0xb7784577, 0x5aaf, 0x4557, {0xa1, 0x99, 0xd4, 0xa4, 0x2f, 0x45, 0x06, 0xf8}}
>    gEfiHisiSocControllerGuid = {0xee369cc3, 0xa743, 0x5382, {0x75, 0x64, 0x53, 0xe4, 0x31, 0x19, 0x38, 0x35}}
> +  HisiShellSampleHiiGuid  = { 0x43859314, 0x82c1, 0x4592, { 0x8f, 0xf7, 0xc1, 0xbd, 0xf3, 0xb2, 0x0e, 0xd5 }}
> +  HisiPlatformShellSampleHiiGuid = { 0x7924a5de, 0xc600, 0x40d5, { 0x91, 0x10, 0xf9, 0xc3, 0xe7, 0x25, 0x4d, 0x33 }}

Why do we need all these different GUIDs?

Also, why "Sample"?

/
    Leif

>  
>  [LibraryClasses]
>    PlatformSysCtrlLib|Include/Library/PlatformSysCtrlLib.h
> @@ -101,6 +104,7 @@
>    gHisiTokenSpaceGuid.PcdSlotPerChannelNum|0x0|UINT32|0x40000004
>  
>    gHisiTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 }|VOID*|0x30006554
> +  gHisiTokenSpaceGuid.PcdStartOsParameter|L""|VOID*|0x5000000
>  
>    #FDT File Address
>    gHisiTokenSpaceGuid.FdtFileAddress|0x0|UINT64|0x40000005
> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
> index 053ea894d5..544039e450 100644
> --- a/Platform/Hisilicon/D06/D06.dsc
> +++ b/Platform/Hisilicon/D06/D06.dsc
> @@ -473,6 +473,8 @@
>  !if $(INCLUDE_DP) == TRUE
>        NULL|ShellPkg/Library/UefiDpLib/UefiDpLib.inf
>  !endif #$(INCLUDE_DP)
> +      NULL|Silicon/Hisilicon/Library/HisiShellCmdLib/HisiShellCmdLib.inf
> +      NULL|Silicon/Hisilicon/Hi1620/Library/HisiD06ShellCmdLib/HisiD06ShellCmdLib.inf
>  
>      <PcdsFixedAtBuild>
>        gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0xFF
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 00/43] Upload for D06 platform
  2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
                   ` (42 preceding siblings ...)
  2018-08-14  8:09 ` [PATCH edk2-platforms v2 43/43] Platform/Hisilicon/D0x: Update version string to 18.08 Ming Huang
@ 2018-08-22 18:49 ` Leif Lindholm
  43 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-22 18:49 UTC (permalink / raw)
  To: Ming Huang
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

Hi Ming,

I have finished reviewing v2/v3.
Please go ahead and start putting together and sending out a v4 of
both the edk2-platforms part and the edk2-non-osi part.

Regards,

Leif

On Tue, Aug 14, 2018 at 04:08:20PM +0800, Ming Huang wrote:
> The major features of this patchset include:
> 1 D06 source code;
> 2 Unify some D0x modules;
> 
> This patch set is base on pcihostbridage-v2.
> For compiling D06, add below hunk to edk2-platforms.config
> [d06]
> LONGNAME=HiSilicon D06
> DSC=Platform/Hisilicon/D06/D06.dsc
> ARCH=AARCH64
> 
> Code can also be found in github: https://github.com/hisilicon/OpenPlatformPkg.git
> branch: d06-platform-v2
> 
> 
> Heyi Guo (3):
>   Hisilicon/D06: Add Debug Serial Port Init Driver
>   Hisilicon/Hi1620: Add ACPI PPTT table
>   Platform/Hisilicon/D06: Enable ACPI PPTT
> 
> Luqi Jiang (1):
>   Hisilicon/D06: add apei driver
> 
> Ming Huang (32):
>   Silicon/Hisilicon: Modify the MRC interface for other module
>   Silicon/Hisilicon: Separate PlatformArch.h
>   Silicon/Hisilicon/Acpi: Move some macro to PlatformArch.h
>   Hisilicon/D0x: Move CustomData.Fv to common path of Hisilicon
>   Hisilicon/D0x: Move IpmiCmdLib to common path of Hisilicon
>   Hisilicon/D0x: Unify FlashFvbDxe driver
>   Hisilicon/D0X: Rename the global variable gDS3231RtcDevice
>   Hisilicon/D06: Add several base file for D06
>   Platform/Hisilicon/D06: Add M41T83RealTimeClockLib
>   Platform/Hisilicon/D06: Add edk2-non-osi components for D06
>   Hisilicon/D06: Add OemMiscLibD06
>   Silicon/Hisilicon/D06: Wait for all disk ready
>   Silicon/Hisilicon/Acpi: Unify HisiAcipPlatformDxe
>   Hisilicon/D06: Add ACPI Tables for D06
>   Silicon/Hisilicon/D06: Stop watchdog
>   Hisilicon/I2C: Modify I2CLib.c for coding style
>   Silicon/Hisilicon/I2C: Refactor I2C library
>   Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06
>   Silicon/Hisilicon/D06: Add I2C delay for HNS auto config
>   Hisilicon/I2C: Fix a typo issue
>   Platform/Hisilicon/D06: Add OemNicLib
>   Platform/Hisilicon/D06: Add OemNicConfig2P Driver
>   Platform/Hisilicon/D06: Add EarlyConfigPeim peim
>   Platform/Hisilicon/D06: Add PciHostBridgeLib
>   Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h
>   Platform/Hisilicon/D06: Add capsule upgrade support
>   Silicon/Hisilicon/D06: Add I2C Bus Exception handle function
>   Silicon/Hisilicon/Setup: Support SPCR table switch
>   Silicon/Hisilicon/setup: Support SMMU switch
>   Hisilicon/D06: Add PciPlatformLib
>   Hisilicon/D06: Add edk2-non-osi Shell components
>   Platform/Hisilicon/D0x: Update version string to 18.08
> 
> Sun Yuanchen (3):
>   Silicon/Hisilicon/D0x: Move dimm size definition to PlatformArch.h
>   Silicon/Hisilicon/D0x: Move RAS macro to PlatformArch.h
>   Hisilicon/D0x: Update SMBIOS type9 info
> 
> Yang XinYi (2):
>   Hisilicon/D06: Add Hi1620OemConfigUiLib
>   Silicon/Hisilicon/Setup: Add Setup Item "EnableGOP"
> 
> ZhenYao (1):
>   Silicon/Hisilicon/D06: Modify for close slave core clock.
> 
> shaochangliang (1):
>   Silicon/Hisilicon/D06: Optimize HNS config CDR post time
> 
>  Platform/Hisilicon/D06/D06.dec                |   29 +
>  Silicon/Hisilicon/HisiPkg.dec                 |    6 +
>  Platform/Hisilicon/D03/D03.dsc                |    4 +-
>  Platform/Hisilicon/D05/D05.dsc                |    4 +-
>  Platform/Hisilicon/D06/D06.dsc                |  490 ++++
>  Platform/Hisilicon/D03/D03.fdf                |    8 +-
>  Platform/Hisilicon/D05/D05.fdf                |    8 +-
>  Platform/Hisilicon/D06/D06.fdf                |  444 ++++
>  .../OemMiscLib2P/OemMiscLib2PHi1610.inf       |    1 +
>  .../Library/OemMiscLibD05/OemMiscLibD05.inf   |    1 +
>  .../OemNicConfig2PHi1620/OemNicConfig2P.inf   |   43 +
>  .../SystemFirmwareDescriptor.inf              |   50 +
>  .../EarlyConfigPeim/EarlyConfigPeimD06.inf    |   50 +
>  .../Library/OemMiscLibD06/OemMiscLibD06.inf   |   51 +
>  .../D06/Library/OemNicLib/OemNicLib.inf       |   35 +
>  .../PciHostBridgeLib/PciHostBridgeLib.inf     |   36 +
>  .../Drivers/FlashFvbDxe/FlashFvbDxe.inf       |    7 +-
>  .../HisiAcpiPlatformDxe/AcpiPlatformDxe.inf   |    3 +-
>  .../ProcessorSubClassDxe.inf                  |    2 +
>  .../Hisilicon/Hi1620/Drivers/Apei/Apei.inf    |   64 +
>  .../Pl011DebugSerialPortInitDxe.inf           |   48 +
>  .../Hi1620AcpiTables/AcpiTablesHi1620.inf     |   59 +
>  .../Hi1620OemConfigUiLib/OemConfigUiLib.inf   |   68 +
>  .../Hi1620PciPlatformLib.inf                  |   30 +
>  Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf        |   48 +
>  .../M41T83RealTimeClockLib.inf                |   46 +
>  .../PlatformBootManagerLib.inf                |    4 +
>  .../OemNicConfig2PHi1620/OemNicConfig.h       |   25 +
>  .../Hisilicon/D06/Include/Library/CpldD06.h   |   39 +
>  .../Smbios/MemorySubClassDxe/MemorySubClass.h |    2 -
>  .../Hi1610/Hi1610AcpiTables/Hi1610Platform.h  |   27 +-
>  .../Hisilicon/Hi1610/Include/PlatformArch.h   |   71 +
>  .../Hi1616/D05AcpiTables/Hi1616Platform.h     |   24 +-
>  .../Hisilicon/Hi1616/Include/PlatformArch.h   |   71 +
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h  |   41 +
>  .../Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h |   43 +
>  .../Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h |  146 ++
>  .../Hi1620/Drivers/Apei/ErrorSource/Ghes.h    |  110 +
>  .../Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h |  146 ++
>  .../Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h |   59 +
>  .../Hi1620/Drivers/Apei/OemApeiHi1620.h       |   43 +
>  .../Hi1620/Hi1620AcpiTables/Hi1620Platform.h  |   27 +
>  .../Hi1620/Hi1620OemConfigUiLib/OemConfig.h   |  142 ++
>  .../Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h |   64 +
>  .../Hi1620/Include/Library/SerdesLib.h        |   85 +
>  .../Hisilicon/Hi1620/Include/PlatformArch.h   |   67 +
>  Silicon/Hisilicon/Hi1620/Pptt/Pptt.h          |   68 +
>  .../Hisilicon/Include/Library/AcpiNextLib.h   |   31 +-
>  .../Hisilicon/Include/Library/HwMemInitLib.h  |  356 +--
>  .../Hisilicon/Include/Library/IpmiCmdLib.h    |   16 +
>  Silicon/Hisilicon/Include/Library/LpcLib.h    |   51 +-
>  .../Include/Library/OemAddressMapLib.h        |    8 +
>  .../Hisilicon/Include/Library/OemConfigData.h |   85 +
>  .../Hisilicon/Include/Library/OemMiscLib.h    |    9 +-
>  Silicon/Hisilicon/Include/Library/OemNicLib.h |   57 +
>  .../Include/Library/PlatformSysCtrlLib.h      |    6 +
>  Silicon/Hisilicon/Include/PlatformArch.h      |   35 -
>  Silicon/Hisilicon/Library/I2CLib/I2CHw.h      |    9 +-
>  .../M41T83RealTimeClock.h                     |  158 ++
>  .../DS3231RealTimeClockLib.c                  |    8 +-
>  .../OemMiscLib2P/BoardFeature2PHi1610.c       |    2 +-
>  .../Library/OemMiscLib2P/OemMiscLib2PHi1610.c |   24 +
>  .../Library/OemMiscLibD05/BoardFeatureD05.c   |    2 +-
>  .../D05/Library/OemMiscLibD05/OemMiscLibD05.c |   27 +-
>  .../OemNicConfig2PHi1620/OemNicConfig2P.c     |   71 +
>  .../SystemFirmwareDescriptorPei.c             |   70 +
>  .../D06/EarlyConfigPeim/EarlyConfigPeimD06.c  |  107 +
>  .../Library/OemMiscLibD06/BoardFeatureD06.c   |  432 ++++
>  .../D06/Library/OemMiscLibD06/OemMiscLibD06.c |  222 ++
>  .../D06/Library/OemNicLib/OemNicLib.c         |  570 +++++
>  .../PciHostBridgeLib/PciHostBridgeLib.c       |  635 ++++++
>  .../Drivers/FlashFvbDxe/FlashFvbDxe.c         |   22 +-
>  .../HisiAcpiPlatformDxe/UpdateAcpiTable.c     |  118 +-
>  .../Smbios/AddSmbiosType9/AddSmbiosType9.c    |   14 +-
>  .../Smbios/MemorySubClassDxe/MemorySubClass.c |   26 +-
>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c  |  108 +
>  .../Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c |   92 +
>  .../Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c |  349 +++
>  .../Hi1620/Drivers/Apei/ErrorSource/Ghes.c    |  330 +++
>  .../Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c |  374 ++++
>  .../Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c |  119 +
>  .../Hi1620/Drivers/Apei/OemApeiHi1620.c       |  337 +++
>  .../Pl011DebugSerialPortInitDxe.c             |   64 +
>  .../Hi1620/Hi1620OemConfigUiLib/OemConfig.c   |  364 +++
>  .../Hi1620PciPlatformLib.c                    |   67 +
>  Silicon/Hisilicon/Hi1620/Pptt/Pptt.c          |  543 +++++
>  .../DS3231RealTimeClockLib.c                  |    8 +-
>  Silicon/Hisilicon/Library/I2CLib/I2CLib.c     |  975 ++++----
>  .../M41T83RealTimeClockLib.c                  |  564 +++++
>  .../PlatformBootManagerLib/PlatformBm.c       |   65 +
>  .../SystemFirmwareUpdateConfig.ini            |   46 +
>  .../SystemFirmwareDescriptor.aslc             |   81 +
>  .../OemMiscLibD06/BoardFeatureD06Strings.uni  |   64 +
>  .../Hi1620/Hi1620AcpiTables/Dsdt/CPU.asl      |  409 ++++
>  .../Hi1620/Hi1620AcpiTables/Dsdt/Com.asl      |   30 +
>  .../Hi1620AcpiTables/Dsdt/DsdtHi1620.asl      |   35 +
>  .../Hi1620AcpiTables/Dsdt/Hi1620Apei.asl      |   93 +
>  .../Hi1620AcpiTables/Dsdt/Hi1620Ged.asl       |   58 +
>  .../Hi1620AcpiTables/Dsdt/Hi1620Mbig.asl      | 1459 ++++++++++++
>  .../Hi1620AcpiTables/Dsdt/Hi1620Mctp.asl      |   41 +
>  .../Hi1620AcpiTables/Dsdt/Hi1620Pci.asl       | 1216 ++++++++++
>  .../Hi1620AcpiTables/Dsdt/Hi1620Power.asl     |   28 +
>  .../Hi1620AcpiTables/Dsdt/Hi1620Rde.asl       |   47 +
>  .../Hi1620AcpiTables/Dsdt/Hi1620Sec.asl       |   57 +
>  .../Dsdt/Hi1620Socip4_i2c100k.asl             |  249 +++
>  .../Dsdt/Hi1620Socip4_i2c400k.asl             |  249 +++
>  .../Hi1620AcpiTables/Dsdt/LpcUart_clk.asl     |   49 +
>  .../Hi1620AcpiTables/Dsdt/Pv680UncorePmu.asl  | 1658 ++++++++++++++
>  .../Hi1620/Hi1620AcpiTables/Dsdt/ipmi.asl     |   49 +
>  .../Hi1620/Hi1620AcpiTables/Facs.aslc         |   67 +
>  .../Hi1620/Hi1620AcpiTables/Fadt.aslc         |   91 +
>  .../Hi1620/Hi1620AcpiTables/Gtdt.aslc         |   86 +
>  .../Hi1620/Hi1620AcpiTables/Hi1620Dbg2.aslc   |   86 +
>  .../Hi1620/Hi1620AcpiTables/Hi1620Iort.asl    | 1989 +++++++++++++++++
>  .../Hi1620AcpiTables/Hi1620IortNoSmmu.asl     | 1736 ++++++++++++++
>  .../Hi1620/Hi1620AcpiTables/Hi1620Mcfg.aslc   |   64 +
>  .../Hi1620/Hi1620AcpiTables/Hi1620Slit.aslc   |   64 +
>  .../Hi1620/Hi1620AcpiTables/Hi1620Spcr.aslc   |   81 +
>  .../Hi1620/Hi1620AcpiTables/Hi1620Srat.aslc   |  166 ++
>  .../Hi1620/Hi1620AcpiTables/MadtHi1620.aslc   |  375 ++++
>  .../Hi1620OemConfigUiLib/MemoryConfig.hfr     |  154 ++
>  .../Hi1620OemConfigUiLib/MemoryConfig.uni     |  103 +
>  .../Hi1620OemConfigUiLib/MiscConfig.hfr       |   48 +
>  .../Hi1620OemConfigUiLib/MiscConfig.uni       |   27 +
>  .../Hi1620OemConfigUiLib/OemConfigUiLib.uni   |   24 +
>  .../OemConfigUiLibStrings.uni                 |   42 +
>  .../Hi1620OemConfigUiLib/OemConfigVfr.Vfr     |   89 +
>  .../Hi1620OemConfigUiLib/PcieConfig.hfr       |  219 ++
>  .../PcieConfigStrings.uni                     |  111 +
>  .../Hi1620OemConfigUiLib/PciePortConfig.hfr   |  167 ++
>  .../Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr |  172 ++
>  .../Hi1620/Hi1620OemConfigUiLib/RasConfig.uni |   85 +
>  .../Hi1620OemConfigUiLib/iBMCConfig.hfr       |   81 +
>  .../Hi1620OemConfigUiLib/iBMCConfig.uni       |   34 +
>  134 files changed, 21578 insertions(+), 970 deletions(-)
>  create mode 100644 Platform/Hisilicon/D06/D06.dec
>  create mode 100644 Platform/Hisilicon/D06/D06.dsc
>  create mode 100644 Platform/Hisilicon/D06/D06.fdf
>  create mode 100644 Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.inf
>  create mode 100644 Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
>  create mode 100644 Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
>  create mode 100644 Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.inf
>  create mode 100644 Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.inf
>  create mode 100644 Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.inf
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.inf
>  create mode 100644 Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.inf
>  create mode 100644 Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
>  create mode 100644 Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.inf
>  create mode 100644 Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig.h
>  create mode 100644 Platform/Hisilicon/D06/Include/Library/CpldD06.h
>  create mode 100644 Silicon/Hisilicon/Hi1610/Include/PlatformArch.h
>  create mode 100644 Silicon/Hisilicon/Hi1616/Include/PlatformArch.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Platform.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUi.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Include/Library/SerdesLib.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Include/PlatformArch.h
>  create mode 100644 Silicon/Hisilicon/Hi1620/Pptt/Pptt.h
>  create mode 100644 Silicon/Hisilicon/Include/Library/OemConfigData.h
>  create mode 100644 Silicon/Hisilicon/Include/Library/OemNicLib.h
>  delete mode 100644 Silicon/Hisilicon/Include/PlatformArch.h
>  create mode 100644 Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClock.h
>  create mode 100644 Platform/Hisilicon/D06/Drivers/OemNicConfig2PHi1620/OemNicConfig2P.c
>  create mode 100644 Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
>  create mode 100644 Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.c
>  create mode 100644 Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06.c
>  create mode 100644 Platform/Hisilicon/D06/Library/OemMiscLibD06/OemMiscLibD06.c
>  create mode 100644 Platform/Hisilicon/D06/Library/OemNicLib/OemNicLib.c
>  create mode 100644 Platform/Hisilicon/D06/Library/PciHostBridgeLib/PciHostBridgeLib.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfig.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Library/Hi1620PciPlatformLib/Hi1620PciPlatformLib.c
>  create mode 100644 Silicon/Hisilicon/Hi1620/Pptt/Pptt.c
>  create mode 100644 Silicon/Hisilicon/Library/M41T83RealTimeClockLib/M41T83RealTimeClockLib.c
>  create mode 100644 Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
>  create mode 100644 Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
>  create mode 100644 Platform/Hisilicon/D06/Library/OemMiscLibD06/BoardFeatureD06Strings.uni
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/CPU.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Com.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/DsdtHi1620.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Apei.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Ged.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mbig.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Mctp.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Pci.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Power.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Rde.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Sec.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c100k.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Hi1620Socip4_i2c400k.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/LpcUart_clk.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/Pv680UncorePmu.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Dsdt/ipmi.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Facs.aslc
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Fadt.aslc
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Gtdt.aslc
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Dbg2.aslc
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Iort.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620IortNoSmmu.asl
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Mcfg.aslc
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Slit.aslc
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Spcr.aslc
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/Hi1620Srat.aslc
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/MadtHi1620.aslc
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.hfr
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MemoryConfig.uni
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.hfr
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/MiscConfig.uni
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLib.uni
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigUiLibStrings.uni
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/OemConfigVfr.Vfr
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfig.hfr
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PcieConfigStrings.uni
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/PciePortConfig.hfr
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.hfr
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/RasConfig.uni
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.hfr
>  create mode 100644 Silicon/Hisilicon/Hi1620/Hi1620OemConfigUiLib/iBMCConfig.uni
> 
> -- 
> 2.17.0
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 34/43] Hisilicon/D06: add apei driver
  2018-08-22 15:31   ` Leif Lindholm
@ 2018-08-23  7:35     ` Ming
  2018-08-23  9:43       ` Leif Lindholm
  0 siblings, 1 reply; 93+ messages in thread
From: Ming @ 2018-08-23  7:35 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Luqi Jiang



On 8/22/2018 11:31 PM, Leif Lindholm wrote:
> On Tue, Aug 14, 2018 at 04:08:54PM +0800, Ming Huang wrote:
>> From: Luqi Jiang <jiangluqi@huawei.com>
>>
>> This driver provide a means for the platform to
>> convey error information to OSPM.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Luqi Jiang <jiangluqi@huawei.com>
>> ---
>>  Platform/Hisilicon/D06/D06.dsc                           |   1 +
>>  Platform/Hisilicon/D06/D06.fdf                           |   1 +
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf           |  64 ++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h             |  41 +++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h        |  43 +++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h        | 146 ++++++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h | 110 ++++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h        | 146 ++++++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h        |  59 +++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h    |  43 +++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c             | 108 ++++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c        |  92 +++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c        | 349 ++++++++++++++++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c | 330 +++++++++++++++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c        | 374 ++++++++++++++++++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c        | 119 +++++++
>>  Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c    | 337 ++++++++++++++++++
>>  17 files changed, 2363 insertions(+)
> 
> OK, so I was a bit terse in my original comment.
> But all of these files need to be named approprietly - with an
> upper-case first letter.
> 
> bert.h ->
> Bert.h
> einj.h ->
> Einj.h
> 
> and so on.
> 
> More comments inline.
> 
>>
>> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
>> index c6de9f04ad..9550e0d497 100644
>> --- a/Platform/Hisilicon/D06/D06.dsc
>> +++ b/Platform/Hisilicon/D06/D06.dsc
>> @@ -340,6 +340,7 @@
>>    Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
>>    Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>>  
>> +  Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
>>    Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
>>    #
>>    # Usb Support
>> diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
>> index bd3ea47226..90379b8558 100644
>> --- a/Platform/Hisilicon/D06/D06.fdf
>> +++ b/Platform/Hisilicon/D06/D06.fdf
>> @@ -251,6 +251,7 @@ READ_LOCK_STATUS   = TRUE
>>  
>>    INF RuleOverride=ACPITABLE Silicon/Hisilicon/Hi1620/Hi1620AcpiTables/AcpiTablesHi1620.inf
>>    INF Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>> +  INF Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
>>  
>>    INF Silicon/Hisilicon/Hi1620/Pptt/Pptt.inf
>>  
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
>> new file mode 100644
>> index 0000000000..7a75968da1
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.inf
>> @@ -0,0 +1,64 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +[defines]
>> +  INF_VERSION                    = 0x0001001A
>> +  BASE_NAME                      = AcpiApei
>> +  FILE_GUID                      = E9570C39-EF68-4fc6-B921-C1954A87CCD2
>> +  MODULE_TYPE                    = DXE_DRIVER
>> +  VERSION_STRING                 = 1.0
>> +  ENTRY_POINT                    = ApeiEntryPoint
>> +
>> +[sources.common]
>> +  Apei.c
>> +  Bert/bert.c
>> +  Bert/bert.h
>> +  Einj/einj.c
>> +  Einj/einj.h
>> +  Erst/erst.c
>> +  Erst/erst.h
>> +  Hest/hest.c
>> +  Hest/hest.h
>> +  ErrorSource/Ghes.c
>> +  ErrorSource/Ghes.h
>> +  OemApeiHi1620.c
>> +
>> +[Packages]
>> +  ArmPkg/ArmPkg.dec
>> +  MdePkg/MdePkg.dec
>> +  Silicon/Hisilicon/HisiPkg.dec
>> +
>> +[LibraryClasses]
>> +  ArmSmcLib
>> +  BaseMemoryLib
>> +  DebugLib
>> +  HobLib
>> +  TimerLib
>> +  UefiDriverEntryPoint
>> +  UefiRuntimeServicesTableLib
>> +
>> +[Guids]
>> +  gOemConfigGuid
>> +
>> +[Protocols]
>> +  gEfiAcpiSdtProtocolGuid
>> +  gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
>> +
>> +[Pcd]
>> +  gHisiTokenSpaceGuid.PcdCpldBaseAddress
>> +  gHisiTokenSpaceGuid.PcdTrustedFirmwareEnable
>> +
>> +[Depex]
>> +  gEfiAcpiTableProtocolGuid AND gEfiAcpiSdtProtocolGuid
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h
>> new file mode 100644
>> index 0000000000..ed8ec417cb
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.h
>> @@ -0,0 +1,41 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +#ifndef _APEI_H_
>> +#define _APEI_H_
>> +
>> +#include <IndustryStandard/Acpi.h>
>> +#include <Protocol/AcpiSystemDescriptionTable.h>
>> +#include <Protocol/AcpiTable.h>
>> +
>> +#define EFI_ACPI_MAX_NUM_TABLES         20
>> +#define PRIVATE_ARM_SMC_ID_APEI         0x83000100
>> +#define PRIVATE_ARM_SMC_ID_APEI_S       0x83000101
>> +
>> +typedef struct {
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *HestCorrectedErrorGhesV2;
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *HestFatalErrorGhesV2;
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *HestRecoverableErrorGhesV2;
>> +  EFI_PHYSICAL_ADDRESS                                            HestTableAddress;
>> +  EFI_PHYSICAL_ADDRESS                                            EinjTableAddress;
>> +  EFI_PHYSICAL_ADDRESS                                            EinjDataStruct;
>> +  VOID                                                            *ErstContext;
>> +} APEI_TRUSTED_FIRMWARE_STRUCTURE;
>> +
>> +extern EFI_ACPI_TABLE_PROTOCOL       *mAcpiTableProtocol;
>> +extern EFI_ACPI_SDT_PROTOCOL         *mAcpiSdtProtocol;
>> +extern APEI_TRUSTED_FIRMWARE_STRUCTURE     *mApeiTrustedfirmwareData;
>> +
>> +
>> +#endif    // _APEI_H_
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h
>> new file mode 100644
>> index 0000000000..36a0c58966
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.h
>> @@ -0,0 +1,43 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#ifndef _BERT_H_
>> +#define _BERT_H_
>> +
>> +#include "Apei.h"
>> +#include <Guid/Cper.h>
>> +
>> +typedef struct _BERT_CONTEXT {
>> +  EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER   *BertHeader;
>> +  VOID                                          *Block;
>> +  UINT32                                        BlockSize;
>> +} BERT_CONTEXT;
>> +
>> +EFI_STATUS
>> +OemInitBertTable (
>> +  IN EFI_HANDLE    ImageHandle
>> +);
>> +VOID
>> +BertSetAcpiTable (
>> +  IN BERT_CONTEXT *Context
>> +);
>> +EFI_STATUS
>> +BertHeaderCreator (
>> +  BERT_CONTEXT  *Context,
>> +  UINT32        ErrorBlockSize
>> +);
>> +
>> +
>> +#endif    // _BERT_H_
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h
>> new file mode 100644
>> index 0000000000..85aa52f450
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.h
>> @@ -0,0 +1,146 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#ifndef _EINJ_H_
>> +#define _EINJ_H_
>> +
>> +#include "Apei.h"
>> +
>> +#define EINJ_ACTION_NO             10
>> +#define EINJ_BEGIN_OPERATION_VALUE 0xFFFF
>> +#define EINJ_END_OPERATION_VALUE   0
>> +#define EINJ_WRITE_MASK            0xFFFFFFFF
>> +#define EINJ_READ_VALUE            0xFFFF
>> +#define EINJ_READ_MASK             0xFFFFFFFF
>> +
>> +#define EINJ_TRIGGER_ERROR_ACTION_NO                                    1
>> +
>> +#define EFI_ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS                       0x08
>> +#define EFI_ACPI_EINJ_GET_EXCUTE_OPERATION_TIMINGS                      0x09
>> +
>> +
>> +extern EFI_ACPI_TABLE_PROTOCOL            *mAcpiTableProtocol;
>> +extern EFI_ACPI_SDT_PROTOCOL              *mAcpiSdtProtocol;
>> +extern APEI_TRUSTED_FIRMWARE_STRUCTURE    *mApeiTrustedfirmwareData;
>> +
>> +//
>> +// Error Type Definition
>> +//
>> +#define EINJ_PROCESSOR_CORRECTABLE                                      BIT0
>> +#define EINJ_PROCESSOR_UNCORRECTABLE_NONFATAL                           BIT1
>> +#define EINJ_PROCESSOR_UNCORRECTABLE_FATAL                              BIT2
>> +#define EINJ_MEMORY_CORRECTABLE                                         BIT3
>> +#define EINJ_MEMORY_UNCORRECTABLE_NONFATAL                              BIT4
>> +#define EINJ_MEMORY_UNCORRECTABLE_FATAL                                 BIT5
>> +#define EINJ_PCIE_CORRECTABLE                                           BIT6
>> +#define EINJ_PCIE_UNCORRECTABLE_NONFATAL                                BIT7
>> +#define EINJ_PCIE_UNCORRECTABLE_FATAL                                   BIT8
>> +#define EINJ_PLATFORM_CORRECTABLE                                       BIT9
>> +#define EINJ_PLATFORM_UNCORRECTABLE_NONFATAL                            BIT10
>> +#define EINJ_PLATFORM_UNCORRECTABLE_FATAL                               BIT11
>> +#define EINJ_VENDOR_DEFINED_ERROR_TYPE                                  BIT31
>> +
>> +#define EINJ_PROCESSOR_APIC_VALID                                       BIT0
>> +#define EINJ_MEMORY_ADDRESS_VALID                                       BIT1
>> +#define EINJ_PCIE_SBDF_VALID                                            BIT2
>> +
>> +///
>> +/// EINJ Table
>> +///
>> +typedef struct {
>> +  EFI_ACPI_6_0_ERROR_INJECTION_TABLE_HEADER        EinjTableHeader;
>> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY    EinjInstructionEntry[EINJ_ACTION_NO];
>> +} EINJ_TABLE;
>> +
>> +typedef struct {
>> +  EFI_ACPI_6_0_EINJ_TRIGGER_ACTION_TABLE           TriggerErrorHeader;
>> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY    ErrorInstructionEntry[EINJ_TRIGGER_ERROR_ACTION_NO];
>> +} EINJ_TRIGGER_ERROR_ACTION;
>> +
>> +typedef struct {
>> +  UINT32 Reserved: 8;
>> +  UINT32 Function: 3;
>> +  UINT32 Device: 5;
>> +  UINT32 PrimaryOrDeviceBus: 8;
>> +  UINT32 Segment: 8;
>> +} EINJ_PCIE_SBDF;
>> +
>> +typedef struct {
>> +  UINT32         ErrorType;
>> +  UINT32         VendorErrorTypeOffset;
>> +  UINT32         Flags;
>> +  UINT32         ApicId;
>> +  UINT64         MemAddress;
>> +  UINT64         MemAddressRange;
>> +  EINJ_PCIE_SBDF PcieSBDF;
>> +} EINJ_SET_ERROR_TYPE_WITH_ADDRESS;
>> +
>> +typedef struct {
>> +  UINT32 Length;
>> +  UINT32 SBDF;
>> +  UINT16 VendorId;
>> +  UINT16 DeviceId;
>> +  UINT8  RevId;
>> +  UINT8  Reserved[3];
>> +} EINJ_VENDOR_ERROR_TYPE;
>> +
>> +typedef struct {
>> +  UINT64                           OperationBegin;
>> +  UINT64                           ErrorType;
>> +  UINT64                           ErrorCapabilities;
>> +  UINT64                           BusyStatus;
>> +  UINT64                           CommandStatus;
>> +  UINT64                           Timming;
> 
> Is this a typo for "Timing"?

Yes, change to Timing in v4.

> 
>> +  EINJ_TRIGGER_ERROR_ACTION        *TriggerErrorActionTablePtr;
>> +  EINJ_SET_ERROR_TYPE_WITH_ADDRESS ErrorTypeWithAddress;
>> +  EINJ_VENDOR_ERROR_TYPE           VendorErrorTypeExtension;
>> +  EINJ_TRIGGER_ERROR_ACTION        TriggerErrorActionTable;
>> +} EINJ_DATA_STRUCTURE;
>> +
>> +// V2
>> +typedef struct _EINJ_CONTEXT {
>> +  EINJ_TABLE                                    *EINJ;
>> +  EINJ_DATA_STRUCTURE                           *EinjData;
>> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY *GetErrorTypeEntry;
>> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY *ExecuteOperationEntry;
>> +} EINJ_CONTEXT;
>> +
>> +
>> +EFI_STATUS
>> +InitEinjTable(VOID);
>> +// Version2
>> +EFI_STATUS
>> +EinjConfigErrorInjectCapability(
>> +  EINJ_CONTEXT  *Context,
>> +  UINT32        BitsSupportedErrorType
>> +);
>> +EFI_STATUS
>> +EinjHeaderCreator(
>> +  EINJ_CONTEXT  *Context
>> +);
>> +/***OEM***/
>> +EFI_STATUS
>> +OemInitEinjTable(VOID);
>> +EFI_STATUS
>> +OemEinjConfigExecuteOperationEntry(
>> +  EINJ_CONTEXT *Context
>> +);
>> +VOID
>> +EinjSetAcpiTable(
>> +  EINJ_CONTEXT *Context
>> +);
>> +
>> +
>> +#endif    // _EINJ_H_
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h
>> new file mode 100644
>> index 0000000000..44cd1f9577
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.h
>> @@ -0,0 +1,110 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#ifndef GENERIC_HARDWARE_ERROR_SOURCE
>> +#define GENERIC_HARDWARE_ERROR_SOURCE
>> +#include "Apei.h"
>> +
>> +
>> +typedef struct {
>> +  UINT64 AckRegister;
>> +  UINT64 ErrorStatusBlockAddress;
>> +} GHES_REGISTER;
>> +
>> +typedef enum {
>> +  PROCESSOR_GENERIC   = 0,
>> +  PROCESSOR_IA32_X64  = 1,
>> +  PROCESSOR_IPF       = 2,
>> +  PROCESSOR_ARM       = 3,
>> +  PLATFORM_MEMORY     = 4,
>> +  PLATFORM_MEMORY2    = 5,
>> +  PCIE_EXPRESS        = 6,
>> +  FIRMWARE_ERROR      = 7,
>> +  PCI_BUS             = 8,
>> +  PCI_COMPONENT       = 9
>> +} EFI_CPER_SECTION_TYPE;
>> +typedef enum {
>> +  RECOVERABLE = 0,
>> +  FATAL = 1,
>> +  CORRECTED = 2,
>> +  NONE = 3
>> +} ERROR_SEVERITY;
>> +
>> +EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE*
>> +ErrorBlockInitial(
>> +  VOID   *Block,
>> +  UINT32 Severity
>> +);
>> +BOOLEAN ErrorBlockAddErrorData (
>> +  IN VOID                  *ErrorBlock,
>> +  IN UINT32                MaxBlockLength,
>> +  IN EFI_CPER_SECTION_TYPE TypeOfErrorData,
>> +  IN VOID                  *GenericErrorData,
>> +  IN UINT32                SizeOfGenericErrorData,
>> +  IN ERROR_SEVERITY        ErrorSeverity,
>> +  IN BOOLEAN               Correctable
>> +);
>> +BOOLEAN ErrorBlockAddErrorData (
>> +  IN VOID                  *ErrorBlock,
>> +  IN UINT32                MaxBlockLength,
>> +  IN EFI_CPER_SECTION_TYPE TypeOfErrorData,
>> +  IN VOID                  *GenericErrorData,
>> +  IN UINT32                SizeOfGenericErrorData,
>> +  IN ERROR_SEVERITY        ErrorSeverity,
>> +  IN BOOLEAN               Correctable
>> +);
>> +
>> +VOID
>> +GhesV2Initial (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *GhesV2,
>> +  UINT32                                                          BlockLength
>> +);
>> +
>> +/**
>> +@param type - one of HARDWARE_ERROR_NOTIFICATION Type, GSIV For ARM,and SCI for X86,
>> +              Notice: Windows OS hadn't support to GSIV, 20171026
>> +*/
>> +VOID
>> +GhesV2AddNotification (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *This,
>> +  UINT8                                                           Type
>> +);
>> +
>> +
>> +EFI_STATUS
>> +GhesV2LinkErrorBlock (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *GhesV2,
>> +  GHES_REGISTER                                                  *Register,
>> +  VOID                                                           *ErrorBlock
>> +);
>> +VOID
>> +GhesV1Initial (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *GhesV1,
>> +  UINT32                                               BlockLength
>> +);
>> +VOID
>> +GhesV1AddNotification (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
>> +  UINT8                                                Type
>> +);
>> +EFI_STATUS
>> +GhesV1LinkErrorBlock (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
>> +  UINT64                                               *ptrBlockAddress,
>> +  VOID                                                 *ErrorBlock
>> +);
>> +
>> +
>> +#endif
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h
>> new file mode 100644
>> index 0000000000..ca43c83fa0
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.h
>> @@ -0,0 +1,146 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#ifndef _ERST_H_
>> +#define _ERST_H_
>> +
>> +#include "Apei.h"
>> +
>> +#define ERST_STATUS_SUCCESS                 EFI_ACPI_6_1_ERST_STATUS_SUCCESS
>> +#define ERST_STATUS_NOT_ENOUGH_SPACE        EFI_ACPI_6_1_ERST_STATUS_NOT_ENOUGH_SPACE
>> +#define ERST_STATUS_HARDWARE_NOT_AVAILABLE  EFI_ACPI_6_1_ERST_STATUS_HARDWARE_NOT_AVAILABLE
>> +#define ERST_STATUS_FAILED                  EFI_ACPI_6_1_ERST_STATUS_FAILED
>> +#define ERST_STATUS_RECORD_STORE_EMPTY      EFI_ACPI_6_1_ERST_STATUS_RECORD_STORE_EMPTY
>> +#define ERST_STATUS_RECORD_NOT_FOUND        EFI_ACPI_6_1_ERST_STATUS_RECORD_NOT_FOUND
>> +
>> +#define ERST_BEGIN_WRITE_VALUE              0x01
>> +#define ERST_BEGIN_WRITE_MASK               0xFFFFFFFFFFFFFFFF
>> +#define ERST_BEGIN_READ_VALUE               0x02
>> +#define ERST_BEGIN_READ_MASK                0xFFFFFFFFFFFFFFFF
>> +#define ERST_BEGIN_CLEAR_VALUE              0x03
>> +#define ERST_BEGIN_CLEAR_MASK               0xFFFFFFFFFFFFFFFF
>> +#define ERST_END_OPERATION_VALUE            0x04
>> +#define ERST_END_OPERATION_MASK             0xFFFFFFFFFFFFFFFF
>> +#define ERST_MASK                           0xFFFFFFFFFFFFFFFF
>> +
>> +#define ERST_BEGIN_WRITE_OPERATION          EFI_ACPI_6_1_ERST_BEGIN_WRITE_OPERATION
>> +#define ERST_BEGIN_READ_OPERATION           EFI_ACPI_6_1_ERST_BEGIN_READ_OPERATION
>> +#define ERST_BEGIN_CLEAR_OPERATION          EFI_ACPI_6_1_ERST_BEGIN_CLEAR_OPERATION
>> +#define ERST_END_OPERATION                  EFI_ACPI_6_1_ERST_END_OPERATION
>> +#define ERST_BEGIN_DUMMY_WRITE_OPERATION    EFI_ACPI_6_1_ERST_BEGIN_DUMMY_WRITE_OPERATION
>> +
>> +#define ERST_ACTION_NO                      16
>> +
>> +#define ERST_RECORD_FREE                    0x00
>> +#define ERST_RECORD_INUSE                   0x01
>> +
>> +#define ERST_RECORD_STORE_IN_NVRAM          0
>> +#define ERST_RECORD_STORE_IN_MEM            1
>> +#define ERST_RECORD_STORE_IN_SPI_FLASH      2
>> +
>> +#define ERST_LOG_ATTR_NVRAM                 0x02
>> +
>> +typedef struct {
>> +  UINT64 OperationId;
>> +  UINT64 RecordOffset;
>> +  UINT64 BusyStatus;
>> +  UINT64 CommandStatus;
>> +  UINT64 GetRecordId;
>> +  UINT64 SetRecordId;
>> +  UINT64 RecordCount;
>> +  UINT64 DummyWrite;
>> +  UINT64 Reserved;
>> +  UINT64 ErrorLogAddrRange;
>> +  UINT64 ErrorLogAddrRangeLength;
>> +  UINT64 ErrorLogAttributes;
>> +  UINT64 NvRamLogAddrNext;
>> +  UINT64 NvRamLogSizeRemain;
>> +} ERST_DATA_STRUCTURE;
>> +
>> +typedef struct {
>> +  UINT16 Signature;
>> +  UINT16 Data0;
>> +  UINT16 Data1;
>> +  UINT8  Data2;
>> +  UINT8  Attributes; //0: free
>> +} ERST_ERROR_RECORD_INFO;
>> +
>> +///
>> +/// ERST Table
>> +///
>> +
>> +
>> +
>> +typedef struct _ERST_CONTEXT {
>> +  UINT64 Operation;                  // WRITE,READ,CLEAR,END,
>> +  UINT64 DummyWrite;                 //DUMMY_WRITE_OPEATION
>> +  UINT64 RecordOffset;               // Offset form the buffer(error log  adress range)
>> +  UINT32 BusyStatus;
>> +  UINT32 CommandStatus;
>> +  UINT64 KeyRecordId;                //OS Set the Record ID To Read/Write/Search
>> +  UINT64 MaxTimeOfExecuteOperation;
>> +  UINT64 RecordCount;                // Num of Record In NVRAM
>> +  UINT64 ErrorLogAddressRange;       // Address Of Range Top
>> +  UINT64 ErrorLogAddressRangeLength; // Address Of Range Top
>> +  UINT64 ErrorLogAttributes;
>> +  VOID   *NvRamLogAddrRange;
>> +  UINT64 NvRamLogAddrRangeLength;
>> +  UINT64 NvRamRecordOffset;
>> +  UINT64 NvRamNextVallidRecordId;    //Get RecordId entry
>> +  UINT64 NvRamNextValidRecordOffset;
>> +  UINT64 NvRamAllRecordLength;
>> +} ERST_RT_CONTEXT;
>> +
>> +typedef struct _ERST_BOOT_CONTEXT {
>> +  EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER *ErstHeader;
>> +  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY    *ExecuteOperationEntry;
>> +  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY    *GetErrorLogAddrRangeAttributes;
>> +  ERST_RT_CONTEXT                                      *Rt;
>> +} ERST_BOOT_CONTEXT;
>> +
>> +extern EFI_ACPI_TABLE_PROTOCOL              *mAcpiTableProtocol;
>> +extern APEI_TRUSTED_FIRMWARE_STRUCTURE      *mApeiTrustedfirmwareData;
>> +
>> +EFI_STATUS
>> +ErstHeaderCreator(
>> +  ERST_BOOT_CONTEXT  *Context,
>> +  UINT64             BufferSize,//ERST_DATASTORE_SIZE
>> +  VOID               *NvRamAddrRange,
>> +  UINT64             NvRamAllRecordLength,
>> +  UINT64             NvRamAddrRangeLength
>> +);
>> +
>> +VOID
>> +SetAttributeOfErrorLogAddressRange (
>> +  ERST_BOOT_CONTEXT  *Context,
>> +  UINT64             Attribute
>> +);
> 
> The definition of this function has been deleted, so please delete the
> declaration as well.
> 
>> +
>> +/***OEM***/
>> +EFI_STATUS
>> +OemInitErstTable (VOID);
>> +
>> +EFI_STATUS
>> +OemErstConfigExecuteOperationEntry (
>> +  ERST_BOOT_CONTEXT *Context
>> +);
>> +
>> +VOID
>> +ErstSetAcpiTable (
>> +  ERST_BOOT_CONTEXT *Context
>> +);
>> +
>> +
>> +#endif    // _ERST_H_
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h
>> new file mode 100644
>> index 0000000000..94f66496e6
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.h
>> @@ -0,0 +1,59 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#ifndef _HEST_H_
>> +#define _HEST_H_
>> +
>> +#include "Apei.h"
>> +
>> +
>> +typedef struct _HEST_CONTEXT {
>> +  EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER  *HestHeader;         // pointer to hest header
>> +  UINT32                                           OccupiedMemorySize; // allocated memory size for hest
>> +  VOID                                             *KeyErrorSource;     // key error source, valtile
>> +} HEST_CONTEXT;
>> +
>> +EFI_STATUS
>> +HestAddErrorSourceDescriptor (
>> +  IN OUT HEST_CONTEXT  *Context,
>> +  IN VOID              *ErrorSourceDescriptor,
>> +  IN UINT32            SizeOfDescriptor
>> +);
>> +VOID
>> +HestSetAcpiTable (
>> +  IN HEST_CONTEXT *Context
>> +);
>> +EFI_STATUS
>> +HestHeaderCreator (
>> +  HEST_CONTEXT  *Context,
>> +  UINT32        PreAllocatedHestSize
>> +);
>> +
>> +/**
>> +* OEM Interface declaration
>> +* 1.Interface is not realized default
>> +* 2.OEM should implement this interface
>> +*/
>> +extern
>> +VOID
>> +OemHestInitialNotification (VOID);
>> +
>> +extern
>> +EFI_STATUS
>> +OemInitHestTable(
>> +  IN EFI_HANDLE ImageHandle
>> +);
>> +
>> +#endif    // _HEST_H_
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h
>> new file mode 100644
>> index 0000000000..e6fb386a62
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.h
>> @@ -0,0 +1,43 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#ifndef OEM_APEI_HI1620_H_H
>> +#define OEM_APEI_HI1620_H_H
>> +#define GPIO0_BASE             0x94100000
>> +#define GPIO1_BASE             0x94110000
>> +#define GPIO_INT_MASK          0x34
>> +#define GPIO_INT_EN            0x30
>> +#define GPIO_SWPORT_DDR        0x04
>> +#define GPIO_INT_TYPE          0x38
>> +#define GPIO_INT_POLARITY      0x3c
>> +#define GPIO_LS_SYNC           0x60
>> +#define GPIO_INT_COMB          0xffc
>> +#define IOMUX_REG_BASE         0x94190000
>> +#define IOMG051                0xCC
>> +#define IOMG052                0xD0
>> +#define PAD_EX_INT1            0x4
>> +#define CPLD_GPIO10_INT_OFFSET 0xfc
>> +#define CPLD_BASE_ADDR         0x80000000
>> +#define CPLD_MASK              0x01030000
>> +#define CPLD_VALUE             0x01020000
>> +
>> +#define MAX_GHES                          3
>> +#define GENERIC_HARDWARE_ERROR_BLOCK_SIZE 0x1000
>> +#define HEST_TABLE_SIZE                   0x2000
>> +#define BOOT_ERROR_REGION_SIZE            0x1000
>> +#define GPIO_HEST_NOTIFIED_PIN            BIT8
>> +
>> +#define ERST_DATASTORE_SIZE               0x2000
>> +#endif
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c
>> new file mode 100644
>> index 0000000000..8769d88bff
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Apei.c
>> @@ -0,0 +1,108 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +#include <Library/ArmSmcLib.h>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/IoLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include <Library/OemConfigData.h>
>> +#include <Library/UefiBootServicesTableLib.h>
>> +#include <Library/UefiLib.h>
>> +#include <Library/UefiRuntimeServicesTableLib.h>
>> +#include "Apei.h"
>> +#include "PlatformArch.h"
> 
> Please use <PlatformArch.h> to avoid is looking like there is a
> separate copy in the same directory as this source file.
> Applies throughout this patch.
> 
>> +#include "bert.h"
>> +#include "einj.h"
>> +#include "erst.h"
>> +#include "hest.h"
>> +
>> +EFI_ACPI_TABLE_PROTOCOL        *mAcpiTableProtocol = NULL;
>> +EFI_ACPI_SDT_PROTOCOL          *mAcpiSdtProtocol = NULL;
>> +APEI_TRUSTED_FIRMWARE_STRUCTURE      *mApeiTrustedfirmwareData;
>> +
>> +EFI_STATUS
>> +EFIAPI
>> +ApeiEntryPoint (
>> +  IN EFI_HANDLE          ImageHandle,
>> +  IN EFI_SYSTEM_TABLE    *SystemTable
>> +)
>> +{
>> +  EFI_STATUS              Status;
>> +  ARM_SMC_ARGS            SmcRegs = {0};
>> +  UINTN                   Size = sizeof (OEM_CONFIG_DATA);
>> +  OEM_CONFIG_DATA         SetupData;
>> +
>> +  Status = gRT->GetVariable (
>> +             OEM_CONFIG_NAME,
>> +             &gOemConfigGuid,
>> +             NULL,
>> +             &Size,
>> +             &SetupData
>> +             );
>> +  if (EFI_ERROR (Status)) {
>> +    SetupData.EnRasSupport = 1;
>> +    DEBUG ((DEBUG_ERROR, "[%a]GetVariable %r.Get default variable value\n",
>> +      __FUNCTION__, Status));
>> +  }
>> +  if (!SetupData.EnRasSupport) {
>> +    return EFI_ABORTED;
>> +  }
>> +  if (PcdGet64 (PcdTrustedFirmwareEnable) == 0) {
>> +    return EFI_ABORTED;
>> +  }
>> +  Status = gBS->LocateProtocol (
>> +                  &gEfiAcpiTableProtocolGuid,
>> +                  NULL,
>> +                  (VOID**)&mAcpiTableProtocol);
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  Status = gBS->LocateProtocol (
>> +                &gEfiAcpiSdtProtocolGuid,
>> +                NULL,
>> +                (VOID**)&mAcpiSdtProtocol);
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  Status = gBS->AllocatePool (
>> +             EfiReservedMemoryType,
>> +             sizeof (APEI_TRUSTED_FIRMWARE_STRUCTURE),
>> +             (VOID**)&mApeiTrustedfirmwareData
>> +           );
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  gBS->SetMem (
>> +    mApeiTrustedfirmwareData,
>> +    sizeof (APEI_TRUSTED_FIRMWARE_STRUCTURE),
>> +    0
>> +  );
>> +  Status = EFI_SUCCESS;
>> +  Status |= OemInitBertTable (ImageHandle);
>> +  Status |= OemInitHestTable (ImageHandle);
>> +  Status |= OemInitErstTable ();
>> +  Status |= OemInitEinjTable ();
>> +  // smc call
>> +  DEBUG ((DEBUG_INFO, "[%a]:[%dL]: %r\n", __FUNCTION__, __LINE__, Status));
>> +  if (Status == EFI_SUCCESS) {
>> +    SmcRegs.Arg0 = PRIVATE_ARM_SMC_ID_APEI;
>> +    SmcRegs.Arg1 = (UINTN)mApeiTrustedfirmwareData;
>> +    ArmCallSmc (&SmcRegs);
>> +  }
>> +  DEBUG ((DEBUG_INFO, "Acpi Apei init done.\n"));
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c
>> new file mode 100644
>> index 0000000000..2953e22690
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Bert/bert.c
>> @@ -0,0 +1,92 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#include "bert.h"
>> +#include "ErrorSource/Ghes.h"
>> +#include <Library/BaseLib.h>
>> +#include <Library/BaseMemoryLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include "PlatformArch.h"
>> +
>> +VOID
>> +BertSetAcpiTable (
>> +  IN BERT_CONTEXT *Context
>> +)
>> +{
>> +  UINTN          AcpiTableHandle;
>> +  EFI_STATUS     Status;
>> +  if (Context == NULL) {
>> +    return;
>> +  }
>> +  EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER* Bert = Context->BertHeader;
>> +  Bert->Header.Checksum = CalculateCheckSum8 ((UINT8*)(Bert), Bert->Header.Length);
>> +  AcpiTableHandle = 0;
>> +  Status = mAcpiTableProtocol->InstallAcpiTable (
>> +                                 mAcpiTableProtocol,
>> +                                 Bert,
>> +                                 Bert->Header.Length,
>> +                                 &AcpiTableHandle);
>> +  ASSERT_EFI_ERROR (Status);
>> +  return;
>> +}
>> +
>> +BOOLEAN
>> +BertAddGenericErrorData (
>> +  IN EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER *Bert,
>> +  IN EFI_CPER_SECTION_TYPE                       TypeOfErrorData,
>> +  IN VOID                                        *GenericErrorData,
>> +  IN UINT32                                      SizeOfGenericErrorData,
>> +  IN ERROR_SEVERITY                              ErrorSeverity,
>> +  IN BOOLEAN                                     Correctable
>> +)
>> +{
>> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: \n", __FUNCTION__, __LINE__));
> 
> Isn't this adding error data for somewhere else?
> If so, shouldn't that be giving an error message?
> This one amounts to "I'm logging that there was an error somewhere".

I want to drop this DEBUG line. Is that ok?

> 
>> +  BOOLEAN Status = ErrorBlockAddErrorData (
>> +                     (VOID*)Bert->BootErrorRegion,
>> +                     Bert->BootErrorRegionLength,
>> +                     TypeOfErrorData,
>> +                     GenericErrorData,
>> +                     SizeOfGenericErrorData,
>> +                     ErrorSeverity,
>> +                     Correctable);
>> +  return Status;
>> +}
>> +
>> +EFI_STATUS
>> +BertHeaderCreator (
>> +  IN BERT_CONTEXT  *Context,
>> +  IN UINT32        ErrorBlockSize
>> +)
>> +{
>> +  if (Context == NULL) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +  Context->BertHeader = AllocateZeroPool (sizeof (EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER));
>> +  Context->Block = AllocateReservedZeroPool (ErrorBlockSize);
>> +  Context->BlockSize = ErrorBlockSize;
>> +  *Context->BertHeader = (EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER) {
>> +    ARM_ACPI_HEADER (
>> +      EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_SIGNATURE,
>> +      EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER,
>> +      EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_REVISION
>> +      ),
>> +    Context->BlockSize,
>> +    (UINT64)Context->Block
>> +  };
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c
>> new file mode 100644
>> index 0000000000..c53f4cdb3c
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Einj/einj.c
>> @@ -0,0 +1,349 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +#include "einj.h"
>> +#include <IndustryStandard/Acpi62.h>
>> +#include <Library/BaseLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include <Library/UefiBootServicesTableLib.h>
>> +#include "OemApeiHi1620.h"
>> +#include "PlatformArch.h"
>> +
>> +
>> +EINJ_TABLE mEinj = {
>> +  {
>> +    ARM_ACPI_HEADER (
>> +      EFI_ACPI_6_0_ERROR_INJECTION_TABLE_SIGNATURE,
>> +      EFI_ACPI_6_0_ERROR_INJECTION_TABLE_HEADER,
>> +      EFI_ACPI_6_0_ERROR_INJECTION_TABLE_REVISION
>> +    ),
>> +    sizeof (EFI_ACPI_6_0_ERROR_INJECTION_TABLE_HEADER),
>> +    0x0,
>> +    {
>> +      0x0,
>> +      0x0,
>> +      0x0
>> +    },
>> +    EINJ_ACTION_NO
>> +  },
>> +  {
>> +    {
>> +      // 0 EFI_ACPI_6_0_EINJ_BEGIN_INJECTION_OPERATION
>> +      EFI_ACPI_6_0_EINJ_BEGIN_INJECTION_OPERATION,
>> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER_VALUE,
>> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      EINJ_BEGIN_OPERATION_VALUE,
>> +      EINJ_WRITE_MASK
>> +    },
>> +    {
>> +      // 1 EFI_ACPI_6_0_EINJ_GET_TRIGGER_ERROR_ACTION_TABLE
>> +      EFI_ACPI_6_0_EINJ_GET_TRIGGER_ERROR_ACTION_TABLE,
>> +      EFI_ACPI_6_0_EINJ_READ_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      EINJ_READ_MASK
>> +    },
>> +    {
>> +      // 2 EFI_ACPI_6_0_EINJ_SET_ERROR_TYPE
>> +      EFI_ACPI_6_0_EINJ_SET_ERROR_TYPE,
>> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER,
>> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      EINJ_WRITE_MASK
>> +    },
>> +    {
>> +      // 3 EFI_ACPI_6_0_EINJ_GET_ERROR_TYPE
>> +      EFI_ACPI_6_0_EINJ_GET_ERROR_TYPE,
>> +      EFI_ACPI_6_0_EINJ_READ_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      0xFFFFFFFF
>> +    },
>> +    {
>> +      // 4 EFI_ACPI_6_0_EINJ_END_OPERATION
>> +      EFI_ACPI_6_0_EINJ_END_OPERATION,
>> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER_VALUE,
>> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      EINJ_END_OPERATION_VALUE,
>> +      0xFFFFFFFF
>> +    },
>> +    {
>> +      // 5 EFI_ACPI_6_0_EINJ_EXECUTE_OPERATION
>> +      EFI_ACPI_6_0_EINJ_EXECUTE_OPERATION,
>> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER_VALUE,
>> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        32,
>> +        0,
>> +        EFI_ACPI_6_0_DWORD,
>> +        GPIO1_BASE + GPIO_INT_MASK //0x40070008//0x4d000F00//GPIO0_BASE + GPIO0_SWPORT_DR_OFFSET
>> +      },
>> +      0,
>> +      0xFFFFFFFF //BIT0
>> +    },
>> +    {
>> +      // 6 EFI_ACPI_6_0_EINJ_CHECK_BUSY_STATUS
>> +      EFI_ACPI_6_0_EINJ_CHECK_BUSY_STATUS,
>> +      EFI_ACPI_6_0_EINJ_READ_REGISTER_VALUE,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0x01,
>> +      0x01
>> +    },
>> +    {
>> +      // 7 EFI_ACPI_6_0_EINJ_GET_COMMAND_STATUS
>> +      EFI_ACPI_6_0_EINJ_GET_COMMAND_STATUS,
>> +      EFI_ACPI_6_0_EINJ_READ_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      0x3
>> +    },
>> +    {
>> +      // 8 EFI_ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS
>> +      EFI_ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS,
>> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER,
>> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      0xFFFFFF
>> +    },
>> +    {
>> +      // 9 EFI_ACPI_EINJ_GET_EXCUTE_OPERATION_TIMINGS
>> +      EFI_ACPI_EINJ_GET_EXCUTE_OPERATION_TIMINGS,
>> +      EFI_ACPI_6_0_EINJ_WRITE_REGISTER,
>> +      EFI_ACPI_6_0_EINJ_PRESERVE_REGISTER,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      0xFFFFFF
>> +    }
>> +  }
>> +};
>> +
>> +EINJ_TRIGGER_ERROR_ACTION mEinjTriggerErrorAction = {
>> +  {
>> +    sizeof (EFI_ACPI_6_0_EINJ_TRIGGER_ACTION_TABLE),
>> +    0,
>> +    sizeof (EINJ_TRIGGER_ERROR_ACTION),
>> +    EINJ_TRIGGER_ERROR_ACTION_NO
>> +  },
>> +  {
>> +    {
>> +      EFI_ACPI_6_0_EINJ_TRIGGER_ERROR,
>> +      EFI_ACPI_6_0_EINJ_NOOP,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_DWORD,
>> +        0
>> +      },
>> +      0,
>> +      0
>> +    }
>> +  }
>> +};
>> +
>> +
>> +VOID
>> +EinjSetAcpiTable (
>> +  EINJ_CONTEXT *Context
>> +)
>> +{
>> +  UINTN                   AcpiTableHandle;
>> +  EFI_STATUS              Status;
>> +  UINT8                   Checksum;
>> +  EFI_ACPI_SDT_HEADER     *Table;
>> +  EFI_ACPI_TABLE_VERSION  TableVersion;
>> +  UINTN                   TableKey;
>> +  UINTN                   i;
>> +
>> +  Context->EINJ->EinjTableHeader.Header.Length = sizeof (EINJ_TABLE);
>> +  Checksum = CalculateCheckSum8 (
>> +               (UINT8*)(Context->EINJ),
>> +               Context->EINJ->EinjTableHeader.Header.Length);
>> +  Context->EINJ->EinjTableHeader.Header.Checksum = Checksum;
>> +  AcpiTableHandle = 0;
>> +  Status = mAcpiTableProtocol->InstallAcpiTable (
>> +             mAcpiTableProtocol,
>> +             Context->EINJ,
>> +             Context->EINJ->EinjTableHeader.Header.Length,
>> +             &AcpiTableHandle
>> +           );
>> +  for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) {
>> +    Status = mAcpiSdtProtocol->GetAcpiTable (i, &Table, &TableVersion, &TableKey);
>> +    if (EFI_ERROR (Status)) {
>> +      break;
>> +    }
>> +    if (Table->Signature != EFI_ACPI_6_0_ERROR_INJECTION_TABLE_SIGNATURE) {
>> +      continue;
>> +    }
>> +    mApeiTrustedfirmwareData->EinjTableAddress = (EFI_PHYSICAL_ADDRESS)Table;
>> +    mApeiTrustedfirmwareData->EinjDataStruct = (EFI_PHYSICAL_ADDRESS)Context->EinjData;
>> +  }
>> +  ASSERT_EFI_ERROR (Status) ;
>> +}
>> +//V2
>> +EFI_STATUS
>> +EinjHeaderCreator (
>> +  EINJ_CONTEXT *Context
>> +)
>> +{
>> +  EFI_STATUS           Status;
>> +  EINJ_DATA_STRUCTURE  *EinjData = NULL;
>> +  Status = gBS->AllocatePool (
>> +             EfiReservedMemoryType,
>> +             sizeof (EINJ_DATA_STRUCTURE),
>> +             (VOID**)&EinjData
>> +           );
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  gBS->SetMem (
>> +    EinjData,
>> +    sizeof (EINJ_DATA_STRUCTURE),
>> +    0
>> +  );
>> +
>> +  DEBUG ((DEBUG_INFO, "EINJ EinjData is at 0x%X,size =0x%x\n",
>> +          EinjData, sizeof (EINJ_DATA_STRUCTURE)));
>> +  EinjData->TriggerErrorActionTablePtr =
>> +    (EINJ_TRIGGER_ERROR_ACTION*)(&(EinjData->TriggerErrorActionTable));
>> +  gBS->CopyMem (
>> +         EinjData->TriggerErrorActionTablePtr,
>> +         &mEinjTriggerErrorAction,
>> +         sizeof (EINJ_TRIGGER_ERROR_ACTION));
>> +  EinjData->OperationBegin = 0;
>> +  EinjData->ErrorType = 0;
>> +  EinjData->ErrorCapabilities = 0xFFF;
>> +  EinjData->BusyStatus = 0;
>> +  EinjData->CommandStatus = 0;
>> +  mEinj.EinjInstructionEntry[0].RegisterRegion.Address =
>> +    (UINT64)(&(EinjData->OperationBegin));
>> +  mEinj.EinjInstructionEntry[1].RegisterRegion.Address =
>> +    (UINT64)(&(EinjData->TriggerErrorActionTablePtr));
>> +  mEinj.EinjInstructionEntry[2].RegisterRegion.Address =
>> +    (UINT64)(&(EinjData->ErrorType));
>> +  mEinj.EinjInstructionEntry[3].RegisterRegion.Address =
>> +    (UINT64)(&(EinjData->ErrorCapabilities));
>> +  mEinj.EinjInstructionEntry[4].RegisterRegion.Address =
>> +    (UINT64)(&(EinjData->OperationBegin));
>> +  mEinj.EinjInstructionEntry[6].RegisterRegion.Address =
>> +    (UINT64)(&(EinjData->BusyStatus));
>> +  mEinj.EinjInstructionEntry[7].RegisterRegion.Address =
>> +    (UINT64)(&(EinjData->CommandStatus));
>> +  mEinj.EinjInstructionEntry[8].RegisterRegion.Address =
>> +    (UINT64)(&(EinjData->ErrorTypeWithAddress));
>> +  mEinj.EinjInstructionEntry[9].RegisterRegion.Address =
>> +    (UINT64)(&(EinjData->Timming));
>> +  EinjData->ErrorTypeWithAddress.VendorErrorTypeOffset =
>> +    (UINT32)((UINTN)&(EinjData->VendorErrorTypeExtension) -
>> +    (UINTN)&(EinjData->ErrorTypeWithAddress));
>> +  Context->EinjData = EinjData;
>> +  Context->EINJ = &mEinj;
>> +  Context->ExecuteOperationEntry = &mEinj.EinjInstructionEntry[5];
>> +  Context->GetErrorTypeEntry = &mEinj.EinjInstructionEntry[3];
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +
>> +EFI_STATUS
>> +EinjConfigErrorInjectCapability (
>> +  EINJ_CONTEXT* Context,
>> +  UINT32        BitsSupportedErrorType
>> +)
>> +{
>> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY* KeyEntry;
>> +  UINT32*                                        EinjCapablity;
>> +
>> +  KeyEntry = Context->GetErrorTypeEntry;
>> +  EinjCapablity = (UINT32*)KeyEntry->RegisterRegion.Address;
>> +  *EinjCapablity = BitsSupportedErrorType;
>> +  KeyEntry->Value = BitsSupportedErrorType;
>> +  return EFI_SUCCESS;
>> +}
>> +
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c
>> new file mode 100644
>> index 0000000000..6d69b90e9b
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/ErrorSource/Ghes.c
>> @@ -0,0 +1,330 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#include <Guid/Cper.h>
>> +#include "Ghes.h"
>> +#include <Library/DebugLib.h>
>> +#include <Library/UefiBootServicesTableLib.h>
>> +
>> +#define READ_ACK_PRESERVE 0xFFFFFFFE
>> +#define READ_ACK_WRITE 0x1
>> +
>> +EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE*
>> +ErrorBlockInitial (
>> +  VOID   *Block,
>> +  UINT32 Severity
>> +)
>> +{
>> +  EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE* BlockHeader = Block;
>> +  BlockHeader->BlockStatus = (EFI_ACPI_6_1_ERROR_BLOCK_STATUS) {0, 0, 0, 0, 0};
>> +  BlockHeader->RawDataOffset = 0;
>> +  BlockHeader->RawDataLength = 0;
>> +  BlockHeader->DataLength = 0;
>> +  BlockHeader->ErrorSeverity = Severity;
>> +  return BlockHeader;
>> +}
>> +
>> +
>> +BOOLEAN
>> +ErrorBlockUpdateStatusStructure (
>> +  VOID *ErrorBlock
>> +)
>> +{
>> +  if (ErrorBlock == NULL) {
>> +    return FALSE;
>> +  }
>> +  IN EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE *BlockHeader =  ErrorBlock;
>> +  VOID *EntriesBegin = ErrorBlock + sizeof (EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE);
>> +  if (BlockHeader->BlockStatus.ErrorDataEntryCount == 0) {
>> +    gBS->SetMem (EntriesBegin, BlockHeader->DataLength, 0);
>> +    BlockHeader->RawDataLength = 0;
>> +    BlockHeader->RawDataOffset = 0;
>> +    BlockHeader->DataLength = 0;
>> +  }
>> +  return TRUE;
>> +}
>> +
>> +
>> +BOOLEAN
>> +ErrorBlockAddErrorData (
>> +  IN VOID                  *ErrorBlock,
>> +  IN UINT32                MaxBlockLength,
>> +  IN EFI_CPER_SECTION_TYPE TypeOfErrorData,
>> +  IN VOID                  *GenericErrorData,
>> +  IN UINT32                SizeOfGenericErrorData,
>> +  IN ERROR_SEVERITY        ErrorSeverity,
>> +  IN BOOLEAN               Correctable
>> +)
>> +{
>> +  if (ErrorBlock == NULL || GenericErrorData == NULL) {
>> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]Invalid Param \n", __FUNCTION__, __LINE__));
>> +    return FALSE;
>> +  }
>> +  EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE*  Entry;
>> +  EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE* BlockHeader = ErrorBlock;
>> +  EFI_ACPI_6_1_ERROR_BLOCK_STATUS* BlockStatus = &BlockHeader->BlockStatus;
>> +  (VOID)ErrorBlockUpdateStatusStructure (ErrorBlock);
>> +  UINT32 ExpectedNewDataLength = BlockHeader->DataLength +
>> +           sizeof (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE) +
>> +           SizeOfGenericErrorData;
>> +  if (sizeof (EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE) + ExpectedNewDataLength >
>> +      MaxBlockLength) {
>> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]Out of BlockSize \n", __FUNCTION__, __LINE__));
>> +    return FALSE;
>> +  }
>> +  // guid
>> +  EFI_GUID Guid;
>> +  switch (TypeOfErrorData) {
>> +    case PROCESSOR_GENERIC:
>> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PROCESSOR_GENERIC_GUID;
>> +      break;
>> +    case PROCESSOR_ARM:
>> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PROCESSOR_SPECIFIC_ARM_GUID;
>> +      break;
>> +    case PLATFORM_MEMORY:
>> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PLATFORM_MEMORY_GUID;
>> +      break;
>> +    case PLATFORM_MEMORY2:
>> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PLATFORM_MEMORY2_GUID;
>> +      break;
>> +    case PCIE_EXPRESS:
>> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PCIE_GUID;
>> +      break;
>> +    case FIRMWARE_ERROR:
>> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_FW_ERROR_RECORD_GUID;
>> +      break;
>> +    case PCI_BUS:
>> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PCI_PCIX_BUS_GUID;
>> +      break;
>> +    case PCI_COMPONENT:
>> +      Guid = (EFI_GUID)EFI_ERROR_SECTION_PCI_DEVICE_GUID;
>> +      break;
>> +    default:
>> +      return FALSE;
>> +  }
>> +  //Block Status
>> +  if (Correctable == TRUE) {
>> +    if (BlockStatus->CorrectableErrorValid == 0) {
>> +      BlockStatus->CorrectableErrorValid = 1;
>> +    } else {
>> +      BlockStatus->MultipleCorrectableErrors = 1;
>> +    }
>> +  } else {
>> +    if (BlockStatus->UncorrectableErrorValid == 0) {
>> +      BlockStatus->UncorrectableErrorValid = 1;
>> +    } else {
>> +      BlockStatus->MultipleUncorrectableErrors = 1;
>> +    }
>> +  }
>> +  BlockStatus->ErrorDataEntryCount++;
>> +  // Entry
>> +  Entry = (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE*)(ErrorBlock +
>> +           sizeof (EFI_ACPI_6_1_GENERIC_ERROR_STATUS_STRUCTURE) +
>> +           BlockHeader->DataLength);
>> +  gBS->SetMem (Entry, sizeof (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE), 0);
>> +  gBS->CopyMem (&Entry->SectionType, &Guid, sizeof (EFI_GUID));
>> +  Entry->ErrorSeverity = ErrorSeverity;
>> +  Entry->Revision = EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_REVISION;
>> +  Entry->ErrorDataLength = SizeOfGenericErrorData;
>> +  VOID*  GenericErrorDataFollowEntry = (VOID*)Entry +
>> +           sizeof (EFI_ACPI_6_1_GENERIC_ERROR_DATA_ENTRY_STRUCTURE);
>> +  gBS->CopyMem (
>> +         GenericErrorDataFollowEntry,
>> +         GenericErrorData,
>> +         SizeOfGenericErrorData);
>> +  // BlockHeader
>> +  BlockHeader->RawDataOffset = 0;
>> +  BlockHeader->RawDataLength = 0;
>> +  BlockHeader->DataLength = ExpectedNewDataLength;
>> +  return TRUE;
>> +}
>> +
>> +VOID
>> +GhesV2Initial (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *GhesV2,
>> +  UINT32                                                         BlockLength
>> +)
>> +{
>> +  if (GhesV2 == NULL) {
>> +    return;
>> +  }
>> +  *GhesV2 = (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE) {
>> +    .Type = EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_VERSION_2,
>> +    .SourceId = 0,
>> +    .RelatedSourceId = 0xFFFF,
>> +    .Flags = 0,
>> +    .Enabled = 1,
>> +    .NumberOfRecordsToPreAllocate = 1,//ERROR BLOCK
>> +    .MaxSectionsPerRecord = 1,// Num Entries(section)
>> +    .MaxRawDataLength = BlockLength, // Max Size Of a Raw Data
>> +    .ErrorStatusAddress = {
>> +      .AddressSpaceId = EFI_ACPI_6_1_SYSTEM_MEMORY,
>> +      .RegisterBitWidth = 64,
>> +      .RegisterBitOffset = 0,
>> +      .AccessSize = EFI_ACPI_6_1_QWORD,
>> +      .Address = 0
>> +    },
>> +    .NotificationStructure = {
>> +      .Type = EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV,
>> +      .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE),
>> +      .ConfigurationWriteEnable = {0, 0, 0, 0, 0, 0, 0} ,
>> +      .PollInterval = 0,
>> +      .Vector = 0,
>> +      .SwitchToPollingThresholdValue = 0,
>> +      .SwitchToPollingThresholdWindow = 0,
>> +      .ErrorThresholdValue = 0,
>> +      .ErrorThresholdWindow = 0
>> +    },
>> +    .ErrorStatusBlockLength = BlockLength,
>> +    .ReadAckRegister = {
>> +      .AddressSpaceId = EFI_ACPI_6_1_SYSTEM_MEMORY,
>> +      .RegisterBitWidth = 64,
>> +      .RegisterBitOffset = 0,
>> +      .AccessSize = EFI_ACPI_6_1_QWORD,
>> +      .Address = 0
>> +    },
>> +    .ReadAckPreserve = READ_ACK_PRESERVE,
>> +    .ReadAckWrite = READ_ACK_WRITE
>> +  };
>> +  return;
>> +}
>> +
>> +VOID
>> +GhesV2AddNotification (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE  *This,
>> +  UINT8                                                           Type
>> +)
>> +{
>> +  This->NotificationStructure = (EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_STRUCTURE) {
>> +    .Type = Type,
>> +    .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE),
>> +    .ConfigurationWriteEnable = {
>> +      .Type = 0,
>> +      .PollInterval = 1,
>> +      .SwitchToPollingThresholdValue = 1,
>> +      .SwitchToPollingThresholdWindow = 1,
>> +      .ErrorThresholdValue = 1,
>> +      .ErrorThresholdWindow = 1
>> +    },
>> +    .PollInterval = 20,
>> +    .Vector = 0,
>> +    .SwitchToPollingThresholdValue = 0,
>> +    .SwitchToPollingThresholdWindow = 0,
>> +    .ErrorThresholdValue = 0,
>> +    .ErrorThresholdWindow = 0
>> +  };
>> +  return;
>> +}
>> +
>> +EFI_STATUS
>> +GhesV2LinkErrorBlock (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE *GhesV2,
>> +  GHES_REGISTER                                                  *Register,
>> +  VOID                                                           *ErrorBlock
>> +)
>> +{
>> +  if (ErrorBlock == NULL || Register == NULL || GhesV2 == NULL) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  Register->ErrorStatusBlockAddress = (UINTN)ErrorBlock;
>> +  GhesV2->ErrorStatusAddress.Address = (UINTN)&(Register->ErrorStatusBlockAddress);
>> +  Register->AckRegister = READ_ACK_WRITE;
>> +  GhesV2->ReadAckRegister.Address = (UINT64)&(Register->AckRegister);
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +
>> +VOID GhesV1Initial (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *GhesV1,
>> +  UINT32 BlockLength
>> +)
>> +{
>> +  if (GhesV1 == NULL) {
>> +    return;
>> +  }
>> +  *GhesV1 = (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE) {
>> +    .Type = EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR,
>> +    .SourceId = 0,
>> +    .RelatedSourceId = 0xFFFF,
>> +    .Flags = 0,
>> +    .Enabled = 1,
>> +    .NumberOfRecordsToPreAllocate = 1,//ERROR BLOCK
>> +    .MaxSectionsPerRecord = 1,// Num Entries(section)
>> +    .MaxRawDataLength = BlockLength, // Max Size Of a Raw Data
>> +    .ErrorStatusAddress = {
>> +      .AddressSpaceId = EFI_ACPI_6_1_SYSTEM_MEMORY,
>> +      .RegisterBitWidth = 64,
>> +      .RegisterBitOffset = 0,
>> +      .AccessSize = EFI_ACPI_6_1_QWORD,
>> +      .Address = 0
>> +    },
>> +    .NotificationStructure = {
>> +      .Type = EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV,
>> +      .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE),
>> +      .ConfigurationWriteEnable = {0, 0, 0, 0, 0, 0, 0},
>> +      .PollInterval = 0,
>> +      .Vector = 0,
>> +      .SwitchToPollingThresholdValue = 0,
>> +      .SwitchToPollingThresholdWindow = 0,
>> +      .ErrorThresholdValue = 0,
>> +      .ErrorThresholdWindow = 0
>> +    },
>> +    .ErrorStatusBlockLength = BlockLength,
>> +  };
>> +  return;
>> +}
>> +
>> +VOID
>> +GhesV1AddNotification (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
>> +  UINT8                                                Type
>> +)
>> +{
>> +  This->NotificationStructure = (EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_STRUCTURE) {
>> +    .Type = Type,
>> +    .Length = sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE),
>> +    .ConfigurationWriteEnable = {
>> +      .Type = 0,
>> +      .PollInterval = 1,
>> +      .SwitchToPollingThresholdValue = 1,
>> +      .SwitchToPollingThresholdWindow = 1,
>> +      .ErrorThresholdValue = 1,
>> +      .ErrorThresholdWindow = 1
>> +    },
>> +    .PollInterval = 20,
>> +    .Vector = 0,
>> +    .SwitchToPollingThresholdValue = 0,
>> +    .SwitchToPollingThresholdWindow = 0,
>> +    .ErrorThresholdValue = 0,
>> +    .ErrorThresholdWindow = 0
>> +  };
>> +  return;
>> +}
>> +
>> +EFI_STATUS GhesV1LinkErrorBlock (
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *This,
>> +  UINT64                                               *ptrBlockAddress,
>> +  VOID                                                 *ErrorBlock
>> +)
>> +{
>> +  if (ErrorBlock == NULL || ptrBlockAddress == NULL || This == NULL) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +  *ptrBlockAddress = (UINTN)ErrorBlock;
>> +  This->ErrorStatusAddress.Address = (UINTN) ptrBlockAddress;
>> +  return EFI_SUCCESS;
>> +}
>> +
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c
>> new file mode 100644
>> index 0000000000..80d7d43c5b
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Erst/erst.c
>> @@ -0,0 +1,374 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +#include "erst.h"
>> +#include <Guid/Cper.h>
>> +#include <Library/BaseLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include "PlatformArch.h"
>> +
>> +typedef struct {
>> +  EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER ErstTableHeader;
>> +  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY    ErstInstructionEntry[ERST_ACTION_NO];
>> +} ERST_TABLE;
>> +
>> +ERST_TABLE mErst = {
>> +  {
>> +    ARM_ACPI_HEADER (
>> +      EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_SIGNATURE,
>> +      EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_HEADER,
>> +      EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_REVISION
>> +    ),
>> +    sizeof (EFI_ACPI_6_0_ERROR_RECORD_SERIALIZATION_TABLE_HEADER),
>> +    {
>> +      0x0,
>> +      0x0,
>> +      0x0,
>> +      0x0
>> +    },
>> +    ERST_ACTION_NO,
>> +  },
>> +  {
>> +    {
>> +      // 0 EFI_ACPI_6_0_ERST_BEGIN_WRITE_OPERATION
>> +      EFI_ACPI_6_0_ERST_BEGIN_WRITE_OPERATION,
>> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      ERST_BEGIN_WRITE_VALUE,
>> +      ERST_BEGIN_WRITE_MASK
>> +    },
>> +    {
>> +      // 1 EFI_ACPI_6_0_ERST_BEGIN_READ_OPERATION
>> +      EFI_ACPI_6_0_ERST_BEGIN_READ_OPERATION,
>> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      ERST_BEGIN_READ_VALUE,
>> +      ERST_BEGIN_READ_MASK
>> +    },
>> +    {
>> +      // 2 EFI_ACPI_6_0_ERST_BEGIN_CLEAR_OPERATION
>> +      EFI_ACPI_6_0_ERST_BEGIN_CLEAR_OPERATION,
>> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      ERST_BEGIN_CLEAR_VALUE,
>> +      ERST_BEGIN_CLEAR_MASK
>> +    },
>> +    {
>> +      // 3 EFI_ACPI_6_0_ERST_END_OPERATION
>> +      EFI_ACPI_6_0_ERST_END_OPERATION,
>> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
>> +      EFI_ACPI_6_0_ERST_PRESERVE_REGISTER,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      ERST_END_OPERATION_VALUE,
>> +      ERST_END_OPERATION_MASK
>> +    },
>> +    {
>> +      // 4 EFI_ACPI_6_0_ERST_SET_RECORD_OFFSET
>> +      EFI_ACPI_6_0_ERST_SET_RECORD_OFFSET,
>> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    },
>> +    {
>> +      // 5 EFI_ACPI_6_0_ERST_EXECUTE_OPERATION
>> +      EFI_ACPI_6_0_ERST_EXECUTE_OPERATION,
>> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER_VALUE,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_DWORD,
>> +        0x94730000
>> +      },
>> +      0x0002,
>> +      0x0002
>> +    },
>> +    {
>> +      // 6 EFI_ACPI_6_0_ERST_CHECK_BUSY_STATUS
>> +      EFI_ACPI_6_0_ERST_CHECK_BUSY_STATUS,
>> +      EFI_ACPI_6_0_ERST_READ_REGISTER_VALUE,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0x00000001,
>> +      0x00000001
>> +    },
>> +    {
>> +      // 7 EFI_ACPI_6_0_ERST_GET_COMMAND_STATUS
>> +      EFI_ACPI_6_0_ERST_GET_COMMAND_STATUS,
>> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    },
>> +    {
>> +      // 8 EFI_ACPI_6_0_ERST_GET_RECORD_IDENTIFIER
>> +      EFI_ACPI_6_0_ERST_GET_RECORD_IDENTIFIER,
>> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    },
>> +    {
>> +      // 9 EFI_ACPI_6_0_ERST_SET_RECORD_IDENTIFIER
>> +      EFI_ACPI_6_0_ERST_SET_RECORD_IDENTIFIER,
>> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    },
>> +    {
>> +      // A EFI_ACPI_6_0_ERST_GET_RECORD_COUNT
>> +      EFI_ACPI_6_0_ERST_GET_RECORD_COUNT,
>> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    },
>> +    {
>> +      // B EFI_ACPI_6_0_ERST_BEGIN_DUMMY_WRITE_OPERATION
>> +      EFI_ACPI_6_0_ERST_BEGIN_DUMMY_WRITE_OPERATION,
>> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    },
>> +    {
>> +      // C RESERVED
>> +      0x0C,
>> +      EFI_ACPI_6_0_ERST_WRITE_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    },
>> +    {
>> +      // D EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE
>> +      EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE,
>> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    },
>> +    {
>> +      // E EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_LENGTH
>> +      EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_LENGTH,
>> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    },
>> +    {
>> +      // F EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_ATTRIBUTES
>> +      EFI_ACPI_6_0_ERST_GET_ERROR_LOG_ADDRESS_RANGE_ATTRIBUTES,
>> +      EFI_ACPI_6_0_ERST_READ_REGISTER,
>> +      0,
>> +      0,
>> +      {
>> +        EFI_ACPI_6_0_SYSTEM_MEMORY,
>> +        64,
>> +        0,
>> +        EFI_ACPI_6_0_QWORD,
>> +        0
>> +      },
>> +      0,
>> +      ERST_MASK
>> +    }
>> +  }
>> +};
>> +
>> +VOID
>> +ErstSetAcpiTable (
>> +  ERST_BOOT_CONTEXT *Context
>> +)
>> +{
>> +  UINTN                     AcpiTableHandle;
>> +  EFI_STATUS                Status;
>> +  UINT8                     Checksum;
>> +  mErst.ErstTableHeader.Header.Length = sizeof (ERST_TABLE);
>> +  Checksum = CalculateCheckSum8 ((UINT8*)(&mErst), mErst.ErstTableHeader.Header.Length);
>> +  mErst.ErstTableHeader.Header.Checksum = Checksum;
>> +  AcpiTableHandle = 0;
>> +  Status = mAcpiTableProtocol->InstallAcpiTable (
>> +             mAcpiTableProtocol,
>> +             &mErst,
>> +             mErst.ErstTableHeader.Header.Length,
>> +             &AcpiTableHandle
>> +             );
>> +  ASSERT_EFI_ERROR (Status) ;
>> +}
>> +
>> +EFI_STATUS
>> +ErstHeaderCreator (
>> +  ERST_BOOT_CONTEXT  *Context,
>> +  UINT64             BufferSize,//ERST_DATASTORE_SIZE
>> +  VOID               *NvRamAddrRange,
>> +  UINT64             NvRamAllRecordLength,
>> +  UINT64             NvRamAddrRangeLength
>> +)
>> +{
>> +  EFI_STATUS            Status = EFI_SUCCESS;
>> +  ERST_RT_CONTEXT       *ErstRtCtx;
>> +  //
>> +  ErstRtCtx = AllocateReservedZeroPool (sizeof (ERST_RT_CONTEXT));
>> +  ErstRtCtx->Operation = ERST_END_OPERATION;
>> +  ErstRtCtx->RecordOffset = 0;
>> +  ErstRtCtx->BusyStatus = 0;
>> +  ErstRtCtx->CommandStatus = 0;
>> +  ErstRtCtx->KeyRecordId = 0;
>> +  ErstRtCtx->MaxTimeOfExecuteOperation = MAX_UINT64;
>> +  ErstRtCtx->RecordCount = 0;
>> +  ErstRtCtx->ErrorLogAddressRange = (UINT64)AllocateReservedZeroPool (BufferSize);
>> +  ErstRtCtx->ErrorLogAddressRangeLength = BufferSize;
>> +  ErstRtCtx->ErrorLogAttributes = 0;
>> +  ErstRtCtx->NvRamLogAddrRange = NvRamAddrRange;
>> +  ErstRtCtx->NvRamLogAddrRangeLength = NvRamAddrRangeLength;
>> +  ErstRtCtx->NvRamRecordOffset = 0;
>> +  ErstRtCtx->NvRamNextVallidRecordId = MAX_UINT64;
>> +  ErstRtCtx->NvRamNextValidRecordOffset = 0;
>> +  ErstRtCtx->NvRamAllRecordLength = NvRamAllRecordLength;
>> +  mErst.ErstInstructionEntry[0].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
>> +  mErst.ErstInstructionEntry[1].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
>> +  mErst.ErstInstructionEntry[2].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
>> +  mErst.ErstInstructionEntry[3].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->Operation));
>> +  mErst.ErstInstructionEntry[4].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->RecordOffset));
>> +  mErst.ErstInstructionEntry[6].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->BusyStatus));
>> +  mErst.ErstInstructionEntry[7].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->CommandStatus));
>> +  mErst.ErstInstructionEntry[8].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->NvRamNextVallidRecordId));
>> +  mErst.ErstInstructionEntry[9].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->KeyRecordId));
>> +  mErst.ErstInstructionEntry[10].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->RecordCount));
>> +  mErst.ErstInstructionEntry[11].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->DummyWrite));
>> +  mErst.ErstInstructionEntry[12].RegisterRegion.Address = 0;
>> +  mErst.ErstInstructionEntry[13].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->ErrorLogAddressRange));
>> +  mErst.ErstInstructionEntry[14].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->ErrorLogAddressRangeLength));
>> +  mErst.ErstInstructionEntry[15].RegisterRegion.Address = (UINT64)(&(ErstRtCtx->ErrorLogAttributes));
>> +  Context->ErstHeader = (EFI_ACPI_6_1_ERROR_RECORD_SERIALIZATION_TABLE_HEADER*)&mErst;
>> +  Context->ExecuteOperationEntry = &(mErst.ErstInstructionEntry[5]);
>> +  Context->GetErrorLogAddrRangeAttributes = &(mErst.ErstInstructionEntry[15]);
>> +  Context->Rt = ErstRtCtx;
>> +  return Status;
>> +};
>> +
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c
>> new file mode 100644
>> index 0000000000..eea73af229
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/Hest/hest.c
>> @@ -0,0 +1,119 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#include "ErrorSource/Ghes.h"
>> +#include "hest.h"
>> +#include <IndustryStandard/Acpi62.h>
>> +#include <Library/BaseLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include <Library/UefiBootServicesTableLib.h>
>> +#include "PlatformArch.h"
>> +
>> +EFI_STATUS HestAddErrorSourceDescriptor (
>> +  IN OUT HEST_CONTEXT  *Context,
>> +  IN VOID              *ErrorSourceDescriptor,
>> +  IN UINT32            SizeOfDescriptor
>> +)
>> +{
>> +  UINT16                                          *pSourceId;
>> +  VOID                                            *Descriptor;
>> +  EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeader;
>> +
>> +  if ((Context == NULL) || (ErrorSourceDescriptor == NULL)) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +  HestHeader = Context->HestHeader;
>> +  if (HestHeader->Header.Length + SizeOfDescriptor > Context->OccupiedMemorySize) {
>> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: Hest Size Too small\n", __FUNCTION__, __LINE__));
>> +    return EFI_BUFFER_TOO_SMALL;
>> +  }
>> +  Descriptor = (UINT8*)HestHeader + HestHeader->Header.Length;
>> +  gBS->CopyMem ((VOID*)Descriptor , ErrorSourceDescriptor, SizeOfDescriptor);
>> +  pSourceId = Descriptor + sizeof (UINT16);
>> +  *pSourceId = HestHeader->ErrorSourceCount;
>> +  HestHeader->Header.Length += SizeOfDescriptor;
>> +  HestHeader->ErrorSourceCount++;
>> +  Context->KeyErrorSource = Descriptor;
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +VOID
>> +HestSetAcpiTable (
>> +  IN HEST_CONTEXT  *Context
>> +)
>> +{
>> +  UINTN                     AcpiTableHandle;
>> +  EFI_STATUS                Status;
>> +  UINT8                     Checksum;
>> +  EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER *HestHeader;
>> +  EFI_ACPI_SDT_HEADER       *Table;
>> +  EFI_ACPI_TABLE_VERSION    TableVersion;
>> +  UINTN                     TableKey;
>> +  UINT32                    Index;
>> +  if (Context == NULL) {
>> +    DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: ERROR\n", __FUNCTION__, __LINE__));
>> +    return;
>> +  }
>> +
>> +  HestHeader = Context->HestHeader;
>> +  Checksum = CalculateCheckSum8 ((UINT8*)(HestHeader),  HestHeader->Header.Length);
>> +  HestHeader->Header.Checksum = Checksum;
>> +  AcpiTableHandle = 0;
>> +  // see AcpiTableProtocol.c InstallAcpiTable
>> +  Status = mAcpiTableProtocol->InstallAcpiTable (
>> +                                  mAcpiTableProtocol,
>> +                                  HestHeader,
>> +                                  HestHeader->Header.Length,
>> +                                  &AcpiTableHandle);
>> +  for (Index = 0; Index < EFI_ACPI_MAX_NUM_TABLES; Index++) {
>> +    Status = mAcpiSdtProtocol->GetAcpiTable (Index, &Table, &TableVersion, &TableKey);
>> +    if (EFI_ERROR (Status)) {
>> +      break;
>> +    }
>> +    if (Table->Signature != EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE) {
>> +      continue;
>> +    }
>> +    mApeiTrustedfirmwareData->HestTableAddress = (EFI_PHYSICAL_ADDRESS)Table;
>> +    DEBUG ((DEBUG_ERROR, "Acpi HestSetAcpiTable Table = 0x%x.\n", (EFI_PHYSICAL_ADDRESS)Table));
>> +  }
>> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]:OUT %llx, IN %llx \n", __FUNCTION__, __LINE__,
>> +          AcpiTableHandle, Context->HestHeader));
> 
> This does not look like an error - should it really be of the ERROR
> debug level? Better to move it to INFO.
> The same applies to similar functions for the other tables.

Yes, it should be INFO and I will modify similar issues in this patch.

> 
>> +  return;
>> +}
>> +
>> +EFI_STATUS
>> +HestHeaderCreator (
>> +  HEST_CONTEXT  *Context,
>> +  UINT32        PreAllocatedHestSize
>> +)
>> +{
>> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: \n", __FUNCTION__, __LINE__));
> 
> Why this message?

I think this DEBUG is useless.
I will drop it in v4.

> 
>> +  if (PreAllocatedHestSize < sizeof (EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER)) {
>> +    return EFI_BUFFER_TOO_SMALL;
>> +  }
>> +  Context->HestHeader = AllocateReservedZeroPool (PreAllocatedHestSize);
>> +  *Context->HestHeader = (EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER) {
>> +   ARM_ACPI_HEADER (
>> +      EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_SIGNATURE,
>> +      EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_HEADER,
>> +      EFI_ACPI_6_1_HARDWARE_ERROR_SOURCE_TABLE_REVISION
>> +    ),
>> +    0x0
>> +  };
>> +  Context->KeyErrorSource = Context->HestHeader + 1;
>> +  Context->OccupiedMemorySize = PreAllocatedHestSize;
>> +  return EFI_SUCCESS;
>> +}
>> diff --git a/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c
>> new file mode 100644
>> index 0000000000..de972b8a9e
>> --- /dev/null
>> +++ b/Silicon/Hisilicon/Hi1620/Drivers/Apei/OemApeiHi1620.c
>> @@ -0,0 +1,337 @@
>> +/** @file
>> +*
>> +*  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +*
>> +*  This program and the accompanying materials
>> +*  are licensed and made available under the terms and conditions of the BSD License
>> +*  which accompanies this distribution.  The full text of the license may be found at
>> +*  http://opensource.org/licenses/bsd-license.php
>> +*
>> +*  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +*  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +*
>> +**/
>> +
>> +#include <Guid/Cper.h>
>> +#include <IndustryStandard/Acpi62.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/IoLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include <Library/UefiBootServicesTableLib.h>
>> +
>> +#include "Bert/bert.h"
>> +#include "Einj/einj.h"
>> +#include "ErrorSource/Ghes.h"
>> +#include "Erst/erst.h"
>> +#include "Hest/hest.h"
>> +#include "OemApeiHi1620.h"
>> +
>> +VOID
>> +GpioCombInit (
>> +  UINTN  Base,
>> +  UINT32 Pin
>> +)
>> +{
>> +  UINT32 Val = MmioRead32 (Base + GPIO_INT_MASK);
>> +  MmioWrite32 (Base + GPIO_INT_MASK, Val | Pin);
>> +  Val = MmioRead32 (Base + GPIO_INT_EN);
>> +  MmioWrite32 (Base + GPIO_INT_EN, Val | Pin);
>> +  Val = MmioRead32 (Base + GPIO_SWPORT_DDR);
>> +  MmioWrite32 (Base + GPIO_SWPORT_DDR, Val & (~Pin));
>> +  Val = MmioRead32 (Base + GPIO_INT_TYPE);
>> +  MmioWrite32 (Base + GPIO_INT_TYPE, Val & (~Pin));
>> +  Val = MmioRead32 (Base + GPIO_INT_POLARITY);
>> +  MmioWrite32 (Base + GPIO_INT_POLARITY, Val | Pin);
>> +  Val = MmioRead32 (Base + GPIO_LS_SYNC);
>> +  MmioWrite32 (Base + GPIO_LS_SYNC, Val & (~Pin));
>> +  MmioWrite32 (Base + GPIO_INT_COMB, 1);
>> +  return;
>> +}
>> +/************************************************
>> +*************** HEST ***************
>> +************************************************/
>> +
>> +/*****************************************************************************
>> +* @param EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE* GhesV2,Vector of GhesV2
>> +* @param UINT8 NumOfGhesV2
>> +* @param_out
>> +* @retval EFI_STATUS
>> +*****************************************************************************/
>> +EFI_STATUS
>> +GhesV2ContextForHest (
>> +  IN EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE GhesV2[MAX_GHES],
>> +  IN UINT8                                                          NumOfGhesV2
>> +)
>> +{
>> +  // ensuce the size is expected
>> +  if ((GhesV2 == NULL) || (NumOfGhesV2 != MAX_GHES)) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  UINT8  NumOfBlockPerGhes = 1;
>> +  UINT8  Iter = 0;
>> +  UINT32 BlockMemorySize;
>> +  UINT32 ErrorSeverityArray[MAX_GHES] = {
>> +           EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTABLE,
>> +           EFI_ACPI_6_2_ERROR_SEVERITY_FATAL,
>> +           EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTED};
>> +  VOID   *ErrorBlockHead;
>> +  VOID   *ErrorBlock;
>> +  VOID   *BlockMemory;
>> +  GHES_REGISTER  *GhesRegisters;
>> +  EFI_STATUS     Status = EFI_SUCCESS;
>> +
>> +  BlockMemorySize = MAX_GHES *
>> +    (sizeof (GHES_REGISTER) + NumOfBlockPerGhes * GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
>> +  Status = gBS->AllocatePool (
>> +             EfiReservedMemoryType,
>> +             BlockMemorySize,
>> +             &BlockMemory
>> +           );
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  gBS->SetMem (BlockMemory, BlockMemorySize, 0);
>> +  GhesRegisters = BlockMemory;
>> +  ErrorBlockHead = BlockMemory + MAX_GHES * sizeof (GHES_REGISTER);
>> +  ErrorBlock = ErrorBlockHead;
>> +  for (Iter = 0; Iter < MAX_GHES; Iter++) {
>> +    GhesV2Initial (&GhesV2[Iter], GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
>> +    GhesV2AddNotification (&GhesV2[Iter], EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV);
>> +    ErrorBlockInitial (ErrorBlock, ErrorSeverityArray[Iter]);
>> +    GhesV2LinkErrorBlock (&GhesV2[Iter], &GhesRegisters[Iter], ErrorBlock);
>> +    ErrorBlock += GhesV2[Iter].ErrorStatusBlockLength;
>> +  }
>> +  return EFI_SUCCESS;
>> +}
>> +/*****************************************************************************
>> +* @param EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE* GhesV2,Vector of GhesV2
>> +* @param UINT8 NumOfGhesV2
>> +* @param_out
>> +* @retval EFI_STATUS
>> +*****************************************************************************/
>> +
>> +EFI_STATUS
>> +GhesV1ContextForHest (
>> +  IN EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE GhesV1[MAX_GHES],
>> +  IN UINT8                                                NumOfGhesV1
>> +)
>> +{
>> +  // ensuce the size is expected
>> +  if ((GhesV1 == NULL) || (NumOfGhesV1 != MAX_GHES)) {
>> +    return EFI_INVALID_PARAMETER;
>> +  }
>> +
>> +  UINT8      NumOfBlockPerGhes = 1;
>> +  UINT8      Iter = 0;
>> +  UINT32     BlockMemorySize = MAX_GHES *
>> +             (sizeof (UINT64) + NumOfBlockPerGhes * GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
>> +  UINT32     ErrorSeverityArray[MAX_GHES] = {
>> +             EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTABLE,
>> +             EFI_ACPI_6_2_ERROR_SEVERITY_FATAL,
>> +             EFI_ACPI_6_2_ERROR_SEVERITY_CORRECTED};
>> +  VOID       *ErrorBlockHead;
>> +  VOID       *ErrorBlock;
>> +  VOID       *BlockMemory;
>> +  UINT64     *ptrBlockAddress;
>> +  EFI_STATUS Status = EFI_SUCCESS;
>> +  Status = gBS->AllocatePool (
>> +             EfiReservedMemoryType,
>> +             BlockMemorySize,
>> +             &BlockMemory
>> +           );
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  gBS->SetMem (BlockMemory, BlockMemorySize, 0);
>> +  ptrBlockAddress = BlockMemory;
>> +  ErrorBlockHead = BlockMemory + MAX_GHES * sizeof (UINT64);
>> +  ErrorBlock = ErrorBlockHead;
>> +  for (Iter = 0; Iter < MAX_GHES; Iter++) {
>> +    GhesV1Initial (&GhesV1[Iter], GENERIC_HARDWARE_ERROR_BLOCK_SIZE);
>> +    GhesV1AddNotification (&GhesV1[Iter], EFI_ACPI_6_1_HARDWARE_ERROR_NOTIFICATION_GSIV);
>> +    ErrorBlockInitial (ErrorBlock, ErrorSeverityArray[Iter]);
>> +    GhesV1LinkErrorBlock (&GhesV1[Iter], &ptrBlockAddress[Iter], ErrorBlock);
>> +    ErrorBlock += GhesV1[Iter].ErrorStatusBlockLength;
>> +  }
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +VOID
>> +OemHestInitialNotification ()
>> +{
>> +  // GPIO init
>> +  // use int_msk to simulate
>> +  UINTN Base = IOMUX_REG_BASE;
>> +  //GPIO9, in document 'PhosphorV680 Totemiomux' iomg051,
>> +  //Set GPIO9 to pad_ex_int1
>> +  MmioWrite32 (Base + IOMG051, PAD_EX_INT1);
>> +  return;
>> +}
>> +
>> +VOID
>> +OemEinjInitialNotification ()
>> +{
>> +  UINTN Base = IOMUX_REG_BASE;
>> +  //use TB_GPIO_PIN10 for EINJ
>> +  MmioWrite32 (Base + IOMG052, PAD_EX_INT1);
>> +  return;
>> +}
>> +
>> +EFI_STATUS
>> +OemInitHestTable (
>> +  IN EFI_HANDLE         ImageHandle
>> +)
>> +{
>> +  EFI_STATUS                                                     Status = EFI_SUCCESS;
>> +  HEST_CONTEXT                                                   HestContext;
>> +  EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE GhesV2[MAX_GHES];
>> +  Status = HestHeaderCreator (&HestContext, HEST_TABLE_SIZE);
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  Status = GhesV2ContextForHest(GhesV2, MAX_GHES);
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  Status |= HestAddErrorSourceDescriptor (
>> +              &HestContext,
>> +              &GhesV2[0],
>> +              sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)
>> +              );
>> +  mApeiTrustedfirmwareData->HestRecoverableErrorGhesV2 = HestContext.KeyErrorSource;
>> +  Status |= HestAddErrorSourceDescriptor (
>> +              &HestContext,
>> +              &GhesV2[1],
>> +              sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)
>> +              );
>> +  mApeiTrustedfirmwareData->HestFatalErrorGhesV2 = HestContext.KeyErrorSource;
>> +  Status |= HestAddErrorSourceDescriptor (
>> +              &HestContext,
>> +              &GhesV2[2],
>> +              sizeof (EFI_ACPI_6_1_GENERIC_HARDWARE_ERROR_SOURCE_VERSION_2_STRUCTURE)
>> +              );
>> +  mApeiTrustedfirmwareData->HestCorrectedErrorGhesV2 = HestContext.KeyErrorSource;
>> +  OemHestInitialNotification ();
>> +  HestSetAcpiTable (&HestContext);
>> +  return Status;
>> +}
>> +/************************************************
>> +*************** BERT ***************
>> +************************************************/
>> +
>> +EFI_STATUS
>> +OemInitBertTable (
>> +  IN EFI_HANDLE ImageHandle
>> +)
>> +{
>> +  BERT_CONTEXT Context;
>> +  BOOLEAN      Status;
>> +  Status = BertHeaderCreator (&Context, BOOT_ERROR_REGION_SIZE);
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  ErrorBlockInitial (Context.Block, EFI_ACPI_6_2_ERROR_SEVERITY_NONE);
>> +  BertSetAcpiTable (&Context);
>> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: %r\n", __FUNCTION__, __LINE__, Status));
> 
> This does not look like an error case.
> 
>> +  return EFI_SUCCESS;
>> +}
>> +/************************************************
>> +*************** EINJ ***************
>> +************************************************/
>> +EFI_STATUS
>> +OemEinjConfigExecuteOperationEntry (
>> +  EINJ_CONTEXT *Context
>> +)
>> +{
>> +  EFI_ACPI_6_0_EINJ_INJECTION_INSTRUCTION_ENTRY* KeyEntry = Context->ExecuteOperationEntry;
>> +  OemEinjInitialNotification ();
>> +  //use TB_GPIO_PIN10 for EINJ
>> +  KeyEntry->RegisterRegion.Address = PcdGet64 (PcdCpldBaseAddress) + CPLD_GPIO10_INT_OFFSET;
>> +  KeyEntry->Mask = CPLD_MASK;
>> +  KeyEntry->Value = CPLD_VALUE;
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +EFI_STATUS
>> +OemInitEinjTable (
>> +)
>> +{
>> +  EFI_STATUS    Status;
>> +  EINJ_CONTEXT  Context;
>> +  Status = EinjHeaderCreator (&Context);
>> +  if (EFI_ERROR (Status)) {
>> +    return Status;
>> +  }
>> +  (VOID)EinjConfigErrorInjectCapability (&Context, 0xFFF);// TBD
>> +  (VOID)OemEinjConfigExecuteOperationEntry (&Context);
>> +  EinjSetAcpiTable (&Context);
>> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: %d\n", __FUNCTION__, __LINE__, Status));
> 
> This does not look like an error case.
> 
> /
>     Leif
> 
>> +  return EFI_SUCCESS;
>> +}
>> +/************************************************
>> +*************** ERST ***************
>> +************************************************/
>> +
>> +EFI_STATUS
>> +OemErstConfigExecuteOperationEntry (
>> +  ERST_BOOT_CONTEXT *Context
>> +)
>> +{
>> +  EFI_ACPI_6_1_ERST_SERIALIZATION_INSTRUCTION_ENTRY *KeyEntry;
>> +  KeyEntry = Context->ExecuteOperationEntry;
>> +  KeyEntry->RegisterRegion.Address = GPIO1_BASE + GPIO_INT_MASK;
>> +  KeyEntry->Value = 0x10;
>> +  KeyEntry->Mask = 0xFFFFFFFF;
>> +  GpioCombInit (GPIO1_BASE, 0xFFFF);
>> +  return EFI_SUCCESS;
>> +}
>> +
>> +BOOLEAN
>> +GetNvRamRegion (
>> +  OUT  VOID  **NvRamAddrRange,
>> +  OUT UINT64 *NvRamAddrRangeLength
>> +)
>> +{
>> +  UINT32 Store = ERST_RECORD_STORE_IN_MEM;
>> +  switch (Store) {
>> +    case (ERST_RECORD_STORE_IN_NVRAM):
>> +      break;
>> +    case (ERST_RECORD_STORE_IN_MEM):
>> +      * NvRamAddrRangeLength = ERST_DATASTORE_SIZE;
>> +      * NvRamAddrRange = AllocateReservedZeroPool (ERST_DATASTORE_SIZE);
>> +      break;
>> +    case (ERST_RECORD_STORE_IN_SPI_FLASH):
>> +      break;
>> +    default:
>> +      ;
>> +  }
>> +  return TRUE;
>> +}
>> +
>> +/***OEM***/
>> +EFI_STATUS
>> +OemInitErstTable (
>> +)
>> +{
>> +  EFI_STATUS        Status = ERST_STATUS_SUCCESS;
>> +  ERST_BOOT_CONTEXT Context;
>> +  UINT64            BufferSize = ERST_DATASTORE_SIZE;
>> +  VOID              *NvRamAddrRange;
>> +  UINT64            NvRamAddrRangeLength;
>> +  UINT64            NvRamAllRecordLength;
>> +
>> +  GetNvRamRegion (&NvRamAddrRange, &NvRamAddrRangeLength);
>> +  NvRamAllRecordLength = 0;
>> +  Status = ErstHeaderCreator (
>> +             &Context,
>> +             BufferSize,
>> +             NvRamAddrRange,
>> +             NvRamAllRecordLength,
>> +             NvRamAddrRangeLength);
>> +  OemErstConfigExecuteOperationEntry (&Context);
>> +  mApeiTrustedfirmwareData->ErstContext = (VOID*)Context.Rt;
>> +  ErstSetAcpiTable (&Context);
>> +  return Status;
>> +};
>> -- 
>> 2.17.0
>>


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 35/43] Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h
  2018-08-22 15:33   ` Leif Lindholm
@ 2018-08-23  7:39     ` Ming
  2018-08-23  9:44       ` Leif Lindholm
  0 siblings, 1 reply; 93+ messages in thread
From: Ming @ 2018-08-23  7:39 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu



On 8/22/2018 11:33 PM, Leif Lindholm wrote:
> On Tue, Aug 14, 2018 at 04:08:55PM +0800, Ming Huang wrote:
>> Add some Lpc macro to LpcLib.h for D06.
>>
> 
> Unaddressed feedback from v1:
> 
> I have no issue with this patch, but can you explain when these macros
> are intended to be used? And if in this set, move this patch
> immediately before the patch than needs it?

These macros are not used in edk2-platforms, used in HwPkg/LpcLib.

> 
> Again, this patch is not D06 specific, and the subject should reflect that.
> 
> /
>     Leif
> 
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ming Huang <ming.huang@linaro.org>
>> ---
>>  Silicon/Hisilicon/Include/Library/LpcLib.h | 51 +++++++++++++++++++-
>>  1 file changed, 49 insertions(+), 2 deletions(-)
>>
>> diff --git a/Silicon/Hisilicon/Include/Library/LpcLib.h b/Silicon/Hisilicon/Include/Library/LpcLib.h
>> index 236a52ba45..5cf08ccde1 100755
>> --- a/Silicon/Hisilicon/Include/Library/LpcLib.h
>> +++ b/Silicon/Hisilicon/Include/Library/LpcLib.h
>> @@ -1,7 +1,7 @@
>>  /** @file
>>  *
>> -*  Copyright (c) 2016, Hisilicon Limited. All rights reserved.
>> -*  Copyright (c) 2016, Linaro Limited. All rights reserved.
>> +*  Copyright (c) 2016-2018, Hisilicon Limited. All rights reserved.
>> +*  Copyright (c) 2016-2018, Linaro Limited. All rights reserved.
>>  *
>>  *  This program and the accompanying materials
>>  *  are licensed and made available under the terms and conditions of the BSD License
>> @@ -18,6 +18,53 @@
>>  
>>  #include <Uefi.h>
>>  
>> +#define PCIE_SUBSYS_IOMUX       0x201100000
>> +#define PCIE_SUBSYS_IOMG019     (PCIE_SUBSYS_IOMUX + 0x48)
>> +#define PCIE_SUBSYS_IOMG020     (PCIE_SUBSYS_IOMUX + 0x4C)
>> +#define PCIE_SUBSYS_IOMG021     (PCIE_SUBSYS_IOMUX + 0x50)
>> +#define PCIE_SUBSYS_IOMG022     (PCIE_SUBSYS_IOMUX + 0x54)
>> +#define PCIE_SUBSYS_IOMG023     (PCIE_SUBSYS_IOMUX + 0x58)
>> +#define PCIE_SUBSYS_IOMG024     (PCIE_SUBSYS_IOMUX + 0x5C)
>> +#define PCIE_SUBSYS_IOMG025     (PCIE_SUBSYS_IOMUX + 0x60)
>> +#define PCIE_SUBSYS_IOMG028     (PCIE_SUBSYS_IOMUX + 0x6C)
>> +
>> +#define IO_MGMT_SUBCTRL_BASE    0x201070000
>> +#define SC_LPC_RESET_REQ_REG    (IO_MGMT_SUBCTRL_BASE + 0x0a58)
>> +#define SC_LPC_RESET_DREQ_REG   (IO_MGMT_SUBCTRL_BASE + 0x0a5c)
>> +#define SC_LPC_SEL              (IO_MGMT_SUBCTRL_BASE + 0x2400)
>> +
>> +
>> +#define LPCD06_BASE             0x201190000
>> +#define LPC_FIRM_SPACE0_CFG     (LPCD06_BASE + 0x100)
>> +#define LPC_FIRM_SPACE1_CFG     (LPCD06_BASE + 0x104)
>> +#define LPC_FIRM_SPACE2_CFG     (LPCD06_BASE + 0x108)
>> +#define LPC_FIRM_SPACE3_CFG     (LPCD06_BASE + 0x10C)
>> +#define LPC_FIRM_SPACE4_CFG     (LPCD06_BASE + 0x110)
>> +#define LPC_FIRM_SPACE5_CFG     (LPCD06_BASE + 0x114)
>> +#define LPC_FIRM_SPACE6_CFG     (LPCD06_BASE + 0x118)
>> +#define LPC_FIRM_SPACE7_CFG     (LPCD06_BASE + 0x11C)
>> +#define LPC_MEM_SPACE0_CFG      (LPCD06_BASE + 0x120)
>> +#define LPC_MEM_SPACE1_CFG      (LPCD06_BASE + 0x124)
>> +#define LPC_MEM_SPACE2_CFG      (LPCD06_BASE + 0x128)
>> +#define LPC_MEM_SPACE3_CFG      (LPCD06_BASE + 0x12C)
>> +#define LPC_MEM_SPACE4_CFG      (LPCD06_BASE + 0x130)
>> +#define LPC_MEM_SPACE5_CFG      (LPCD06_BASE + 0x134)
>> +#define LPC_MEM_SPACE6_CFG      (LPCD06_BASE + 0x138)
>> +
>> +#define LPCD06_START_REG        (LPCD06_BASE + 0x00)
>> +#define LPCD06_OP_STATUS_REG    (LPCD06_BASE + 0x04)
>> +#define LPCD06_IRQ_ST_REG       (LPCD06_BASE + 0x08)
>> +#define LPCD06_OP_LEN_REG       (LPCD06_BASE + 0x10)
>> +#define LPCD06_CMD_REG          (LPCD06_BASE + 0x14)
>> +#define LPCD06_ADDR_REG         (LPCD06_BASE + 0x20)
>> +#define LPCD06_WDATA_REG        (LPCD06_BASE + 0x24)
>> +#define LPCD06_RDATA_REG        (LPCD06_BASE + 0x28)
>> +
>> +#define LPC_SIRQ_CTR0           (LPCD06_BASE + 0x80)
>> +#define LPC_SIRQ_CTR1           (LPCD06_BASE + 0x84)
>> +#define LPC_SIRQ_INT_MASK       (LPCD06_BASE + 0x94)
>> +
>> +
>>  #define PCIE_SUBSYS_IO_MUX      0xA0170000
>>  #define PCIE_SUBSYS_IOMG033     (PCIE_SUBSYS_IO_MUX + 0x84)
>>  #define PCIE_SUBSYS_IOMG035     (PCIE_SUBSYS_IO_MUX + 0x8C)
>> -- 
>> 2.17.0
>>


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 42/43] Hisilicon/D06: Add edk2-non-osi Shell components
  2018-08-22 18:48   ` Leif Lindholm
@ 2018-08-23  8:37     ` Ming
  0 siblings, 0 replies; 93+ messages in thread
From: Ming @ 2018-08-23  8:37 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu



On 8/23/2018 2:48 AM, Leif Lindholm wrote:
> So, on the whole, I am really not happy for any of these commands to
> go into 18.08. I understand they may be handy for development, but I
> do not understand why they make sense to upstream.

As Oem Shell commands is useless for ERP, I will drop this patch
and on-osi related components.

> 
> On Tue, Aug 14, 2018 at 04:09:02PM +0800, Ming Huang wrote:
>> Add Hisilicon Oem Shell libraries for some commands,such as
>> biosupdate, getmac, setmac, provision, acpistartos, brdinfo,
>> sfpinfo.
>>
>> biosupdate example:
>> ifconfig -s eth2 static 192.168.2.68 255.255.255.0 192.168.2.1
>> biosupdate serverIp -u user -p password -f D06.fd -m master
>>
>> acpistartos example:
>> ifconfig -s eth2 static 192.168.2.69 255.255.255.0 192.168.2.1
>> provision serverIp -u user -p password -f os\Image -a 0x80000
>> 2
>> provision serverIp -u user -p password -f os\minifs.cpio.gz -a 0x07000000
>> 2
>> acpistartos
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ming Huang <ming.huang@linaro.org>
>> ---
>>  Silicon/Hisilicon/HisiPkg.dec  | 4 ++++
>>  Platform/Hisilicon/D06/D06.dsc | 2 ++
>>  2 files changed, 6 insertions(+)
>>
>> diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec
>> index 858b840a57..010d501914 100644
>> --- a/Silicon/Hisilicon/HisiPkg.dec
>> +++ b/Silicon/Hisilicon/HisiPkg.dec
>> @@ -39,6 +39,7 @@
>>    gPlatformSasProtocolGuid = {0x40e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x5d}}
>>    gHisiPlatformSasProtocolGuid = {0x20e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x6d}}
>>    gHisiSnpPlatformProtocolGuid = {0x81321f27, 0xff58, 0x4a1d, {0x99, 0x97, 0xd, 0xcc, 0xfa, 0x82, 0xf4, 0x6f}}
>> +  gOemNicProtocolGuid = {0xb5903955, 0x31e9, 0x4aaf, {0xb2, 0x83, 0x7, 0x9f, 0x3c, 0xc4, 0x71, 0x66}}
>>  
>>  [Guids]
>>    gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}
>> @@ -49,6 +50,8 @@
>>    gHisiOemVariableGuid = {0xac62b9a5, 0x9939, 0x41d3, {0xff, 0x5c, 0xc5, 0x80, 0x32, 0x7d, 0x9b, 0x29}}
>>    gOemBootVariableGuid = {0xb7784577, 0x5aaf, 0x4557, {0xa1, 0x99, 0xd4, 0xa4, 0x2f, 0x45, 0x06, 0xf8}}
>>    gEfiHisiSocControllerGuid = {0xee369cc3, 0xa743, 0x5382, {0x75, 0x64, 0x53, 0xe4, 0x31, 0x19, 0x38, 0x35}}
>> +  HisiShellSampleHiiGuid  = { 0x43859314, 0x82c1, 0x4592, { 0x8f, 0xf7, 0xc1, 0xbd, 0xf3, 0xb2, 0x0e, 0xd5 }}
>> +  HisiPlatformShellSampleHiiGuid = { 0x7924a5de, 0xc600, 0x40d5, { 0x91, 0x10, 0xf9, 0xc3, 0xe7, 0x25, 0x4d, 0x33 }}
> 
> Why do we need all these different GUIDs?
> 
> Also, why "Sample"?
> 
> /
>     Leif
> 
>>  
>>  [LibraryClasses]
>>    PlatformSysCtrlLib|Include/Library/PlatformSysCtrlLib.h
>> @@ -101,6 +104,7 @@
>>    gHisiTokenSpaceGuid.PcdSlotPerChannelNum|0x0|UINT32|0x40000004
>>  
>>    gHisiTokenSpaceGuid.PcdShellFile|{ 0x83, 0xA5, 0x04, 0x7C, 0x3E, 0x9E, 0x1C, 0x4F, 0xAD, 0x65, 0xE0, 0x52, 0x68, 0xD0, 0xB4, 0xD1 }|VOID*|0x30006554
>> +  gHisiTokenSpaceGuid.PcdStartOsParameter|L""|VOID*|0x5000000
>>  
>>    #FDT File Address
>>    gHisiTokenSpaceGuid.FdtFileAddress|0x0|UINT64|0x40000005
>> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
>> index 053ea894d5..544039e450 100644
>> --- a/Platform/Hisilicon/D06/D06.dsc
>> +++ b/Platform/Hisilicon/D06/D06.dsc
>> @@ -473,6 +473,8 @@
>>  !if $(INCLUDE_DP) == TRUE
>>        NULL|ShellPkg/Library/UefiDpLib/UefiDpLib.inf
>>  !endif #$(INCLUDE_DP)
>> +      NULL|Silicon/Hisilicon/Library/HisiShellCmdLib/HisiShellCmdLib.inf
>> +      NULL|Silicon/Hisilicon/Hi1620/Library/HisiD06ShellCmdLib/HisiD06ShellCmdLib.inf
>>  
>>      <PcdsFixedAtBuild>
>>        gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0xFF
>> -- 
>> 2.17.0
>>


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 34/43] Hisilicon/D06: add apei driver
  2018-08-23  7:35     ` Ming
@ 2018-08-23  9:43       ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-23  9:43 UTC (permalink / raw)
  To: Ming
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Luqi Jiang

On Thu, Aug 23, 2018 at 03:35:04PM +0800, Ming wrote:
> >> +BOOLEAN
> >> +BertAddGenericErrorData (
> >> +  IN EFI_ACPI_6_0_BOOT_ERROR_RECORD_TABLE_HEADER *Bert,
> >> +  IN EFI_CPER_SECTION_TYPE                       TypeOfErrorData,
> >> +  IN VOID                                        *GenericErrorData,
> >> +  IN UINT32                                      SizeOfGenericErrorData,
> >> +  IN ERROR_SEVERITY                              ErrorSeverity,
> >> +  IN BOOLEAN                                     Correctable
> >> +)
> >> +{
> >> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: \n", __FUNCTION__, __LINE__));
> > 
> > Isn't this adding error data for somewhere else?
> > If so, shouldn't that be giving an error message?
> > This one amounts to "I'm logging that there was an error somewhere".
> 
> I want to drop this DEBUG line. Is that ok?

Yes please.

> > This does not look like an error - should it really be of the ERROR
> > debug level? Better to move it to INFO.
> > The same applies to similar functions for the other tables.
> 
> Yes, it should be INFO and I will modify similar issues in this patch.

Thanks.

> >> +  DEBUG ((DEBUG_ERROR, "[%a]:[%dL]: \n", __FUNCTION__, __LINE__));
> > 
> > Why this message?
> 
> I think this DEBUG is useless.
> I will drop it in v4.

Yes please.

/
    Leif


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 35/43] Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h
  2018-08-23  7:39     ` Ming
@ 2018-08-23  9:44       ` Leif Lindholm
  2018-08-23  9:51         ` Ming
  0 siblings, 1 reply; 93+ messages in thread
From: Leif Lindholm @ 2018-08-23  9:44 UTC (permalink / raw)
  To: Ming
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu

On Thu, Aug 23, 2018 at 03:39:57PM +0800, Ming wrote:
> 
> 
> On 8/22/2018 11:33 PM, Leif Lindholm wrote:
> > On Tue, Aug 14, 2018 at 04:08:55PM +0800, Ming Huang wrote:
> >> Add some Lpc macro to LpcLib.h for D06.
> >>
> > 
> > Unaddressed feedback from v1:
> > 
> > I have no issue with this patch, but can you explain when these macros
> > are intended to be used? And if in this set, move this patch
> > immediately before the patch than needs it?
> 
> These macros are not used in edk2-platforms, used in HwPkg/LpcLib.

Then why are they not in HwPkg?

/
    Leif


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 35/43] Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h
  2018-08-23  9:44       ` Leif Lindholm
@ 2018-08-23  9:51         ` Ming
  0 siblings, 0 replies; 93+ messages in thread
From: Ming @ 2018-08-23  9:51 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu



On 8/23/2018 5:44 PM, Leif Lindholm wrote:
> On Thu, Aug 23, 2018 at 03:39:57PM +0800, Ming wrote:
>>
>>
>> On 8/22/2018 11:33 PM, Leif Lindholm wrote:
>>> On Tue, Aug 14, 2018 at 04:08:55PM +0800, Ming Huang wrote:
>>>> Add some Lpc macro to LpcLib.h for D06.
>>>>
>>>
>>> Unaddressed feedback from v1:
>>>
>>> I have no issue with this patch, but can you explain when these macros
>>> are intended to be used? And if in this set, move this patch
>>> immediately before the patch than needs it?
>>
>> These macros are not used in edk2-platforms, used in HwPkg/LpcLib.
> 
> Then why are they not in HwPkg?

I will drop this patch and move those macros to HwPkg.

> 
> /
>     Leif
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 39/43] Silicon/Hisilicon/Setup: Support SPCR table switch
  2018-08-14  8:08 ` [PATCH edk2-platforms v2 39/43] Silicon/Hisilicon/Setup: Support SPCR table switch Ming Huang
@ 2018-08-23  9:54   ` Ming
  2018-08-23  9:57     ` Leif Lindholm
  0 siblings, 1 reply; 93+ messages in thread
From: Ming @ 2018-08-23  9:54 UTC (permalink / raw)
  To: leif.lindholm, linaro-uefi, edk2-devel, graeme.gregory
  Cc: ard.biesheuvel, michael.d.kinney, lersek, guoheyi, wanghuiqiang,
	huangming23, zhangjinsong2, huangdaode, john.garry, xinliang.liu,
	Heyi Guo

Hi Leif,

How about this patch?

On 8/14/2018 4:08 PM, Ming Huang wrote:
> If install SPCR table, KVM will not output while install or boot
> some OS, like ubuntu, so add SPCR switch setup item and set it
> disable by default.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ming Huang <ming.huang@linaro.org>
> Signed-off-by: Heyi Guo <heyi.guo@linaro.org>
> ---
>  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf |  1 +
>  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c   | 24 ++++++++++++++++++++
>  2 files changed, 25 insertions(+)
> 
> diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> index 281a4f2ebd..3d133aff85 100644
> --- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> +++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> @@ -51,6 +51,7 @@
>  
>  [Guids]
>    gHisiEfiMemoryMapGuid
> +  gOemConfigGuid
>  
>  [Pcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile    ## CONSUMES
> diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> index 54f49977c3..32878ca4f9 100644
> --- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> +++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> @@ -16,8 +16,10 @@
>  #include <Library/DebugLib.h>
>  #include <Library/HobLib.h>
>  #include <Library/HwMemInitLib.h>
> +#include <Library/OemConfigData.h>
>  #include <Library/OemMiscLib.h>
>  #include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiRuntimeServicesTableLib.h>
>  #include <Library/UefiLib.h>
>  
>  #define CORECOUNT(X) ((X) * CORE_NUM_PER_SOCKET)
> @@ -114,6 +116,25 @@ UpdateSlit (
>    return  EFI_SUCCESS;
>  }
>  
> +STATIC
> +EFI_STATUS
> +IsNeedSpcr (
> +  IN OUT EFI_ACPI_DESCRIPTION_HEADER  *Table
> +  )
> +{
> +  EFI_STATUS                     Status;
> +  OEM_CONFIG_DATA                SetupData;
> +  UINTN                          DataSize = sizeof (OEM_CONFIG_DATA);
> +
> +  Status = gRT->GetVariable (OEM_CONFIG_NAME, &gOemConfigGuid, NULL, &DataSize, &SetupData);
> +  if (!EFI_ERROR (Status) && (SetupData.EnableSpcr == FALSE)) {
> +    return EFI_ABORTED;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
>  EFI_STATUS
>  UpdateAcpiTable (
>    IN OUT EFI_ACPI_DESCRIPTION_HEADER      *TableHeader
> @@ -130,6 +151,9 @@ UpdateAcpiTable (
>    case EFI_ACPI_6_0_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE:
>      Status = UpdateSlit (TableHeader);
>      break;
> +  case EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE:
> +    Status = IsNeedSpcr (TableHeader);
> +    break;
>    }
>    return Status;
>  }
> 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 39/43] Silicon/Hisilicon/Setup: Support SPCR table switch
  2018-08-23  9:54   ` Ming
@ 2018-08-23  9:57     ` Leif Lindholm
  0 siblings, 0 replies; 93+ messages in thread
From: Leif Lindholm @ 2018-08-23  9:57 UTC (permalink / raw)
  To: Ming
  Cc: linaro-uefi, edk2-devel, graeme.gregory, ard.biesheuvel,
	michael.d.kinney, lersek, guoheyi, wanghuiqiang, huangming23,
	zhangjinsong2, huangdaode, john.garry, xinliang.liu, Heyi Guo

On Thu, Aug 23, 2018 at 05:54:48PM +0800, Ming wrote:
> Hi Leif,
> 
> How about this patch?

https://lists.01.org/pipermail/edk2-devel/2018-August/028823.html

/
    Leif

> On 8/14/2018 4:08 PM, Ming Huang wrote:
> > If install SPCR table, KVM will not output while install or boot
> > some OS, like ubuntu, so add SPCR switch setup item and set it
> > disable by default.
> > 
> > Contributed-under: TianoCore Contribution Agreement 1.1
> > Signed-off-by: Ming Huang <ming.huang@linaro.org>
> > Signed-off-by: Heyi Guo <heyi.guo@linaro.org>
> > ---
> >  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf |  1 +
> >  Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c   | 24 ++++++++++++++++++++
> >  2 files changed, 25 insertions(+)
> > 
> > diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> > index 281a4f2ebd..3d133aff85 100644
> > --- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> > +++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/AcpiPlatformDxe.inf
> > @@ -51,6 +51,7 @@
> >  
> >  [Guids]
> >    gHisiEfiMemoryMapGuid
> > +  gOemConfigGuid
> >  
> >  [Pcd]
> >    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile    ## CONSUMES
> > diff --git a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> > index 54f49977c3..32878ca4f9 100644
> > --- a/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> > +++ b/Silicon/Hisilicon/Drivers/HisiAcpiPlatformDxe/UpdateAcpiTable.c
> > @@ -16,8 +16,10 @@
> >  #include <Library/DebugLib.h>
> >  #include <Library/HobLib.h>
> >  #include <Library/HwMemInitLib.h>
> > +#include <Library/OemConfigData.h>
> >  #include <Library/OemMiscLib.h>
> >  #include <Library/UefiBootServicesTableLib.h>
> > +#include <Library/UefiRuntimeServicesTableLib.h>
> >  #include <Library/UefiLib.h>
> >  
> >  #define CORECOUNT(X) ((X) * CORE_NUM_PER_SOCKET)
> > @@ -114,6 +116,25 @@ UpdateSlit (
> >    return  EFI_SUCCESS;
> >  }
> >  
> > +STATIC
> > +EFI_STATUS
> > +IsNeedSpcr (
> > +  IN OUT EFI_ACPI_DESCRIPTION_HEADER  *Table
> > +  )
> > +{
> > +  EFI_STATUS                     Status;
> > +  OEM_CONFIG_DATA                SetupData;
> > +  UINTN                          DataSize = sizeof (OEM_CONFIG_DATA);
> > +
> > +  Status = gRT->GetVariable (OEM_CONFIG_NAME, &gOemConfigGuid, NULL, &DataSize, &SetupData);
> > +  if (!EFI_ERROR (Status) && (SetupData.EnableSpcr == FALSE)) {
> > +    return EFI_ABORTED;
> > +  }
> > +
> > +  return EFI_SUCCESS;
> > +}
> > +
> > +
> >  EFI_STATUS
> >  UpdateAcpiTable (
> >    IN OUT EFI_ACPI_DESCRIPTION_HEADER      *TableHeader
> > @@ -130,6 +151,9 @@ UpdateAcpiTable (
> >    case EFI_ACPI_6_0_SYSTEM_LOCALITY_INFORMATION_TABLE_SIGNATURE:
> >      Status = UpdateSlit (TableHeader);
> >      break;
> > +  case EFI_ACPI_6_2_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_SIGNATURE:
> > +    Status = IsNeedSpcr (TableHeader);
> > +    break;
> >    }
> >    return Status;
> >  }
> > 


^ permalink raw reply	[flat|nested] 93+ messages in thread

* Re: [PATCH edk2-platforms v2 36/43] Platform/Hisilicon/D06: Add capsule upgrade support
  2018-08-22 18:42   ` Leif Lindholm
@ 2018-08-24 14:43     ` Ard Biesheuvel
  0 siblings, 0 replies; 93+ messages in thread
From: Ard Biesheuvel @ 2018-08-24 14:43 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: Ming Huang, linaro-uefi, edk2-devel@lists.01.org, Graeme Gregory,
	Kinney, Michael D, Laszlo Ersek, guoheyi, wanghuiqiang, huangming,
	Jason Zhang, huangdaode, John Garry, Xinliang Liu

On 22 August 2018 at 19:42, Leif Lindholm <leif.lindholm@linaro.org> wrote:
> On Tue, Aug 14, 2018 at 04:08:56PM +0800, Ming Huang wrote:
>> This module support updating the boot CPU firmware only.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ming Huang <ming.huang@linaro.org>
>
> As I said on v1, I have no further comments on this.
> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
>
> Ard may have something to add.
>

Reviewed-by: Ard BIesheuvel <ard.biesheuvel@linaro.org>

>> ---
>>  Platform/Hisilicon/D06/D06.dsc                                                           | 14 ++++
>>  Platform/Hisilicon/D06/D06.fdf                                                           | 72 ++++++++++++++++-
>>  Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf     | 50 ++++++++++++
>>  Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c    | 70 +++++++++++++++++
>>  Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini | 46 +++++++++++
>>  Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc    | 81 ++++++++++++++++++++
>>  6 files changed, 332 insertions(+), 1 deletion(-)
>>
>> diff --git a/Platform/Hisilicon/D06/D06.dsc b/Platform/Hisilicon/D06/D06.dsc
>> index 9550e0d497..fad6fcc747 100644
>> --- a/Platform/Hisilicon/D06/D06.dsc
>> +++ b/Platform/Hisilicon/D06/D06.dsc
>> @@ -121,6 +121,11 @@
>>    gHisiTokenSpaceGuid.PcdIsItsSupported|TRUE
>>    gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdHiiOsRuntimeSupport|FALSE
>> +[PcdsDynamicExDefault.common.DEFAULT]
>> +  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor|{0x0}|VOID*|0x100
>> +  gEfiMdeModulePkgTokenSpaceGuid.PcdSystemFmpCapsuleImageTypeIdGuid|{0x29, 0x3d, 0x4b, 0xd3, 0x85, 0x00, 0xb3, 0x4a, 0x8b, 0xe8, 0x84, 0x18, 0x8c, 0xc5, 0x04, 0x89}
>> +  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareFileGuid|{0xcf, 0x4f, 0x2e, 0x64, 0xf7, 0x2d, 0x15, 0x44, 0x8b, 0x70, 0xa0, 0x39, 0x09, 0xc5, 0x7b, 0x55}
>> +
>>
>>  [PcdsFixedAtBuild.common]
>>    gArmPlatformTokenSpaceGuid.PcdCoreCount|48
>> @@ -266,6 +271,7 @@
>>    Platform/Hisilicon/D06/EarlyConfigPeim/EarlyConfigPeimD06.inf
>>    Silicon/Hisilicon/Drivers/VersionInfoPeim/VersionInfoPeim.inf
>>
>> +  Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
>>    MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
>>      <LibraryClasses>
>>        NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
>> @@ -386,6 +392,8 @@
>>    MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
>>    MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf
>>    MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
>> +  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
>> +  MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
>>    #
>>    # FAT filesystem + GPT/MBR partitioning
>>    #
>> @@ -434,6 +442,12 @@
>>    MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
>>    MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
>>    MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
>> +  SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf {
>> +    <LibraryClasses>
>> +      FmpAuthenticationLib|SecurityPkg/Library/FmpAuthenticationLibPkcs7/FmpAuthenticationLibPkcs7.inf
>> +  }
>> +
>> +  MdeModulePkg/Application/CapsuleApp/CapsuleApp.inf
>>
>>    #
>>    # UEFI application (Shell Embedded Boot Loader)
>> diff --git a/Platform/Hisilicon/D06/D06.fdf b/Platform/Hisilicon/D06/D06.fdf
>> index 90379b8558..8c3f4f9932 100644
>> --- a/Platform/Hisilicon/D06/D06.fdf
>> +++ b/Platform/Hisilicon/D06/D06.fdf
>> @@ -308,7 +308,9 @@ READ_LOCK_STATUS   = TRUE
>>    INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf
>>
>>    INF Silicon/Hisilicon/Hi1620/Drivers/Pl011DebugSerialPortInitDxe/Pl011DebugSerialPortInitDxe.inf
>> -  INF MdeModulePkg/Universal/Network/SnpDxe/SnpDxe.inf
>> +  INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareReportDxe.inf
>> +  INF MdeModulePkg/Universal/EsrtDxe/EsrtDxe.inf
>> +
>>    #
>>    # Build Shell from latest source code instead of prebuilt binary
>>    #
>> @@ -364,11 +366,79 @@ READ_LOCK_STATUS   = TRUE
>>
>>    INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>
>> +  INF RuleOverride = FMP_IMAGE_DESC Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
>>    FILE FV_IMAGE = 9E21FD93-9C72-4c15-8C4B-E77F1DB2D792 {
>>      SECTION GUIDED EE4E5898-3914-4259-9D6E-DC7BD79403CF PROCESSING_REQUIRED = TRUE {
>>        SECTION FV_IMAGE = FVMAIN
>>      }
>>    }
>> +[FV.CapsuleDispatchFv]
>> +FvAlignment        = 16
>> +ERASE_POLARITY     = 1
>> +MEMORY_MAPPED      = TRUE
>> +STICKY_WRITE       = TRUE
>> +LOCK_CAP           = TRUE
>> +LOCK_STATUS        = TRUE
>> +WRITE_DISABLED_CAP = TRUE
>> +WRITE_ENABLED_CAP  = TRUE
>> +WRITE_STATUS       = TRUE
>> +WRITE_LOCK_CAP     = TRUE
>> +WRITE_LOCK_STATUS  = TRUE
>> +READ_DISABLED_CAP  = TRUE
>> +READ_ENABLED_CAP   = TRUE
>> +READ_STATUS        = TRUE
>> +READ_LOCK_CAP      = TRUE
>> +READ_LOCK_STATUS   = TRUE
>> +
>> +  INF SignedCapsulePkg/Universal/SystemFirmwareUpdate/SystemFirmwareUpdateDxe.inf
>> +
>> +[FV.SystemFirmwareUpdateCargo]
>> +FvAlignment        = 16
>> +ERASE_POLARITY     = 1
>> +MEMORY_MAPPED      = TRUE
>> +STICKY_WRITE       = TRUE
>> +LOCK_CAP           = TRUE
>> +LOCK_STATUS        = TRUE
>> +WRITE_DISABLED_CAP = TRUE
>> +WRITE_ENABLED_CAP  = TRUE
>> +WRITE_STATUS       = TRUE
>> +WRITE_LOCK_CAP     = TRUE
>> +WRITE_LOCK_STATUS  = TRUE
>> +READ_DISABLED_CAP  = TRUE
>> +READ_ENABLED_CAP   = TRUE
>> +READ_STATUS        = TRUE
>> +READ_LOCK_CAP      = TRUE
>> +READ_LOCK_STATUS   = TRUE
>> +
>> +  FILE RAW = 642e4fcf-2df7-4415-8b70-a03909c57b55 { # PcdEdkiiSystemFirmwareFileGuid
>> +    FD = D06
>> +  }
>> +
>> +  FILE RAW = ce57b167-b0e4-41e8-a897-5f4feb781d40 { # gEdkiiSystemFmpCapsuleDriverFvFileGuid
>> +    FV = CapsuleDispatchFv
>> +  }
>> +
>> +  FILE RAW = 812136D3-4D3A-433A-9418-29BB9BF78F6E { # gEdkiiSystemFmpCapsuleConfigFileGuid
>> +    Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
>> +  }
>> +
>> +[FmpPayload.FmpPayloadSystemFirmwarePkcs7]
>> +IMAGE_HEADER_INIT_VERSION = 0x02
>> +IMAGE_TYPE_ID             = df8fe8d1-e937-45b8-9691-c4b5e183874e # PcdSystemFmpCapsuleImageTypeIdGuid
>> +IMAGE_INDEX               = 0x1
>> +HARDWARE_INSTANCE         = 0x0
>> +MONOTONIC_COUNT           = 0x1
>> +CERTIFICATE_GUID          = 4AAFD29D-68DF-49EE-8AA9-347D375665A7 # PKCS7
>> +
>> +  FV = SystemFirmwareUpdateCargo
>> +
>> +[Capsule.D06FirmwareUpdateCapsuleFmpPkcs7]
>> +CAPSULE_GUID                = 6dcbd5ed-e82d-4c44-bda1-7194199ad92a # gEfiFmpCapsuleGuid
>> +CAPSULE_HEADER_SIZE         = 0x20
>> +CAPSULE_HEADER_INIT_VERSION = 0x1
>> +
>> +  FMP_PAYLOAD = FmpPayloadSystemFirmwarePkcs7
>> +
>>
>>  !include Silicon/Hisilicon/Hisilicon.fdf.inc
>>
>> diff --git a/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
>> new file mode 100644
>> index 0000000000..fc1832fa5f
>> --- /dev/null
>> +++ b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
>> @@ -0,0 +1,50 @@
>> +## @file
>> +#  System Firmware descriptor.
>> +#
>> +#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +#  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +#  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
>> +#
>> +#  This program and the accompanying materials
>> +#  are licensed and made available under the terms and conditions of the BSD License
>> +#  which accompanies this distribution.  The full text of the license may be found at
>> +#  http://opensource.org/licenses/bsd-license.php
>> +#
>> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +#
>> +##
>> +
>> +[Defines]
>> +  INF_VERSION                    = 0x0001001A
>> +  BASE_NAME                      = SystemFirmwareDescriptor
>> +  FILE_GUID                      = 90B2B846-CA6D-4D6E-A8D3-C140A8E110AC
>> +  MODULE_TYPE                    = PEIM
>> +  VERSION_STRING                 = 1.0
>> +  ENTRY_POINT                    = SystemFirmwareDescriptorPeimEntry
>> +
>> +[Sources]
>> +  SystemFirmwareDescriptorPei.c
>> +  SystemFirmwareDescriptor.aslc
>> +
>> +[Packages]
>> +  ArmPkg/ArmPkg.dec
>> +  ArmPlatformPkg/ArmPlatformPkg.dec
>> +  MdeModulePkg/MdeModulePkg.dec
>> +  MdePkg/MdePkg.dec
>> +  SignedCapsulePkg/SignedCapsulePkg.dec
>> +
>> +[LibraryClasses]
>> +  DebugLib
>> +  PcdLib
>> +  PeimEntryPoint
>> +  PeiServicesLib
>> +
>> +[FixedPcd]
>> +  gArmTokenSpaceGuid.PcdFdSize
>> +
>> +[Pcd]
>> +  gEfiSignedCapsulePkgTokenSpaceGuid.PcdEdkiiSystemFirmwareImageDescriptor
>> +
>> +[Depex]
>> +  TRUE
>> diff --git a/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
>> new file mode 100644
>> index 0000000000..27c0a718f8
>> --- /dev/null
>> +++ b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptorPei.c
>> @@ -0,0 +1,70 @@
>> +/** @file
>> +  System Firmware descriptor producer.
>> +
>> +  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
>> +
>> +  This program and the accompanying materials
>> +  are licensed and made available under the terms and conditions of the BSD License
>> +  which accompanies this distribution.  The full text of the license may be found at
>> +  http://opensource.org/licenses/bsd-license.php
>> +
>> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +
>> +**/
>> +
>> +#include <PiPei.h>
>> +#include <Guid/EdkiiSystemFmpCapsule.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/PcdLib.h>
>> +#include <Library/PeiServicesLib.h>
>> +#include <Protocol/FirmwareManagement.h>
>> +
>> +/**
>> +  Entrypoint for SystemFirmwareDescriptor PEIM.
>> +
>> +  @param[in]  FileHandle  Handle of the file being invoked.
>> +  @param[in]  PeiServices Describes the list of possible PEI Services.
>> +
>> +  @retval EFI_SUCCESS            PPI successfully installed.
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +SystemFirmwareDescriptorPeimEntry (
>> +  IN EFI_PEI_FILE_HANDLE     FileHandle,
>> +  IN CONST EFI_PEI_SERVICES  **PeiServices
>> +  )
>> +{
>> +  EFI_STATUS                              Status;
>> +  EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR  *Descriptor;
>> +  UINTN                                   Size;
>> +  UINTN                                   Index;
>> +  UINT32                                  AuthenticationStatus;
>> +
>> +  //
>> +  // Search RAW section.
>> +  //
>> +
>> +  Index = 0;
>> +  while (TRUE) {
>> +    Status = PeiServicesFfsFindSectionData3 (EFI_SECTION_RAW, Index, FileHandle, (VOID **)&Descriptor, &AuthenticationStatus);
>> +    if (EFI_ERROR (Status)) {
>> +      // Should not happen, must something wrong in FDF.
>> +      DEBUG ((DEBUG_ERROR, "Not found SystemFirmwareDescriptor in fdf !\n"));
>> +      return EFI_NOT_FOUND;
>> +    }
>> +    if (Descriptor->Signature == EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE) {
>> +      break;
>> +    }
>> +    Index++;
>> +  }
>> +
>> +  DEBUG ((DEBUG_INFO, "EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR size - 0x%x\n", Descriptor->Length));
>> +
>> +  Size = Descriptor->Length;
>> +  PcdSetPtrS (PcdEdkiiSystemFirmwareImageDescriptor, &Size, Descriptor);
>> +
>> +  return EFI_SUCCESS;
>> +}
>> diff --git a/Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini b/Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
>> new file mode 100644
>> index 0000000000..80f253b235
>> --- /dev/null
>> +++ b/Platform/Hisilicon/D06/Capsule/SystemFirmwareUpdateConfig/SystemFirmwareUpdateConfig.ini
>> @@ -0,0 +1,46 @@
>> +#
>> +#  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +#  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +#  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
>> +#
>> +#  This program and the accompanying materials
>> +#  are licensed and made available under the terms and conditions of the BSD License
>> +#  which accompanies this distribution.  The full text of the license may be found at
>> +#  http://opensource.org/licenses/bsd-license.php
>> +#
>> +#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +#
>> +##
>> +
>> +[Head]
>> +NumOfUpdate = 3
>> +NumOfRecovery = 0
>> +Update0 = SysFvMain
>> +Update1 = SysCustom
>> +Update2 = SysNvRam
>> +
>> +[SysFvMain]
>> +FirmwareType  = 0             # 0 - SystemFirmware, 1 - NvRam
>> +AddressType   = 0             # 0 - relative address, 1 - absolute address.
>> +BaseAddress   = 0x00000000    # Base address offset on flash
>> +Length        = 0x003C0000    # Length
>> +ImageOffset   = 0x00000000    # Image offset of this SystemFirmware image
>> +FileGuid      = 642e4fcf-2df7-4415-8b70-a03909c57b55  # PcdEdkiiSystemFirmwareFileGuid
>> +
>> +[SysCustom]
>> +FirmwareType  = 0             # 0 - SystemFirmware, 1 - NvRam
>> +AddressType   = 0             # 0 - relative address, 1 - absolute address.
>> +BaseAddress   = 0x003F0000    # Base address offset on flash
>> +Length        = 0x00010000    # Length
>> +ImageOffset   = 0x003F0000    # Image offset of this SystemFirmware image
>> +FileGuid      = 642e4fcf-2df7-4415-8b70-a03909c57b55  # PcdEdkiiSystemFirmwareFileGuid
>> +
>> +[SysNvRam]
>> +FirmwareType  = 1             # 0 - SystemFirmware, 1 - NvRam
>> +AddressType   = 0             # 0 - relative address, 1 - absolute address.
>> +BaseAddress   = 0x003C0000    # Base address offset on flash
>> +Length        = 0x00020000    # Length
>> +ImageOffset   = 0x003C0000    # Image offset of this SystemFirmware image
>> +FileGuid      = 642e4fcf-2df7-4415-8b70-a03909c57b55  # PcdEdkiiSystemFirmwareFileGuid
>> +
>> diff --git a/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
>> new file mode 100644
>> index 0000000000..36175338dd
>> --- /dev/null
>> +++ b/Platform/Hisilicon/D06/Drivers/SystemFirmwareDescriptor/SystemFirmwareDescriptor.aslc
>> @@ -0,0 +1,81 @@
>> +/** @file
>> +  System Firmware descriptor.
>> +
>> +  Copyright (c) 2018, Hisilicon Limited. All rights reserved.
>> +  Copyright (c) 2018, Linaro Limited. All rights reserved.
>> +  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
>> +
>> +  This program and the accompanying materials
>> +  are licensed and made available under the terms and conditions of the BSD License
>> +  which accompanies this distribution.  The full text of the license may be found at
>> +  http://opensource.org/licenses/bsd-license.php
>> +
>> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
>> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>> +
>> +**/
>> +
>> +#include <PiPei.h>
>> +#include <Guid/EdkiiSystemFmpCapsule.h>
>> +#include <Protocol/FirmwareManagement.h>
>> +
>> +#define PACKAGE_VERSION                     0xFFFFFFFF
>> +#define PACKAGE_VERSION_STRING              L"Unknown"
>> +
>> +#define CURRENT_FIRMWARE_VERSION            0x00000002
>> +#define CURRENT_FIRMWARE_VERSION_STRING     L"0x00000002"
>> +#define LOWEST_SUPPORTED_FIRMWARE_VERSION   0x00000001
>> +
>> +#define IMAGE_ID                            SIGNATURE_64('H','W','A', 'R', 'M', '_', 'F', 'd')
>> +#define IMAGE_ID_STRING                     L"ARMPlatformFd"
>> +
>> +// PcdSystemFmpCapsuleImageTypeIdGuid
>> +#define IMAGE_TYPE_ID_GUID                  { 0xdf8fe8d1, 0xe937, 0x45b8, { 0x96, 0x91, 0xc4, 0xb5, 0xe1, 0x83, 0x87, 0x4e } }
>> +
>> +typedef struct {
>> +  EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR  Descriptor;
>> +  // real string data
>> +  CHAR16                                  ImageIdNameStr[ARRAY_SIZE (IMAGE_ID_STRING)];
>> +  CHAR16                                  VersionNameStr[ARRAY_SIZE (CURRENT_FIRMWARE_VERSION_STRING)];
>> +  CHAR16                                  PackageVersionNameStr[ARRAY_SIZE (PACKAGE_VERSION_STRING)];
>> +} IMAGE_DESCRIPTOR;
>> +
>> +IMAGE_DESCRIPTOR mImageDescriptor =
>> +{
>> +  {
>> +    EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR_SIGNATURE,
>> +    sizeof (EDKII_SYSTEM_FIRMWARE_IMAGE_DESCRIPTOR),
>> +    sizeof (IMAGE_DESCRIPTOR),
>> +    PACKAGE_VERSION,                                       // PackageVersion
>> +    OFFSET_OF (IMAGE_DESCRIPTOR, PackageVersionNameStr),   // PackageVersionName
>> +    1,                                                     // ImageIndex;
>> +    {0x0},                                                 // Reserved
>> +    IMAGE_TYPE_ID_GUID,                                    // ImageTypeId;
>> +    IMAGE_ID,                                              // ImageId;
>> +    OFFSET_OF (IMAGE_DESCRIPTOR, ImageIdNameStr),          // ImageIdName;
>> +    CURRENT_FIRMWARE_VERSION,                              // Version;
>> +    OFFSET_OF (IMAGE_DESCRIPTOR, VersionNameStr),          // VersionName;
>> +    {0x0},                                                 // Reserved2
>> +    FixedPcdGet32 (PcdFdSize),                             // Size;
>> +    IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
>> +      IMAGE_ATTRIBUTE_RESET_REQUIRED |
>> +      IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
>> +      IMAGE_ATTRIBUTE_IN_USE,                              // AttributesSupported;
>> +    IMAGE_ATTRIBUTE_IMAGE_UPDATABLE |
>> +      IMAGE_ATTRIBUTE_RESET_REQUIRED |
>> +      IMAGE_ATTRIBUTE_AUTHENTICATION_REQUIRED |
>> +      IMAGE_ATTRIBUTE_IN_USE,                              // AttributesSetting;
>> +    0x0,                                                   // Compatibilities;
>> +    LOWEST_SUPPORTED_FIRMWARE_VERSION,                     // LowestSupportedImageVersion;
>> +    0x00000000,                                            // LastAttemptVersion;
>> +    0,                                                     // LastAttemptStatus;
>> +    {0x0},                                                 // Reserved3
>> +    0,                                                     // HardwareInstance;
>> +  },
>> +  // real string data
>> +  {IMAGE_ID_STRING},
>> +  {CURRENT_FIRMWARE_VERSION_STRING},
>> +  {PACKAGE_VERSION_STRING},
>> +};
>> +
>> +VOID* CONST ReferenceAcpiTable = &mImageDescriptor;
>> --
>> 2.17.0
>>


^ permalink raw reply	[flat|nested] 93+ messages in thread

end of thread, other threads:[~2018-08-24 14:43 UTC | newest]

Thread overview: 93+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-08-14  8:08 [PATCH edk2-platforms v2 00/43] Upload for D06 platform Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 01/43] Silicon/Hisilicon: Modify the MRC interface for other module Ming Huang
2018-08-21 17:50   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 02/43] Silicon/Hisilicon: Separate PlatformArch.h Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 03/43] Silicon/Hisilicon/Acpi: Move some macro to PlatformArch.h Ming Huang
2018-08-17 13:23   ` Leif Lindholm
2018-08-18  7:26     ` Ming
2018-08-14  8:08 ` [PATCH edk2-platforms v2 04/43] Silicon/Hisilicon/D0x: Move dimm size definition " Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 05/43] Silicon/Hisilicon/D0x: Move RAS macro " Ming Huang
2018-08-21 17:48   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 06/43] Hisilicon/D0x: Move CustomData.Fv to common path of Hisilicon Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 07/43] Hisilicon/D0x: Move IpmiCmdLib " Ming Huang
2018-08-15 13:58   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 08/43] Hisilicon/D0x: Unify FlashFvbDxe driver Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 09/43] Hisilicon/D0X: Rename the global variable gDS3231RtcDevice Ming Huang
2018-08-21 17:59   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 10/43] Hisilicon/D06: Add several base file for D06 Ming Huang
2018-08-21 21:56   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 11/43] Platform/Hisilicon/D06: Add M41T83RealTimeClockLib Ming Huang
2018-08-21 22:57   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 12/43] Platform/Hisilicon/D06: Add edk2-non-osi components for D06 Ming Huang
2018-08-22  9:49   ` Leif Lindholm
2018-08-22 14:54     ` Ming
2018-08-22 16:43       ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 13/43] Hisilicon/D06: Add OemMiscLibD06 Ming Huang
2018-08-22 10:17   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 14/43] Silicon/Hisilicon/D06: Wait for all disk ready Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 15/43] Silicon/Hisilicon/Acpi: Unify HisiAcipPlatformDxe Ming Huang
2018-08-22 10:29   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 16/43] Hisilicon/D06: Add Debug Serial Port Init Driver Ming Huang
2018-08-22 11:01   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 17/43] Hisilicon/D06: Add ACPI Tables for D06 Ming Huang
2018-08-22 11:49   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 18/43] Hisilicon/D06: Add Hi1620OemConfigUiLib Ming Huang
2018-08-22 14:14   ` Leif Lindholm
2018-08-22 15:11     ` Ming
2018-08-14  8:08 ` [PATCH edk2-platforms v2 19/43] Silicon/Hisilicon/D06: Stop watchdog Ming Huang
2018-08-22 14:17   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 20/43] Hisilicon/I2C: Modify I2CLib.c for coding style Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 21/43] Silicon/Hisilicon/I2C: Refactor I2C library Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 22/43] Silicon/Hisilicon/D06: Fix I2C enable fail issue for D06 Ming Huang
2018-08-22 14:21   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 23/43] Silicon/Hisilicon/D06: Add I2C delay for HNS auto config Ming Huang
2018-08-22 14:27   ` Leif Lindholm
2018-08-22 15:16     ` Ming
2018-08-22 16:46       ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 24/43] Hisilicon/I2C: Fix a typo issue Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 25/43] Silicon/Hisilicon/D06: Optimize HNS config CDR post time Ming Huang
2018-08-22 14:30   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 26/43] Silicon/Hisilicon/Setup: Add Setup Item "EnableGOP" Ming Huang
2018-08-22 14:33   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 27/43] Hisilicon/Hi1620: Add ACPI PPTT table Ming Huang
2018-08-22 14:39   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 28/43] Platform/Hisilicon/D06: Enable ACPI PPTT Ming Huang
2018-08-22 14:40   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 29/43] Platform/Hisilicon/D06: Add OemNicLib Ming Huang
2018-08-14  8:08 ` [PATCH edk2-platforms v2 30/43] Platform/Hisilicon/D06: Add OemNicConfig2P Driver Ming Huang
2018-08-22 14:57   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 31/43] Hisilicon/D0x: Update SMBIOS type9 info Ming Huang
2018-08-22 15:01   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 32/43] Platform/Hisilicon/D06: Add EarlyConfigPeim peim Ming Huang
2018-08-22 15:04   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 33/43] Platform/Hisilicon/D06: Add PciHostBridgeLib Ming Huang
2018-08-22 15:09   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 34/43] Hisilicon/D06: add apei driver Ming Huang
2018-08-22 15:31   ` Leif Lindholm
2018-08-23  7:35     ` Ming
2018-08-23  9:43       ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 35/43] Silicon/Hisilicon/D06: Add some Lpc macro to LpcLib.h Ming Huang
2018-08-22 15:33   ` Leif Lindholm
2018-08-23  7:39     ` Ming
2018-08-23  9:44       ` Leif Lindholm
2018-08-23  9:51         ` Ming
2018-08-14  8:08 ` [PATCH edk2-platforms v2 36/43] Platform/Hisilicon/D06: Add capsule upgrade support Ming Huang
2018-08-22 18:42   ` Leif Lindholm
2018-08-24 14:43     ` Ard Biesheuvel
2018-08-14  8:08 ` [PATCH edk2-platforms v2 37/43] Silicon/Hisilicon/D06: Modify for close slave core clock Ming Huang
2018-08-22 15:44   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 38/43] Silicon/Hisilicon/D06: Add I2C Bus Exception handle function Ming Huang
2018-08-22 15:45   ` Leif Lindholm
2018-08-14  8:08 ` [PATCH edk2-platforms v2 39/43] Silicon/Hisilicon/Setup: Support SPCR table switch Ming Huang
2018-08-23  9:54   ` Ming
2018-08-23  9:57     ` Leif Lindholm
2018-08-14  8:09 ` [PATCH edk2-platforms v2 40/43] Silicon/Hisilicon/setup: Support SMMU switch Ming Huang
2018-08-22 18:42   ` Leif Lindholm
2018-08-14  8:09 ` [PATCH edk2-platforms v2 41/43] Hisilicon/D06: Add PciPlatformLib Ming Huang
2018-08-22 16:12   ` Leif Lindholm
2018-08-14  8:09 ` [PATCH edk2-platforms v2 42/43] Hisilicon/D06: Add edk2-non-osi Shell components Ming Huang
2018-08-22 18:48   ` Leif Lindholm
2018-08-23  8:37     ` Ming
2018-08-14  8:09 ` [PATCH edk2-platforms v2 43/43] Platform/Hisilicon/D0x: Update version string to 18.08 Ming Huang
2018-08-22 16:09   ` Leif Lindholm
2018-08-22 18:49 ` [PATCH edk2-platforms v2 00/43] Upload for D06 platform Leif Lindholm

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox