linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: santosh.shilimkar@ti.com (Santosh Shilimkar)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 03/16] ARM: b.L: introduce helpers for platform coherency exit/setup
Date: Sat, 12 Jan 2013 00:04:40 +0530	[thread overview]
Message-ID: <50F05B40.40302@ti.com> (raw)
In-Reply-To: <20130111180757.GI1966@linaro.org>

On Friday 11 January 2013 11:37 PM, Dave Martin wrote:
> On Fri, Jan 11, 2013 at 11:16:18PM +0530, Santosh Shilimkar wrote:
>
> [...]
>
>>> +Originally created and documented by Dave Martin for Linaro Limited, in
>>> +collaboration with Nicolas Pitre and Achin Gupta.
>>> +
>> Great write-up Dave!! I might have to do couple of more passes on it to
>> get overall idea, but surely this documentation is good start for
>> anybody reading/reviewing the big.LITTLE switcher code.
>
> Thanks for reading through it.  Partly, this was insurance against me
> forgetting how the code worked in between writing and posting it...
> but this is all quite subtle code, so it felt important to document
> it thoroughly.
>
>>
>>> +Copyright (C) 2012  Linaro Limited
>>> +Distributed under the terms of Version 2 of the GNU General Public
>>> +License, as defined in linux/COPYING.
>>> diff --git a/arch/arm/common/bL_entry.c b/arch/arm/common/bL_entry.c
>>> index 41de0622de..1ea4ec9df0 100644
>>> --- a/arch/arm/common/bL_entry.c
>>> +++ b/arch/arm/common/bL_entry.c
>>> @@ -116,3 +116,163 @@ int bL_cpu_powered_up(void)
>>>   		platform_ops->powered_up();
>>>   	return 0;
>>>   }
>>> +
>>> +struct bL_sync_struct bL_sync;
>>> +
>>> +static void __sync_range(volatile void *p, size_t size)
>>> +{
>>> +	char *_p = (char *)p;
>>> +
>>> +	__cpuc_flush_dcache_area(_p, size);
>>> +	outer_flush_range(__pa(_p), __pa(_p + size));
>>> +	outer_sync();
>>> +}
>>> +
>>> +#define sync_mem(ptr) __sync_range(ptr, sizeof *(ptr))
>>> +
>>> +/*
>> /** as per kerneldoc.
>
> Does kerneldoc not require the comment to be specially formatted?
>
> I haven't played with that, so far.
>
>>
>>> + * __bL_cpu_going_down: Indicates that the cpu is being torn down.
>>> + *    This must be called at the point of committing to teardown of a CPU.
>>> + *    The CPU cache (SCTRL.C bit) is expected to still be active.
>>> + */
>>> +void __bL_cpu_going_down(unsigned int cpu, unsigned int cluster)
>>> +{
>>> +	bL_sync.clusters[cluster].cpus[cpu].cpu = CPU_GOING_DOWN;
>>> +	sync_mem(&bL_sync.clusters[cluster].cpus[cpu].cpu);
>>> +}
>>> +
>>
>> [..]
>>
>>> diff --git a/arch/arm/common/bL_head.S b/arch/arm/common/bL_head.S
>>> index 9d351f2b4c..f7a64ac127 100644
>>> --- a/arch/arm/common/bL_head.S
>>> +++ b/arch/arm/common/bL_head.S
>>> @@ -7,11 +7,19 @@
>>>    * This program is free software; you can redistribute it and/or modify
>>>    * it under the terms of the GNU General Public License version 2 as
>>>    * published by the Free Software Foundation.
>>> + *
>>> + *
>>> + * Refer to Documentation/arm/big.LITTLE/cluster-pm-race-avoidance.txt
>>> + * for details of the synchronisation algorithms used here.
>>>    */
>>>
>>>   #include <linux/linkage.h>
>>>   #include <asm/bL_entry.h>
>>>
>>> +.if BL_SYNC_CLUSTER_CPUS
>>> +.error "cpus must be the first member of struct bL_cluster_sync_struct"
>>> +.endif
>>> +
>>>   	.macro	pr_dbg	cpu, string
>>>   #if defined(CONFIG_DEBUG_LL) && defined(DEBUG)
>>>   	b	1901f
>>> @@ -52,12 +60,82 @@ ENTRY(bL_entry_point)
>>>   2:	pr_dbg	r4, "kernel bL_entry_point\n"
>>>
>>>   	/*
>>> -	 * MMU is off so we need to get to bL_entry_vectors in a
>>> +	 * MMU is off so we need to get to various variables in a
>>>   	 * position independent way.
>>>   	 */
>>>   	adr	r5, 3f
>>> -	ldr	r6, [r5]
>>> +	ldmia	r5, {r6, r7, r8}
>>>   	add	r6, r5, r6			@ r6 = bL_entry_vectors
>>> +	ldr	r7, [r5, r7]			@ r7 = bL_power_up_setup_phys
>>> +	add	r8, r5, r8			@ r8 = bL_sync
>>> +
>>> +	mov	r0, #BL_SYNC_CLUSTER_SIZE
>>> +	mla	r8, r0, r10, r8			@ r8 = bL_sync cluster base
>>> +
>>> +	@ Signal that this CPU is coming UP:
>>> +	mov	r0, #CPU_COMING_UP
>>> +	mov	r5, #BL_SYNC_CPU_SIZE
>>> +	mla	r5, r9, r5, r8			@ r5 = bL_sync cpu address
>>> +	strb	r0, [r5]
>>> +
>>> +	dsb
>> Do you really need above dsb(). With MMU off, the the store should
>
> The short answer is "maybe not".  Some of the barriers can be
> eliminated; some can be demoted to DSBs.  Others may be required but
> unnecessarily duplicated e.g., between bL_head.S and vlock.S.
>
>> any way make it to the main memory, No ?
>
> Yes, but this raises issues about precisely what the architecture
> guarantees about memory ordering in these scenarios.  The only obvious
> thing about that is that it's non-obvious.
>
Well at least ARM documents clearly says the memory accesses will be
treated as strongly ordered with MMU OFF and that means they expect
to make it to main memory.

> Strongly-Ordered memory is not quite the same as having explicit
> barriers everywhere.
>
> I need to have a careful think, but it should be possible to optimise
> a bit here.
>
If the CCI comes in between that rule and if it needs a barrier to let
it flush is WB to main memory then thats a different story.

Anyway thanks for the answer.
Regards
Santosh

  reply	other threads:[~2013-01-11 18:34 UTC|newest]

Thread overview: 132+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-10  0:20 [PATCH 00/16] big.LITTLE low-level CPU and cluster power management Nicolas Pitre
2013-01-10  0:20 ` [PATCH 01/16] ARM: b.L: secondary kernel entry code Nicolas Pitre
2013-01-10  7:12   ` Stephen Boyd
2013-01-10 15:30     ` Nicolas Pitre
2013-01-10 15:34   ` Catalin Marinas
2013-01-10 16:47     ` Nicolas Pitre
2013-01-11 11:45       ` Catalin Marinas
2013-01-11 12:05         ` Lorenzo Pieralisi
2013-01-11 12:19         ` Dave Martin
2013-01-10 23:05   ` Will Deacon
2013-01-11  1:26     ` Nicolas Pitre
2013-01-11 10:55       ` Will Deacon
2013-01-11 11:35         ` Dave Martin
2013-01-11 17:16   ` Santosh Shilimkar
2013-01-11 18:10     ` Nicolas Pitre
2013-01-11 18:30       ` Santosh Shilimkar
2013-03-07  7:37   ` Pavel Machek
2013-03-07  8:57     ` Nicolas Pitre
2013-01-10  0:20 ` [PATCH 02/16] ARM: b.L: introduce the CPU/cluster power API Nicolas Pitre
2013-01-10 23:08   ` Will Deacon
2013-01-11  2:30     ` Nicolas Pitre
2013-01-11 10:58       ` Will Deacon
2013-01-11 11:29       ` Dave Martin
2013-01-11 17:26   ` Santosh Shilimkar
2013-01-11 18:33     ` Nicolas Pitre
2013-01-11 18:41       ` Santosh Shilimkar
2013-01-11 19:54         ` Nicolas Pitre
2013-01-10  0:20 ` [PATCH 03/16] ARM: b.L: introduce helpers for platform coherency exit/setup Nicolas Pitre
2013-01-10 12:01   ` Dave Martin
2013-01-10 19:04     ` Nicolas Pitre
2013-01-11 11:30       ` Dave Martin
2013-01-10 16:53   ` Catalin Marinas
2013-01-10 17:59     ` Nicolas Pitre
2013-01-10 21:50       ` Catalin Marinas
2013-01-10 22:31         ` Nicolas Pitre
2013-01-11 10:36           ` Dave Martin
2013-01-10 22:32     ` Nicolas Pitre
2013-01-10 23:13   ` Will Deacon
2013-01-11  1:50     ` Nicolas Pitre
2013-01-11 11:09       ` Dave Martin
2013-01-11 17:46   ` Santosh Shilimkar
2013-01-11 18:07     ` Dave Martin
2013-01-11 18:34       ` Santosh Shilimkar [this message]
2013-01-14 17:08   ` Dave Martin
2013-01-14 17:15     ` Catalin Marinas
2013-01-14 18:10       ` Dave Martin
2013-01-14 21:34         ` Catalin Marinas
2013-01-10  0:20 ` [PATCH 04/16] ARM: b.L: Add baremetal voting mutexes Nicolas Pitre
2013-01-10 23:18   ` Will Deacon
2013-01-11  3:15     ` Nicolas Pitre
2013-01-11 11:03       ` Will Deacon
2013-01-11 16:57       ` Dave Martin
2013-01-10  0:20 ` [PATCH 05/16] ARM: bL_head: vlock-based first man election Nicolas Pitre
2013-01-10  0:20 ` [PATCH 06/16] ARM: b.L: generic SMP secondary bringup and hotplug support Nicolas Pitre
2013-01-11 18:02   ` Santosh Shilimkar
2013-01-14 18:05     ` Achin Gupta
2013-01-15  6:32       ` Santosh Shilimkar
2013-01-15 11:18         ` Achin Gupta
2013-01-15 11:26           ` Santosh Shilimkar
2013-01-15 18:53           ` Dave Martin
2013-01-14 16:35   ` Will Deacon
2013-01-14 16:51     ` Nicolas Pitre
2013-01-15 19:09       ` Dave Martin
2013-01-10  0:20 ` [PATCH 07/16] ARM: bL_platsmp.c: close the kernel entry gate before hot-unplugging a CPU Nicolas Pitre
2013-01-14 16:37   ` Will Deacon
2013-01-14 16:53     ` Nicolas Pitre
2013-01-14 17:00       ` Will Deacon
2013-01-14 17:11         ` Catalin Marinas
2013-01-14 17:15         ` Nicolas Pitre
2013-01-14 17:23           ` Will Deacon
2013-01-14 18:26           ` Russell King - ARM Linux
2013-01-14 18:49             ` Nicolas Pitre
2013-01-15 18:40             ` Dave Martin
2013-01-16 16:06               ` Catalin Marinas
2013-01-10  0:20 ` [PATCH 08/16] ARM: bL_platsmp.c: make sure the GIC interface of a dying CPU is disabled Nicolas Pitre
2013-01-11 18:07   ` Santosh Shilimkar
2013-01-11 19:07     ` Nicolas Pitre
2013-01-12  6:50       ` Santosh Shilimkar
2013-01-12 16:47         ` Nicolas Pitre
2013-01-13  4:37           ` Santosh Shilimkar
2013-01-14 17:53           ` Lorenzo Pieralisi
2013-01-14 16:39   ` Will Deacon
2013-01-14 16:54     ` Nicolas Pitre
2013-01-14 17:02       ` Will Deacon
2013-01-14 17:18         ` Nicolas Pitre
2013-01-14 17:24           ` Will Deacon
2013-01-14 17:56             ` Lorenzo Pieralisi
2013-01-10  0:20 ` [PATCH 09/16] ARM: vexpress: Select the correct SMP operations at run-time Nicolas Pitre
2013-01-10  0:20 ` [PATCH 10/16] ARM: vexpress: introduce DCSCB support Nicolas Pitre
2013-01-11 18:12   ` Santosh Shilimkar
2013-01-11 19:13     ` Nicolas Pitre
2013-01-12  6:52       ` Santosh Shilimkar
2013-01-10  0:20 ` [PATCH 11/16] ARM: vexpress/dcscb: add CPU use counts to the power up/down API implementation Nicolas Pitre
2013-01-10  0:20 ` [PATCH 12/16] ARM: vexpress/dcscb: do not hardcode number of CPUs per cluster Nicolas Pitre
2013-01-10  0:20 ` [PATCH 13/16] drivers: misc: add ARM CCI support Nicolas Pitre
2013-01-11 18:20   ` Santosh Shilimkar
2013-01-11 19:22     ` Nicolas Pitre
2013-01-12  6:53       ` Santosh Shilimkar
2013-01-15 18:34       ` Dave Martin
2013-01-10  0:20 ` [PATCH 14/16] ARM: TC2: ensure powerdown-time data is flushed from cache Nicolas Pitre
2013-01-10 18:50   ` Dave Martin
2013-01-10 19:13     ` Nicolas Pitre
2013-01-11 11:38       ` Dave Martin
2013-01-10  0:20 ` [PATCH 15/16] ARM: vexpress/dcscb: handle platform coherency exit/setup and CCI Nicolas Pitre
2013-01-10 12:05   ` Dave Martin
2013-01-11 18:27   ` Santosh Shilimkar
2013-01-11 19:28     ` Nicolas Pitre
2013-01-12  7:21       ` Santosh Shilimkar
2013-01-14 12:25         ` Lorenzo Pieralisi
2013-01-15  6:23           ` Santosh Shilimkar
2013-01-15 18:20             ` Dave Martin
2013-01-16  6:33               ` Santosh Shilimkar
2013-01-16 10:03                 ` Lorenzo Pieralisi
2013-01-16 10:12                   ` Santosh Shilimkar
2013-01-10  0:20 ` [PATCH 16/16] ARM: vexpress/dcscb: probe via device tree Nicolas Pitre
2013-01-10  0:46 ` [PATCH 00/16] big.LITTLE low-level CPU and cluster power management Rob Herring
2013-01-10  5:04   ` Nicolas Pitre
2013-01-10 23:01 ` Will Deacon
2013-01-14  9:56 ` Joseph Lo
2013-01-14 14:05   ` Nicolas Pitre
2013-01-15  2:44     ` Joseph Lo
2013-01-15 16:44       ` Nicolas Pitre
2013-01-16 16:02         ` Catalin Marinas
2013-01-16 21:18           ` Nicolas Pitre
2013-01-17 17:55             ` Catalin Marinas
2013-01-15 18:31     ` Dave Martin
2013-03-07  8:27 ` Pavel Machek
2013-03-07  9:12   ` Nicolas Pitre
2013-03-07  9:40     ` Pavel Machek
2013-03-07  9:56       ` Nicolas Pitre
2013-03-07 14:51         ` Pavel Machek
2013-03-07 15:42           ` Nicolas Pitre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=50F05B40.40302@ti.com \
    --to=santosh.shilimkar@ti.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).