This commit is contained in:
Dongyan Qian 2026-08-26 22:31:58 +02:00 committed by GitHub
commit 7bc1a677c3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 1423 additions and 0 deletions

View file

@ -230,6 +230,11 @@
}
[Components.LOONGARCH64]
#
# Generators (LoongArch64 specific)
#
DynamicTablesPkg/Library/Acpi/LoongArch64/AcpiMadtLibLoongArch64/AcpiMadtLibLoongArch64.inf
#
# Dynamic Table Factory Dxe
#
@ -242,6 +247,8 @@
NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiPpttLib/AcpiPpttLib.inf
NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiRawLib/AcpiRawLib.inf
NULL|DynamicTablesPkg/Library/Acpi/Common/AcpiSlitLib/AcpiSlitLib.inf
# LoongArch64 specific
NULL|DynamicTablesPkg/Library/Acpi/LoongArch64/AcpiMadtLibLoongArch64/AcpiMadtLibLoongArch64.inf
NULL|DynamicTablesPkg/Library/Smbios/SmbiosType0Lib/SmbiosType0Lib.inf
NULL|DynamicTablesPkg/Library/Smbios/SmbiosType4Lib/SmbiosType4Lib.inf

View file

@ -112,6 +112,7 @@
"deviceid",
"EArch",
"edynamic",
"eloongarch",
"eventq",
"EOBJECT",
"gerror",

View file

@ -2,6 +2,7 @@
Copyright (c) 2017 - 2024, Arm Limited. All rights reserved.
Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved.
Copyright (c) 2026, Loongson Technology Corporation Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@ -15,6 +16,7 @@
#include <ArchCommonNameSpaceObjects.h>
#include <ArmNameSpaceObjects.h>
#include <LoongArch64NameSpaceObjects.h>
#include <RiscVNameSpaceObjects.h>
#include <StandardNameSpaceObjects.h>
#include <X64NameSpaceObjects.h>
@ -37,6 +39,7 @@ Bits: [31:28] - Name Space ID
0010 - ARM
0011 - X64
0100 - RISC-V
0101 - LoongArch64
1111 - Custom/OEM
All other values are reserved.
@ -90,6 +93,7 @@ typedef enum ObjectNameSpaceID {
EObjNameSpaceArm, ///< ARM Objects Namespace
EObjNameSpaceX64, ///< X64 Objects Namespace
EObjNameSpaceRiscV, ///< RISC-V Objects Namespace
EObjNameSpaceLoongArch64, ///< LoongArch64 Objects Namespace
EObjNameSpaceOem = 0xF, ///< OEM Objects Namespace
EObjNameSpaceMax,
} EOBJECT_NAMESPACE_ID;
@ -175,6 +179,16 @@ typedef struct CmObjDescriptor {
#define CREATE_CM_RISCV_OBJECT_ID(ObjectId) \
(CREATE_CM_OBJECT_ID (EObjNameSpaceRiscV, ObjectId))
/** This macro returns a Configuration Manager Object ID
in the LoongArch64 Object Namespace.
@param [in] ObjectId The Object ID.
@retval Returns a LoongArch64 Configuration Manager Object ID.
**/
#define CREATE_CM_LOONGARCH64_OBJECT_ID(ObjectId) \
(CREATE_CM_OBJECT_ID (EObjNameSpaceLoongArch64, ObjectId))
/** This macro returns a Configuration Manager Object ID
in the Arch Common Object Namespace.

View file

@ -0,0 +1,179 @@
/** @file
Copyright (c) 2026, Loongson Technology Corporation Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Glossary:
- Cm or CM - Configuration Manager
- Obj or OBJ - Object
**/
#pragma once
#include <AcpiObjects.h>
#include <StandardNameSpaceObjects.h>
#pragma pack(1)
/** The ELOONGARCH64_OBJECT_ID enum describes the Object IDs
in the LoongArch64 Namespace.
*/
typedef enum LoongArch64ObjectID {
ELoongArch64ObjReserved, ///< 0 - Reserved
ELoongArch64ObjMadtInfo, ///< 1 - MADT table information
ELoongArch64ObjCorePicInfo, ///< 2 - Core Programmable Interrupt Controller Info
ELoongArch64ObjLioPicInfo, ///< 3 - Legacy I/O Programmable Interrupt Controller Info
ELoongArch64ObjHtPicInfo, ///< 4 - HyperTransport Programmable Interrupt Controller Info
ELoongArch64ObjEioPicInfo, ///< 5 - Extend I/O Programmable Interrupt Controller Info
ELoongArch64ObjMsiPicInfo, ///< 6 - MSI Programmable Interrupt Controller Info
ELoongArch64ObjBioPicInfo, ///< 7 - Bridge I/O Programmable Interrupt Controller Info
ELoongArch64ObjLpcPicInfo, ///< 8 - Low Pin Count Programmable Interrupt Controller Info
ELoongArch64ObjMax
} ELOONGARCH64_OBJECT_ID;
/** A structure that describes MADT table-wide LoongArch64 information.
ID: ELoongArch64ObjMadtInfo
*/
typedef struct CmLoongArch64MadtInfo {
/// Address of the local interrupt controller.
UINT32 LocalApicAddress;
/// MADT flags.
UINT32 Flags;
} CM_LOONGARCH64_MADT_INFO;
/** A structure that describes a Core PIC.
ID: ELoongArch64ObjCorePicInfo
*/
typedef struct CmLoongArch64CorePicInfo {
/// PIC structure version. Currently, ACPI defines only version 1.
UINT8 Version;
/// ACPI processor UID matching the processor device's _UID.
UINT32 AcpiProcessorUid;
/// Physical processor ID. MAX_UINT32 is only valid for a disabled processor.
UINT32 CoreId;
/// CORE PIC flags. BIT0 is Enabled; all other bits are reserved.
UINT32 Flags;
} CM_LOONGARCH64_CORE_PIC_INFO;
/** A structure that describes a LIO PIC.
ID: ELoongArch64ObjLioPicInfo
*/
typedef struct CmLoongArch64LioPicInfo {
/// PIC structure version. Currently, ACPI defines only version 1.
UINT8 Version;
/// Base address
UINT64 Address;
/// Register space size
UINT16 Size;
/// Cascade vector
UINT8 Cascade[2];
/// Cascade map
UINT32 CascadeMap[2];
} CM_LOONGARCH64_LIO_PIC_INFO;
/** A structure that describes a HT PIC.
ID: ELoongArch64ObjHtPicInfo
*/
typedef struct CmLoongArch64HtPicInfo {
/// PIC structure version. Currently, ACPI defines only version 1.
UINT8 Version;
/// Base address
UINT64 Address;
/// Register space size
UINT16 Size;
/// Cascade vector
UINT8 Cascade[8];
} CM_LOONGARCH64_HT_PIC_INFO;
/** A structure that describes an EIO PIC.
ID: ELoongArch64ObjEioPicInfo
*/
typedef struct CmLoongArch64EioPicInfo {
/// PIC structure version. Currently, ACPI defines only version 1.
UINT8 Version;
/// Cascade vector
UINT8 Cascade;
/// Node ID
UINT8 Node;
/// Node map
UINT64 NodeMap;
} CM_LOONGARCH64_EIO_PIC_INFO;
/** A structure that describes a MSI PIC.
ID: ELoongArch64ObjMsiPicInfo
*/
typedef struct CmLoongArch64MsiPicInfo {
/// PIC structure version. Currently, ACPI defines only version 1.
UINT8 Version;
/// MSI message address
UINT64 MsgAddress;
/// MSI vector base
UINT32 Start;
/// MSI vector count
UINT32 Count;
} CM_LOONGARCH64_MSI_PIC_INFO;
/** A structure that describes a BIO PIC.
ID: ELoongArch64ObjBioPicInfo
*/
typedef struct CmLoongArch64BioPicInfo {
/// PIC structure version. Currently, ACPI defines only version 1.
UINT8 Version;
/// Base address
UINT64 Address;
/// Register space size
UINT16 Size;
/// Controller ID
UINT16 Id;
/// GSI base
UINT16 GsiBase;
} CM_LOONGARCH64_BIO_PIC_INFO;
/** A structure that describes a LPC PIC.
ID: ELoongArch64ObjLpcPicInfo
*/
typedef struct CmLoongArch64LpcPicInfo {
/// PIC structure version. Currently, ACPI defines only version 1.
UINT8 Version;
/// Base address
UINT64 Address;
/// Register space size
UINT16 Size;
/// Cascade vector
UINT8 Cascade;
} CM_LOONGARCH64_LPC_PIC_INFO;
#pragma pack()

View file

@ -0,0 +1,29 @@
## @file
# LoongArch64 MADT Table Generator
#
# Copyright (c) 2026, Loongson Technology Corporation Limited. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
[Defines]
INF_VERSION = 0x00010019
BASE_NAME = AcpiMadtLibLoongArch64
FILE_GUID = 019B6DB8-92C5-4C96-9085-85DA15F5E568
VERSION_STRING = 1.0
MODULE_TYPE = DXE_DRIVER
LIBRARY_CLASS = NULL|DXE_DRIVER
CONSTRUCTOR = AcpiMadtLibConstructor
DESTRUCTOR = AcpiMadtLibDestructor
[Sources]
MadtGenerator.c
[Packages]
DynamicTablesPkg/DynamicTablesPkg.dec
MdePkg/MdePkg.dec
[LibraryClasses]
BaseMemoryLib
DebugLib
MemoryAllocationLib

File diff suppressed because it is too large Load diff

View file

@ -4,6 +4,7 @@
Copyright (c) 2021 - 2026, ARM Limited. All rights reserved.<BR>
Copyright (C) 2024 - 2025 Advanced Micro Devices, Inc. All rights reserved.
Copyright (c) 2024 - 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.<BR>
Copyright (c) 2026, Loongson Technology Corporation Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@ -1836,6 +1837,93 @@ STATIC CONST CM_OBJ_PARSER_ARRAY RiscVNamespaceObjectParser[] = {
CM_PARSER_ADD_OBJECT_RESERVED (ERiscVObjMax)
};
/** A parser for ELoongArch64ObjMadtInfo.
*/
STATIC CONST CM_OBJ_PARSER CmLoongArch64MadtInfoParser[] = {
{ "LocalApicAddress", 4, "0x%x", NULL },
{ "Flags", 4, "0x%x", NULL }
};
/** A parser for ELoongArch64ObjCorePicInfo.
*/
STATIC CONST CM_OBJ_PARSER CmLoongArch64CorePicInfoParser[] = {
{ "Version", 1, "0x%x", NULL },
{ "AcpiProcessorUid", 4, "0x%x", NULL },
{ "CoreId", 4, "0x%x", NULL },
{ "Flags", 4, "0x%x", NULL }
};
/** A parser for ELoongArch64ObjLioPicInfo.
*/
STATIC CONST CM_OBJ_PARSER CmLoongArch64LioPicInfoParser[] = {
{ "Version", 1, "0x%x", NULL },
{ "Address", 8, "0x%llx", NULL },
{ "Size", 2, "0x%x", NULL },
{ "Cascade", sizeof (UINT8) * 2, NULL, HexDump },
{ "CascadeMap", sizeof (UINT32) * 2, NULL, HexDump }
};
/** A parser for ELoongArch64ObjHtPicInfo.
*/
STATIC CONST CM_OBJ_PARSER CmLoongArch64HtPicInfoParser[] = {
{ "Version", 1, "0x%x", NULL },
{ "Address", 8, "0x%llx", NULL },
{ "Size", 2, "0x%x", NULL },
{ "Cascade", sizeof (UINT8) * 8, NULL, HexDump }
};
/** A parser for ELoongArch64ObjEioPicInfo.
*/
STATIC CONST CM_OBJ_PARSER CmLoongArch64EioPicInfoParser[] = {
{ "Version", 1, "0x%x", NULL },
{ "Cascade", 1, "0x%x", NULL },
{ "Node", 1, "0x%x", NULL },
{ "NodeMap", 8, "0x%llx", NULL }
};
/** A parser for ELoongArch64ObjMsiPicInfo.
*/
STATIC CONST CM_OBJ_PARSER CmLoongArch64MsiPicInfoParser[] = {
{ "Version", 1, "0x%x", NULL },
{ "MsgAddress", 8, "0x%llx", NULL },
{ "Start", 4, "0x%x", NULL },
{ "Count", 4, "0x%x", NULL }
};
/** A parser for ELoongArch64ObjBioPicInfo.
*/
STATIC CONST CM_OBJ_PARSER CmLoongArch64BioPicInfoParser[] = {
{ "Version", 1, "0x%x", NULL },
{ "Address", 8, "0x%llx", NULL },
{ "Size", 2, "0x%x", NULL },
{ "Id", 2, "0x%x", NULL },
{ "GsiBase", 2, "0x%x", NULL }
};
/** A parser for ELoongArch64ObjLpcPicInfo.
*/
STATIC CONST CM_OBJ_PARSER CmLoongArch64LpcPicInfoParser[] = {
{ "Version", 1, "0x%x", NULL },
{ "Address", 8, "0x%llx", NULL },
{ "Size", 2, "0x%x", NULL },
{ "Cascade", 1, "0x%x", NULL }
};
/** A parser for LoongArch64 namespace objects.
*/
STATIC CONST CM_OBJ_PARSER_ARRAY LoongArch64NamespaceObjectParser[] = {
CM_PARSER_ADD_OBJECT_RESERVED (ELoongArch64ObjReserved),
CM_PARSER_ADD_OBJECT (ELoongArch64ObjMadtInfo, CmLoongArch64MadtInfoParser),
CM_PARSER_ADD_OBJECT (ELoongArch64ObjCorePicInfo, CmLoongArch64CorePicInfoParser),
CM_PARSER_ADD_OBJECT (ELoongArch64ObjLioPicInfo, CmLoongArch64LioPicInfoParser),
CM_PARSER_ADD_OBJECT (ELoongArch64ObjHtPicInfo, CmLoongArch64HtPicInfoParser),
CM_PARSER_ADD_OBJECT (ELoongArch64ObjEioPicInfo, CmLoongArch64EioPicInfoParser),
CM_PARSER_ADD_OBJECT (ELoongArch64ObjMsiPicInfo, CmLoongArch64MsiPicInfoParser),
CM_PARSER_ADD_OBJECT (ELoongArch64ObjBioPicInfo, CmLoongArch64BioPicInfoParser),
CM_PARSER_ADD_OBJECT (ELoongArch64ObjLpcPicInfo, CmLoongArch64LpcPicInfoParser),
CM_PARSER_ADD_OBJECT_RESERVED (ELoongArch64ObjMax)
};
/** A parser for EStdObjCfgMgrInfo.
*/
STATIC CONST CM_OBJ_PARSER StdObjCfgMgrInfoParser[] = {
@ -2174,6 +2262,21 @@ ParseCmObjDesc (
ParserArray = &RiscVNamespaceObjectParser[ObjId];
break;
case EObjNameSpaceLoongArch64:
if (ObjId >= ELoongArch64ObjMax) {
ASSERT (0);
return;
}
if (ObjId >= ARRAY_SIZE (LoongArch64NamespaceObjectParser)) {
DEBUG ((DEBUG_ERROR, "ObjId 0x%x is missing from the LoongArch64NamespaceObjectParser array\n", ObjId));
ASSERT (0);
return;
}
ParserArray = &LoongArch64NamespaceObjectParser[ObjId];
break;
case EObjNameSpaceArchCommon:
if (ObjId >= EArchCommonObjMax) {
ASSERT (0);