From patchwork Wed Aug 26 12:09:44 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: chenhui zhao X-Patchwork-Id: 510830 X-Patchwork-Delegate: scottwood@freescale.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id A2CA31401EF for ; Wed, 26 Aug 2015 22:11:19 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 7F15C1A1E0E for ; Wed, 26 Aug 2015 22:11:19 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-bl2-obe.outbound.protection.outlook.com (mail-bl2on0137.outbound.protection.outlook.com [65.55.169.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3A4A81A0179 for ; Wed, 26 Aug 2015 22:09:57 +1000 (AEST) Received: from CO2PR03CA0041.namprd03.prod.outlook.com (10.141.194.168) by BY2PR03MB298.namprd03.prod.outlook.com (10.141.139.17) with Microsoft SMTP Server (TLS) id 15.1.231.21; Wed, 26 Aug 2015 12:09:49 +0000 Received: from BL2FFO11OLC008.protection.gbl (2a01:111:f400:7c09::160) by CO2PR03CA0041.outlook.office365.com (2a01:111:e400:1414::40) with Microsoft SMTP Server (TLS) id 15.1.262.13 via Frontend Transport; Wed, 26 Aug 2015 12:09:48 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BL2FFO11OLC008.mail.protection.outlook.com (10.173.160.143) with Microsoft SMTP Server (TLS) id 15.1.256.10 via Frontend Transport; Wed, 26 Aug 2015 12:09:47 +0000 Received: from localhost.localdomain ([10.193.20.174]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t7QC9iMJ012923; Wed, 26 Aug 2015 05:09:45 -0700 From: Chenhui Zhao To: , Subject: [PATCH v2, 1/5] powerpc/cache: add cache flush operation for various e500 Date: Wed, 26 Aug 2015 20:09:44 +0800 Message-ID: <1440590988-25594-1-git-send-email-chenhui.zhao@freescale.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11OLC008; 1:fU96sa4WJeW8YYcD7XQCr5C6P/RvunK6Xu8EB3woCUSp2CqCTcqrqg/DfZHbBuTrXXiN6avmEO/+7YLjV+kXELrZOISP0eDf4JukfSYJ7tgHmX7YEa/bIceL1dBFX8mWsh2ja0bAIigUT5edisjxtcHktIOgq7LPGngTNYb5hXTYr/VRpnCKTobfxEkhhynDHM8c99yKZNLs0sm0EY8yHUnVH3hKeT3B1AQwCXYvCh1Bsp9MEw5XP6pT/TVwPVibLX5rHZNojT60u9NbHa0G/IpKunTbwOxgoE38fx4Clly2oHb3XW6kJv9CYsiN40KwfvzaxDikls/5SO0lT8nFU702b6v1K8CmPYquQBEjvVC0Oqg6h4W1nDYlNivN4wTOnSw60dQCzhjepmU6sUPLUZzbNEk/fzf0vA5laifRhn8= X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(3050300001)(339900001)(199003)(189002)(46102003)(4001450100002)(68736005)(77096005)(50466002)(6806004)(19580405001)(5003940100001)(50986999)(85426001)(48376002)(49486002)(19580395003)(33646002)(69596002)(87936001)(50226001)(86362001)(104016003)(105606002)(77156002)(106466001)(5007970100001)(62966003)(4001540100001)(92566002)(47776003)(107886002)(229853001)(64706001)(189998001)(5001960100002)(97736004)(5001860100001)(5001770100001)(5001830100001)(36756003)(81156007)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BY2PR03MB298; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB298; 2:FF21n4hq1jsvgn9brXIIz6PJnarldTLlQEKNzVizd3WFJ9HskUXrxJIdOX2H0GoolKf+97eIsshO3Gmt/cZql0kZhpkwzk5nk2PQDu8L6zActQamXHZoizW8siU4CWxwfo/Yjxk0hpM+QMYOG+A2OCSasYvepRC3YtM+BiyGsvE=; 3:PnidnR3+dYACrG3875gRjjTRYxx+ZON4MZwq73SaWFS9zY8dPScWnj4+WPjJ0HEiUKV/PORhEpdjMCefQCt+Al+LVtEgunphFC3gHtGi/56GB3CnP096hXQYr9TCpjo85CBvdH/tN5/Am4fy4YaWDBmxObl8KAmywgUQqfcwqnBw4efwJwVxD2cxT6IzB212tNVxVqThXVF/IX6Yquu8VDto7HubgxqGN9SvfEHb71E=; 25:QquFCMwarVw+hEiSq5qk6OvqnSrZjm8lydwUR3Fakt5cDKu7464ebq3FjWXTJbZDZ8KrKVvG2uYw7LRt/bc9ZhbSsmG8rX9uac6NmzNyWR4LqdHjtxNp2eB59s4912QXMESY7tYf7mDUu+9qQWAa9vl5pq9IG3CM6z48PwfLKJJfZndhHAqgSpnEAT3P471U8tMkkg2OQDT9gn6j2K34ZYqsXAFBm2NvqxLsO6ybPwy1SYjmM+lSPEdWhzJjKQbg7isXPsjdufuH6SnvKKhikw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB298; X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB298; 20:ooU6TVHpO8VzgZkjRhnrXQsg3Hd0zip2HwqwjOzBXzDOtQ4breHOuAqTvAsjLvTixgF3+ym1s1Rxi4qpsRDhQNaeQiO4zEDtTCaXsPi2Civ/HT4N2B4BC8DMkcVLr5xg10Pt8k06j2r2w7GFKo4L0TqQrhoNVAkc5HE5ag9XOFQDTFfRnX9f+iqpbAsY+tgC+4/uM0M/w00i+THJ4F0W0hXGRDIs+OuAug4Hd2F7PvPaJIlgfENn8TUZL2+lAkeAX9N3WCa2O0nRzVW2WcM//mLIZYPvik57oCJaIHclEx/WWCkEMJigPFEKOlRKKrfdBu0PULsNYWf/GRNqxpfvhroD9HbtvppGGqzvYBPsC/4=; 4:sIrLYttfICOSwGrLdRSqP3rH2iNx6QRBEu73SromnRzKCkHisIptPq02Bk974TnVoFOmO0isN8nWXg13d8Cafr6bA60JKHPweKEH/MxNAR3N/fB3lodAUOEECZGPfD9Mud7YIIUhCZeoGXkZjI/FY0q0N6DTQekCmgpHQoNI7wVxYvltJkvkFe0JHB1pewAVyApNGerg32kCZBTUjcvuc5uAsNBZdFifNagdZVOaEaWm0Wmxbh7uQldxqhem7vqhchlFiPnzFyUNCk9g0oZ8FZRamzafntKYDlpCHfMpVGDtNIEuCCPhH0It9U7g0BeS X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(8121501046)(5005006)(3002001); SRVR:BY2PR03MB298; BCL:0; PCL:0; RULEID:; SRVR:BY2PR03MB298; X-Forefront-PRVS: 0680FADD48 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR03MB298; 23:3qggb972sV5AhOG2ekKX0q9hL3HVQDxsckmd7In9dr?= =?us-ascii?Q?RcJS+Il2YMe9Xwgp1UYAUtZYJwTG4OVvoMoINFMwQ6/bjc7J+vf4KZZ7Ga2J?= =?us-ascii?Q?jL9qlTpyhXCHW724kv+z912xd4t5dRTLETII6Deiqr8xwVboc9Bc5CCEE7uX?= =?us-ascii?Q?CmcAdOjyyZU2t6iOx/VaDdyU2LY6z+n1NtUCQDIQnYJBbb433L5n5mfKTl6o?= =?us-ascii?Q?2QzPmuHbu2xhbjks9wFOTs7TRDOi2jojS3Pa60AoSsYhIhZA2ibHBnK6oPzA?= =?us-ascii?Q?gewinvQYIV1MMa3OZ+6Z8oPHqPimytDlQdUksVLBWLObl6+A3rhF0zEGjBi6?= =?us-ascii?Q?W/GX+aS1kBR6LsrAE+0KoYz6kXmohv8VcP4MtHOlV5I+fgFJTz5jqduijhDt?= =?us-ascii?Q?0Fd3PhoDiw0bHjYI9ZNxRX+pj0SVv2Zn5B5Wwc1haqfx5wckYEu82t6JfixM?= =?us-ascii?Q?Q2pe5queKztqGMzEAHpWC7/Pfk+RAayTUTGW9Z0pFFQYosbiZ1Ttgkp+oEbT?= =?us-ascii?Q?C05rsjtabn62AydoiiDVEHqL0xmkpQsk/fQdXbdu8q6uuoq1iEnJYHGzJ0M5?= =?us-ascii?Q?JiX8VSROV8WZffwqezE3eUWgAM54hlh9ZWFTDx4B3GAShRMB/68a4eYpcq5W?= =?us-ascii?Q?4DwxwZB+bmo+iovzO9j73uGP/PWsAL5/7Zygxfqowon0qpWQoM1FbG7q+HvK?= =?us-ascii?Q?qGo1Mq3hYh4aOI5JbtJ68FRxcp0qr4cGb9g1VtV+47qbqcg52/2336gWMpY4?= =?us-ascii?Q?/k3JhDodMPwxberlh/jAetvIP6vzy4F/5b2Kxvj3f19g7GCj09xStr04pU+p?= =?us-ascii?Q?PvaPRlnhzFklz+ijM+PgNzIuG8KvtdXAiIJA4oEEeVai4jdVZyIn3IQ6/4QO?= =?us-ascii?Q?NLOm+hYDQeMmxFctDvOeR9YQ5RYaWSuJEMs4V6MDAEOe1tsKdTf2/RAZu94d?= =?us-ascii?Q?tiVIVeLq2L61NzC5jzlp+6VnLv0czHBf8ngPot6oLjTnMPT2rmsxrSDRptgi?= =?us-ascii?Q?1CbqHn0O39mLZLTPqPumwYlbxspNi+b3gfq2wZx79V38SiNDCNieeqlrV8ZE?= =?us-ascii?Q?G8HQWz/XFy0OtGOpnd7PZlw8/4meQ3MR4l79N0ARaQWuOMEsRQ7L4X6GOIdK?= =?us-ascii?Q?j37PyoPD3RCp/KS4OXo0ZhdR4Jeq91GLabV/u3JJNYR0y6lNYQraIg7LTt7+?= =?us-ascii?Q?oOFSCTJXxHn/7ibiBcKhSmQjXMUvlVjsMl5vRrxDF6jWsWWsqDpybkelBgtv?= =?us-ascii?Q?sE9G5nc63oa1W2Rec=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB298; 5:YK/R4ywrUBTa6RcLNrjHsF7lgFgv4ZMGAf4iyKD/CoxDYTx82YTqNqnwSWI741D54gBLG5hqf2ygyG/Tgj4hFcyMYdWLP6OiOVrgHY3e0IBuOSFU5VVwWZP0c9lA8iD6l/h8VA0rC+ux41fCr7oB0Q==; 24:GFfM0K+Mttmsp84hcEW1F2QDm6TLaVj9cBFK+0aEhNmW1eefrl/Hh2sw6xI2YEZZgKCWv9nNjYWNADeBiDmXWhLI+HWLCT1HPtcNPgqlxh4=; 20:OgiJNr8r0uKm7D7PqU9LkLmeNhUbp35355of/BqYheI/8enloO2P4zXbxXpJ1bSmExb7yTrAi8znMgmnGJ8lEw== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Aug 2015 12:09:47.6598 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR03MB298 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-kernel@vger.kernel.org, Jason.Jin@freescale.com Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Various e500 core have different cache architecture, so they need different cache flush operations. Therefore, add a callback function cpu_flush_caches to the struct cpu_spec. The cache flush operation for the specific kind of e500 is selected at init time. The callback function will flush all caches inside the current cpu. Signed-off-by: Chenhui Zhao Signed-off-by: Tang Yuantian --- arch/powerpc/include/asm/cacheflush.h | 2 - arch/powerpc/include/asm/cputable.h | 11 +++ arch/powerpc/kernel/asm-offsets.c | 3 + arch/powerpc/kernel/cpu_setup_fsl_booke.S | 112 ++++++++++++++++++++++++++++++ arch/powerpc/kernel/cputable.c | 4 ++ arch/powerpc/kernel/head_fsl_booke.S | 74 -------------------- arch/powerpc/platforms/85xx/smp.c | 5 +- 7 files changed, 133 insertions(+), 78 deletions(-) diff --git a/arch/powerpc/include/asm/cacheflush.h b/arch/powerpc/include/asm/cacheflush.h index 30b35ff..729fde4 100644 --- a/arch/powerpc/include/asm/cacheflush.h +++ b/arch/powerpc/include/asm/cacheflush.h @@ -30,8 +30,6 @@ extern void flush_dcache_page(struct page *page); #define flush_dcache_mmap_lock(mapping) do { } while (0) #define flush_dcache_mmap_unlock(mapping) do { } while (0) -extern void __flush_disable_L1(void); - extern void flush_icache_range(unsigned long, unsigned long); extern void flush_icache_user_range(struct vm_area_struct *vma, struct page *page, unsigned long addr, diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index b118072..d89b04a 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h @@ -43,6 +43,13 @@ extern int machine_check_e500(struct pt_regs *regs); extern int machine_check_e200(struct pt_regs *regs); extern int machine_check_47x(struct pt_regs *regs); +#if defined(CONFIG_E500) +extern void cpu_down_flush_e500v2(void); +extern void cpu_down_flush_e500mc(void); +extern void cpu_down_flush_e5500(void); +extern void cpu_down_flush_e6500(void); +#endif + /* NOTE WELL: Update identify_cpu() if fields are added or removed! */ struct cpu_spec { /* CPU is matched via (PVR & pvr_mask) == pvr_value */ @@ -59,6 +66,10 @@ struct cpu_spec { unsigned int icache_bsize; unsigned int dcache_bsize; +#if defined(CONFIG_E500) + /* flush caches inside the current cpu */ + void (*cpu_down_flush)(void); +#endif /* number of performance monitor counters */ unsigned int num_pmcs; enum powerpc_pmc_type pmc_type; diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 9823057..17b672d 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c @@ -373,6 +373,9 @@ int main(void) DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features)); DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup)); DEFINE(CPU_SPEC_RESTORE, offsetof(struct cpu_spec, cpu_restore)); +#if defined(CONFIG_E500) + DEFINE(CPU_DOWN_FLUSH, offsetof(struct cpu_spec, cpu_down_flush)); +#endif DEFINE(pbe_address, offsetof(struct pbe, address)); DEFINE(pbe_orig_address, offsetof(struct pbe, orig_address)); diff --git a/arch/powerpc/kernel/cpu_setup_fsl_booke.S b/arch/powerpc/kernel/cpu_setup_fsl_booke.S index dddba3e..462aed9 100644 --- a/arch/powerpc/kernel/cpu_setup_fsl_booke.S +++ b/arch/powerpc/kernel/cpu_setup_fsl_booke.S @@ -13,11 +13,13 @@ * */ +#include #include #include #include #include #include +#include _GLOBAL(__e500_icache_setup) mfspr r0, SPRN_L1CSR1 @@ -233,3 +235,113 @@ _GLOBAL(__setup_cpu_e5500) mtlr r5 blr #endif + +/* flush L1 date cache, it can apply to e500v2, e500mc and e5500 */ +_GLOBAL(flush_dcache_L1) + mfmsr r10 + wrteei 0 + + mfspr r3,SPRN_L1CFG0 + rlwinm r5,r3,9,3 /* Extract cache block size */ + twlgti r5,1 /* Only 32 and 64 byte cache blocks + * are currently defined. + */ + li r4,32 + subfic r6,r5,2 /* r6 = log2(1KiB / cache block size) - + * log2(number of ways) + */ + slw r5,r4,r5 /* r5 = cache block size */ + + rlwinm r7,r3,0,0xff /* Extract number of KiB in the cache */ + mulli r7,r7,13 /* An 8-way cache will require 13 + * loads per set. + */ + slw r7,r7,r6 + + /* save off HID0 and set DCFA */ + mfspr r8,SPRN_HID0 + ori r9,r8,HID0_DCFA@l + mtspr SPRN_HID0,r9 + isync + + LOAD_REG_IMMEDIATE(r6, KERNELBASE) + mr r4, r6 + mtctr r7 + +1: lwz r3,0(r4) /* Load... */ + add r4,r4,r5 + bdnz 1b + + msync + mr r4, r6 + mtctr r7 + +1: dcbf 0,r4 /* ...and flush. */ + add r4,r4,r5 + bdnz 1b + + /* restore HID0 */ + mtspr SPRN_HID0,r8 + isync + + wrtee r10 + + blr + +has_L2_cache: + /* skip L2 cache on P2040/P2040E as they have no L2 cache */ + mfspr r3, SPRN_SVR + /* shift right by 8 bits and clear E bit of SVR */ + rlwinm r4, r3, 24, ~0x800 + + lis r3, SVR_P2040@h + ori r3, r3, SVR_P2040@l + cmpw r4, r3 + beq 1f + + li r3, 1 + blr +1: + li r3, 0 + blr + +/* flush backside L2 cache */ +flush_backside_L2_cache: + mflr r10 + bl has_L2_cache + mtlr r10 + cmpwi r3, 0 + beq 2f + + /* Flush the L2 cache */ + mfspr r3, SPRN_L2CSR0 + ori r3, r3, L2CSR0_L2FL@l + msync + isync + mtspr SPRN_L2CSR0,r3 + isync + + /* check if it is complete */ +1: mfspr r3,SPRN_L2CSR0 + andi. r3, r3, L2CSR0_L2FL@l + bne 1b +2: + blr + +_GLOBAL(cpu_down_flush_e500v2) + mflr r0 + bl flush_dcache_L1 + mtlr r0 + blr + +_GLOBAL(cpu_down_flush_e500mc) +_GLOBAL(cpu_down_flush_e5500) + mflr r0 + bl flush_dcache_L1 + bl flush_backside_L2_cache + mtlr r0 + blr + +/* L1 Data Cache of e6500 contains no modified data, no flush is required */ +_GLOBAL(cpu_down_flush_e6500) + blr diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 7d80bfd..d65b45a 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -2023,6 +2023,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .cpu_setup = __setup_cpu_e500v2, .machine_check = machine_check_e500, .platform = "ppc8548", + .cpu_down_flush = cpu_down_flush_e500v2, }, #else { /* e500mc */ @@ -2042,6 +2043,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .cpu_setup = __setup_cpu_e500mc, .machine_check = machine_check_e500mc, .platform = "ppce500mc", + .cpu_down_flush = cpu_down_flush_e500mc, }, #endif /* CONFIG_PPC_E500MC */ #endif /* CONFIG_PPC32 */ @@ -2066,6 +2068,7 @@ static struct cpu_spec __initdata cpu_specs[] = { #endif .machine_check = machine_check_e500mc, .platform = "ppce5500", + .cpu_down_flush = cpu_down_flush_e5500, }, { /* e6500 */ .pvr_mask = 0xffff0000, @@ -2088,6 +2091,7 @@ static struct cpu_spec __initdata cpu_specs[] = { #endif .machine_check = machine_check_e500mc, .platform = "ppce6500", + .cpu_down_flush = cpu_down_flush_e6500, }, #endif /* CONFIG_PPC_E500MC */ #ifdef CONFIG_PPC32 diff --git a/arch/powerpc/kernel/head_fsl_booke.S b/arch/powerpc/kernel/head_fsl_booke.S index fffd1f9..709bc50 100644 --- a/arch/powerpc/kernel/head_fsl_booke.S +++ b/arch/powerpc/kernel/head_fsl_booke.S @@ -1075,80 +1075,6 @@ _GLOBAL(set_context) isync /* Force context change */ blr -_GLOBAL(flush_dcache_L1) - mfspr r3,SPRN_L1CFG0 - - rlwinm r5,r3,9,3 /* Extract cache block size */ - twlgti r5,1 /* Only 32 and 64 byte cache blocks - * are currently defined. - */ - li r4,32 - subfic r6,r5,2 /* r6 = log2(1KiB / cache block size) - - * log2(number of ways) - */ - slw r5,r4,r5 /* r5 = cache block size */ - - rlwinm r7,r3,0,0xff /* Extract number of KiB in the cache */ - mulli r7,r7,13 /* An 8-way cache will require 13 - * loads per set. - */ - slw r7,r7,r6 - - /* save off HID0 and set DCFA */ - mfspr r8,SPRN_HID0 - ori r9,r8,HID0_DCFA@l - mtspr SPRN_HID0,r9 - isync - - lis r4,KERNELBASE@h - mtctr r7 - -1: lwz r3,0(r4) /* Load... */ - add r4,r4,r5 - bdnz 1b - - msync - lis r4,KERNELBASE@h - mtctr r7 - -1: dcbf 0,r4 /* ...and flush. */ - add r4,r4,r5 - bdnz 1b - - /* restore HID0 */ - mtspr SPRN_HID0,r8 - isync - - blr - -/* Flush L1 d-cache, invalidate and disable d-cache and i-cache */ -_GLOBAL(__flush_disable_L1) - mflr r10 - bl flush_dcache_L1 /* Flush L1 d-cache */ - mtlr r10 - - mfspr r4, SPRN_L1CSR0 /* Invalidate and disable d-cache */ - li r5, 2 - rlwimi r4, r5, 0, 3 - - msync - isync - mtspr SPRN_L1CSR0, r4 - isync - -1: mfspr r4, SPRN_L1CSR0 /* Wait for the invalidate to finish */ - andi. r4, r4, 2 - bne 1b - - mfspr r4, SPRN_L1CSR1 /* Invalidate and disable i-cache */ - li r5, 2 - rlwimi r4, r5, 0, 3 - - mtspr SPRN_L1CSR1, r4 - isync - - blr - #ifdef CONFIG_SMP /* When we get here, r24 needs to hold the CPU # */ .globl __secondary_start diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c index b8b8216..0b75e8e 100644 --- a/arch/powerpc/platforms/85xx/smp.c +++ b/arch/powerpc/platforms/85xx/smp.c @@ -139,7 +139,8 @@ static void smp_85xx_mach_cpu_die(void) mtspr(SPRN_TCR, 0); - __flush_disable_L1(); + cur_cpu_spec->cpu_down_flush(); + tmp = (mfspr(SPRN_HID0) & ~(HID0_DOZE|HID0_SLEEP)) | HID0_NAP; mtspr(SPRN_HID0, tmp); isync(); @@ -345,7 +346,7 @@ void mpc85xx_smp_kexec_cpu_down(int crash_shutdown, int secondary) local_irq_disable(); if (secondary) { - __flush_disable_L1(); + cur_cpu_spec->cpu_down_flush(); atomic_inc(&kexec_down_cpus); /* loop forever */ while (1);