Skip to content

Commit d98b40c

Browse files
kudureranganathingomolnar
authored andcommitted
Documentation/x86/topology: Detail CPUID leaves used for topology enumeration
Add a new section describing the different CPUID leaves and fields used to parse topology on x86 systems. [ bp: Cleanups and simplifications ontop. ] Suggested-by: Borislav Petkov <bp@alien8.de> Signed-off-by: K Prateek Nayak <kprateek.nayak@amd.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/20250901170418.4314-1-kprateek.nayak@amd.com
1 parent bc6397c commit d98b40c

1 file changed

Lines changed: 191 additions & 0 deletions

File tree

Documentation/arch/x86/topology.rst

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,197 @@ Thread-related topology information in the kernel:
141141

142142

143143

144+
System topology enumeration
145+
===========================
146+
147+
The topology on x86 systems can be discovered using a combination of vendor
148+
specific CPUID leaves which enumerate the processor topology and the cache
149+
hierarchy.
150+
151+
The CPUID leaves in their preferred order of parsing for each x86 vendor is as
152+
follows:
153+
154+
1) AMD
155+
156+
1) CPUID leaf 0x80000026 [Extended CPU Topology] (Core::X86::Cpuid::ExCpuTopology)
157+
158+
The extended CPUID leaf 0x80000026 is the extension of the CPUID leaf 0xB
159+
and provides the topology information of Core, Complex, CCD (Die), and
160+
Socket in each level.
161+
162+
Support for the leaf is discovered by checking if the maximum extended
163+
CPUID level is >= 0x80000026 and then checking if `LogProcAtThisLevel`
164+
in `EBX[15:0]` at a particular level (starting from 0) is non-zero.
165+
166+
The `LevelType` in `ECX[15:8]` at the level provides the topology domain
167+
the level describes - Core, Complex, CCD(Die), or the Socket.
168+
169+
The kernel uses the `CoreMaskWidth` from `EAX[4:0]` to discover the
170+
number of bits that need to be right-shifted from `ExtendedLocalApicId`
171+
in `EDX[31:0]` in order to get a unique Topology ID for the topology
172+
level. CPUs with the same Topology ID share the resources at that level.
173+
174+
CPUID leaf 0x80000026 also provides more information regarding the power
175+
and efficiency rankings, and about the core type on AMD processors with
176+
heterogeneous characteristics.
177+
178+
If CPUID leaf 0x80000026 is supported, further parsing is not required.
179+
180+
2) CPUID leaf 0x0000000B [Extended Topology Enumeration] (Core::X86::Cpuid::ExtTopEnum)
181+
182+
The extended CPUID leaf 0x0000000B is the predecessor on the extended
183+
CPUID leaf 0x80000026 and only describes the core, and the socket domains
184+
of the processor topology.
185+
186+
The support for the leaf is discovered by checking if the maximum supported
187+
CPUID level is >= 0xB and then if `EBX[31:0]` at a particular level
188+
(starting from 0) is non-zero.
189+
190+
The `LevelType` in `ECX[15:8]` at the level provides the topology domain
191+
that the level describes - Thread, or Processor (Socket).
192+
193+
The kernel uses the `CoreMaskWidth` from `EAX[4:0]` to discover the
194+
number of bits that need to be right-shifted from the `ExtendedLocalApicId`
195+
in `EDX[31:0]` to get a unique Topology ID for that topology level. CPUs
196+
sharing the Topology ID share the resources at that level.
197+
198+
If CPUID leaf 0xB is supported, further parsing is not required.
199+
200+
201+
3) CPUID leaf 0x80000008 ECX [Size Identifiers] (Core::X86::Cpuid::SizeId)
202+
203+
If neither the CPUID leaf 0x80000026 nor 0xB is supported, the number of
204+
CPUs on the package is detected using the Size Identifier leaf
205+
0x80000008 ECX.
206+
207+
The support for the leaf is discovered by checking if the supported
208+
extended CPUID level is >= 0x80000008.
209+
210+
The shifts from the APIC ID for the Socket ID is calculated from the
211+
`ApicIdSize` field in `ECX[15:12]` if it is non-zero.
212+
213+
If `ApicIdSize` is reported to be zero, the shift is calculated as the
214+
order of the `number of threads` calculated from `NC` field in
215+
`ECX[7:0]` which describes the `number of threads - 1` on the package.
216+
217+
Unless Extended APIC ID is supported, the APIC ID used to find the
218+
Socket ID is from the `LocalApicId` field of CPUID leaf 0x00000001
219+
`EBX[31:24]`.
220+
221+
The topology parsing continues to detect if Extended APIC ID is
222+
supported or not.
223+
224+
225+
4) CPUID leaf 0x8000001E [Extended APIC ID, Core Identifiers, Node Identifiers]
226+
(Core::X86::Cpuid::{ExtApicId,CoreId,NodeId})
227+
228+
The support for Extended APIC ID can be detected by checking for the
229+
presence of `TopologyExtensions` in `ECX[22]` of CPUID leaf 0x80000001
230+
[Feature Identifiers] (Core::X86::Cpuid::FeatureExtIdEcx).
231+
232+
If Topology Extensions is supported, the APIC ID from `ExtendedApicId`
233+
from CPUID leaf 0x8000001E `EAX[31:0]` should be preferred over that from
234+
`LocalApicId` field of CPUID leaf 0x00000001 `EBX[31:24]` for topology
235+
enumeration.
236+
237+
On processors of Family 0x17 and above that do not support CPUID leaf
238+
0x80000026 or CPUID leaf 0xB, the shifts from the APIC ID for the Core
239+
ID is calculated using the order of `number of threads per core`
240+
calculated using the `ThreadsPerCore` field in `EBX[15:8]` which
241+
describes `number of threads per core - 1`.
242+
243+
On Processors of Family 0x15, the Core ID from `EBX[7:0]` is used as the
244+
`cu_id` (Compute Unit ID) to detect CPUs that share the compute units.
245+
246+
247+
All AMD processors that support the `TopologyExtensions` feature store the
248+
`NodeId` from the `ECX[7:0]` of CPUID leaf 0x8000001E
249+
(Core::X86::Cpuid::NodeId) as the per-CPU `node_id`. On older processors,
250+
the `node_id` was discovered using MSR_FAM10H_NODE_ID MSR (MSR
251+
0x0xc001_100c). The presence of the NODE_ID MSR was detected by checking
252+
`ECX[19]` of CPUID leaf 0x80000001 [Feature Identifiers]
253+
(Core::X86::Cpuid::FeatureExtIdEcx).
254+
255+
256+
2) Intel
257+
258+
On Intel platforms, the CPUID leaves that enumerate the processor
259+
topology are as follows:
260+
261+
1) CPUID leaf 0x1F (V2 Extended Topology Enumeration Leaf)
262+
263+
The CPUID leaf 0x1F is the extension of the CPUID leaf 0xB and provides
264+
the topology information of Core, Module, Tile, Die, DieGrp, and Socket
265+
in each level.
266+
267+
The support for the leaf is discovered by checking if the supported
268+
CPUID level is >= 0x1F and then `EBX[31:0]` at a particular level
269+
(starting from 0) is non-zero.
270+
271+
The `Domain Type` in `ECX[15:8]` of the sub-leaf provides the topology
272+
domain that the level describes - Core, Module, Tile, Die, DieGrp, and
273+
Socket.
274+
275+
The kernel uses the value from `EAX[4:0]` to discover the number of
276+
bits that need to be right shifted from the `x2APIC ID` in `EDX[31:0]`
277+
to get a unique Topology ID for the topology level. CPUs with the same
278+
Topology ID share the resources at that level.
279+
280+
If CPUID leaf 0x1F is supported, further parsing is not required.
281+
282+
283+
2) CPUID leaf 0x0000000B (Extended Topology Enumeration Leaf)
284+
285+
The extended CPUID leaf 0x0000000B is the predecessor of the V2 Extended
286+
Topology Enumeration Leaf 0x1F and only describes the core, and the
287+
socket domains of the processor topology.
288+
289+
The support for the leaf is iscovered by checking if the supported CPUID
290+
level is >= 0xB and then checking if `EBX[31:0]` at a particular level
291+
(starting from 0) is non-zero.
292+
293+
CPUID leaf 0x0000000B shares the same layout as CPUID leaf 0x1F and
294+
should be enumerated in a similar manner.
295+
296+
If CPUID leaf 0xB is supported, further parsing is not required.
297+
298+
299+
3) CPUID leaf 0x00000004 (Deterministic Cache Parameters Leaf)
300+
301+
On Intel processors that support neither CPUID leaf 0x1F, nor CPUID leaf
302+
0xB, the shifts for the SMT domains is calculated using the number of
303+
CPUs sharing the L1 cache.
304+
305+
Processors that feature Hyper-Threading is detected using `EDX[28]` of
306+
CPUID leaf 0x1 (Basic CPUID Information).
307+
308+
The order of `Maximum number of addressable IDs for logical processors
309+
sharing this cache` from `EAX[25:14]` of level-0 of CPUID 0x4 provides
310+
the shifts from the APIC ID required to compute the Core ID.
311+
312+
The APIC ID and Package information is computed using the data from
313+
CPUID leaf 0x1.
314+
315+
316+
4) CPUID leaf 0x00000001 (Basic CPUID Information)
317+
318+
The mask and shifts to derive the Physical Package (socket) ID is
319+
computed using the `Maximum number of addressable IDs for logical
320+
processors in this physical package` from `EBX[23:16]` of CPUID leaf
321+
0x1.
322+
323+
The APIC ID on the legacy platforms is derived from the `Initial APIC
324+
ID` field from `EBX[31:24]` of CPUID leaf 0x1.
325+
326+
327+
3) Centaur and Zhaoxin
328+
329+
Similar to Intel, Centaur and Zhaoxin use a combination of CPUID leaf
330+
0x00000004 (Deterministic Cache Parameters Leaf) and CPUID leaf 0x00000001
331+
(Basic CPUID Information) to derive the topology information.
332+
333+
334+
144335
System topology examples
145336
========================
146337

0 commit comments

Comments
 (0)