mbox series

[v5,0/8] RISC-V CPU Idle Support

Message ID 20210602112321.2241566-1-anup.patel@wdc.com
Headers show
Series RISC-V CPU Idle Support | expand

Message

Anup Patel June 2, 2021, 11:23 a.m. UTC
This series adds RISC-V CPU Idle support using SBI HSM suspend function.
The RISC-V SBI CPU idle driver added by this series is highly inspired
from the ARM PSCI CPU idle driver.

At high-level, this series includes the following changes:
1) Preparatory arch/riscv patches (Patches 1 to 3)
2) Defines for RISC-V SBI HSM suspend (Patch 4)
3) Preparatory patch to share code between RISC-V SBI CPU idle driver
   and ARM PSCI CPU idle driver (Patch 5)
4) RISC-V SBI CPU idle driver and related DT bindings (Patches 6 to 7)

These patches can be found in riscv_sbi_hsm_suspend_v5 branch at
https://github.com/avpatel/linux

Special thanks Sandeep Tripathy for providing early feeback on SBI HSM
support in all above projects (RISC-V SBI specification, OpenSBI, and
Linux RISC-V).

Changes since v4:
 - Rebased on Linux-5.13-rc2
 - Renamed all dt_idle_genpd functions to have "dt_idle_" prefix
 - Added MAINTAINERS file entry for dt_idle_genpd

Changes since v3:
 - Rebased on Linux-5.13-rc2
 - Fixed __cpu_resume_enter() which was broken due to XIP kernel support
 - Removed "struct dt_idle_genpd_ops" abstraction which simplifies code
   sharing between ARM PSCI and RISC-V SBI drivers in PATCH5

Changes since v2:
 - Rebased on Linux-5.12-rc3
 - Updated PATCH7 to add common DT bindings for both ARM and RISC-V
   idle states
 - Added "additionalProperties = false" for both idle-states node and
   child nodes in PATCH7

Changes since v1:
 - Fixex minor typo in PATCH1
 - Use just "idle-states" as DT node name for CPU idle states
 - Added documentation for "cpu-idle-states" DT property in
   devicetree/bindings/riscv/cpus.yaml
 - Added documentation for "riscv,sbi-suspend-param" DT property in
   devicetree/bindings/riscv/idle-states.yaml

Anup Patel (8):
  RISC-V: Enable CPU_IDLE drivers
  RISC-V: Rename relocate() and make it global
  RISC-V: Add arch functions for non-retentive suspend entry/exit
  RISC-V: Add SBI HSM suspend related defines
  cpuidle: Factor-out power domain related code from PSCI domain driver
  cpuidle: Add RISC-V SBI CPU idle driver
  dt-bindings: Add common bindings for ARM and RISC-V idle states
  RISC-V: Enable RISC-V SBI CPU Idle driver for QEMU virt machine

 .../bindings/{arm => cpu}/idle-states.yaml    | 228 ++++++-
 .../devicetree/bindings/riscv/cpus.yaml       |   6 +
 MAINTAINERS                                   |  14 +
 arch/riscv/Kconfig                            |   7 +
 arch/riscv/Kconfig.socs                       |   3 +
 arch/riscv/configs/defconfig                  |  13 +-
 arch/riscv/configs/rv32_defconfig             |   6 +-
 arch/riscv/include/asm/asm.h                  |  17 +
 arch/riscv/include/asm/cpuidle.h              |  24 +
 arch/riscv/include/asm/sbi.h                  |  27 +-
 arch/riscv/include/asm/suspend.h              |  35 +
 arch/riscv/kernel/Makefile                    |   2 +
 arch/riscv/kernel/asm-offsets.c               |   3 +
 arch/riscv/kernel/cpu_ops_sbi.c               |   2 +-
 arch/riscv/kernel/head.S                      |  18 +-
 arch/riscv/kernel/process.c                   |   3 +-
 arch/riscv/kernel/suspend.c                   |  86 +++
 arch/riscv/kernel/suspend_entry.S             | 123 ++++
 drivers/cpuidle/Kconfig                       |   9 +
 drivers/cpuidle/Kconfig.arm                   |   1 +
 drivers/cpuidle/Kconfig.riscv                 |  15 +
 drivers/cpuidle/Makefile                      |   5 +
 drivers/cpuidle/cpuidle-psci-domain.c         | 138 +---
 drivers/cpuidle/cpuidle-psci.h                |  15 +-
 drivers/cpuidle/cpuidle-sbi.c                 | 626 ++++++++++++++++++
 drivers/cpuidle/dt_idle_genpd.c               | 182 +++++
 drivers/cpuidle/dt_idle_genpd.h               |  50 ++
 27 files changed, 1475 insertions(+), 183 deletions(-)
 rename Documentation/devicetree/bindings/{arm => cpu}/idle-states.yaml (74%)
 create mode 100644 arch/riscv/include/asm/cpuidle.h
 create mode 100644 arch/riscv/include/asm/suspend.h
 create mode 100644 arch/riscv/kernel/suspend.c
 create mode 100644 arch/riscv/kernel/suspend_entry.S
 create mode 100644 drivers/cpuidle/Kconfig.riscv
 create mode 100644 drivers/cpuidle/cpuidle-sbi.c
 create mode 100644 drivers/cpuidle/dt_idle_genpd.c
 create mode 100644 drivers/cpuidle/dt_idle_genpd.h

Comments

Ulf Hansson June 2, 2021, 1:17 p.m. UTC | #1
On Wed, 2 Jun 2021 at 13:24, Anup Patel <anup.patel@wdc.com> wrote:
>
> The generic power domain related code in PSCI domain driver is largely
> independent of PSCI and can be shared with RISC-V SBI domain driver
> hence we factor-out this code into dt_idle_genpd.c and dt_idle_genpd.h.
>
> Signed-off-by: Anup Patel <anup.patel@wdc.com>

Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>

A small nitpick below.

[...]

> +EXPORT_SYMBOL_GPL(dt_idle_pd_free);

Do we really need to export this symbol? Looks like there are only
built-in cpuidle drivers that are going to use it. At least for now.

As a matter of fact, the same comment applies to all cases of
EXPORT_SYMBOL_GPL from $subject patch. Can we drop all of them?

[...]

Kind regards
Uffe
Samuel Holland June 6, 2021, 6:34 p.m. UTC | #2
On 6/2/21 6:23 AM, Anup Patel wrote:
> The generic power domain related code in PSCI domain driver is largely

> independent of PSCI and can be shared with RISC-V SBI domain driver

> hence we factor-out this code into dt_idle_genpd.c and dt_idle_genpd.h.

> 

> Signed-off-by: Anup Patel <anup.patel@wdc.com>

> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>

> ---

>  MAINTAINERS                           |   7 +

>  drivers/cpuidle/Kconfig               |   4 +

>  drivers/cpuidle/Kconfig.arm           |   1 +

>  drivers/cpuidle/Makefile              |   1 +

>  drivers/cpuidle/cpuidle-psci-domain.c | 138 +------------------

>  drivers/cpuidle/cpuidle-psci.h        |  15 ++-

>  drivers/cpuidle/dt_idle_genpd.c       | 182 ++++++++++++++++++++++++++

>  drivers/cpuidle/dt_idle_genpd.h       |  50 +++++++

>  8 files changed, 263 insertions(+), 135 deletions(-)

>  create mode 100644 drivers/cpuidle/dt_idle_genpd.c

>  create mode 100644 drivers/cpuidle/dt_idle_genpd.h

> 

...
> diff --git a/drivers/cpuidle/dt_idle_genpd.h b/drivers/cpuidle/dt_idle_genpd.h

> new file mode 100644

> index 000000000000..a8a3bad3cb7f

> --- /dev/null

> +++ b/drivers/cpuidle/dt_idle_genpd.h

> @@ -0,0 +1,50 @@

> +/* SPDX-License-Identifier: GPL-2.0 */

> +#ifndef __DT_IDLE_GENPD

> +#define __DT_IDLE_GENPD

> +

> +struct device_node;

> +struct generic_pm_domain;

> +

> +#ifdef CONFIG_DT_IDLE_GENPD

> +

> +void dt_idle_pd_free(struct generic_pm_domain *pd);

> +

> +struct generic_pm_domain *dt_idle_pd_alloc(struct device_node *np,

> +			int (*parse_state)(struct device_node *, u32 *));

> +

> +int dt_idle_pd_init_topology(struct device_node *np);

> +

> +struct device *dt_idle_attach_cpu(int cpu, const char *name);

> +

> +void dt_idle_detach_cpu(struct device *dev);

> +

> +#else

> +

> +static inline void dt_idle_pd_free(struct generic_pm_domain *pd)

> +{

> +}

> +

> +static inline struct generic_pm_domain *dt_idle_pd_alloc(

> +			struct device_node *np,

> +			int (*parse_state)(struct device_node *, u32 *));


In file included from drivers/cpuidle/cpuidle-sbi.c:27:
drivers/cpuidle/dt_idle_genpd.h:29:1: error: expected identifier or '('
before '{' token
   29 | {
      | ^

Looks like you have a stray semicolon here.

> +{

> +	return NULL;

> +}

> +

> +static inline int dt_idle_pd_init_topology(struct device_node *np)

> +{

> +	return 0;

> +}

> +

> +static inline struct device *dt_idle_attach_cpu(int cpu, const char *name)

> +{

> +	return NULL;

> +}

> +

> +static inline void dt_idle_detach_cpu(struct device *dev)

> +{

> +}

> +

> +#endif

> +

> +#endif

>
Anup Patel June 9, 2021, 8:01 a.m. UTC | #3
On Mon, Jun 7, 2021 at 12:04 AM Samuel Holland <samuel@sholland.org> wrote:
>

> On 6/2/21 6:23 AM, Anup Patel wrote:

> > The generic power domain related code in PSCI domain driver is largely

> > independent of PSCI and can be shared with RISC-V SBI domain driver

> > hence we factor-out this code into dt_idle_genpd.c and dt_idle_genpd.h.

> >

> > Signed-off-by: Anup Patel <anup.patel@wdc.com>

> > Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>

> > ---

> >  MAINTAINERS                           |   7 +

> >  drivers/cpuidle/Kconfig               |   4 +

> >  drivers/cpuidle/Kconfig.arm           |   1 +

> >  drivers/cpuidle/Makefile              |   1 +

> >  drivers/cpuidle/cpuidle-psci-domain.c | 138 +------------------

> >  drivers/cpuidle/cpuidle-psci.h        |  15 ++-

> >  drivers/cpuidle/dt_idle_genpd.c       | 182 ++++++++++++++++++++++++++

> >  drivers/cpuidle/dt_idle_genpd.h       |  50 +++++++

> >  8 files changed, 263 insertions(+), 135 deletions(-)

> >  create mode 100644 drivers/cpuidle/dt_idle_genpd.c

> >  create mode 100644 drivers/cpuidle/dt_idle_genpd.h

> >

> ...

> > diff --git a/drivers/cpuidle/dt_idle_genpd.h b/drivers/cpuidle/dt_idle_genpd.h

> > new file mode 100644

> > index 000000000000..a8a3bad3cb7f

> > --- /dev/null

> > +++ b/drivers/cpuidle/dt_idle_genpd.h

> > @@ -0,0 +1,50 @@

> > +/* SPDX-License-Identifier: GPL-2.0 */

> > +#ifndef __DT_IDLE_GENPD

> > +#define __DT_IDLE_GENPD

> > +

> > +struct device_node;

> > +struct generic_pm_domain;

> > +

> > +#ifdef CONFIG_DT_IDLE_GENPD

> > +

> > +void dt_idle_pd_free(struct generic_pm_domain *pd);

> > +

> > +struct generic_pm_domain *dt_idle_pd_alloc(struct device_node *np,

> > +                     int (*parse_state)(struct device_node *, u32 *));

> > +

> > +int dt_idle_pd_init_topology(struct device_node *np);

> > +

> > +struct device *dt_idle_attach_cpu(int cpu, const char *name);

> > +

> > +void dt_idle_detach_cpu(struct device *dev);

> > +

> > +#else

> > +

> > +static inline void dt_idle_pd_free(struct generic_pm_domain *pd)

> > +{

> > +}

> > +

> > +static inline struct generic_pm_domain *dt_idle_pd_alloc(

> > +                     struct device_node *np,

> > +                     int (*parse_state)(struct device_node *, u32 *));

>

> In file included from drivers/cpuidle/cpuidle-sbi.c:27:

> drivers/cpuidle/dt_idle_genpd.h:29:1: error: expected identifier or '('

> before '{' token

>    29 | {

>       | ^

>

> Looks like you have a stray semicolon here.


Okay, I will fix this in the next revision.

Regards,
Anup

>

> > +{

> > +     return NULL;

> > +}

> > +

> > +static inline int dt_idle_pd_init_topology(struct device_node *np)

> > +{

> > +     return 0;

> > +}

> > +

> > +static inline struct device *dt_idle_attach_cpu(int cpu, const char *name)

> > +{

> > +     return NULL;

> > +}

> > +

> > +static inline void dt_idle_detach_cpu(struct device *dev)

> > +{

> > +}

> > +

> > +#endif

> > +

> > +#endif

> >

>