From patchwork Fri Aug 25 04:30:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 805736 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=kvm-ppc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="BCVKILgT"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xdpBX5fB9z9t6D for ; Fri, 25 Aug 2017 14:31:00 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751857AbdHYEbA (ORCPT ); Fri, 25 Aug 2017 00:31:00 -0400 Received: from mail-pg0-f66.google.com ([74.125.83.66]:35459 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751829AbdHYEa7 (ORCPT ); Fri, 25 Aug 2017 00:30:59 -0400 Received: by mail-pg0-f66.google.com with SMTP id r133so2195725pgr.2 for ; Thu, 24 Aug 2017 21:30:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=51uIMzntDwbhyImFji474r4QdhIPiBFyk+TPv+su0yA=; b=BCVKILgTvs2nd1ggs5iDMg9QdyO0qSoOFL353oUXvTx2dW5AxuBtZg6PNpbvqNfIO/ Th+m+8bsTVkPz+cErxJshHACksqpTqQTgjfnaKyJL1gBFkF46ZU7MscgYVLetgvUymyW 5p1iY7zq3JFk0zHnbYDD56WypwiYivS8+G/2idNFVOwb4YLzrFW+Wg9y5y7+N9Y9Qtod xXpddarGyEwl97eJ9qMPE1LFbJ7H+it4gDliTEQbamER74Xu9mVOnT7ycbrhL9umGx7Q fYmECmPfE9kBXARTaT/WWEIOveRs5sehnykcvzs5YRiAShOOFVblSjXnP9+10OMmG3bv O/YA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=51uIMzntDwbhyImFji474r4QdhIPiBFyk+TPv+su0yA=; b=RS0OUIaytRs14WX19N2yweGLTLZowsXX6MlWtEruCq7VOPXv5I8Z3WIr7sOLZID5e/ WM9gbY2SZJ95KlFd4G61mu0zYEsXCcCVkYZDqgNZfVIK114C6kWO0y2ZEIJc7BJsg+9o a6LaogpmbMAox5ULI0w4CjKFGEoLy5XAk6X5DnQKHjXZcaFsAG9Ki4AfRn6OPfIz1YK3 4fs6y1VZZWyyDt/yFhhnRCVEQy+w4Dh48lMxL7p+l42zBL9wJaUiAYawsTFQUe9mebWC pmKWg3q6pX6PD4650P5WJqmUZxgyUgpzZeEUn0Wjzt1I4J4z/Ra9n88vYPOY6KTW9Eky 3P1w== X-Gm-Message-State: AHYfb5ie3r1cdczm9zFnOGWFENLIVZqy/D1MmcgdP85l0ijervZAbRLs bF9TjT6EmJ663g== X-Received: by 10.99.95.76 with SMTP id t73mr8499799pgb.263.1503635459260; Thu, 24 Aug 2017 21:30:59 -0700 (PDT) Received: from roar.au.ibm.com (203-219-56-202.tpgi.com.au. [203.219.56.202]) by smtp.gmail.com with ESMTPSA id u195sm9010365pgb.82.2017.08.24.21.30.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 24 Aug 2017 21:30:58 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Cc: Nicholas Piggin , kvm-ppc@vger.kernel.org, Paul Mackerras Subject: [PATCH v3 2/4] powerpc/64s: idle POWER9 can execute stop without a sync sequence Date: Fri, 25 Aug 2017 14:30:34 +1000 Message-Id: <20170825043036.18236-3-npiggin@gmail.com> X-Mailer: git-send-email 2.13.3 In-Reply-To: <20170825043036.18236-1-npiggin@gmail.com> References: <20170825043036.18236-1-npiggin@gmail.com> Sender: kvm-ppc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm-ppc@vger.kernel.org Reviewed-by: Gautham R. Shenoy Signed-off-by: Nicholas Piggin --- arch/powerpc/include/asm/cpuidle.h | 16 ---------------- arch/powerpc/kernel/idle_book3s.S | 26 ++++++++++++++++++++------ 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/arch/powerpc/include/asm/cpuidle.h b/arch/powerpc/include/asm/cpuidle.h index 8a174cba5567..eb43b5c3a7b5 100644 --- a/arch/powerpc/include/asm/cpuidle.h +++ b/arch/powerpc/include/asm/cpuidle.h @@ -101,20 +101,4 @@ static inline void report_invalid_psscr_val(u64 psscr_val, int err) #endif -/* Idle state entry routines */ -#ifdef CONFIG_PPC_P7_NAP -#define IDLE_STATE_ENTER_SEQ(IDLE_INST) \ - /* Magic NAP/SLEEP/WINKLE mode enter sequence */ \ - std r0,0(r1); \ - ptesync; \ - ld r0,0(r1); \ -236: cmpd cr0,r0,r0; \ - bne 236b; \ - IDLE_INST; \ - -#define IDLE_STATE_ENTER_SEQ_NORET(IDLE_INST) \ - IDLE_STATE_ENTER_SEQ(IDLE_INST) \ - b . -#endif /* CONFIG_PPC_P7_NAP */ - #endif diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S index 4924647d964d..14e97f442167 100644 --- a/arch/powerpc/kernel/idle_book3s.S +++ b/arch/powerpc/kernel/idle_book3s.S @@ -205,6 +205,19 @@ pnv_powersave_common: mtmsrd r7,0 bctr +/* + * This is the sequence required to execute idle instructions, as + * specified in ISA v2.07. MSR[IR] and MSR[DR] must be 0. + */ +#define ARCH207_IDLE_STATE_ENTER_SEQ_NORET(IDLE_INST) \ + /* Magic NAP/SLEEP/WINKLE mode enter sequence */ \ + std r0,0(r1); \ + ptesync; \ + ld r0,0(r1); \ +236: cmpd cr0,r0,r0; \ + bne 236b; \ + IDLE_INST; + .globl pnv_enter_arch207_idle_mode pnv_enter_arch207_idle_mode: #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE @@ -230,7 +243,7 @@ pnv_enter_arch207_idle_mode: stb r3,PACA_THREAD_IDLE_STATE(r13) cmpwi cr3,r3,PNV_THREAD_SLEEP bge cr3,2f - IDLE_STATE_ENTER_SEQ_NORET(PPC_NAP) + ARCH207_IDLE_STATE_ENTER_SEQ_NORET(PPC_NAP) /* No return */ 2: /* Sleep or winkle */ @@ -269,7 +282,7 @@ pnv_fastsleep_workaround_at_entry: common_enter: /* common code for all the threads entering sleep or winkle */ bgt cr3,enter_winkle - IDLE_STATE_ENTER_SEQ_NORET(PPC_SLEEP) + ARCH207_IDLE_STATE_ENTER_SEQ_NORET(PPC_SLEEP) fastsleep_workaround_at_entry: oris r15,r15,PNV_CORE_IDLE_LOCK_BIT@h @@ -291,7 +304,7 @@ fastsleep_workaround_at_entry: enter_winkle: bl save_sprs_to_stack - IDLE_STATE_ENTER_SEQ_NORET(PPC_WINKLE) + ARCH207_IDLE_STATE_ENTER_SEQ_NORET(PPC_WINKLE) /* * r3 - PSSCR value corresponding to the requested stop state. @@ -316,7 +329,7 @@ power_enter_stop: andis. r4,r3,PSSCR_EC_ESL_MASK_SHIFTED clrldi r3,r3,60 /* r3 = Bits[60:63] = Requested Level (RL) */ bne .Lhandle_esl_ec_set - IDLE_STATE_ENTER_SEQ(PPC_STOP) + PPC_STOP li r3,0 /* Since we didn't lose state, return 0 */ /* @@ -349,7 +362,8 @@ power_enter_stop: ld r4,ADDROFF(pnv_first_deep_stop_state)(r5) cmpd r3,r4 bge .Lhandle_deep_stop - IDLE_STATE_ENTER_SEQ_NORET(PPC_STOP) + PPC_STOP /* Does not return (system reset interrupt) */ + .Lhandle_deep_stop: /* * Entering deep idle state. @@ -371,7 +385,7 @@ lwarx_loop_stop: bl save_sprs_to_stack - IDLE_STATE_ENTER_SEQ_NORET(PPC_STOP) + PPC_STOP /* Does not return (system reset interrupt) */ /* * Entered with MSR[EE]=0 and no soft-masked interrupts pending.