From patchwork Fri Dec 1 22:23:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Linton X-Patchwork-Id: 120406 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp1706460qgn; Fri, 1 Dec 2017 14:24:41 -0800 (PST) X-Google-Smtp-Source: AGs4zMaFfaYMSI7D0PnsFZ0GQNCm+msXLX76w9wJfO/cBnY+o6m/jpGxUhYheW+6WAikjJcc3WZR X-Received: by 10.98.18.88 with SMTP id a85mr11674115pfj.141.1512167081766; Fri, 01 Dec 2017 14:24:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512167081; cv=none; d=google.com; s=arc-20160816; b=gZb3JqOfs8QzQV8WY7bSL83zXxczV/io0B77IRw69gf9Zw1M/KJGnsgOh8jZrRweBF 0SjWH7pvm8lFnBdHWk3pJPDvbAioXrtVsi9mRIK7h/Fr4NkQnPZyv2v4OvQP9nk1YecY AMwiFjI5fUt2eHpXCfv026wxLvL18iutM8TD7zvDzhxyy9sRTRt4K2bi3UfeNhSPtNvV 793uhJGIIQ6LsAgFzzTYFKrQfJ7KE+MzEkNV1WOaVUZ25rN+axH8CyERoAV/J7plV1jp 4k928pAnwiRyw/QMteX73HI8GEJtdnfnY68PGC12Pfv7UD3eKTJOEBtLQOU7yz4HcqOP o4lA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=iU6DRAeY8K/7JotoR+xCuv7u2fo6SWRrfw+j+4Y+eIY=; b=yIKSI79B74udNwa3JQtDKCfSrKGZqfdjR6ywkTfu5yCAKAwSOgc9MBtvhWSqkxKcdq MgAELf6bCAsb00CJYWdL6EGPEwspA1jQ3aIIsedaZAeLOEmRQfNKG2/+4zbKIMP1GDaB u4XVm9JRB/bYybwkuMx61LEi1k08hZN+ZYeVAgxrV1XaqTFi12SOmDd4zD6jWqhBvcPq NKVyNwjfUhUYKttbxJm3WbAPHf1eXLvoHyibvWyyzZy9gLdANXnY20GWiGfbucZ2oMh5 PWwanysLT+Ny6L5mPFUHru2SHdxrb5Ckp+1lQRVPn/ijmFq95XxSelewXwjwW+ORZ37U YDrA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u73si5836459pfi.245.2017.12.01.14.24.41; Fri, 01 Dec 2017 14:24:41 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751941AbdLAWYj (ORCPT + 28 others); Fri, 1 Dec 2017 17:24:39 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:47138 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751756AbdLAWYF (ORCPT ); Fri, 1 Dec 2017 17:24:05 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3BC7C1688; Fri, 1 Dec 2017 14:24:05 -0800 (PST) Received: from beelzebub.austin.arm.com (beelzebub.austin.arm.com [10.118.12.119]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 563103F246; Fri, 1 Dec 2017 14:24:04 -0800 (PST) From: Jeremy Linton To: linux-acpi@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org, sudeep.holla@arm.com, hanjun.guo@linaro.org, lorenzo.pieralisi@arm.com, rjw@rjwysocki.net, will.deacon@arm.com, catalin.marinas@arm.com, gregkh@linuxfoundation.org, viresh.kumar@linaro.org, mark.rutland@arm.com, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, jhugo@codeaurora.org, wangxiongfeng2@huawei.com, Jonathan.Zhang@cavium.com, ahs3@redhat.com, Jayachandran.Nair@cavium.com, austinwc@codeaurora.org, lenb@kernel.org, Jeremy Linton Subject: [PATCH v5 8/9] arm64: topology: Enable ACPI/PPTT based CPU topology. Date: Fri, 1 Dec 2017 16:23:29 -0600 Message-Id: <20171201222330.18863-9-jeremy.linton@arm.com> X-Mailer: git-send-email 2.13.5 In-Reply-To: <20171201222330.18863-1-jeremy.linton@arm.com> References: <20171201222330.18863-1-jeremy.linton@arm.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Propagate the topology information from the PPTT tree to the cpu_topology array. We can get the thread id, core_id and cluster_id by assuming certain levels of the PPTT tree correspond to those concepts. The package_id is flagged in the tree and can be found by calling find_acpi_cpu_topology_package() which terminates its search when it finds an ACPI node flagged as the physical package. If the tree doesn't contain enough levels to represent all of the requested levels then the root node will be returned for all subsequent levels. Signed-off-by: Jeremy Linton --- arch/arm64/kernel/topology.c | 47 +++++++++++++++++++++++++++++++++++++++++++- include/linux/topology.h | 2 ++ 2 files changed, 48 insertions(+), 1 deletion(-) -- 2.13.5 diff --git a/arch/arm64/kernel/topology.c b/arch/arm64/kernel/topology.c index 74a8a5173a35..198714aca9e8 100644 --- a/arch/arm64/kernel/topology.c +++ b/arch/arm64/kernel/topology.c @@ -11,6 +11,7 @@ * for more details. */ +#include #include #include #include @@ -22,6 +23,7 @@ #include #include #include +#include #include #include @@ -300,6 +302,47 @@ static void __init reset_cpu_topology(void) } } +#ifdef CONFIG_ACPI +/* + * Propagate the topology information of the processor_topology_node tree to the + * cpu_topology array. + */ +static int __init parse_acpi_topology(void) +{ + u64 is_threaded; + int cpu; + int topology_id; + + is_threaded = read_cpuid_mpidr() & MPIDR_MT_BITMASK; + + for_each_possible_cpu(cpu) { + topology_id = find_acpi_cpu_topology(cpu, 0); + if (topology_id < 0) + return topology_id; + + if (is_threaded) { + cpu_topology[cpu].thread_id = topology_id; + topology_id = find_acpi_cpu_topology(cpu, 1); + cpu_topology[cpu].core_id = topology_id; + topology_id = find_acpi_cpu_topology_package(cpu); + cpu_topology[cpu].physical_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].physical_id = topology_id; + } + } + return 0; +} + +#else +static int __init parse_acpi_topology(void) +{ + /*ACPI kernels should be built with PPTT support*/ + return -EINVAL; +} +#endif void __init init_cpu_topology(void) { @@ -309,6 +352,8 @@ void __init init_cpu_topology(void) * Discard anything that was parsed if we hit an error so we * don't use partial information. */ - if (of_have_populated_dt() && parse_dt_topology()) + if ((!acpi_disabled) && parse_acpi_topology()) + reset_cpu_topology(); + else if (of_have_populated_dt() && parse_dt_topology()) reset_cpu_topology(); } diff --git a/include/linux/topology.h b/include/linux/topology.h index cb0775e1ee4b..170ce87edd88 100644 --- a/include/linux/topology.h +++ b/include/linux/topology.h @@ -43,6 +43,8 @@ if (nr_cpus_node(node)) int arch_update_cpu_topology(void); +int find_acpi_cpu_topology(unsigned int cpu, int level); +int find_acpi_cpu_topology_package(unsigned int cpu); /* Conform to ACPI 2.0 SLIT distance definitions */ #define LOCAL_DISTANCE 10