Messages in this thread | | | Date | Wed, 18 Mar 2020 20:52:02 +0530 | From | Vaidyanathan Srinivasan <> | Subject | Re: [PATCH v5 2/3] powerpc/powernv: Introduce Self save support |
| |
* Pratik Rajesh Sampat <psampat@linux.ibm.com> [2020-03-17 19:40:17]:
> This commit introduces and leverages the Self save API which OPAL now > supports. > > Add the new Self Save OPAL API call in the list of OPAL calls. > Implement the self saving of the SPRs based on the support populated > while respecting it's preferences. > > This implementation allows mixing of support for the SPRs, which > means that a SPR can be self restored while another SPR be self saved if > they support and prefer it to be so. > > Signed-off-by: Pratik Rajesh Sampat <psampat@linux.ibm.com> > Reviewed-by: Ram Pai <linuxram@us.ibm.com>
Reviewed-by: Vaidyanathan Srinivasan <svaidy@linux.ibm.com>
> --- > arch/powerpc/include/asm/opal-api.h | 3 ++- > arch/powerpc/include/asm/opal.h | 1 + > arch/powerpc/platforms/powernv/idle.c | 22 ++++++++++++++++++++++ > arch/powerpc/platforms/powernv/opal-call.c | 1 + > 4 files changed, 26 insertions(+), 1 deletion(-) > > diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h > index c1f25a760eb1..1b6e1a68d431 100644 > --- a/arch/powerpc/include/asm/opal-api.h > +++ b/arch/powerpc/include/asm/opal-api.h > @@ -214,7 +214,8 @@ > #define OPAL_SECVAR_GET 176 > #define OPAL_SECVAR_GET_NEXT 177 > #define OPAL_SECVAR_ENQUEUE_UPDATE 178 > -#define OPAL_LAST 178 > +#define OPAL_SLW_SELF_SAVE_REG 181 > +#define OPAL_LAST 181 > > #define QUIESCE_HOLD 1 /* Spin all calls at entry */ > #define QUIESCE_REJECT 2 /* Fail all calls with OPAL_BUSY */ > diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h > index 9986ac34b8e2..389a85b63805 100644 > --- a/arch/powerpc/include/asm/opal.h > +++ b/arch/powerpc/include/asm/opal.h > @@ -203,6 +203,7 @@ int64_t opal_handle_hmi(void); > int64_t opal_handle_hmi2(__be64 *out_flags); > int64_t opal_register_dump_region(uint32_t id, uint64_t start, uint64_t end); > int64_t opal_unregister_dump_region(uint32_t id); > +int64_t opal_slw_self_save_reg(uint64_t cpu_pir, uint64_t sprn); > int64_t opal_slw_set_reg(uint64_t cpu_pir, uint64_t sprn, uint64_t val); > int64_t opal_config_cpu_idle_state(uint64_t state, uint64_t flag); > int64_t opal_pci_set_phb_cxl_mode(uint64_t phb_id, uint64_t mode, uint64_t pe_number); > diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c > index 03fe835aadd1..97aeb45e897b 100644 > --- a/arch/powerpc/platforms/powernv/idle.c > +++ b/arch/powerpc/platforms/powernv/idle.c > @@ -279,6 +279,26 @@ static int pnv_self_save_restore_sprs(void) > if (rc != 0) > return rc; > break; > + } else if (preferred & curr_spr.supported_mode > + & SELF_SAVE_STRICT) { > + is_initialized = true; > + if (curr_spr.spr == SPRN_HMEER && > + cpu_thread_in_core(cpu) != 0) { > + continue; > + } > + rc = opal_slw_self_save_reg(pir, > + curr_spr.spr); > + if (rc != 0) > + return rc; > + switch (curr_spr.spr) { > + case SPRN_LPCR: > + is_lpcr_self_save = true; > + break; > + case SPRN_PTCR: > + is_ptcr_self_save = true; > + break; > + } > + break; > } > preferred_sprs[index].preferred_mode = > preferred_sprs[index].preferred_mode >> > @@ -1159,6 +1179,8 @@ void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val) > if (!is_lpcr_self_save) > opal_slw_set_reg(pir, SPRN_LPCR, > lpcr_val); > + else > + opal_slw_self_save_reg(pir, SPRN_LPCR); > } > } > > diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c > index 5cd0f52d258f..11e0ceb90de0 100644 > --- a/arch/powerpc/platforms/powernv/opal-call.c > +++ b/arch/powerpc/platforms/powernv/opal-call.c > @@ -223,6 +223,7 @@ OPAL_CALL(opal_handle_hmi, OPAL_HANDLE_HMI); > OPAL_CALL(opal_handle_hmi2, OPAL_HANDLE_HMI2); > OPAL_CALL(opal_config_cpu_idle_state, OPAL_CONFIG_CPU_IDLE_STATE); > OPAL_CALL(opal_slw_set_reg, OPAL_SLW_SET_REG); > +OPAL_CALL(opal_slw_self_save_reg, OPAL_SLW_SELF_SAVE_REG); > OPAL_CALL(opal_register_dump_region, OPAL_REGISTER_DUMP_REGION); > OPAL_CALL(opal_unregister_dump_region, OPAL_UNREGISTER_DUMP_REGION); > OPAL_CALL(opal_pci_set_phb_cxl_mode, OPAL_PCI_SET_PHB_CAPI_MODE); > --
The new opal_slw_self_save_reg() call and related interface are more ideal to provide backward compatibility and simplifies implementation for future platforms.
--Vaidy
| |