From patchwork Mon Jun 8 16:16:58 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Griffin X-Patchwork-Id: 49633 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-la0-f70.google.com (mail-la0-f70.google.com [209.85.215.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 831B521419 for ; Mon, 8 Jun 2015 16:17:32 +0000 (UTC) Received: by laar3 with SMTP id r3sf21840901laa.3 for ; Mon, 08 Jun 2015 09:17:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=fp9lstp70Su2oZzCuZ/7lTot/NeFBqyNgZfpK2+XXIA=; b=jBlBW+mB2OvUL+SKGKhcgFchDhDtp/Ys0LrFln6K1lNENzJ7oznUrumXNzMlwULjyU wb+iCca9gkzyYEakGpkbIrsRSSeneZh9MtrxKnr+tb5ngkWxjUlj1kzoR+YPPFTKs7O/ afroCd8JoP3htZt2NIc8RD+2kUP6VKsoKJ7O6yxvR3zHDNxNFso1CIraRnQIdm24XqjQ nTK4UsmJDnAlkdOFZQT740Jd0Y78eK+7YBp6BHAyXTWi50yUJhUX5DZGXuqqv6sHiXkP tZdMWexr5VvvFIHKiO+ZIPP4lcG90FODj+urOiFb2Q1GLwE8LanMnQPz4mAfq0LjBPY0 nuUA== X-Gm-Message-State: ALoCoQlGnrwgTPvQhp7h6/XKgG5q76ZQYpwUm53n50JIh99J7q90ZB495O/3k0kDqasElxtk4qLl X-Received: by 10.112.219.200 with SMTP id pq8mr17694422lbc.7.1433780251399; Mon, 08 Jun 2015 09:17:31 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.22.10 with SMTP id z10ls731973lae.24.gmail; Mon, 08 Jun 2015 09:17:31 -0700 (PDT) X-Received: by 10.152.88.99 with SMTP id bf3mr17437198lab.97.1433780251124; Mon, 08 Jun 2015 09:17:31 -0700 (PDT) Received: from mail-la0-f47.google.com (mail-la0-f47.google.com. [209.85.215.47]) by mx.google.com with ESMTPS id j10si3168790lbv.162.2015.06.08.09.17.31 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 08 Jun 2015 09:17:31 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.47 as permitted sender) client-ip=209.85.215.47; Received: by laar3 with SMTP id r3so51695700laa.3 for ; Mon, 08 Jun 2015 09:17:31 -0700 (PDT) X-Received: by 10.112.209.106 with SMTP id ml10mr13343117lbc.112.1433780250976; Mon, 08 Jun 2015 09:17:30 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.108.230 with SMTP id hn6csp1969086lbb; Mon, 8 Jun 2015 09:17:29 -0700 (PDT) X-Received: by 10.66.90.137 with SMTP id bw9mr31013007pab.52.1433780249182; Mon, 08 Jun 2015 09:17:29 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id kk7si4772048pab.168.2015.06.08.09.17.25; Mon, 08 Jun 2015 09:17:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753282AbbFHQRX (ORCPT + 7 others); Mon, 8 Jun 2015 12:17:23 -0400 Received: from mail-wi0-f169.google.com ([209.85.212.169]:33363 "EHLO mail-wi0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752382AbbFHQRT (ORCPT ); Mon, 8 Jun 2015 12:17:19 -0400 Received: by wiwd19 with SMTP id d19so91741111wiw.0 for ; Mon, 08 Jun 2015 09:17:17 -0700 (PDT) X-Received: by 10.180.88.169 with SMTP id bh9mr24245068wib.6.1433780237568; Mon, 08 Jun 2015 09:17:17 -0700 (PDT) Received: from localhost.localdomain (cpc14-aztw22-2-0-cust189.18-1.cable.virginm.net. [82.45.1.190]) by mx.google.com with ESMTPSA id gw7sm1786187wib.15.2015.06.08.09.17.16 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 08 Jun 2015 09:17:16 -0700 (PDT) From: Peter Griffin To: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, maxime.coquelin@st.com, patrice.chotard@st.com, srinivas.kandagatla@gmail.com Cc: peter.griffin@linaro.org, lee.jones@linaro.org, devicetree@vger.kernel.org Subject: [PATCH 1/2] ARM: STi: Add code to release secondary cores from holding pen. Date: Mon, 8 Jun 2015 17:16:58 +0100 Message-Id: <1433780219-1245-2-git-send-email-peter.griffin@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1433780219-1245-1-git-send-email-peter.griffin@linaro.org> References: <1433780219-1245-1-git-send-email-peter.griffin@linaro.org> Sender: devicetree-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: devicetree@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: peter.griffin@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.47 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , Most upstream devs boot STi platform via JTAG which abuses the boot process by setting the PC of secondary cores directly. As a consquence, booting STi platforms via u-boot results in only the primary core being brought up as the code to manage the holding pen is not upstream. This patch adds the necessary code to bring the secondary cores out of the holding pen. It uses the cpu-release-addr DT property to get the address of the holding pen from the bootloader. With this patch booting upstream kernels via u-boot works correctly: [ 0.045456] CPU: Testing write buffer coherency: ok [ 0.045597] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000 [ 0.045734] Setting up static identity map for 0x40209000 - 0x40209098 [ 0.065047] CPU1: thread -1, cpu 1, socket 0, mpidr 80000001 [ 0.065081] Brought up 2 CPUs [ 0.065089] SMP: Total of 2 processors activated (5983.43 BogoMIPS). [ 0.065092] CPU: All CPU(s) started in SVC mode. Signed-off-by: Peter Griffin --- arch/arm/mach-sti/headsmp.S | 1 + arch/arm/mach-sti/platsmp.c | 56 ++++++++++++++++++++++++++++++++++++++++++--- arch/arm/mach-sti/smp.h | 2 ++ 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/arch/arm/mach-sti/headsmp.S b/arch/arm/mach-sti/headsmp.S index 4c09bae..e0ad4517 100644 --- a/arch/arm/mach-sti/headsmp.S +++ b/arch/arm/mach-sti/headsmp.S @@ -37,6 +37,7 @@ pen: ldr r7, [r6] * should now contain the SVC stack for this core */ b secondary_startup +ENDPROC(sti_secondary_startup) 1: .long . .long pen_release diff --git a/arch/arm/mach-sti/platsmp.c b/arch/arm/mach-sti/platsmp.c index d4b624f..6597ed8 100644 --- a/arch/arm/mach-sti/platsmp.c +++ b/arch/arm/mach-sti/platsmp.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -99,14 +100,62 @@ static int sti_boot_secondary(unsigned int cpu, struct task_struct *idle) static void __init sti_smp_prepare_cpus(unsigned int max_cpus) { - void __iomem *scu_base = NULL; - struct device_node *np = of_find_compatible_node( - NULL, NULL, "arm,cortex-a9-scu"); + struct device_node *np; + void __iomem *scu_base; + u32 __iomem *cpu_strt_ptr; + u32 release_phys; + int cpu; + unsigned long entry_pa = virt_to_phys(sti_secondary_startup); + + np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-scu"); + if (np) { scu_base = of_iomap(np, 0); scu_enable(scu_base); of_node_put(np); } + + if (max_cpus <= 1) + return; + + for_each_possible_cpu(cpu) { + + np = of_get_cpu_node(cpu, NULL); + + if (!np) + continue; + + if (of_property_read_u32(np, "cpu-release-addr", + &release_phys)) { + pr_err("CPU %d: missing or invalid cpu-release-addr " + "property\n", cpu); + continue; + } + + /* + * holding pen is usually configured in SBC DMEM but can also be + * in RAM. + */ + + if (!memblock_is_memory(release_phys)) + cpu_strt_ptr = + ioremap(release_phys, sizeof(release_phys)); + else + cpu_strt_ptr = + (u32 __iomem *)phys_to_virt(release_phys); + + __raw_writel(entry_pa, cpu_strt_ptr); + + /* + * wmb so that data is actually written + * before cache flush is done + */ + smp_wmb(); + sync_cache_w(cpu_strt_ptr); + + if (!memblock_is_memory(release_phys)) + iounmap(cpu_strt_ptr); + } } struct smp_operations __initdata sti_smp_ops = { @@ -114,3 +163,4 @@ struct smp_operations __initdata sti_smp_ops = { .smp_secondary_init = sti_secondary_init, .smp_boot_secondary = sti_boot_secondary, }; + diff --git a/arch/arm/mach-sti/smp.h b/arch/arm/mach-sti/smp.h index 1871b72..ae22707 100644 --- a/arch/arm/mach-sti/smp.h +++ b/arch/arm/mach-sti/smp.h @@ -14,4 +14,6 @@ extern struct smp_operations sti_smp_ops; +void sti_secondary_startup(void); + #endif