hc
2024-03-26 e0728245c89800c2038c23308f2d88969d5b41c8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/** @file
 
  Multiple APIC Description Table (MADT)
 
  Copyright (c) 2017, Linaro Ltd. All rights reserved.<BR>
  Copyright (c) 2019, Marvell International Ltd. and its affiliates.<BR>
 
  SPDX-License-Identifier: BSD-2-Clause-Patent
 
**/
 
#include <Library/AcpiLib.h>
 
#include "AcpiHeader.h"
 
#define GICC_BASE                 FixedPcdGet64 (PcdGicInterruptInterfaceBase)
#define GICD_BASE                 FixedPcdGet64 (PcdGicDistributorBase)
#define GICH_BASE                 0xF0240000
#define GICV_BASE                 0xF0260000
#define VGIC_MAINT_INT            25
 
#define GIC_MSI_FRAME0            0xF0280000
#define GIC_MSI_FRAME1            0xF0290000
#define GIC_MSI_FRAME2            0xF02A0000
#define GIC_MSI_FRAME3            0xF02B0000
 
#define PMU_INTERRUPT_CPU0        130
#define PMU_INTERRUPT_CPU1        131
#define PMU_INTERRUPT_CPU2        132
#define PMU_INTERRUPT_CPU3        133
 
#define PMU_INTERRUPT_FLAG        EFI_ACPI_6_0_GIC_ENABLED | EFI_ACPI_6_0_PERFORMANCE_INTERRUPT_MODEL
 
#pragma pack(push, 1)
typedef struct {
  EFI_ACPI_6_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER Header;
  EFI_ACPI_6_0_GIC_STRUCTURE                          GicC[4];
  EFI_ACPI_6_0_GIC_DISTRIBUTOR_STRUCTURE              GicD;
  EFI_ACPI_6_0_GIC_MSI_FRAME_STRUCTURE                GicM[4];
} ACPI_6_0_MADT_STRUCTURE;
#pragma pack(pop)
 
 
ACPI_6_0_MADT_STRUCTURE Madt = {
  {
    __ACPI_HEADER (EFI_ACPI_6_0_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE,
                   ACPI_6_0_MADT_STRUCTURE,
                   EFI_ACPI_6_0_MULTIPLE_APIC_DESCRIPTION_TABLE_REVISION),
    0,      // UINT32  LocalApicAddress
    0       // UINT32  Flags
  },
  {
    EFI_ACPI_6_0_GICC_STRUCTURE_INIT(0,                         // GicId
                                     0x000,                     // AcpiCpuUid
                                     0x000,                     // Mpidr
                                     PMU_INTERRUPT_FLAG,        // Flags
                                     PMU_INTERRUPT_CPU0,        // PmuIrq
                                     GICC_BASE,                 // GicBase
                                     GICV_BASE,                 // GicVBase
                                     GICH_BASE,                 // GicHBase
                                     VGIC_MAINT_INT,            // GsivId
                                     0,                         // GicRBase
                                     0                          // Efficiency
                                     ),
    EFI_ACPI_6_0_GICC_STRUCTURE_INIT(1,                         // GicId
                                     0x001,                     // AcpiCpuUid
                                     0x001,                     // Mpidr
                                     PMU_INTERRUPT_FLAG,        // Flags
                                     PMU_INTERRUPT_CPU1,        // PmuIrq
                                     GICC_BASE,                 // GicBase
                                     GICV_BASE,                 // GicVBase
                                     GICH_BASE,                 // GicHBase
                                     VGIC_MAINT_INT,            // GsivId
                                     0,                         // GicRBase
                                     0                          // Efficiency
                                     ),
    EFI_ACPI_6_0_GICC_STRUCTURE_INIT(2,                         // GicId
                                     0x100,                     // AcpiCpuUid
                                     0x100,                     // Mpidr
                                     PMU_INTERRUPT_FLAG,        // Flags
                                     PMU_INTERRUPT_CPU2,        // PmuIrq
                                     GICC_BASE,                 // GicBase
                                     GICV_BASE,                 // GicVBase
                                     GICH_BASE,                 // GicHBase
                                     VGIC_MAINT_INT,            // GsivId
                                     0,                         // GicRBase
                                     0                          // Efficiency
                                     ),
    EFI_ACPI_6_0_GICC_STRUCTURE_INIT(3,                         // GicId
                                     0x101,                     // AcpiCpuUid
                                     0x101,                     // Mpidr
                                     PMU_INTERRUPT_FLAG,        // Flags
                                     PMU_INTERRUPT_CPU3,        // PmuIrq
                                     GICC_BASE,                 // GicBase
                                     GICV_BASE,                 // GicVBase
                                     GICH_BASE,                 // GicHBase
                                     VGIC_MAINT_INT,            // GsivId
                                     0,                         // GicRBase
                                     0                          // Efficiency
                                     ),
  },
  EFI_ACPI_6_0_GIC_DISTRIBUTOR_INIT(0x0,                        // GicDistHwId
                                    GICD_BASE,                  // GicDistBase
                                    0x0,                        // GicDistVector
                                    EFI_ACPI_6_0_GIC_V2         // GicVersion
                                    ),
  {
    EFI_ACPI_6_0_GIC_MSI_FRAME_INIT(0x0,                        // GicMsiFrameId
                                    GIC_MSI_FRAME0,             // BaseAddress
                                    0,                          // Flags
                                    0,                          // SPICount
                                    0                           // SPIBase
                                    ),
    EFI_ACPI_6_0_GIC_MSI_FRAME_INIT(0x1,                        // GicMsiFrameId
                                    GIC_MSI_FRAME1,             // BaseAddress
                                    0,                          // Flags
                                    0,                          // SPICount
                                    0                           // SPIBase
                                    ),
    EFI_ACPI_6_0_GIC_MSI_FRAME_INIT(0x2,                        // GicMsiFrameId
                                    GIC_MSI_FRAME2,             // BaseAddress
                                    0,                          // Flags
                                    0,                          // SPICount
                                    0                           // SPIBase
                                    ),
    EFI_ACPI_6_0_GIC_MSI_FRAME_INIT(0x3,                        // GicMsiFrameId
                                    GIC_MSI_FRAME3,             // BaseAddress
                                    0,                          // Flags
                                    0,                          // SPICount
                                    0                           // SPIBase
                                    ),
  }
};
 
VOID CONST * CONST ReferenceAcpiTable = &Madt;