| /* |
| * arch/arm64/kernel/topology.c |
| * |
| * Copyright (C) 2011,2013,2014 Linaro Limited. |
| * |
| * Based on the arm32 version written by Vincent Guittot in turn based on |
| * arch/sh/kernel/topology.c |
| * |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file "COPYING" in the main directory of this archive |
| * for more details. |
| */ |
| |
| #include <linux/acpi.h> |
| #include <linux/arch_topology.h> |
| #include <linux/cacheinfo.h> |
| #include <linux/init.h> |
| #include <linux/percpu.h> |
| |
| #include <asm/cpu.h> |
| #include <asm/cputype.h> |
| #include <asm/topology.h> |
| |
| #ifdef CONFIG_ACPI |
| static bool __init acpi_cpu_is_threaded(int cpu) |
| { |
| int is_threaded = acpi_pptt_cpu_is_thread(cpu); |
| |
| /* |
| * if the PPTT doesn't have thread information, assume a homogeneous |
| * machine and return the current CPU's thread state. |
| */ |
| if (is_threaded < 0) |
| is_threaded = read_cpuid_mpidr() & MPIDR_MT_BITMASK; |
| |
| return !!is_threaded; |
| } |
| |
| /* |
| * Propagate the topology information of the processor_topology_node tree to the |
| * cpu_topology array. |
| */ |
| int __init parse_acpi_topology(void) |
| { |
| int cpu, topology_id; |
| |
| if (acpi_disabled) |
| return 0; |
| |
| for_each_possible_cpu(cpu) { |
| int i, cache_id; |
| |
| topology_id = find_acpi_cpu_topology(cpu, 0); |
| if (topology_id < 0) |
| return topology_id; |
| |
| if (acpi_cpu_is_threaded(cpu)) { |
| cpu_topology[cpu].thread_id = topology_id; |
| topology_id = find_acpi_cpu_topology(cpu, 1); |
| cpu_topology[cpu].core_id = topology_id; |
| } else { |
| cpu_topology[cpu].thread_id = -1; |
| cpu_topology[cpu].core_id = topology_id; |
| } |
| topology_id = find_acpi_cpu_topology_package(cpu); |
| cpu_topology[cpu].package_id = topology_id; |
| |
| i = acpi_find_last_cache_level(cpu); |
| |
| if (i > 0) { |
| /* |
| * this is the only part of cpu_topology that has |
| * a direct relationship with the cache topology |
| */ |
| cache_id = find_acpi_cpu_cache_topology(cpu, i); |
| if (cache_id > 0) |
| cpu_topology[cpu].llc_id = cache_id; |
| } |
| } |
| |
| return 0; |
| } |
| #endif |
| |
| |