Message ID | 20220215031642.1691873-4-npiggin@gmail.com |
---|---|
State | New |
Headers | show |
Series | ppc: nested KVM HV for spapr virtual hypervisor | expand |
On 2/15/22 04:16, Nicholas Piggin wrote: > Machines which don't emulate the HDEC facility are able to use the > timer for something else. Provide functions to start and stop the > hdecr timer. > > Signed-off-by: Nicholas Piggin <npiggin@gmail.com> > --- > hw/ppc/ppc.c | 20 ++++++++++++++++++++ > include/hw/ppc/ppc.h | 3 +++ > 2 files changed, 23 insertions(+) > > diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c > index c6dfc5975f..4bfd413c7f 100644 > --- a/hw/ppc/ppc.c > +++ b/hw/ppc/ppc.c > @@ -1083,6 +1083,26 @@ clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq) > return &cpu_ppc_set_tb_clk; > } > > +void cpu_ppc_hdecr_init (CPUPPCState *env) checkpatch will complain ^ > +{ > + PowerPCCPU *cpu = env_archcpu(env); > + > + assert(env->tb_env->hdecr_timer == NULL); > + > + env->tb_env->hdecr_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, &cpu_ppc_hdecr_cb, > + cpu); > +} > + I am not convinced. Can't we start and stop the hdecr on demand ? Thanks, C. > +void cpu_ppc_hdecr_exit (CPUPPCState *env) > +{ > + PowerPCCPU *cpu = env_archcpu(env); > + > + timer_free(env->tb_env->hdecr_timer); > + env->tb_env->hdecr_timer = NULL; > + > + cpu_ppc_hdecr_lower(cpu); > +} > + > /*****************************************************************************/ > /* PowerPC 40x timers */ > > diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h > index 93e614cffd..fcf9e495a0 100644 > --- a/include/hw/ppc/ppc.h > +++ b/include/hw/ppc/ppc.h > @@ -54,6 +54,9 @@ struct ppc_tb_t { > > uint64_t cpu_ppc_get_tb(ppc_tb_t *tb_env, uint64_t vmclk, int64_t tb_offset); > clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq); > +void cpu_ppc_hdecr_init (CPUPPCState *env); > +void cpu_ppc_hdecr_exit (CPUPPCState *env); > + > /* Embedded PowerPC DCR management */ > typedef uint32_t (*dcr_read_cb)(void *opaque, int dcrn); > typedef void (*dcr_write_cb)(void *opaque, int dcrn, uint32_t val);
Excerpts from Cédric Le Goater's message of February 16, 2022 4:36 am: > On 2/15/22 04:16, Nicholas Piggin wrote: >> Machines which don't emulate the HDEC facility are able to use the >> timer for something else. Provide functions to start and stop the >> hdecr timer. >> >> Signed-off-by: Nicholas Piggin <npiggin@gmail.com> >> --- >> hw/ppc/ppc.c | 20 ++++++++++++++++++++ >> include/hw/ppc/ppc.h | 3 +++ >> 2 files changed, 23 insertions(+) >> >> diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c >> index c6dfc5975f..4bfd413c7f 100644 >> --- a/hw/ppc/ppc.c >> +++ b/hw/ppc/ppc.c >> @@ -1083,6 +1083,26 @@ clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq) >> return &cpu_ppc_set_tb_clk; >> } >> >> +void cpu_ppc_hdecr_init (CPUPPCState *env) > > checkpatch will complain ^ It did but I thouht I would keep to existing style. I'll change it. > >> +{ >> + PowerPCCPU *cpu = env_archcpu(env); >> + >> + assert(env->tb_env->hdecr_timer == NULL); >> + >> + env->tb_env->hdecr_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, &cpu_ppc_hdecr_cb, >> + cpu); >> +} >> + > > I am not convinced. Can't we start and stop the hdecr on demand ? timer_mod() for existing hdecr_timer when we do ppc_store_hdecr, but that shouldn't be used elsewhere in pseries except for nested HV. Thanks, Nick
diff --git a/hw/ppc/ppc.c b/hw/ppc/ppc.c index c6dfc5975f..4bfd413c7f 100644 --- a/hw/ppc/ppc.c +++ b/hw/ppc/ppc.c @@ -1083,6 +1083,26 @@ clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq) return &cpu_ppc_set_tb_clk; } +void cpu_ppc_hdecr_init (CPUPPCState *env) +{ + PowerPCCPU *cpu = env_archcpu(env); + + assert(env->tb_env->hdecr_timer == NULL); + + env->tb_env->hdecr_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, &cpu_ppc_hdecr_cb, + cpu); +} + +void cpu_ppc_hdecr_exit (CPUPPCState *env) +{ + PowerPCCPU *cpu = env_archcpu(env); + + timer_free(env->tb_env->hdecr_timer); + env->tb_env->hdecr_timer = NULL; + + cpu_ppc_hdecr_lower(cpu); +} + /*****************************************************************************/ /* PowerPC 40x timers */ diff --git a/include/hw/ppc/ppc.h b/include/hw/ppc/ppc.h index 93e614cffd..fcf9e495a0 100644 --- a/include/hw/ppc/ppc.h +++ b/include/hw/ppc/ppc.h @@ -54,6 +54,9 @@ struct ppc_tb_t { uint64_t cpu_ppc_get_tb(ppc_tb_t *tb_env, uint64_t vmclk, int64_t tb_offset); clk_setup_cb cpu_ppc_tb_init (CPUPPCState *env, uint32_t freq); +void cpu_ppc_hdecr_init (CPUPPCState *env); +void cpu_ppc_hdecr_exit (CPUPPCState *env); + /* Embedded PowerPC DCR management */ typedef uint32_t (*dcr_read_cb)(void *opaque, int dcrn); typedef void (*dcr_write_cb)(void *opaque, int dcrn, uint32_t val);
Machines which don't emulate the HDEC facility are able to use the timer for something else. Provide functions to start and stop the hdecr timer. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> --- hw/ppc/ppc.c | 20 ++++++++++++++++++++ include/hw/ppc/ppc.h | 3 +++ 2 files changed, 23 insertions(+)