@@ -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+
144335System topology examples
145336========================
146337
0 commit comments