qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC PATCH 2/6] hw/ppc/pnv_xscom: extend xscom to use p


From: Cédric Le Goater
Subject: Re: [Qemu-devel] [RFC PATCH 2/6] hw/ppc/pnv_xscom: extend xscom to use python interface
Date: Thu, 8 Aug 2019 11:04:55 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0

On 07/08/2019 09:14, Balamuruhan S wrote:
> Existing xscom access emulation for read/write can be
> extended with the python interface to support feeding
> data externally.

You should take a look at Rashmica's patch :

  hw/gpio: Add basic Aspeed GPIO model for AST2400 and AST2500
  https://patchwork.ozlabs.org/patch/1138787

The patch generates model properties in the instance_init handler 
for all Aspeed GPIO pins (a lot) that can then be un/set from the 
QEMU monitor to tweak the values exposed to the guest. It integrates 
well in QEMU and its unit test framework. This is a complex example,
they are simpler ones in QEMU.


I think you could do the same for the OCC SRAM which exposes in host 
memory a large set of data to the PowerNV machine, sensors, pstates, 
etc. You would need to define the properties on top of the structures 
which are shared with the host.

You could follow the same pattern for other well known XSCOM registers.

>From there, it is relatively simple to write automated unit tests or 
a tui/gui to tweak at runtime the OCC data of the machine through the 
model properties.

Anyhow, first, we need to extend and correct the PowerNV models that
you are using.  


Thanks,

C.

 
> 
> Signed-off-by: Balamuruhan S <address@hidden>
> ---
>  hw/ppc/pnv_xscom.c      | 31 ++++++++++++++++++++++++++++---
>  include/sysemu/sysemu.h |  4 ++++
>  qemu-options.hx         | 14 ++++++++++++++
>  vl.c                    | 42 ++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 88 insertions(+), 3 deletions(-)
> 
> diff --git a/hw/ppc/pnv_xscom.c b/hw/ppc/pnv_xscom.c
> index 2b81c75f56..5d5b5e9884 100644
> --- a/hw/ppc/pnv_xscom.c
> +++ b/hw/ppc/pnv_xscom.c
> @@ -17,11 +17,13 @@
>   * License along with this library; if not, see 
> <http://www.gnu.org/licenses/>.
>   */
>  
> +#include "sysemu/python_api.h"
>  #include "qemu/osdep.h"
>  #include "hw/hw.h"
>  #include "qemu/log.h"
>  #include "qemu/module.h"
>  #include "sysemu/hw_accel.h"
> +#include "sysemu/sysemu.h"
>  #include "target/ppc/cpu.h"
>  #include "hw/sysbus.h"
>  
> @@ -157,8 +159,20 @@ static uint64_t xscom_read(void *opaque, hwaddr addr, 
> unsigned width)
>      uint64_t val = 0;
>      MemTxResult result;
>  
> -    /* Handle some SCOMs here before dispatch */
> -    val = xscom_read_default(chip, pcba);
> +    if (xscom_module && xscom_readp) {
> +        char **args = g_malloc(2 * sizeof(uint64_t));
> +        PnvChipClass *pcc = PNV_CHIP_GET_CLASS(chip);
> +        python_args_init_cast_long(args, pcba, 0);
> +        python_args_init_cast_int(args, pcc->chip_type, 1);
> +        val = python_callback_int(module_path, xscom_module, xscom_readp,
> +                                  args, 2);
> +        python_args_clean(args, 2);
> +        g_free(args);
> +    }
> +    else {
> +        /* Handle some SCOMs here before dispatch */
> +        val = xscom_read_default(chip, pcba);
> +    }
>      if (val != -1) {
>          goto complete;
>      }
> @@ -184,8 +198,19 @@ static void xscom_write(void *opaque, hwaddr addr, 
> uint64_t val,
>      uint32_t pcba = pnv_xscom_pcba(chip, addr);
>      MemTxResult result;
>  
> +    if (xscom_module && xscom_writep) {
> +        char **args = g_malloc(sizeof(uint64_t));
> +        bool xscom_success;
> +        python_args_init_cast_long(args, pcba, 0);
> +        xscom_success = python_callback_bool(module_path, xscom_module,
> +                                             xscom_writep, args, 1);
> +        python_args_clean(args, 1);
> +        g_free(args);
> +        if (xscom_success)
> +            goto complete;
> +    }
>      /* Handle some SCOMs here before dispatch */
> -    if (xscom_write_default(chip, pcba, val)) {
> +    else if (xscom_write_default(chip, pcba, val)) {
>          goto complete;
>      }
>  
> diff --git a/include/sysemu/sysemu.h b/include/sysemu/sysemu.h
> index 984c439ac9..9b8dc346d6 100644
> --- a/include/sysemu/sysemu.h
> +++ b/include/sysemu/sysemu.h
> @@ -117,6 +117,10 @@ extern bool enable_mlock;
>  extern bool enable_cpu_pm;
>  extern QEMUClockType rtc_clock;
>  extern const char *mem_path;
> +extern const char *module_path;
> +extern const char *xscom_module;
> +extern const char *xscom_readp;
> +extern const char *xscom_writep;
>  extern int mem_prealloc;
>  
>  #define MAX_NODES 128
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 9621e934c0..06c9f34d99 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -385,6 +385,20 @@ STEXI
>  Allocate guest RAM from a temporarily created file in @var{path}.
>  ETEXI
>  
> +DEF("module-path", HAS_ARG, QEMU_OPTION_modulepath,
> +    "-module-path FILE  provide absolute path where python modules"
> +    "resides\n", QEMU_ARCH_ALL)
> +STEXI
> +@item -module-path [path=]@var{absolute 
> path}[,homer_module=homer,homer_func=func1]
> +@findex -module-path
> +Provides information about where the python modules exist and the callback
> +functions defined.
> +
> +@example
> +qemu-system-ppc64 -module-path 
> /home/modules/,homer_module=homer,homer_func=homer_read
> +@end example
> +ETEXI
> +
>  DEF("mem-prealloc", 0, QEMU_OPTION_mem_prealloc,
>      "-mem-prealloc   preallocate guest memory (use with -mem-path)\n",
>      QEMU_ARCH_ALL)
> diff --git a/vl.c b/vl.c
> index b426b32134..28f0dc1c1b 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -140,6 +140,10 @@ int display_opengl;
>  const char* keyboard_layout = NULL;
>  ram_addr_t ram_size;
>  const char *mem_path = NULL;
> +const char *module_path = NULL;
> +const char *xscom_module = NULL;
> +const char *xscom_readp = NULL;
> +const char *xscom_writep = NULL;
>  int mem_prealloc = 0; /* force preallocation of physical target memory */
>  bool enable_mlock = false;
>  bool enable_cpu_pm = false;
> @@ -469,6 +473,32 @@ static QemuOptsList qemu_mem_opts = {
>      },
>  };
>  
> +static QemuOptsList qemu_module_opts = {
> +    .name = "module_path",
> +    .implied_opt_name = "module_path",
> +    .head = QTAILQ_HEAD_INITIALIZER(qemu_module_opts.head),
> +    .merge_lists = true,
> +    .desc = {
> +        {
> +            .name = "module_path",
> +            .type = QEMU_OPT_STRING,
> +        },
> +        {
> +            .name = "xscom_module",
> +            .type = QEMU_OPT_STRING,
> +        },
> +        {
> +            .name = "xscom_read",
> +            .type = QEMU_OPT_STRING,
> +        },
> +        {
> +            .name = "xscom_write",
> +            .type = QEMU_OPT_STRING,
> +        },
> +        { /* end of list */ }
> +    },
> +};
> +
>  static QemuOptsList qemu_icount_opts = {
>      .name = "icount",
>      .implied_opt_name = "shift",
> @@ -2923,6 +2953,7 @@ int main(int argc, char **argv, char **envp)
>      qemu_add_opts(&qemu_machine_opts);
>      qemu_add_opts(&qemu_accel_opts);
>      qemu_add_opts(&qemu_mem_opts);
> +    qemu_add_opts(&qemu_module_opts);
>      qemu_add_opts(&qemu_smp_opts);
>      qemu_add_opts(&qemu_boot_opts);
>      qemu_add_opts(&qemu_add_fd_opts);
> @@ -3190,6 +3221,17 @@ int main(int argc, char **argv, char **envp)
>              case QEMU_OPTION_mempath:
>                  mem_path = optarg;
>                  break;
> +            case QEMU_OPTION_modulepath:
> +                opts = qemu_opts_parse_noisily(qemu_find_opts("module_path"),
> +                                               optarg, true);
> +                if (!opts) {
> +                    exit(EXIT_FAILURE);
> +                }
> +                module_path = qemu_opt_get(opts, "module_path");
> +                xscom_module = qemu_opt_get(opts, "xscom_module");
> +                xscom_readp = qemu_opt_get(opts, "xscom_read");
> +                xscom_writep = qemu_opt_get(opts, "xscom_write");
> +                break;
>              case QEMU_OPTION_mem_prealloc:
>                  mem_prealloc = 1;
>                  break;
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]