From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757454AbcHZD7R (ORCPT ); Thu, 25 Aug 2016 23:59:17 -0400 Received: from mail-bl2nam02on0057.outbound.protection.outlook.com ([104.47.38.57]:65106 "EHLO NAM02-BL2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755320AbcHZD7B (ORCPT ); Thu, 25 Aug 2016 23:59:01 -0400 X-Greylist: delayed 1153 seconds by postgrey-1.27 at vger.kernel.org; Thu, 25 Aug 2016 23:59:00 EDT Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; armlinux.org.uk; dkim=none (message not signed) header.d=none;armlinux.org.uk; dmarc=fail action=none header.from=nxp.com; From: Anson Huang To: , , CC: , , , , , Subject: [PATCH 3/3] ARM: imx: add SMP support for i.MX7D Date: Fri, 26 Aug 2016 19:12:51 +0800 Message-ID: <1472209971-32469-4-git-send-email-Anson.Huang@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1472209971-32469-1-git-send-email-Anson.Huang@nxp.com> References: <1472209971-32469-1-git-send-email-Anson.Huang@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131166554751012407;(91ab9b29-cfa4-454e-5278-08d120cd25b8);() X-Forefront-Antispam-Report: CIP:192.88.168.50;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(7916002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(81156014)(85426001)(5003940100001)(8936002)(81166006)(2201001)(77096005)(8676002)(86362001)(105606002)(19580395003)(19580405001)(48376002)(104016004)(356003)(36756003)(7846002)(50226002)(11100500001)(50986999)(92566002)(229853001)(586003)(87936001)(47776003)(305945005)(8666005)(4326007)(76176999)(2906002)(50466002)(68736007)(189998001)(5660300001)(2950100001)(5001770100001)(97736004)(626004)(106466001)(7059030);DIR:OUT;SFP:1101;SCL:1;SRVR:BN1PR0301MB0707;H:tx30smr01.am.freescale.net;FPR:;SPF:Fail;PTR:InfoDomainNonexistent;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;BN1AFFO11FD020;1:B6Gpk/ucET4FjsSFdXrg0mTuS0rNoSGD+vMGvYnafl2gISNAItm1jQ7NHZqEznp/WRfpuZuOhcbsPS2unarUgH3p9QbOkuLThK1UFTVoY6waJO3c4QmwpztR5h5EvTSbGNGyVKoGd1oAkIGsdRL9LYnkdSPbcUKI2b+5VDm+dHB2wWVjnsi9WuubBeBNxP8XpVefieNgCxNEBuBLgGc22skVzSgBRM1Hy9sOTfYD9BBKkpNsFpE4aAoKYdQKqAus+iCA73nonAOUg8Gew47DX93iznJ1+whnlYZq0yQmOXHLRUZXYX4UZTeik4uLod5Ipk0l8Vtedepkb4JdMmwsO4556SbFwDo9hWnJK8a0ycHcR7sqL+MMK3ym7+v8khGKEpnH1y4rBAJqCTsTc9huesTKAIJ+S4vyXCJpEomHzum+Jzw7BlK7B6FYXliHKbZktEl1nMz5e1JoqUOTXfvar0JAqOqQTa1e52UHBFpejPvzFINm1ukx0Ndw1XDS4gfbzgR+nWBVRLatNaLLvDlx3BOo1LOoITEZ3X7LjjJGbwlrcVQCZcr+V/tZ/up5Gnu8NzZ4xLoSW8vjXFh7J2I/6hsGei2lnJc40MKaIRaZY6x6k6EYs7OsBHIPCRu8AVHWsaRabeFlcQAAxAZGR85mGg== MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: d59e6fd8-7e27-45d5-8337-08d3cd6080bc X-Microsoft-Exchange-Diagnostics: 1;BN1PR0301MB0707;2:IuDRGukzyPhpiJGuIlC3tvXu9TViZ7cZU6gRZquttQI2eMSHK6qnVOdhWhNov4Lom/JMtajUq166iLiyCZRQdVQotS5u84ATBAyJrXuT5t3kz4D/j+iH4RvO8ldCqIvsZy1rWZyqH9h0LL85gIyyFW7LKv3fmhK4RT+cExLG5Xikh5kQj/xDcJSifV0JfYUX;3:vrmurLjvpBLzeAaaxcaAqLEf3/wV1FkbCXBN/rPg7WOTwTQyDtJarYuUEFckhxA/DvqnzPJMBdoqQZpS6v47GlTInpadAN139tm4EXhwMvcOTsDctHsgYS8kI3bcU90e3hbr1l/wu+4Ew3rPERaK0vReSGFN9s7kc/A2BQOVykLXDy9l5Thga3zFXvwoXVs94tt2uJGJhkg0gnMnRkSflEPW0/JeNVm5Cveni/k2q9w= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN1PR0301MB0707; X-Microsoft-Exchange-Diagnostics: 1;BN1PR0301MB0707;25:qmoGrlB+SS5hDFpu4R49VqRdv+r2LUO9REciKNb/7qT18LMcv5dl1baGQuqg2ta2adtSPQxsKrnn/0DJGcehgCG24HuGs2ktusOxreR9T7jOz44FQ6/ybC5SKCtEYNVRFbOfPohUJozuGKwsF6EHBeMjp1dAJ9LF8ck0RR0nAj97okO3CDNkNBm0ZkH7h9IeBlY/5LLgbkpUHHMGnR+2GPtj0ZhM+WUC8EzpmFOepfZ7tpL4AengvRt14HiK7S8IDqG1c7FQOuVguyOZDXPh1p3DYRhO/H8I4+k5BXe6ABDRoVhw89ihMxAMYYFr91fgol0cU6s1MkdY+GE4Pywc2zL7Sf81SP5aLOv2blbbDIxk95XgsIByMTBOZsza6zGb+SpuVZ0/9lejsTtTzsT5jwiVapT3fkIG1aH6TIWbFVSew6SIl9CG8GsTt1VdaKpoRuE2hg11mYVj7ijOSYHS9hYQFUO65eH28MeW4CbshwBKEKJnf2Vv5rUAqNm18uzuXPvoC9JPxdNfW6sAwcmh05aZWvVxVvDQ+8DAXCPUNOPmi5Fpc1UatGO/qhOLSN3Yx/hzOStE/VXS6mH3p5M6M+VCZ5PmiOlCHIUY6smMdpyxdnYv7aD0i8/WHG5oicsfO5kwV4PJIs4P24KBkjbWjpJOYVARkqY8Vss9/6VHdLGZDWbk7NCN6fsxD96M3pIJuExwlH8INMYzzkSeNRuNs22slqdl31IL63GyqU3YDLv7FR+iAHHU8nwgAoxJbirJ X-Microsoft-Exchange-Diagnostics: 1;BN1PR0301MB0707;31:kf+KRcf3+fm6JPtRHS8lVRUbQKly/CTkHBlyQeqz1LlsnuVQbUED8mYwy3Du4OvI0uB3Ab1RyKEvIr4B6kwZCqNqEAK+t+N+W75r9rKeHMBwIejA1fkBIy0PrwR4tYUbtQ+qwYGDj6dGLFy8HF8QK5zon5313o240QicihpwVH4UpX2ChB2PGKo9TqkVffuJ2e1riyhlJiYM1xNs/KemdbYdsLqRXTPKywwK1jSkW6s=;4:spDtd64Q/aGQZWksIiO0iWD6mDptZiWiYEeQe0UwsE+LCCLNmjdBjBuvbG7AFmNZYJcoAZEDbnt5LFWm4kJtcy0T68ufmbULc+RvW7uVElLHURydxDL55tTuFkyK2AABpxAB4eCaUmbzr1Id84hqfNqYNpegVwcsW+I+PPfDYl/AzAf1Jbp+p5a9bc7KVIcQkpW2KHn9SdC2m1ZTS3wXjmEV9/lwq9hyo+W41GgWXFKtBPUXu9u3IlLAHxgaV6PJ5BYOEl7eRJ90My/x4a56g8/OqxsOW9nVEDK1zCMF1i8pyABwH5THV3j3EIHZd1tQBsaR9s4edhtCiFP0I8uBOv6cs/jdMoXbruELfPUwz9JJiee4f0wpHkdZ4aEJYbvs2YT3KHsveaPJ+lbNsFK9aHgxHkkQ7HmJmuoA63icN80/tcvitI3rza6DDqmlNw4bMdIGx7TmD4SjbD9zfNPI9ykYwAp3gkyPutA7PT6SLzQ4zapoyrYsZEQTC6Y4eTU8O7b6C5tnICQLtikRy7Z+h/2sHj/NhmzO6mQD8Z/LLT0= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(13024025)(13015025)(13018025)(13023025)(13017025)(5005006)(8121501046)(10201501046)(3002001)(6055026);SRVR:BN1PR0301MB0707;BCL:0;PCL:0;RULEID:(400006);SRVR:BN1PR0301MB0707; X-Forefront-PRVS: 00462943DE X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;BN1PR0301MB0707;23:L6vpVyRbE3ebFG5ixA10xPuuWWVwSXWH0jmaXfE?= =?us-ascii?Q?hGVPM0AV28XMrb/OMxNv15frB0ZFqF+9fmIPdRXUSg8cd4tYoCFtYQYtdO2D?= =?us-ascii?Q?ZjTsHHZJhhG6EA/zeCHiezRC/X8dYMEjzRCAX7o+m3YiBA3qNjP8HTCmsZeT?= =?us-ascii?Q?J4MMcuVne3YppaZyRFzQ4j/Hi32y1NxmvUcux22HPq82BUF/4vOtTcpU3oHO?= =?us-ascii?Q?qSw79kr4p2dmq53N0s8FvoJCKaG+aYZ4utfrIDP9sHmwB34fVpWo0IiIsKjf?= =?us-ascii?Q?zLI/6Jix9jAyst5ROMC7GcCSC7gZbaNiC5iUhJvwKCTxU1Mz6uwQuKBz4TGn?= =?us-ascii?Q?U00BN+sm6Q5fZHfO76Sh0D4aD/CN0ULkuFq6mVnXyu/OZJ9/yHSeGpUn6j+I?= =?us-ascii?Q?qIqJJ3AEUNoj/XE9gKMz2BklZm1hwEiuS4wnI4Rivy9hEJ1g+cokH+DXkau9?= =?us-ascii?Q?32qLaMQ+fIQvmlzn2KKFfwi5+PnZICea9VVwZuLWJ/6i+GYxl/47zrlcD9Ty?= =?us-ascii?Q?gCxmeywJPEAUEWkqBqx8Ec3BW+/jRLhYUkra+tYiPjjBSxkX/LbuPjCCtY2u?= =?us-ascii?Q?miJcY6h1D5l/z9AW7gJWuudr9DYhmrePgm7Vlia8Niy4VqX3NGFTM3X1FKe4?= =?us-ascii?Q?6G96kS0upZ6uCRE1OA2LJx6Vr3SvuHJ+bDVDZuxfB1j0Hi5Zt7GCn46oHRZ1?= =?us-ascii?Q?9CaA1cNSdNYv8KNptjRwCjsoEKprS2YGXcuMS/x8FNiwzIaJFQ7siGF72kMT?= =?us-ascii?Q?TyqEIcB5dx2lzcI/TL8pMnywA5P49Ku3xK7cZU7pbvGQPpbFfqOa9soVgvO8?= =?us-ascii?Q?N/PtsJg3+pmauVX31DW7HuaAcl49n970ECq9yQLX08/i8nvIdBEerzlkOB39?= =?us-ascii?Q?r35+XG9YJrQMYedewl358R9lcS9daFNbBPa4JCFP0bUVOaJKh4mSZyCvvv9L?= =?us-ascii?Q?/u90ub+SSf+ODoo/2sFle3bo2huHg8YFR2zNXxyhqHkedHgx1vRggPhgDinj?= =?us-ascii?Q?wGFj+oSY2MBRPDi20dnD58L8GrG4jNvoeooYfmmV8aHL2WiOUAdOuNgRtxQ5?= =?us-ascii?Q?u/SLJNru0XFFOZW7oNX45f70DQ0TU3coxC0ZZlOfBD6FW8hyl8SjyfbO1ymA?= =?us-ascii?Q?lFJ2I/zeZ0pYkf+NFKTZKbefLhhJ2ZOB2emCWgncxUVVby3pE642ngw=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1;BN1PR0301MB0707;6:aXtXVqG64JmE4C0RxrR3Cn9Kdi+4WzInJo7cDX9BQZXfYnAZDe81PmVNJ0N6XTCes7jVGZTkueZEpzzzpAZShZRphg5AcOyN8pMMypkIenxPi0vRZihJLnFUVjsZ+leBhM7DJfk0siBwXfRSBE1CWahsXxXYfVTMyaraGMsprT7uV+SW/HqYbY+OMwdVXAXiEjxZ7WpR61zyhSmk3NLmqScd+N/omwxIx9uLvKL1C9k+lW9qSHE90/tdJrOgW97tmfriTI+gPJ5WyLiGAWoDQYx4Nc9WSSgeU8k9vtlaWmE=;5:gfL+1hT1kvo+HaEGBfwbjt0XlpAWY9fvmKmarNxW+bIjiycNf9eyFF/UF+w53nQunHBJOP16MvIKrDfdVkqOgmdRM4O9cX4yH8BTPdxZ30gawyjOejhA6RM1yzfdLvy8AgxwZHZWY2YbexsjfFJbQ5n9o7QgSu4Kt1d/mmkCrjI=;24:FLlSWdzjflr75lQOL9/e4xJZkNTONN/zAICdBTDjWw0orB38ZF/pEvo+brECjnSITqq5P7+mFI9beGh3mBUmut/8hV8Y3qv4PCyuXxb5vrA=;7:TKgpVcqkSGhyF/KhVs7xv/Kc+mPpTGuEFnnH1JDBtT1Hf/JlmAPQCDywvwrbSa1YdyiQveP9MpbVBFsegjJp+DI7x0IvK0M5SMo6ptvHp9KqHfTezAeXFOC3axpHTrFzvJIJOL5yl/xn9KNzVgQvItWBNByedBrccE8m0pMMuUKuXNQhEC8VJ38y+nTKQCYEWLJdSluh5Blq2vlMToDrm+7bQsnsL987cs+jfhN6vq6zrF5yRnrX7kG86JDiOaz9 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Aug 2016 03:24:34.8048 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;Ip=[192.88.168.50];Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN1PR0301MB0707 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org i.MX7D has 2 cortex-a7 ARM core, add support for booting up SMP kernel with 2 CPUs. The existing i.MX SMP code is designed for i.MX6 series SoCs which have cortex-a9 ARM core, but i.MX7D has 2 cortex-a7 ARM core, so we need to add runtime check for those differences between cortex-a9 and cortex-a7. Signed-off-by: Anson Huang --- arch/arm/mach-imx/headsmp.S | 11 +++++++++++ arch/arm/mach-imx/mach-imx7d.c | 2 ++ arch/arm/mach-imx/platsmp.c | 19 ++++++++++++++++++- arch/arm/mach-imx/src.c | 38 ++++++++++++++++++++++++++++++-------- 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/arch/arm/mach-imx/headsmp.S b/arch/arm/mach-imx/headsmp.S index 6c28d28..a26e459 100644 --- a/arch/arm/mach-imx/headsmp.S +++ b/arch/arm/mach-imx/headsmp.S @@ -26,7 +26,18 @@ diag_reg_offset: .endm ENTRY(v7_secondary_startup) + .word 0xc070 @ 0xc07 is cortex-a7 id + .word 0xfff0 @ mask for core type + ARM_BE8(setend be) @ go BE8 if entered LE + mrc p15, 0, r0, c0, c0, 0 + adr r1, v7_secondary_startup + ldr r2, [r1] + ldr r3, [r1, #0x4] + and r0, r0, r3 + cmp r0, r2 + beq secondary_startup + set_diag_reg b secondary_startup ENDPROC(v7_secondary_startup) diff --git a/arch/arm/mach-imx/mach-imx7d.c b/arch/arm/mach-imx/mach-imx7d.c index 26ca744..ef3dce6 100644 --- a/arch/arm/mach-imx/mach-imx7d.c +++ b/arch/arm/mach-imx/mach-imx7d.c @@ -99,6 +99,7 @@ static void __init imx7d_init_machine(void) static void __init imx7d_init_irq(void) { + imx_gpcv2_check_dt(); imx_init_revision_from_anatop(); imx_src_init(); irqchip_init(); @@ -111,6 +112,7 @@ static const char *const imx7d_dt_compat[] __initconst = { }; DT_MACHINE_START(IMX7D, "Freescale i.MX7 Dual (Device Tree)") + .smp = smp_ops(imx_smp_ops), .init_irq = imx7d_init_irq, .init_machine = imx7d_init_machine, .dt_compat = imx7d_dt_compat, diff --git a/arch/arm/mach-imx/platsmp.c b/arch/arm/mach-imx/platsmp.c index 711dbbd..63af911 100644 --- a/arch/arm/mach-imx/platsmp.c +++ b/arch/arm/mach-imx/platsmp.c @@ -60,8 +60,17 @@ static int imx_boot_secondary(unsigned int cpu, struct task_struct *idle) static void __init imx_smp_init_cpus(void) { int i, ncores; + unsigned long val, arch_type; - ncores = scu_get_core_count(scu_base); + asm volatile("mrc p15, 0, %0, c0, c0, 0" : "=r" (arch_type)); + + if (((arch_type >> 4) & 0xfff) == 0xc07) { + /* cortex-a7 core number is in bit[25:24] of CP15 L2CTLR */ + asm volatile("mrc p15, 1, %0, c9, c0, 2" : "=r" (val)); + ncores = ((val >> 24) & 0x3) + 1; + } else { + ncores = scu_get_core_count(scu_base); + } for (i = ncores; i < NR_CPUS; i++) set_cpu_possible(i, false); @@ -74,6 +83,14 @@ void imx_smp_prepare(void) static void __init imx_smp_prepare_cpus(unsigned int max_cpus) { + unsigned long arch_type; + + asm volatile("mrc p15, 0, %0, c0, c0, 0" : "=r" (arch_type)); + + /* no need for cortex-a7 */ + if (((arch_type >> 4) & 0xfff) == 0xc07) + return; + imx_smp_prepare(); /* diff --git a/arch/arm/mach-imx/src.c b/arch/arm/mach-imx/src.c index 70b083f..1fda72a 100644 --- a/arch/arm/mach-imx/src.c +++ b/arch/arm/mach-imx/src.c @@ -18,6 +18,7 @@ #include #include #include "common.h" +#include "hardware.h" #define SRC_SCR 0x000 #define SRC_GPR1 0x020 @@ -30,6 +31,15 @@ #define BP_SRC_SCR_CORE1_RST 14 #define BP_SRC_SCR_CORE1_ENABLE 22 +/* below are for i.MX7D */ +#define SRC_GPR1_V2 0x074 +#define SRC_A7RCR0 0x004 +#define SRC_A7RCR1 0x008 +#define SRC_M4RCR 0x00C + +#define BP_SRC_A7RCR0_A7_CORE_RESET0 0 +#define BP_SRC_A7RCR1_A7_CORE1_ENABLE 1 + static void __iomem *src_base; static DEFINE_SPINLOCK(scr_lock); @@ -87,12 +97,21 @@ void imx_enable_cpu(int cpu, bool enable) u32 mask, val; cpu = cpu_logical_map(cpu); - mask = 1 << (BP_SRC_SCR_CORE1_ENABLE + cpu - 1); spin_lock(&scr_lock); - val = readl_relaxed(src_base + SRC_SCR); - val = enable ? val | mask : val & ~mask; - val |= 1 << (BP_SRC_SCR_CORE1_RST + cpu - 1); - writel_relaxed(val, src_base + SRC_SCR); + if (cpu_is_imx7d()) { + if (enable) + imx_gpcv2_set_core1_pdn_pup_by_software(false); + mask = 1 << (BP_SRC_A7RCR1_A7_CORE1_ENABLE + cpu - 1); + val = readl_relaxed(src_base + SRC_A7RCR1); + val = enable ? val | mask : val & ~mask; + writel_relaxed(val, src_base + SRC_A7RCR1); + } else { + mask = 1 << (BP_SRC_SCR_CORE1_ENABLE + cpu - 1); + val = readl_relaxed(src_base + SRC_SCR); + val = enable ? val | mask : val & ~mask; + val |= 1 << (BP_SRC_SCR_CORE1_RST + cpu - 1); + writel_relaxed(val, src_base + SRC_SCR); + } spin_unlock(&scr_lock); } @@ -100,19 +119,22 @@ void imx_set_cpu_jump(int cpu, void *jump_addr) { cpu = cpu_logical_map(cpu); writel_relaxed(virt_to_phys(jump_addr), - src_base + SRC_GPR1 + cpu * 8); + src_base + (cpu_is_imx7d() ? + SRC_GPR1_V2 : SRC_GPR1) + cpu * 8); } u32 imx_get_cpu_arg(int cpu) { cpu = cpu_logical_map(cpu); - return readl_relaxed(src_base + SRC_GPR1 + cpu * 8 + 4); + return readl_relaxed(src_base + (cpu_is_imx7d() ? + SRC_GPR1_V2 : SRC_GPR1) + cpu * 8 + 4); } void imx_set_cpu_arg(int cpu, u32 arg) { cpu = cpu_logical_map(cpu); - writel_relaxed(arg, src_base + SRC_GPR1 + cpu * 8 + 4); + writel_relaxed(arg, src_base + (cpu_is_imx7d() ? + SRC_GPR1_V2 : SRC_GPR1) + cpu * 8 + 4); } void __init imx_src_init(void) -- 1.9.1