mpe,

Just flagging this as going to conflict with Shreyas' stop instruction
patch series.  It's relatively easy to fix so you can do it manually.

Alternatively you could take this one patch now and get Shreyas to rebase.

Mikey

On Mon, 2016-06-27 at 22:25 +1000, Benjamin Herrenschmidt wrote:
> Replace the old generic opal_call_realmode() with proper per-call
> wrappers similar to the normal ones and convert callers.
> 
> Signed-off-by: Benjamin Herrenschmidt <b...@kernel.crashing.org>
> ---
>  arch/powerpc/include/asm/opal-api.h            | 10 +++-
>  arch/powerpc/include/asm/opal.h                |  6 +++
>  arch/powerpc/kernel/idle_power7.S              | 16 ++-----
>  arch/powerpc/platforms/powernv/opal-wrappers.S | 63 +++++++++++++-------
> ------
>  4 files changed, 51 insertions(+), 44 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/opal-api.h
> b/arch/powerpc/include/asm/opal-api.h
> index 4b4b559..957795c 100644
> --- a/arch/powerpc/include/asm/opal-api.h
> +++ b/arch/powerpc/include/asm/opal-api.h
> @@ -162,7 +162,8 @@
>  #define      OPAL_INT_SET_CPPR                       123
>  #define OPAL_INT_EOI                         124
>  #define OPAL_INT_SET_MFRR                    125
> -#define OPAL_LAST                            125
> +#define OPAL_PCI_TCE_KILL                    126
> +#define OPAL_LAST                            126
>  
>  /* Device tree flags */
>  
> @@ -895,6 +896,13 @@ enum {
>       OPAL_REBOOT_PLATFORM_ERROR      = 1,
>  };
>  
> +/* Argument to OPAL_PCI_TCE_KILL */
> +enum {
> +     OPAL_PCI_TCE_KILL_PAGES,
> +     OPAL_PCI_TCE_KILL_PE,
> +     OPAL_PCI_TCE_KILL_ALL,
> +};
> +
>  #endif /* __ASSEMBLY__ */
>  
>  #endif /* __OPAL_API_H */
> diff --git a/arch/powerpc/include/asm/opal.h
> b/arch/powerpc/include/asm/opal.h
> index 6ccb847..ec6e0cc 100644
> --- a/arch/powerpc/include/asm/opal.h
> +++ b/arch/powerpc/include/asm/opal.h
> @@ -214,6 +214,12 @@ int64_t opal_int_get_xirr(uint32_t *out_xirr, bool
> just_poll);
>  int64_t opal_int_set_cppr(uint8_t cppr);
>  int64_t opal_int_eoi(uint32_t xirr);
>  int64_t opal_int_set_mfrr(uint32_t cpu, uint8_t mfrr);
> +int64_t opal_pci_tce_kill(uint64_t phb_id, uint32_t kill_type,
> +                       uint32_t pe_num, uint32_t tce_size,
> +                       uint64_t dma_addr, uint32_t npages);
> +int64_t opal_rm_pci_tce_kill(uint64_t phb_id, uint32_t kill_type,
> +                          uint32_t pe_num, uint32_t tce_size,
> +                          uint64_t dma_addr, uint32_t npages);
>  
>  /* Internal functions */
>  extern int early_init_dt_scan_opal(unsigned long node, const char
> *uname,
> diff --git a/arch/powerpc/kernel/idle_power7.S
> b/arch/powerpc/kernel/idle_power7.S
> index 470ceeb..c93f825 100644
> --- a/arch/powerpc/kernel/idle_power7.S
> +++ b/arch/powerpc/kernel/idle_power7.S
> @@ -196,8 +196,7 @@ fastsleep_workaround_at_entry:
>       /* Fast sleep workaround */
>       li      r3,1
>       li      r4,1
> -     li      r0,OPAL_CONFIG_CPU_IDLE_STATE
> -     bl      opal_call_realmode
> +     bl      opal_rm_config_cpu_idle_state
>  
>       /* Clear Lock bit */
>       li      r0,0
> @@ -270,8 +269,7 @@ ALT_FTR_SECTION_END_NESTED_IFSET(CPU_FTR_ARCH_207S,
> 66);          \
>       ld      r2,PACATOC(r13);                                        
> \
>       ld      r1,PACAR1(r13);                                 
>       \
>       std     r3,ORIG_GPR3(r1);       /* Save original r3 */  
>       \
> -     li      r0,OPAL_HANDLE_HMI;     /* Pass opal token
> argument*/    \
> -     bl      opal_call_realmode;                                     
> \
> +     bl      opal_rm_handle_hmi;                                     
> \
>       ld      r3,ORIG_GPR3(r1);       /* Restore original r3 */       
> \
>  20:  nop;
>  
> @@ -284,7 +282,7 @@ _GLOBAL(power7_wakeup_tb_loss)
>        * and they are restored before switching to the process
> context. Hence
>        * until they are restored, they are free to be used.
>        *
> -      * Save SRR1 in a NVGPR as it might be clobbered in
> opal_call_realmode
> +      * Save SRR1 in a NVGPR as it might be clobbered in opal call
>        * (called in CHECK_HMI_INTERRUPT). SRR1 is required to
> determine the
>        * wakeup reason if we branch to kvm_start_guest.
>        */
> @@ -378,10 +376,7 @@ timebase_resync:
>        * set in exceptions-64s.S */
>       ble     cr3,clear_lock
>       /* Time base re-sync */
> -     li      r0,OPAL_RESYNC_TIMEBASE
> -     bl      opal_call_realmode;
> -     /* TODO: Check r3 for failure */
> -
> +     bl      opal_rm_resync_timebase;
>       /*
>        * If waking up from sleep, per core state is not lost, skip to
>        * clear_lock.
> @@ -469,8 +464,7 @@ hypervisor_state_restored:
>  fastsleep_workaround_at_exit:
>       li      r3,1
>       li      r4,0
> -     li      r0,OPAL_CONFIG_CPU_IDLE_STATE
> -     bl      opal_call_realmode
> +     bl      opal_rm_config_cpu_idle_state
>       b       timebase_resync
>  
>  /*
> diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S
> b/arch/powerpc/platforms/powernv/opal-wrappers.S
> index 3854343..d5f00bb 100644
> --- a/arch/powerpc/platforms/powernv/opal-wrappers.S
> +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S
> @@ -59,7 +59,7 @@ END_FTR_SECTION(0, 1);                                      
>       \
>  #define OPAL_CALL(name, token)               \
>   _GLOBAL_TOC(name);                  \
>       mflr    r0;                     \
> -     std     r0,16(r1);              \
> +     std     r0,PPC_LR_STKOFF(r1);   \
>       li      r0,token;               \
>       OPAL_BRANCH(opal_tracepoint_entry) \
>       mfcr    r12;                    \
> @@ -92,7 +92,7 @@ opal_return:
>       FIXUP_ENDIAN
>       ld      r2,PACATOC(r13);
>       lwz     r4,8(r1);
> -     ld      r5,16(r1);
> +     ld      r5,PPC_LR_STKOFF(r1);
>       ld      r6,PACASAVEDMSR(r13);
>       mtspr   SPRN_SRR0,r5;
>       mtspr   SPRN_SRR1,r6;
> @@ -157,43 +157,37 @@ opal_tracepoint_return:
>       blr
>  #endif
>  
> -/*
> - * Make opal call in realmode. This is a generic function to be called
> - * from realmode. It handles endianness.
> - *
> - * r13 - paca pointer
> - * r1  - stack pointer
> - * r0  - opal token
> - */
> -_GLOBAL(opal_call_realmode)
> -     mflr    r12
> -     std     r12,PPC_LR_STKOFF(r1)
> -     ld      r2,PACATOC(r13)
> -     /* Set opal return address */
> -     LOAD_REG_ADDR(r12,return_from_opal_call)
> -     mtlr    r12
> -
> -     mfmsr   r12
> -#ifdef __LITTLE_ENDIAN__
> -     /* Handle endian-ness */
> -     li      r11,MSR_LE
> -     andc    r12,r12,r11
> -#endif
> -     mtspr   SPRN_HSRR1,r12
> -     LOAD_REG_ADDR(r11,opal)
> -     ld      r12,8(r11)
> -     ld      r2,0(r11)
> -     mtspr   SPRN_HSRR0,r12
> +#define OPAL_CALL_REAL(name, token)                  \
> + _GLOBAL_TOC(name);                                  \
> +     mflr    r0;                                     \
> +     std     r0,PPC_LR_STKOFF(r1);                   \
> +     li      r0,token;                               \
> +     mfcr    r12;                                    \
> +     stw     r12,8(r1);                              \
> +                                                     \
> +     /* Set opal return address */                   \
> +     LOAD_REG_ADDR(r11, opal_return_realmode);       \
> +     mtlr    r11;                                    \
> +     mfmsr   r12;                                    \
> +     li      r11,MSR_LE;                             \
> +     andc    r12,r12,r11;                            \
> +     mtspr   SPRN_HSRR1,r12;                         \
> +     LOAD_REG_ADDR(r11,opal);                        \
> +     ld      r12,8(r11);                             \
> +     ld      r2,0(r11);                              \
> +     mtspr   SPRN_HSRR0,r12;                         \
>       hrfid
>  
> -return_from_opal_call:
> -#ifdef __LITTLE_ENDIAN__
> +opal_return_realmode:
>       FIXUP_ENDIAN
> -#endif
> +     ld      r2,PACATOC(r13);
> +     lwz     r11,8(r1);
>       ld      r12,PPC_LR_STKOFF(r1)
> +     mtcr    r11;
>       mtlr    r12
>       blr
>  
> +
>  OPAL_CALL(opal_invalid_call,                 OPAL_INVALID_CALL);
>  OPAL_CALL(opal_console_write,                        OPAL_CONSOLE_WRITE)
> ;
>  OPAL_CALL(opal_console_read,                 OPAL_CONSOLE_READ);
> @@ -271,6 +265,7 @@ OPAL_CALL(opal_validate_flash,                    
> OPAL_FLASH_VALIDATE);
>  OPAL_CALL(opal_manage_flash,                 OPAL_FLASH_MANAGE);
>  OPAL_CALL(opal_update_flash,                 OPAL_FLASH_UPDATE);
>  OPAL_CALL(opal_resync_timebase,                      OPAL_RESYNC_TIMEB
> ASE);
> +OPAL_CALL_REAL(opal_rm_resync_timebase,              OPAL_RESYNC_TIMEB
> ASE);
>  OPAL_CALL(opal_check_token,                  OPAL_CHECK_TOKEN);
>  OPAL_CALL(opal_dump_init,                    OPAL_DUMP_INIT);
>  OPAL_CALL(opal_dump_info,                    OPAL_DUMP_INFO);
> @@ -285,7 +280,9 @@ OPAL_CALL(opal_sensor_read,                       OP
> AL_SENSOR_READ);
>  OPAL_CALL(opal_get_param,                    OPAL_GET_PARAM);
>  OPAL_CALL(opal_set_param,                    OPAL_SET_PARAM);
>  OPAL_CALL(opal_handle_hmi,                   OPAL_HANDLE_HMI);
> +OPAL_CALL_REAL(opal_rm_handle_hmi,           OPAL_HANDLE_HMI);
>  OPAL_CALL(opal_config_cpu_idle_state,                OPAL_CONFIG_CPU_IDL
> E_STATE);
> +OPAL_CALL_REAL(opal_rm_config_cpu_idle_state,        OPAL_CONFIG_CPU_IDL
> E_STATE);
>  OPAL_CALL(opal_slw_set_reg,                  OPAL_SLW_SET_REG);
>  OPAL_CALL(opal_register_dump_region,         OPAL_REGISTER_DUMP_R
> EGION);
>  OPAL_CALL(opal_unregister_dump_region,               OPAL_UNREGISTER_DU
> MP_REGION);
> @@ -306,3 +303,5 @@ OPAL_CALL(opal_int_get_xirr,                      O
> PAL_INT_GET_XIRR);
>  OPAL_CALL(opal_int_set_cppr,                 OPAL_INT_SET_CPPR);
>  OPAL_CALL(opal_int_eoi,                              OPAL_INT_EOI);
>  OPAL_CALL(opal_int_set_mfrr,                 OPAL_INT_SET_MFRR);
> +OPAL_CALL(opal_pci_tce_kill,                 OPAL_PCI_TCE_KILL);
> +OPAL_CALL_REAL(opal_rm_pci_tce_kill,         OPAL_PCI_TCE_KILL);
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to