diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-03-26 10:34:10 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-03-26 10:34:10 -0700 | 
| commit | 42234bf8320aeedaf0bff81e38a7020582c93a6f (patch) | |
| tree | a8365e74613335495e8b2ee0f1cbe64935528c54 | |
| parent | 1c23de630886e423ab298bce32a71486577bda5d (diff) | |
| parent | cc638a488a5205713b51eabd047be6ea641cc328 (diff) | |
Merge tag 'powerpc-4.11-6' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull more powerpc fixes from Michael Ellerman:
 "These are all pretty minor. The fix for idle wakeup would be a bad bug
  but has not been observed in practice.
  The update to the gcc-plugins docs was Cc'ed to Kees and Jon, Kees
  OK'ed it going via powerpc and I didn't hear from Jon.
   - cxl: Route eeh events to all slices for pci_channel_io_perm_failure state
   - powerpc/64s: Fix idle wakeup potential to clobber registers
   - Revert "powerpc/64: Disable use of radix under a hypervisor"
   - gcc-plugins: update architecture list in documentation
  Thanks to: Andrew Donnellan, Nicholas Piggin, Paul Mackerras, Vaibhav
  Jain"
* tag 'powerpc-4.11-6' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  gcc-plugins: update architecture list in documentation
  Revert "powerpc/64: Disable use of radix under a hypervisor"
  powerpc/64s: Fix idle wakeup potential to clobber registers
  cxl: Route eeh events to all slices for pci_channel_io_perm_failure state
| -rw-r--r-- | Documentation/gcc-plugins.txt | 4 | ||||
| -rw-r--r-- | arch/powerpc/kernel/idle_book3s.S | 20 | ||||
| -rw-r--r-- | arch/powerpc/mm/init_64.c | 3 | ||||
| -rw-r--r-- | drivers/misc/cxl/pci.c | 13 | 
4 files changed, 26 insertions, 14 deletions
diff --git a/Documentation/gcc-plugins.txt b/Documentation/gcc-plugins.txt index 891c69464434..433eaefb4aa1 100644 --- a/Documentation/gcc-plugins.txt +++ b/Documentation/gcc-plugins.txt @@ -18,8 +18,8 @@ because gcc versions 4.5 and 4.6 are compiled by a C compiler,  gcc-4.7 can be compiled by a C or a C++ compiler,  and versions 4.8+ can only be compiled by a C++ compiler. -Currently the GCC plugin infrastructure supports only the x86, arm and arm64 -architectures. +Currently the GCC plugin infrastructure supports only the x86, arm, arm64 and +powerpc architectures.  This infrastructure was ported from grsecurity [6] and PaX [7]. diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S index 995728736677..6fd08219248d 100644 --- a/arch/powerpc/kernel/idle_book3s.S +++ b/arch/powerpc/kernel/idle_book3s.S @@ -449,9 +449,23 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)  _GLOBAL(pnv_wakeup_tb_loss)  	ld	r1,PACAR1(r13)  	/* -	 * Before entering any idle state, the NVGPRs are saved in the stack -	 * and they are restored before switching to the process context. Hence -	 * until they are restored, they are free to be used. +	 * Before entering any idle state, the NVGPRs are saved in the stack. +	 * If there was a state loss, or PACA_NAPSTATELOST was set, then the +	 * NVGPRs are restored. If we are here, it is likely that state is lost, +	 * but not guaranteed -- neither ISA207 nor ISA300 tests to reach +	 * here are the same as the test to restore NVGPRS: +	 * PACA_THREAD_IDLE_STATE test for ISA207, PSSCR test for ISA300, +	 * and SRR1 test for restoring NVGPRs. +	 * +	 * We are about to clobber NVGPRs now, so set NAPSTATELOST to +	 * guarantee they will always be restored. This might be tightened +	 * with careful reading of specs (particularly for ISA300) but this +	 * is already a slow wakeup path and it's simpler to be safe. +	 */ +	li	r0,1 +	stb	r0,PACA_NAPSTATELOST(r13) + +	/*  	 *  	 * Save SRR1 and LR in NVGPRs as they might be clobbered in  	 * opal_call() (called in CHECK_HMI_INTERRUPT). SRR1 is required diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index 9be992083d2a..c22f207aa656 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c @@ -397,8 +397,7 @@ static void early_check_vec5(void)  void __init mmu_early_init_devtree(void)  {  	/* Disable radix mode based on kernel command line. */ -	/* We don't yet have the machinery to do radix as a guest. */ -	if (disable_radix || !(mfmsr() & MSR_HV)) +	if (disable_radix)  		cur_cpu_spec->mmu_features &= ~MMU_FTR_TYPE_RADIX;  	/* diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c index 91f645992c94..b27ea98b781f 100644 --- a/drivers/misc/cxl/pci.c +++ b/drivers/misc/cxl/pci.c @@ -1792,15 +1792,14 @@ static pci_ers_result_t cxl_pci_error_detected(struct pci_dev *pdev,  	/* If we're permanently dead, give up. */  	if (state == pci_channel_io_perm_failure) { -		/* Tell the AFU drivers; but we don't care what they -		 * say, we're going away. -		 */  		for (i = 0; i < adapter->slices; i++) {  			afu = adapter->afu[i]; -			/* Only participate in EEH if we are on a virtual PHB */ -			if (afu->phb == NULL) -				return PCI_ERS_RESULT_NONE; -			cxl_vphb_error_detected(afu, state); +			/* +			 * Tell the AFU drivers; but we don't care what they +			 * say, we're going away. +			 */ +			if (afu->phb != NULL) +				cxl_vphb_error_detected(afu, state);  		}  		return PCI_ERS_RESULT_DISCONNECT;  	}  | 
