blob: b80d8f14edf1ee8373f4dc149db68e9a91024a5c [file] [log] [blame]
Levi Yun03adb132024-05-13 10:24:31 +01001/*
2 * Copyright (c) 2024, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6#ifndef MPINFO_H
7#define MPINFO_H
8
9#include <stdbool.h>
10#include <stdint.h>
11#include <lib/utils_def.h>
12
13/*
14 * Value used in the NumberProcessors parameter of the GetProcessorInfo function
15 */
16#define CPU_V2_EXTENDED_TOPOLOGY UL(1 << 24)
17
18/*
19 * This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and
20 * indicates whether the processor is playing the role of BSP. If the bit is 1,
21 * then the processor is BSP. Otherwise, it is AP.
22 */
23#define PROCESSOR_AS_BSP_BIT UL(1 << 0)
24
25/*
26 * This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and
27 * indicates whether the processor is enabled. If the bit is 1, then the
28 * processor is enabled. Otherwise, it is disabled.
29 */
30#define PROCESSOR_ENABLED_BIT UL(1 << 1)
31
32/*
33 * This bit is used in the StatusFlag field of EFI_PROCESSOR_INFORMATION and
34 * indicates whether the processor is healthy. If the bit is 1, then the
35 * processor is healthy. Otherwise, some fault has been detected for the processor.
36 */
37#define PROCESSOR_HEALTH_STATUS_BIT UL(1 << 2)
38
39/*
40 * Structure that describes the physical location of a logical CPU.
41 */
42struct efi_cpu_physical_location {
43 uint32_t package;
44 uint32_t core;
45 uint32_t thread;
46};
47
48/*
49 * Structure that defines the 6-level physical location of the processor
50 */
51struct efi_cpu_physical_location2 {
52 uint32_t package;
53 uint32_t module;
54 uint32_t tile;
55 uint32_t die;
56 uint32_t core;
57 uint32_t thread;
58};
59
60union extended_processor_information {
61 /*
62 * The 6-level physical location of the processor, including the
63 * physical package number that identifies the cartridge, the physical
64 * module number within package, the physical tile number within the module,
65 * the physical die number within the tile, the physical core number within
66 * package, and logical thread number within core.
67 */
68 struct efi_cpu_physical_location2 location2;
69};
70
71/*
72 * Structure that describes information about a logical CPU.
73 */
74struct efi_processor_information {
75 /*
76 * The unique processor ID determined by system hardware.
77 */
78 uint64_t processor_id;
79
80 /*
81 * Flags indicating if the processor is BSP or AP, if the processor is enabled
82 * or disabled, and if the processor is healthy. Bits 3..31 are reserved and
83 * must be 0.
84 *
85 * <pre>
86 * BSP ENABLED HEALTH Description
87 * === ======= ====== ===================================================
88 * 0 0 0 Unhealthy Disabled AP.
89 * 0 0 1 Healthy Disabled AP.
90 * 0 1 0 Unhealthy Enabled AP.
91 * 0 1 1 Healthy Enabled AP.
92 * 1 0 0 Invalid. The BSP can never be in the disabled state.
93 * 1 0 1 Invalid. The BSP can never be in the disabled state.
94 * 1 1 0 Unhealthy Enabled BSP.
95 * 1 1 1 Healthy Enabled BSP.
96 * </pre>
97 */
98 uint32_t status_flags;
99
100 /*
101 * The physical location of the processor, including the physical package number
102 * that identifies the cartridge, the physical core number within package, and
103 * logical thread number within core.
104 */
105 struct efi_cpu_physical_location location;
106
107 /*
108 * The extended information of the processor. This field is filled only when
109 * CPU_V2_EXTENDED_TOPOLOGY is set in parameter ProcessorNumber.
110 */
111 union extended_processor_information extended_information;
112};
113
114struct efi_mp_information_hob_data {
115 uint64_t number_of_processors;
116 uint64_t number_of_enabled_processors;
117 struct efi_processor_information processor_info[];
118};
119
120#endif /* MPINFO_H */