[PATCH 1/7] Make the --pm-method argument part of fwts_framework

Keng-Yu Lin keng-yu.lin at canonical.com
Fri Aug 1 09:36:44 UTC 2014


On Thu, Jul 31, 2014 at 6:47 PM, Alberto Milone
<alberto.milone at canonical.com> wrote:
> This will allow us to share it with different handlers (e.g. s3 and s4)
> ---
>  src/acpi/s3/s3.c                 | 36 ++++++++----------------------------
>  src/lib/include/fwts_framework.h |  2 ++
>  src/lib/include/fwts_pm_method.h | 30 ++++++++++++++++++++++++++++++
>  src/lib/src/fwts_framework.c     | 28 ++++++++++++++++++++++++++++
>  4 files changed, 68 insertions(+), 28 deletions(-)
>  create mode 100644 src/lib/include/fwts_pm_method.h
>
> diff --git a/src/acpi/s3/s3.c b/src/acpi/s3/s3.c
> index adcd188..3759de6 100644
> --- a/src/acpi/s3/s3.c
> +++ b/src/acpi/s3/s3.c
> @@ -46,14 +46,6 @@ static inline void freep(void *);
>  #define FWTS_SUSPEND           "FWTS_SUSPEND"
>  #define FWTS_RESUME            "FWTS_RESUME"
>
> -enum pm_methods
> -{
> -       logind,
> -       pm_utils,
> -       sysfs,
> -       undefined
> -};
> -
>  typedef struct
>  {
>         fwts_framework *fw;
> @@ -76,7 +68,6 @@ static bool s3_min_max_delay = false;
>  static float s3_suspend_time = 15.0;   /* Maximum allowed suspend time */
>  static float s3_resume_time = 15.0;    /* Maximum allowed resume time */
>  static bool s3_hybrid = false;
> -static enum pm_methods pm_method = undefined; /* Default pm-method to use to suspend */
>
>  static inline void free_fwts_vars(void *vars)
>  {
> @@ -309,18 +300,18 @@ static bool sysfs_can_hybrid_suspend(const fwts_vars *fwts_settings)
>  }
>
>  /* Detect the best available power method */
> -static enum pm_methods detect_pm_method(fwts_vars *fwts_settings)
> +static void detect_pm_method(fwts_vars *fwts_settings)
>  {
>         if (s3_hybrid ?
>                 logind_can_hybrid_suspend(fwts_settings) :
>                 logind_can_suspend(fwts_settings))
> -               return logind;
> +               fwts_settings->fw->pm_method = logind;
>         else if (s3_hybrid ?
>                 sysfs_can_hybrid_suspend(fwts_settings) :
>                 sysfs_can_suspend(fwts_settings))
> -               return sysfs;
> +               fwts_settings->fw->pm_method = sysfs;
>         else
> -               return pm_utils;
> +               fwts_settings->fw->pm_method = pm_utils;
>  }
>
>  /* Call Logind to suspend.
> @@ -517,13 +508,13 @@ static int s3_do_suspend_resume(fwts_framework *fw,
>                 return FWTS_OUT_OF_MEMORY;
>         fwts_settings->fw = fw;
>
> -       if (pm_method == undefined) {
> +       if (fw->pm_method == undefined) {
>                 /* Autodetection */
>                 fwts_log_info(fw, "Detecting the power method.");
> -               pm_method = detect_pm_method(fwts_settings);
> +               detect_pm_method(fwts_settings);
>         }
>
> -       switch (pm_method) {
> +       switch (fw->pm_method) {
>                 case logind:
>                         fwts_log_info(fw, "Using logind as the default power method.");
>                         if (logind_init_proxy(fwts_settings) != 0) {
> @@ -551,7 +542,7 @@ static int s3_do_suspend_resume(fwts_framework *fw,
>                 fwts_hwinfo_get(fw, &hwinfo1);
>
>         /* Format up pm-suspend command with optional quirking arguments */
> -       if (pm_method == pm_utils) {
> +       if (fw->pm_method == pm_utils) {
>                 if (s3_hybrid) {
>                         if ((command = fwts_realloc_strcat(NULL, PM_SUSPEND_HYBRID_PMUTILS)) == NULL)
>                                 return FWTS_OUT_OF_MEMORY;
> @@ -966,16 +957,6 @@ static int s3_options_handler(fwts_framework *fw, int argc, char * const argv[],
>                 case 10:
>                         s3_hybrid = true;
>                         break;
> -               case 11:
> -                       if (strcmp(optarg, "logind") == 0)
> -                               pm_method = logind;
> -                       else if (strcmp(optarg, "pm-utils") == 0)
> -                               pm_method = pm_utils;
> -                       else if (strcmp(optarg, "sysfs") == 0)
> -                               pm_method = sysfs;
> -                       else
> -                               return FWTS_ERROR;
> -                       break;
>                 }
>         }
>         return FWTS_OK;
> @@ -993,7 +974,6 @@ static fwts_option s3_options[] = {
>         { "s3-suspend-time",    "", 1, "Maximum expected suspend time in seconds, e.g. --s3-suspend-time=3.5" },
>         { "s3-resume-time",     "", 1, "Maximum expected resume time in seconds, e.g. --s3-resume-time=5.1" },
>         { "s3-hybrid",          "", 0, "Run S3 with hybrid sleep, i.e. saving system states as S4 does." },
> -       { "pm-method",      "", 1, "Select the power method to use. Accepted values are \"logind\", \"pm-utils\", \"sysfs\""},
>         { NULL, NULL, 0, NULL }
>  };
>
> diff --git a/src/lib/include/fwts_framework.h b/src/lib/include/fwts_framework.h
> index 8af8bbe..ca6d41e 100644
> --- a/src/lib/include/fwts_framework.h
> +++ b/src/lib/include/fwts_framework.h
> @@ -27,6 +27,7 @@
>  #include "fwts_log.h"
>  #include "fwts_list.h"
>  #include "fwts_acpica_mode.h"
> +#include "fwts_pm_method.h"
>
>  #define FWTS_FRAMEWORK_MAGIC   0x2af61aec
>
> @@ -140,6 +141,7 @@ typedef struct {
>         bool error_filtered_out;                /* True if a klog message has been filtered out */
>         fwts_acpica_mode acpica_mode;           /* ACPICA mode flags */
>         void *rsdp;                             /* ACPI RSDP address */
> +       fwts_pm_method pm_method;
>  } fwts_framework;
>
>  typedef struct {
> diff --git a/src/lib/include/fwts_pm_method.h b/src/lib/include/fwts_pm_method.h
> new file mode 100644
> index 0000000..8a69719
> --- /dev/null
> +++ b/src/lib/include/fwts_pm_method.h
> @@ -0,0 +1,30 @@
> +/*
> + * Copyright (C) 2014 Canonical
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
> + *
> + */
> +
> +#ifndef __FWTS_PM_METHOD_MODE_H__
> +#define __FWTS_PM_METHOD_MODE_H__
> +
> +typedef enum {
> +       logind,
> +       pm_utils,
> +       sysfs,
> +       undefined
> +} fwts_pm_method;
> +
> +#endif
> diff --git a/src/lib/src/fwts_framework.c b/src/lib/src/fwts_framework.c
> index 3609301..475e9a4 100644
> --- a/src/lib/src/fwts_framework.c
> +++ b/src/lib/src/fwts_framework.c
> @@ -83,6 +83,7 @@ static fwts_option fwts_framework_options[] = {
>         { "acpica",             "",   1, "Enable ACPICA run time options." },
>         { "uefi",               "",   0, "Run UEFI tests." },
>         { "rsdp",               "R:", 1, "Specify the physical address of the ACPI RSDP." },
> +       { "pm-method",  "",   1, "Select the power method to use. Accepted values are \"logind\", \"pm-utils\", \"sysfs\""},
>         { NULL, NULL, 0, NULL }
>  };
>
> @@ -998,6 +999,26 @@ static int fwts_framework_acpica_parse(fwts_framework *fw, const char *arg)
>         return FWTS_OK;
>  }
>
> +/*
> + *  fwts_framework_pm_method_parse()
> + *     parse optarg of pm-method mode flag
> + */
> +static int fwts_framework_pm_method_parse(fwts_framework *fw, const char *arg)
> +{
> +       if (strcmp(arg, "logind") == 0)
> +               fw->pm_method = logind;
> +       else if (strcmp(arg, "pm-utils") == 0)
> +               fw->pm_method = pm_utils;
> +       else if (strcmp(arg, "sysfs") == 0)
> +               fw->pm_method = sysfs;
> +       else {
> +               fprintf(stderr, "--pm-method only supports logind, pm-utils, and sysfs methods\n");
> +               return FWTS_ERROR;
> +       }
> +
> +       return FWTS_OK;
> +}
> +
>  int fwts_framework_options_handler(fwts_framework *fw, int argc, char * const argv[], int option_char, int long_index)
>  {
>         FWTS_UNUSED(argc);
> @@ -1134,6 +1155,10 @@ int fwts_framework_options_handler(fwts_framework *fw, int argc, char * const ar
>                 case 37: /* --rsdp */
>                         fw->rsdp = (void *)strtoul(optarg, NULL, 0);
>                         break;
> +               case 38: /* --pm-method */
> +                       if (fwts_framework_pm_method_parse(fw, optarg) != FWTS_OK)
> +                               return FWTS_ERROR;
> +                       break;
>                 }
>                 break;
>         case 'a': /* --all */
> @@ -1231,6 +1256,9 @@ int fwts_framework_args(const int argc, char **argv)
>         if ((fw = (fwts_framework *)calloc(1, sizeof(fwts_framework))) == NULL)
>                 return FWTS_ERROR;
>
> +       /* Set the power method to undefined before we parse arguments */
> +       fw->pm_method = undefined;
> +
>         ret = fwts_args_add_options(fwts_framework_options,
>                 fwts_framework_options_handler, NULL);
>         if (ret == FWTS_ERROR)
> --
> 1.9.1
>
>

Acked-by: Keng-Yu Lin <kengyu at canonical.com>



More information about the fwts-devel mailing list