linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown synchronisation
@ 2013-10-01 17:15 Dave Martin
  0 siblings, 0 replies; 7+ messages in thread
From: Dave Martin @ 2013-10-01 17:15 UTC (permalink / raw)
  To: linux-arm-kernel

This series adds MCPM support for detecting when a CPU is safely powered
down, and provides an implementation for TC2.

It should be possible to implement the same thing for PSCI using the
AFFINITY_INFO call (I need to check the semantics with Charles)

This is sufficient to for working kexec with real power management on
TC2.  To test it, you'll also need:

  * CONFIG_KEXEC=y
  * CONFIG_PROC_DEVICE_TREE=y
  * CONFIG_MCPM=y
  * CONFIG_ARCH_VEXPRESS_TC2_PM=y
  * sufficiently new kexec-tools
    (git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
    v2.0.4 worked for me)

This build on Nico's patch
http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=7842/1
(MCPM: don't explode if invoked without being initialized first)

To prevent CPUs from running off into the weeds across kexec, this
series requires Lorenzo's patch
http://lists.infradead.org/pipermail/linux-arm-kernel/2013-September/200917.html
(arm: vexpress: tc2: fix hotplug/idle/kexec race on cluster power down).

Changes since v2:

 * Return a proper failure code if mcpm_cpu_power_down_finish() is
   called with no mcpm platforms_ops registered, or a NULL
   power_down_finish() method.  (Thanks again Nico)

 * Minor refactoring of the loop in tc2_pm_power_down_finish() to
   avoid the goto.

Changes between v1 and v2:

 * "Fix" erroneous documentation comment by switching to -errno return
   value convention for power_down_finish(), which is more informative.
   tc2_pm now returns -ETIMEDOUT on timeout.  The return is adapted to
   bool convention on return from smp_ops.cpu_kill() instead.  (Thanks,
   Nico).

 * For consistency, BUG_ON out of range cpu or cluster values
   tc2_pm_power_down_finish(), as for tc2_pm_power_down().

Changes between RFC and v1:

 * Print a big fat warning instead of branching to null if the
   power_down_finish() method is not supplied by the backend, or not
   registered.

 * Add a generous timeout of 1 second for the TC2 implementation.

 * Relax the polling interval to 10ms for TC2, since the need to poll
   more than once is rare and this is not a performance-critical path.

 * Fix some silly typos.


Dave Martin (3):
  ARM: mcpm: Factor out logical-to-physical CPU translation
  ARM: mcpm: Implement cpu_kill() to synchronise on powerdown
  ARM: vexpress/TC2: Implement MCPM power_down_finish()

 arch/arm/common/mcpm_entry.c    |   15 +++++++++
 arch/arm/common/mcpm_platsmp.c  |   27 +++++++++++++---
 arch/arm/include/asm/mcpm.h     |   31 ++++++++++++++++++
 arch/arm/mach-vexpress/spc.c    |   39 +++++++++++++++++++++++
 arch/arm/mach-vexpress/spc.h    |    1 +
 arch/arm/mach-vexpress/tc2_pm.c |   66 ++++++++++++++++++++++++++++++++++++---
 6 files changed, 170 insertions(+), 9 deletions(-)

-- 
1.7.9.5

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown synchronisation
       [not found] <CALicx6v86NMp53+zbE=A3ang-ftGE3KiUojkRZO4ss6Pmks1ow@mail.gmail.com>
@ 2013-10-24 12:48 ` Vijay Kilari
  2013-10-24 12:49   ` Vijay Kilari
  0 siblings, 1 reply; 7+ messages in thread
From: Vijay Kilari @ 2013-10-24 12:48 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Dave Martin,

   With the below configuration, I tried to check cpu hotplug as this
is prerequisite for kexec.
I see cpu hotplug fails. hot-unplug is OK but hot plug-in fails.

Below is my DCC board configuration

SCC REGISTERS]
TOTALSCCS: 32                   ;Total Number of SCC registers
SCC: 0x018 0x1FFFFFFF
SCC: 0x01C 0xFF00FF00           ;CFGRW3  - SMC CS6/7 N/U
SCC: 0x118 0x01CD1011           ;CFGRW17 - HDLCD PLL external bypass
;SCC: 0x700 0x1032F003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
Cluster (default CA7_0)
SCC: 0x700 0x0032D003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
Cluster (default CA7_0)
                                ;          Bootmon configuration:
                                ;          [15]: A7 Event stream
generation (default: disabled)
                                ;          [14]: A15 Event stream
generation (default: disabled)
                                ;          [13]: Power down the
non-boot cluster (default: disabled)
                                ;          [12]: Use per-cpu mailboxes
for power management (default: disabled)
                                ;          [11]: A15 executes WFEs as
nops (default: disabled)
                                ;          [ 4]: Erase UEFI variable
storage in NOR flash

SCC: 0x400 0x33330c00           ;CFGREG41 - A15 configuration register
0 (Default 0x33330c80)
                                ;       [29:28] SPNIDEN
                                ;       [25:24] SPIDEN
                                ;       [21:20] NIDEN
                                ;       [17:16] DBGEN
                                ;       [13:12] CFGTE
                                ;       [9:8] VINITHI_CORE
                                ;       [7] IMINLN
                                ;       [3:0] CLUSTER_ID


;Power management interface

SCC: 0xC00 0x00000005           ;Control: [0]PMI_EN [1]DBG_EN [2]SPC_SYSCFG
SCC: 0xC04 0x000005DC           ;Latency in uS max: [15:0]DVFS [31:16]PWRUP


On Mon, Oct 21, 2013 at 6:47 PM, Vijay Kilari <vijay.kilari@gmail.com> wrote:
> Hi Dave Martin,
>
>   On which kernel base this kexec is tested? is it 3.10 or 3.12?
> can you please share your git (public) if available?
>
> I tested using 3.10 + TC2 patches. However I see sometimes kexec fails
> to reboot and hangs at very early stage (log below)
>
> root at armeb-cortex-a15:/# kexec -e
> [   59.311559] Starting new kernel
>
> Thanks
> Vijay
>
> Message: 2
> Date: Tue,  1 Oct 2013 18:15:15 +0100
> From: Dave Martin <Dave.Martin@arm.com>
> To: linux-arm-kernel at lists.infradead.org
> Cc: Nicolas Pitre <nicolas.pitre@linaro.org>, Lorenzo Pieralisi
>         <Lorenzo.Pieralisi@arm.com>, Pawel Moll <Pawel.Moll@arm.com>, Sudeep
>         KarkadaNagesha <Sudeep.KarkadaNagesha@arm.com
>>, Will Deacon
>         <Will.Deacon@arm.com>, Dave Martin <Dave.Martin@arm.com>
> Subject: [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown
>         synchronisation
> Message-ID: <1380647718-9178-1-git-send-email-Dave.Martin@arm.com>
>
> This series adds MCPM support for detecting when a CPU is safely powered
> down, and provides an implementation for TC2.
>
> It should be possible to implement the same thing for PSCI using the
> AFFINITY_INFO call (I need to check the semantics with Charles)
>
> This is sufficient to for working kexec with real power management on
> TC2.  To test it, you'll also need:
>
>   * CONFIG_KEXEC=y
>   * CONFIG_PROC_DEVICE_TREE=y
>   * CONFIG_MCPM=y
>   * CONFIG_ARCH_VEXPRESS_TC2_PM=y
>   * sufficiently new kexec-tools
>     (git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
>     v2.0.4 worked for me)
>
> This build on Nico's patch
> http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=7842/1
> (MCPM: don't explode if invoked without being initialized first)
>
> To prevent CPUs from running off into the weeds across kexec, this
> series requires Lorenzo's patch
> http://lists.infradead.org/pipermail/linux-arm-kernel/2013-September/200917.html
> (arm: vexpress: tc2: fix hotplug/idle/kexec race on cluster power down).
>
> Changes since v2:
>
>  * Return a proper failure code if mcpm_cpu_power_down_finish() is
>    called with no mcpm platforms_ops registered, or a NULL
>    power_down_finish() method.  (Thanks again Nico)
>
>  * Minor refactoring of the loop in tc2_pm_power_down_finish() to
>    avoid the goto.
>
> Changes between v1 and v2:
>
>  * "Fix" erroneous documentation comment by switching to -errno return
>    value convention for power_down_finish(), which is more informative.
>    tc2_pm now returns -ETIMEDOUT on timeout.  The return is adapted to
>    bool convention on return from smp_ops.cpu_kill() instead.  (Thanks,
>    Nico).
>
>  * For consistency, BUG_ON out of range cpu or cluster values
>    tc2_pm_power_down_finish(), as for tc2_pm_power_down().
>
> Changes between RFC and v1:
>
>  * Print a big fat warning instead of branching to null if the
>    power_down_finish() method is not supplied by the backend, or not
>    registered.
>
>  * Add a generous timeout of 1 second for the TC2 implementation.
>
>  * Relax the polling interval to 10ms for TC2, since the need to poll
>    more than once is rare and this is not a performance-critical path.
>
>  * Fix some silly typos.
>
>
> Dave Martin (3):
>   ARM: mcpm: Factor out logical-to-physical CPU translation
>   ARM: mcpm: Implement cpu_kill() to synchronise on powerdown
>   ARM: vexpress/TC2: Implement MCPM power_down_finish()
>
>  arch/arm/common/mcpm_entry.c    |   15 +++++++++
>  arch/arm/common/mcpm_platsmp.c  |   27 +++++++++++++---
>  arch/arm/include/asm/mcpm.h     |   31 ++++++++++++++++++
>  arch/arm/mach-vexpress/spc.c    |   39 +++++++++++++++++++++++
>  arch/arm/mach-vexpress/spc.h    |    1 +
>  arch/arm/mach-vexpress/tc2_pm.c |   66 ++++++++++++++++++++++++++++++++++++---
>  6 files changed, 170 insertions(+), 9 deletions(-)
>
> --
> 1.7.9.5

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown synchronisation
  2013-10-24 12:48 ` [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown synchronisation Vijay Kilari
@ 2013-10-24 12:49   ` Vijay Kilari
  2013-10-24 16:45     ` Sudeep KarkadaNagesha
  2013-10-25 15:46     ` Dave Martin
  0 siblings, 2 replies; 7+ messages in thread
From: Vijay Kilari @ 2013-10-24 12:49 UTC (permalink / raw)
  To: linux-arm-kernel

Sorry. Below is the right DCC configuration for SCC 700
SCC: 0x700 0x0032F003           ;CFGRW48 - [25:24]Boot CPU [28]Boot

On Thu, Oct 24, 2013 at 6:18 PM, Vijay Kilari <vijay.kilari@gmail.com> wrote:
> Hi Dave Martin,
>
>    With the below configuration, I tried to check cpu hotplug as this
> is prerequisite for kexec.
> I see cpu hotplug fails. hot-unplug is OK but hot plug-in fails.
>
> Below is my DCC board configuration
>
> SCC REGISTERS]
> TOTALSCCS: 32                   ;Total Number of SCC registers
> SCC: 0x018 0x1FFFFFFF
> SCC: 0x01C 0xFF00FF00           ;CFGRW3  - SMC CS6/7 N/U
> SCC: 0x118 0x01CD1011           ;CFGRW17 - HDLCD PLL external bypass
> ;SCC: 0x700 0x1032F003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
> Cluster (default CA7_0)
> SCC: 0x700 0x0032D003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
> Cluster (default CA7_0)
>                                 ;          Bootmon configuration:
>                                 ;          [15]: A7 Event stream
> generation (default: disabled)
>                                 ;          [14]: A15 Event stream
> generation (default: disabled)
>                                 ;          [13]: Power down the
> non-boot cluster (default: disabled)
>                                 ;          [12]: Use per-cpu mailboxes
> for power management (default: disabled)
>                                 ;          [11]: A15 executes WFEs as
> nops (default: disabled)
>                                 ;          [ 4]: Erase UEFI variable
> storage in NOR flash
>
> SCC: 0x400 0x33330c00           ;CFGREG41 - A15 configuration register
> 0 (Default 0x33330c80)
>                                 ;       [29:28] SPNIDEN
>                                 ;       [25:24] SPIDEN
>                                 ;       [21:20] NIDEN
>                                 ;       [17:16] DBGEN
>                                 ;       [13:12] CFGTE
>                                 ;       [9:8] VINITHI_CORE
>                                 ;       [7] IMINLN
>                                 ;       [3:0] CLUSTER_ID
>
>
> ;Power management interface
>
> SCC: 0xC00 0x00000005           ;Control: [0]PMI_EN [1]DBG_EN [2]SPC_SYSCFG
> SCC: 0xC04 0x000005DC           ;Latency in uS max: [15:0]DVFS [31:16]PWRUP
>
>
> On Mon, Oct 21, 2013 at 6:47 PM, Vijay Kilari <vijay.kilari@gmail.com> wrote:
>> Hi Dave Martin,
>>
>>   On which kernel base this kexec is tested? is it 3.10 or 3.12?
>> can you please share your git (public) if available?
>>
>> I tested using 3.10 + TC2 patches. However I see sometimes kexec fails
>> to reboot and hangs at very early stage (log below)
>>
>> root at armeb-cortex-a15:/# kexec -e
>> [   59.311559] Starting new kernel
>>
>> Thanks
>> Vijay
>>
>> Message: 2
>> Date: Tue,  1 Oct 2013 18:15:15 +0100
>> From: Dave Martin <Dave.Martin@arm.com>
>> To: linux-arm-kernel at lists.infradead.org
>> Cc: Nicolas Pitre <nicolas.pitre@linaro.org>, Lorenzo Pieralisi
>>         <Lorenzo.Pieralisi@arm.com>, Pawel Moll <Pawel.Moll@arm.com>, Sudeep
>>         KarkadaNagesha <Sudeep.KarkadaNagesha@arm.com
>>>, Will Deacon
>>         <Will.Deacon@arm.com>, Dave Martin <Dave.Martin@arm.com>
>> Subject: [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown
>>         synchronisation
>> Message-ID: <1380647718-9178-1-git-send-email-Dave.Martin@arm.com>
>>
>> This series adds MCPM support for detecting when a CPU is safely powered
>> down, and provides an implementation for TC2.
>>
>> It should be possible to implement the same thing for PSCI using the
>> AFFINITY_INFO call (I need to check the semantics with Charles)
>>
>> This is sufficient to for working kexec with real power management on
>> TC2.  To test it, you'll also need:
>>
>>   * CONFIG_KEXEC=y
>>   * CONFIG_PROC_DEVICE_TREE=y
>>   * CONFIG_MCPM=y
>>   * CONFIG_ARCH_VEXPRESS_TC2_PM=y
>>   * sufficiently new kexec-tools
>>     (git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
>>     v2.0.4 worked for me)
>>
>> This build on Nico's patch
>> http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=7842/1
>> (MCPM: don't explode if invoked without being initialized first)
>>
>> To prevent CPUs from running off into the weeds across kexec, this
>> series requires Lorenzo's patch
>> http://lists.infradead.org/pipermail/linux-arm-kernel/2013-September/200917.html
>> (arm: vexpress: tc2: fix hotplug/idle/kexec race on cluster power down).
>>
>> Changes since v2:
>>
>>  * Return a proper failure code if mcpm_cpu_power_down_finish() is
>>    called with no mcpm platforms_ops registered, or a NULL
>>    power_down_finish() method.  (Thanks again Nico)
>>
>>  * Minor refactoring of the loop in tc2_pm_power_down_finish() to
>>    avoid the goto.
>>
>> Changes between v1 and v2:
>>
>>  * "Fix" erroneous documentation comment by switching to -errno return
>>    value convention for power_down_finish(), which is more informative.
>>    tc2_pm now returns -ETIMEDOUT on timeout.  The return is adapted to
>>    bool convention on return from smp_ops.cpu_kill() instead.  (Thanks,
>>    Nico).
>>
>>  * For consistency, BUG_ON out of range cpu or cluster values
>>    tc2_pm_power_down_finish(), as for tc2_pm_power_down().
>>
>> Changes between RFC and v1:
>>
>>  * Print a big fat warning instead of branching to null if the
>>    power_down_finish() method is not supplied by the backend, or not
>>    registered.
>>
>>  * Add a generous timeout of 1 second for the TC2 implementation.
>>
>>  * Relax the polling interval to 10ms for TC2, since the need to poll
>>    more than once is rare and this is not a performance-critical path.
>>
>>  * Fix some silly typos.
>>
>>
>> Dave Martin (3):
>>   ARM: mcpm: Factor out logical-to-physical CPU translation
>>   ARM: mcpm: Implement cpu_kill() to synchronise on powerdown
>>   ARM: vexpress/TC2: Implement MCPM power_down_finish()
>>
>>  arch/arm/common/mcpm_entry.c    |   15 +++++++++
>>  arch/arm/common/mcpm_platsmp.c  |   27 +++++++++++++---
>>  arch/arm/include/asm/mcpm.h     |   31 ++++++++++++++++++
>>  arch/arm/mach-vexpress/spc.c    |   39 +++++++++++++++++++++++
>>  arch/arm/mach-vexpress/spc.h    |    1 +
>>  arch/arm/mach-vexpress/tc2_pm.c |   66 ++++++++++++++++++++++++++++++++++++---
>>  6 files changed, 170 insertions(+), 9 deletions(-)
>>
>> --
>> 1.7.9.5

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown synchronisation
  2013-10-24 12:49   ` Vijay Kilari
@ 2013-10-24 16:45     ` Sudeep KarkadaNagesha
  2013-10-25 15:46     ` Dave Martin
  1 sibling, 0 replies; 7+ messages in thread
From: Sudeep KarkadaNagesha @ 2013-10-24 16:45 UTC (permalink / raw)
  To: linux-arm-kernel

On 24/10/13 13:49, Vijay Kilari wrote:
> Sorry. Below is the right DCC configuration for SCC 700
> SCC: 0x700 0x0032F003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
> 
> On Thu, Oct 24, 2013 at 6:18 PM, Vijay Kilari <vijay.kilari@gmail.com> wrote:
>> Hi Dave Martin,
>>
>>    With the below configuration, I tried to check cpu hotplug as this
>> is prerequisite for kexec.
>> I see cpu hotplug fails. hot-unplug is OK but hot plug-in fails.
>>
It works fine for me on v3.12-rc6.
Do you see any error message ?
(check demsg if loglevel is changed by some scripts in FS)

Regards,
Sudeep

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown synchronisation
  2013-10-24 12:49   ` Vijay Kilari
  2013-10-24 16:45     ` Sudeep KarkadaNagesha
@ 2013-10-25 15:46     ` Dave Martin
  2013-10-27  2:52       ` Nicolas Pitre
  2013-11-05  5:27       ` Vijay Kilari
  1 sibling, 2 replies; 7+ messages in thread
From: Dave Martin @ 2013-10-25 15:46 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Oct 24, 2013 at 06:19:42PM +0530, Vijay Kilari wrote:
> Sorry. Below is the right DCC configuration for SCC 700
> SCC: 0x700 0x0032F003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
> 
> On Thu, Oct 24, 2013 at 6:18 PM, Vijay Kilari <vijay.kilari@gmail.com> wrote:
> > Hi Dave Martin,
> >
> >    With the below configuration, I tried to check cpu hotplug as this
> > is prerequisite for kexec.
> > I see cpu hotplug fails. hot-unplug is OK but hot plug-in fails.

Thanks for giving this a try.

> > Below is my DCC board configuration


I've attached my board.txt.

The only obvious difference that I think should have an impact is that
bit 13 in SCC 0x700 needs to be 1 in order for the non-boot cluster to
be powered down on startup.

In my board.txt, SCC 0x700 has the value 0x0032F003 -- you have that,
but it's commented out.

What happens if you set that bit, and make no other changes to your
config?

[more comments below]

> >
> > SCC REGISTERS]
> > TOTALSCCS: 32                   ;Total Number of SCC registers
> > SCC: 0x018 0x1FFFFFFF
> > SCC: 0x01C 0xFF00FF00           ;CFGRW3  - SMC CS6/7 N/U
> > SCC: 0x118 0x01CD1011           ;CFGRW17 - HDLCD PLL external bypass
> > ;SCC: 0x700 0x1032F003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
> > Cluster (default CA7_0)
> > SCC: 0x700 0x0032D003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
> > Cluster (default CA7_0)
> >                                 ;          Bootmon configuration:
> >                                 ;          [15]: A7 Event stream
> > generation (default: disabled)
> >                                 ;          [14]: A15 Event stream
> > generation (default: disabled)
> >                                 ;          [13]: Power down the
> > non-boot cluster (default: disabled)
> >                                 ;          [12]: Use per-cpu mailboxes
> > for power management (default: disabled)
> >                                 ;          [11]: A15 executes WFEs as
> > nops (default: disabled)
> >                                 ;          [ 4]: Erase UEFI variable
> > storage in NOR flash
> >
> > SCC: 0x400 0x33330c00           ;CFGREG41 - A15 configuration register
> > 0 (Default 0x33330c80)
> >                                 ;       [29:28] SPNIDEN
> >                                 ;       [25:24] SPIDEN
> >                                 ;       [21:20] NIDEN
> >                                 ;       [17:16] DBGEN
> >                                 ;       [13:12] CFGTE
> >                                 ;       [9:8] VINITHI_CORE
> >                                 ;       [7] IMINLN
> >                                 ;       [3:0] CLUSTER_ID
> >
> >
> > ;Power management interface
> >
> > SCC: 0xC00 0x00000005           ;Control: [0]PMI_EN [1]DBG_EN [2]SPC_SYSCFG
> > SCC: 0xC04 0x000005DC           ;Latency in uS max: [15:0]DVFS [31:16]PWRUP
> >
> >
> > On Mon, Oct 21, 2013 at 6:47 PM, Vijay Kilari <vijay.kilari@gmail.com> wrote:
> >> Hi Dave Martin,
> >>
> >>   On which kernel base this kexec is tested? is it 3.10 or 3.12?
> >> can you please share your git (public) if available?

I don't have a public git tree right now (that's on my todo list).

I tested the latest post of the series (v4) with v3.12-rc3.

> >> I tested using 3.10 + TC2 patches. However I see sometimes kexec fails
> >> to reboot and hangs at very early stage (log below)
> >>
> >> root at armeb-cortex-a15:/# kexec -e
> >> [   59.311559] Starting new kernel

I don't know why this should happen.  There is a known bug affecting
kexec when the initial kernel is Thumb (i.e., CONFIG_THUMB2_KERNEL=y).
What's your config?

Do you get any extra output if you enable the debug UART earlyprintk? 


Note that in the kernel config, you'll need CONFIG_NR_CPUS=5.  The
default is 4, which may result in the final A7 CPU not being properly
parked across kexec -- I suggest you try changing this too.

Cheers
---Dave

> >>
> >> Thanks
> >> Vijay
> >>
> >> Message: 2
> >> Date: Tue,  1 Oct 2013 18:15:15 +0100
> >> From: Dave Martin <Dave.Martin@arm.com>
> >> To: linux-arm-kernel at lists.infradead.org
> >> Cc: Nicolas Pitre <nicolas.pitre@linaro.org>, Lorenzo Pieralisi
> >>         <Lorenzo.Pieralisi@arm.com>, Pawel Moll <Pawel.Moll@arm.com>, Sudeep
> >>         KarkadaNagesha <Sudeep.KarkadaNagesha@arm.com
> >>>, Will Deacon
> >>         <Will.Deacon@arm.com>, Dave Martin <Dave.Martin@arm.com>
> >> Subject: [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown
> >>         synchronisation
> >> Message-ID: <1380647718-9178-1-git-send-email-Dave.Martin@arm.com>
> >>
> >> This series adds MCPM support for detecting when a CPU is safely powered
> >> down, and provides an implementation for TC2.
> >>
> >> It should be possible to implement the same thing for PSCI using the
> >> AFFINITY_INFO call (I need to check the semantics with Charles)
> >>
> >> This is sufficient to for working kexec with real power management on
> >> TC2.  To test it, you'll also need:
> >>
> >>   * CONFIG_KEXEC=y
> >>   * CONFIG_PROC_DEVICE_TREE=y
> >>   * CONFIG_MCPM=y
> >>   * CONFIG_ARCH_VEXPRESS_TC2_PM=y
> >>   * sufficiently new kexec-tools
> >>     (git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
> >>     v2.0.4 worked for me)
> >>
> >> This build on Nico's patch
> >> http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=7842/1
> >> (MCPM: don't explode if invoked without being initialized first)
> >>
> >> To prevent CPUs from running off into the weeds across kexec, this
> >> series requires Lorenzo's patch
> >> http://lists.infradead.org/pipermail/linux-arm-kernel/2013-September/200917.html
> >> (arm: vexpress: tc2: fix hotplug/idle/kexec race on cluster power down).
> >>
> >> Changes since v2:
> >>
> >>  * Return a proper failure code if mcpm_cpu_power_down_finish() is
> >>    called with no mcpm platforms_ops registered, or a NULL
> >>    power_down_finish() method.  (Thanks again Nico)
> >>
> >>  * Minor refactoring of the loop in tc2_pm_power_down_finish() to
> >>    avoid the goto.
> >>
> >> Changes between v1 and v2:
> >>
> >>  * "Fix" erroneous documentation comment by switching to -errno return
> >>    value convention for power_down_finish(), which is more informative.
> >>    tc2_pm now returns -ETIMEDOUT on timeout.  The return is adapted to
> >>    bool convention on return from smp_ops.cpu_kill() instead.  (Thanks,
> >>    Nico).
> >>
> >>  * For consistency, BUG_ON out of range cpu or cluster values
> >>    tc2_pm_power_down_finish(), as for tc2_pm_power_down().
> >>
> >> Changes between RFC and v1:
> >>
> >>  * Print a big fat warning instead of branching to null if the
> >>    power_down_finish() method is not supplied by the backend, or not
> >>    registered.
> >>
> >>  * Add a generous timeout of 1 second for the TC2 implementation.
> >>
> >>  * Relax the polling interval to 10ms for TC2, since the need to poll
> >>    more than once is rare and this is not a performance-critical path.
> >>
> >>  * Fix some silly typos.
> >>
> >>
> >> Dave Martin (3):
> >>   ARM: mcpm: Factor out logical-to-physical CPU translation
> >>   ARM: mcpm: Implement cpu_kill() to synchronise on powerdown
> >>   ARM: vexpress/TC2: Implement MCPM power_down_finish()
> >>
> >>  arch/arm/common/mcpm_entry.c    |   15 +++++++++
> >>  arch/arm/common/mcpm_platsmp.c  |   27 +++++++++++++---
> >>  arch/arm/include/asm/mcpm.h     |   31 ++++++++++++++++++
> >>  arch/arm/mach-vexpress/spc.c    |   39 +++++++++++++++++++++++
> >>  arch/arm/mach-vexpress/spc.h    |    1 +
> >>  arch/arm/mach-vexpress/tc2_pm.c |   66 ++++++++++++++++++++++++++++++++++++---
> >>  6 files changed, 170 insertions(+), 9 deletions(-)
> >>
> >> --
> >> 1.7.9.5
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
-------------- next part --------------
BOARD: HBI0249
TITLE: V2P-CA15_A7 Configuration File

[DCCS]
TOTALDCCS: 1                    ;Total Number of DCCS
M0FILE: dbb_v110.ebf            ;DCC0 Filename
M0MODE: MICRO                   ;DCC0 Programming Mode

[FPGAS]
TOTALFPGAS: 0                   ;Total Number of FPGAs

[TAPS]
TOTALTAPS: 3                    ;Total Number of TAPs
T0NAME: STM32TMC                ;TAP0 Device Name
T0FILE: NONE                    ;TAP0 Filename
T0MODE: NONE                    ;TAP0 Programming Mode
T1NAME: STM32CM3                ;TAP1 Device Name
T1FILE: NONE                    ;TAP1 Filename
T1MODE: NONE                    ;TAP1 Programming Mode
T2NAME: CORTEXA15               ;TAP2 Device Name
T2FILE: NONE      		;TAP2 Filename
T2MODE: NONE                    ;TAP2 Programming Mode

[OSCCLKS]
TOTALOSCCLKS: 9                 ;Total Number of OSCCLKS
OSC0: 50.0                      ;CPUREFCLK0 A15 CPU (20:1 - 1.0GHz)
OSC1: 50.0                      ;CPUREFCLK1 A15 CPU (20:1 - 1.0GHz)
OSC2: 40.0                      ;CPUREFCLK0 A7  CPU (20:1 - 800MHz)
OSC3: 40.0                      ;CPUREFCLK1 A7  CPU (20:1 - 800MHz)
OSC4: 40.0                      ;HSBM AXI (40MHz)
OSC5: 23.75                     ;HDLCD (23.75MHz - TC PLL is in bypass)
OSC6: 50.0                      ;SMB (50MHz)
OSC7: 50.0                      ;SYSREFCLK (20:1 - 1.0GHz, ACLK - 500MHz)
OSC8: 50.0                      ;DDR2 (8:1 - 400MHz)

[SCC REGISTERS]
TOTALSCCS: 32                   ;Total Number of SCC registers
SCC: 0x01C 0xFF00FF00           ;CFGRW3  - SMC CS6/7 N/U
SCC: 0x118 0x01CD1011           ;CFGRW17 - HDLCD PLL external bypass

SCC: 0x700 0x0032F003           ;CFGRW48 - Cluster configuration register (Default 0x0032F003)
                                ;          [   28] Boot Cluster (default CA15)
                                ;          [25:24] Boot CPU (default 0)
                                ;          [   15] A7 Event stream generation (default: enabled)
                                ;          [   14] A15 Event stream generation (default: enabled)
                                ;          [   13] Power down the non-boot cluster (default: enabled)
                                ;          [   12] Use per-cpu mailboxes for power management (default: enabled)
                                ;          [   11] A15 executes WFEs as nops (default: disabled)

SCC: 0x400 0x33330C00           ;CFGRW41 - A15 configuration register 0 (Default 0x33330C00)
                                ;          [29:28] SPNIDEN
                                ;          [25:24] SPIDEN
                                ;          [21:20] NIDEN
                                ;          [17:16] DBGEN
                                ;          [13:12] CFGTE
                                ;          [ 9: 8] VINITHI_CORE
                                ;          [    7] IMINLN
                                ;          [ 3: 0] CLUSTER_ID

                                ;Set the CPU clock PLLs
SCC: 0x120 0x022F1010           ;CFGRW19 - CA15_0 PLL control - 20:1 (lock OFF)
SCC: 0x124 0x0011710D           ;CFGRW20 - CA15_0 PLL value
SCC: 0x128 0x022F1010           ;CFGRW21 - CA15_1 PLL control - 20:1 (lock OFF)
SCC: 0x12C 0x0011710D           ;CFGRW22 - CA15_1 PLL value
SCC: 0x130 0x022F1010           ;CFGRW23 - CA7_0  PLL control - 20:1 (lock OFF)
SCC: 0x134 0x0011710D           ;CFGRW24 - CA7_0  PLL value
SCC: 0x138 0x022F1010           ;CFGRW25 - CA7_1  PLL control - 20:1 (lock OFF)
SCC: 0x13C 0x0011710D           ;CFGRW26 - CA7_1  PLL value

                                ;Power management interface
; SCC: 0xC00 0x00000007           ;Control: [0]PMI_EN [1]DBG_EN [2]SPC_SYSCFG (disable DBG_EN for power measurements)
; Disable DBG_EN for real power management with Linux MCPM:
SCC: 0xC00 0x00000005           ;Control: [0]PMI_EN [1]DBG_EN [2]SPC_SYSCFG (disable DBG_EN for power measurements)
SCC: 0xC04 0x060E0356           ;Latency in uS max: [15:0]DVFS [31:16]PWRUP
SCC: 0xC08 0x00000000           ;Reserved
SCC: 0xC0C 0x00000000           ;Reserved

                                ;CA15 performance values: 0xVVVFFFFF
SCC: 0xC10 0x384061A8           ;CA15 PERFVAL0,  900mV, 20,000*20= 500MHz
SCC: 0xC14 0x38407530           ;CA15 PERFVAL1,  900mV, 25,000*20= 600MHz
SCC: 0xC18 0x384088B8           ;CA15 PERFVAL2,  900mV, 30,000*20= 700MHz
SCC: 0xC1C 0x38409C40           ;CA15 PERFVAL3,  900mV, 35,000*20= 800MHz
SCC: 0xC20 0x3840AFC8           ;CA15 PERFVAL4,  900mV, 40,000*20= 900MHz
SCC: 0xC24 0x3840C350           ;CA15 PERFVAL5,  900mV, 45,000*20=1000MHz
SCC: 0xC28 0x3CF0D6D8           ;CA15 PERFVAL6,  975mV, 50,000*20=1100MHz
SCC: 0xC2C 0x41A0EA60           ;CA15 PERFVAL7, 1050mV, 55,000*20=1200MHz

                                ;CA7 performance values: 0xVVVFFFFF
SCC: 0xC30 0x3840445C           ;CA7 PERFVAL0,  900mV, 10,000*20= 350MHz
SCC: 0xC34 0x38404E20           ;CA7 PERFVAL1,  900mV, 15,000*20= 400MHz
SCC: 0xC38 0x384061A8           ;CA7 PERFVAL2,  900mV, 20,000*20= 500MHz
SCC: 0xC3C 0x38407530           ;CA7 PERFVAL3,  900mV, 25,000*20= 600MHz
SCC: 0xC40 0x384088B8           ;CA7 PERFVAL4,  900mV, 30,000*20= 700MHz
SCC: 0xC44 0x38409C40           ;CA7 PERFVAL5,  900mV, 35,000*20= 800MHz
SCC: 0xC48 0x3CF0AFC8           ;CA7 PERFVAL6,  975mV, 40,000*20= 900MHz
SCC: 0xC4C 0x41A0C350           ;CA7 PERFVAL7, 1050mV, 45,000*20=1000MHz

SCC: 0xB00 0x00000007           ;CA15 PERFLVL7 (max) requested initially
SCC: 0xB08 0x00000007           ;CA7 PERFLVL7 (max) requested initially

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown synchronisation
  2013-10-25 15:46     ` Dave Martin
@ 2013-10-27  2:52       ` Nicolas Pitre
  2013-11-05  5:27       ` Vijay Kilari
  1 sibling, 0 replies; 7+ messages in thread
From: Nicolas Pitre @ 2013-10-27  2:52 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, 25 Oct 2013, Dave Martin wrote:

> On Thu, Oct 24, 2013 at 06:19:42PM +0530, Vijay Kilari wrote:
> > Sorry. Below is the right DCC configuration for SCC 700
> > SCC: 0x700 0x0032F003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
> > 
> > On Thu, Oct 24, 2013 at 6:18 PM, Vijay Kilari <vijay.kilari@gmail.com> wrote:
> > > Hi Dave Martin,
> > >
> > >    With the below configuration, I tried to check cpu hotplug as this
> > > is prerequisite for kexec.
> > > I see cpu hotplug fails. hot-unplug is OK but hot plug-in fails.
> 
> Thanks for giving this a try.
> 
> > > Below is my DCC board configuration
> 
> 
> I've attached my board.txt.
> 
> The only obvious difference that I think should have an impact is that
> bit 13 in SCC 0x700 needs to be 1 in order for the non-boot cluster to
> be powered down on startup.
> 
> In my board.txt, SCC 0x700 has the value 0x0032F003 -- you have that,
> but it's commented out.

Is there a way to programmatically determine from Linux if the necessary 
bits are set?

...

Yes, from physical 0x7fff0700.  I think we should test for the proper 
bits to be set such as bit 12 which is absolutely needed for the code in 
tc2_pm.c to work, and refuse to register the TC2 MCPM backend with a big 
warning in the boot log to that effect otherwise.  If Linux can flag 
inproper firmware config that might help with issues like this one.


> What happens if you set that bit, and make no other changes to your
> config?

That would be interesting to know indeed.


Nicolas

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown synchronisation
  2013-10-25 15:46     ` Dave Martin
  2013-10-27  2:52       ` Nicolas Pitre
@ 2013-11-05  5:27       ` Vijay Kilari
  1 sibling, 0 replies; 7+ messages in thread
From: Vijay Kilari @ 2013-11-05  5:27 UTC (permalink / raw)
  To: linux-arm-kernel

Hi Dave,

 After picking required patches for 3.10, kexec & kdump works
on ARM VE

I have set SCC 0x700 to 0x0032F003 and thumb2 is disabled

Thanks
Vijay

On Fri, Oct 25, 2013 at 9:16 PM, Dave Martin <Dave.Martin@arm.com> wrote:
> On Thu, Oct 24, 2013 at 06:19:42PM +0530, Vijay Kilari wrote:
>> Sorry. Below is the right DCC configuration for SCC 700
>> SCC: 0x700 0x0032F003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
>>
>> On Thu, Oct 24, 2013 at 6:18 PM, Vijay Kilari <vijay.kilari@gmail.com> wrote:
>> > Hi Dave Martin,
>> >
>> >    With the below configuration, I tried to check cpu hotplug as this
>> > is prerequisite for kexec.
>> > I see cpu hotplug fails. hot-unplug is OK but hot plug-in fails.
>
> Thanks for giving this a try.
>
>> > Below is my DCC board configuration
>
>
> I've attached my board.txt.
>
> The only obvious difference that I think should have an impact is that
> bit 13 in SCC 0x700 needs to be 1 in order for the non-boot cluster to
> be powered down on startup.
>
> In my board.txt, SCC 0x700 has the value 0x0032F003 -- you have that,
> but it's commented out.
>
> What happens if you set that bit, and make no other changes to your
> config?
>
> [more comments below]
>
>> >
>> > SCC REGISTERS]
>> > TOTALSCCS: 32                   ;Total Number of SCC registers
>> > SCC: 0x018 0x1FFFFFFF
>> > SCC: 0x01C 0xFF00FF00           ;CFGRW3  - SMC CS6/7 N/U
>> > SCC: 0x118 0x01CD1011           ;CFGRW17 - HDLCD PLL external bypass
>> > ;SCC: 0x700 0x1032F003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
>> > Cluster (default CA7_0)
>> > SCC: 0x700 0x0032D003           ;CFGRW48 - [25:24]Boot CPU [28]Boot
>> > Cluster (default CA7_0)
>> >                                 ;          Bootmon configuration:
>> >                                 ;          [15]: A7 Event stream
>> > generation (default: disabled)
>> >                                 ;          [14]: A15 Event stream
>> > generation (default: disabled)
>> >                                 ;          [13]: Power down the
>> > non-boot cluster (default: disabled)
>> >                                 ;          [12]: Use per-cpu mailboxes
>> > for power management (default: disabled)
>> >                                 ;          [11]: A15 executes WFEs as
>> > nops (default: disabled)
>> >                                 ;          [ 4]: Erase UEFI variable
>> > storage in NOR flash
>> >
>> > SCC: 0x400 0x33330c00           ;CFGREG41 - A15 configuration register
>> > 0 (Default 0x33330c80)
>> >                                 ;       [29:28] SPNIDEN
>> >                                 ;       [25:24] SPIDEN
>> >                                 ;       [21:20] NIDEN
>> >                                 ;       [17:16] DBGEN
>> >                                 ;       [13:12] CFGTE
>> >                                 ;       [9:8] VINITHI_CORE
>> >                                 ;       [7] IMINLN
>> >                                 ;       [3:0] CLUSTER_ID
>> >
>> >
>> > ;Power management interface
>> >
>> > SCC: 0xC00 0x00000005           ;Control: [0]PMI_EN [1]DBG_EN [2]SPC_SYSCFG
>> > SCC: 0xC04 0x000005DC           ;Latency in uS max: [15:0]DVFS [31:16]PWRUP
>> >
>> >
>> > On Mon, Oct 21, 2013 at 6:47 PM, Vijay Kilari <vijay.kilari@gmail.com> wrote:
>> >> Hi Dave Martin,
>> >>
>> >>   On which kernel base this kexec is tested? is it 3.10 or 3.12?
>> >> can you please share your git (public) if available?
>
> I don't have a public git tree right now (that's on my todo list).
>
> I tested the latest post of the series (v4) with v3.12-rc3.
>
>> >> I tested using 3.10 + TC2 patches. However I see sometimes kexec fails
>> >> to reboot and hangs at very early stage (log below)
>> >>
>> >> root at armeb-cortex-a15:/# kexec -e
>> >> [   59.311559] Starting new kernel
>
> I don't know why this should happen.  There is a known bug affecting
> kexec when the initial kernel is Thumb (i.e., CONFIG_THUMB2_KERNEL=y).
> What's your config?
>
> Do you get any extra output if you enable the debug UART earlyprintk?
>
>
> Note that in the kernel config, you'll need CONFIG_NR_CPUS=5.  The
> default is 4, which may result in the final A7 CPU not being properly
> parked across kexec -- I suggest you try changing this too.
>
> Cheers
> ---Dave
>
>> >>
>> >> Thanks
>> >> Vijay
>> >>
>> >> Message: 2
>> >> Date: Tue,  1 Oct 2013 18:15:15 +0100
>> >> From: Dave Martin <Dave.Martin@arm.com>
>> >> To: linux-arm-kernel at lists.infradead.org
>> >> Cc: Nicolas Pitre <nicolas.pitre@linaro.org>, Lorenzo Pieralisi
>> >>         <Lorenzo.Pieralisi@arm.com>, Pawel Moll <Pawel.Moll@arm.com>, Sudeep
>> >>         KarkadaNagesha <Sudeep.KarkadaNagesha@arm.com
>> >>>, Will Deacon
>> >>         <Will.Deacon@arm.com>, Dave Martin <Dave.Martin@arm.com>
>> >> Subject: [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown
>> >>         synchronisation
>> >> Message-ID: <1380647718-9178-1-git-send-email-Dave.Martin@arm.com>
>> >>
>> >> This series adds MCPM support for detecting when a CPU is safely powered
>> >> down, and provides an implementation for TC2.
>> >>
>> >> It should be possible to implement the same thing for PSCI using the
>> >> AFFINITY_INFO call (I need to check the semantics with Charles)
>> >>
>> >> This is sufficient to for working kexec with real power management on
>> >> TC2.  To test it, you'll also need:
>> >>
>> >>   * CONFIG_KEXEC=y
>> >>   * CONFIG_PROC_DEVICE_TREE=y
>> >>   * CONFIG_MCPM=y
>> >>   * CONFIG_ARCH_VEXPRESS_TC2_PM=y
>> >>   * sufficiently new kexec-tools
>> >>     (git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
>> >>     v2.0.4 worked for me)
>> >>
>> >> This build on Nico's patch
>> >> http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=7842/1
>> >> (MCPM: don't explode if invoked without being initialized first)
>> >>
>> >> To prevent CPUs from running off into the weeds across kexec, this
>> >> series requires Lorenzo's patch
>> >> http://lists.infradead.org/pipermail/linux-arm-kernel/2013-September/200917.html
>> >> (arm: vexpress: tc2: fix hotplug/idle/kexec race on cluster power down).
>> >>
>> >> Changes since v2:
>> >>
>> >>  * Return a proper failure code if mcpm_cpu_power_down_finish() is
>> >>    called with no mcpm platforms_ops registered, or a NULL
>> >>    power_down_finish() method.  (Thanks again Nico)
>> >>
>> >>  * Minor refactoring of the loop in tc2_pm_power_down_finish() to
>> >>    avoid the goto.
>> >>
>> >> Changes between v1 and v2:
>> >>
>> >>  * "Fix" erroneous documentation comment by switching to -errno return
>> >>    value convention for power_down_finish(), which is more informative.
>> >>    tc2_pm now returns -ETIMEDOUT on timeout.  The return is adapted to
>> >>    bool convention on return from smp_ops.cpu_kill() instead.  (Thanks,
>> >>    Nico).
>> >>
>> >>  * For consistency, BUG_ON out of range cpu or cluster values
>> >>    tc2_pm_power_down_finish(), as for tc2_pm_power_down().
>> >>
>> >> Changes between RFC and v1:
>> >>
>> >>  * Print a big fat warning instead of branching to null if the
>> >>    power_down_finish() method is not supplied by the backend, or not
>> >>    registered.
>> >>
>> >>  * Add a generous timeout of 1 second for the TC2 implementation.
>> >>
>> >>  * Relax the polling interval to 10ms for TC2, since the need to poll
>> >>    more than once is rare and this is not a performance-critical path.
>> >>
>> >>  * Fix some silly typos.
>> >>
>> >>
>> >> Dave Martin (3):
>> >>   ARM: mcpm: Factor out logical-to-physical CPU translation
>> >>   ARM: mcpm: Implement cpu_kill() to synchronise on powerdown
>> >>   ARM: vexpress/TC2: Implement MCPM power_down_finish()
>> >>
>> >>  arch/arm/common/mcpm_entry.c    |   15 +++++++++
>> >>  arch/arm/common/mcpm_platsmp.c  |   27 +++++++++++++---
>> >>  arch/arm/include/asm/mcpm.h     |   31 ++++++++++++++++++
>> >>  arch/arm/mach-vexpress/spc.c    |   39 +++++++++++++++++++++++
>> >>  arch/arm/mach-vexpress/spc.h    |    1 +
>> >>  arch/arm/mach-vexpress/tc2_pm.c |   66 ++++++++++++++++++++++++++++++++++++---
>> >>  6 files changed, 170 insertions(+), 9 deletions(-)
>> >>
>> >> --
>> >> 1.7.9.5
>>
>> _______________________________________________
>> linux-arm-kernel mailing list
>> linux-arm-kernel at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2013-11-05  5:27 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <CALicx6v86NMp53+zbE=A3ang-ftGE3KiUojkRZO4ss6Pmks1ow@mail.gmail.com>
2013-10-24 12:48 ` [PATCH v3 0/3] MCPM/TC2 support for CPU powerdown synchronisation Vijay Kilari
2013-10-24 12:49   ` Vijay Kilari
2013-10-24 16:45     ` Sudeep KarkadaNagesha
2013-10-25 15:46     ` Dave Martin
2013-10-27  2:52       ` Nicolas Pitre
2013-11-05  5:27       ` Vijay Kilari
2013-10-01 17:15 Dave Martin

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).