Commit 2771fc8e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'powerpc-4.8-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Pull powerpc fixes from Michael Ellerman:
 "Fixes marked for stable:
   - Don't alias user region to other regions below PAGE_OFFSET from
     Paul Mackerras
   - Fix again csum_partial_copy_generic() on 32-bit from Christophe
     Leroy
   - Fix corrupted PE allocation bitmap on releasing PE from Gavin Shan

  Fixes for code merged this cycle:
   - Fix crash on releasing compound PE from Gavin Shan
   - Fix processor numbers in OPAL ICP from Benjamin Herrenschmidt
   - Fix little endian build with CONFIG_KEXEC=n from Thiago Jung
     Bauermann"

* tag 'powerpc-4.8-5' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/mm: Don't alias user region to other regions below PAGE_OFFSET
  powerpc/32: Fix again csum_partial_copy_generic()
  powerpc/powernv: Fix corrupted PE allocation bitmap on releasing PE
  powerpc/powernv: Fix crash on releasing compound PE
  powerpc/xics/opal: Fix processor numbers in OPAL ICP
  powerpc/pseries: Fix little endian build with CONFIG_KEXEC=n
parents 53d5f1dc f077aaf0
...@@ -127,18 +127,19 @@ _GLOBAL(csum_partial_copy_generic) ...@@ -127,18 +127,19 @@ _GLOBAL(csum_partial_copy_generic)
stw r7,12(r1) stw r7,12(r1)
stw r8,8(r1) stw r8,8(r1)
rlwinm r0,r4,3,0x8
rlwnm r6,r6,r0,0,31 /* odd destination address: rotate one byte */
cmplwi cr7,r0,0 /* is destination address even ? */
addic r12,r6,0 addic r12,r6,0
addi r6,r4,-4 addi r6,r4,-4
neg r0,r4 neg r0,r4
addi r4,r3,-4 addi r4,r3,-4
andi. r0,r0,CACHELINE_MASK /* # bytes to start of cache line */ andi. r0,r0,CACHELINE_MASK /* # bytes to start of cache line */
crset 4*cr7+eq
beq 58f beq 58f
cmplw 0,r5,r0 /* is this more than total to do? */ cmplw 0,r5,r0 /* is this more than total to do? */
blt 63f /* if not much to do */ blt 63f /* if not much to do */
rlwinm r7,r6,3,0x8
rlwnm r12,r12,r7,0,31 /* odd destination address: rotate one byte */
cmplwi cr7,r7,0 /* is destination address even ? */
andi. r8,r0,3 /* get it word-aligned first */ andi. r8,r0,3 /* get it word-aligned first */
mtctr r8 mtctr r8
beq+ 61f beq+ 61f
......
...@@ -113,7 +113,12 @@ BEGIN_FTR_SECTION ...@@ -113,7 +113,12 @@ BEGIN_FTR_SECTION
END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT) END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
b slb_finish_load_1T b slb_finish_load_1T
0: 0: /*
* For userspace addresses, make sure this is region 0.
*/
cmpdi r9, 0
bne 8f
/* when using slices, we extract the psize off the slice bitmaps /* when using slices, we extract the psize off the slice bitmaps
* and then we need to get the sllp encoding off the mmu_psize_defs * and then we need to get the sllp encoding off the mmu_psize_defs
* array. * array.
......
...@@ -162,11 +162,12 @@ static struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb) ...@@ -162,11 +162,12 @@ static struct pnv_ioda_pe *pnv_ioda_alloc_pe(struct pnv_phb *phb)
static void pnv_ioda_free_pe(struct pnv_ioda_pe *pe) static void pnv_ioda_free_pe(struct pnv_ioda_pe *pe)
{ {
struct pnv_phb *phb = pe->phb; struct pnv_phb *phb = pe->phb;
unsigned int pe_num = pe->pe_number;
WARN_ON(pe->pdev); WARN_ON(pe->pdev);
memset(pe, 0, sizeof(struct pnv_ioda_pe)); memset(pe, 0, sizeof(struct pnv_ioda_pe));
clear_bit(pe->pe_number, phb->ioda.pe_alloc); clear_bit(pe_num, phb->ioda.pe_alloc);
} }
/* The default M64 BAR is shared by all PEs */ /* The default M64 BAR is shared by all PEs */
...@@ -3402,12 +3403,6 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe) ...@@ -3402,12 +3403,6 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe)
struct pnv_phb *phb = pe->phb; struct pnv_phb *phb = pe->phb;
struct pnv_ioda_pe *slave, *tmp; struct pnv_ioda_pe *slave, *tmp;
/* Release slave PEs in compound PE */
if (pe->flags & PNV_IODA_PE_MASTER) {
list_for_each_entry_safe(slave, tmp, &pe->slaves, list)
pnv_ioda_release_pe(slave);
}
list_del(&pe->list); list_del(&pe->list);
switch (phb->type) { switch (phb->type) {
case PNV_PHB_IODA1: case PNV_PHB_IODA1:
...@@ -3422,6 +3417,15 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe) ...@@ -3422,6 +3417,15 @@ static void pnv_ioda_release_pe(struct pnv_ioda_pe *pe)
pnv_ioda_release_pe_seg(pe); pnv_ioda_release_pe_seg(pe);
pnv_ioda_deconfigure_pe(pe->phb, pe); pnv_ioda_deconfigure_pe(pe->phb, pe);
/* Release slave PEs in the compound PE */
if (pe->flags & PNV_IODA_PE_MASTER) {
list_for_each_entry_safe(slave, tmp, &pe->slaves, list) {
list_del(&slave->list);
pnv_ioda_free_pe(slave);
}
}
pnv_ioda_free_pe(pe); pnv_ioda_free_pe(pe);
} }
......
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
#include <linux/root_dev.h> #include <linux/root_dev.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_pci.h> #include <linux/of_pci.h>
#include <linux/kexec.h>
#include <asm/mmu.h> #include <asm/mmu.h>
#include <asm/processor.h> #include <asm/processor.h>
...@@ -66,6 +65,7 @@ ...@@ -66,6 +65,7 @@
#include <asm/eeh.h> #include <asm/eeh.h>
#include <asm/reg.h> #include <asm/reg.h>
#include <asm/plpar_wrappers.h> #include <asm/plpar_wrappers.h>
#include <asm/kexec.h>
#include "pseries.h" #include "pseries.h"
......
...@@ -23,10 +23,10 @@ ...@@ -23,10 +23,10 @@
static void icp_opal_teardown_cpu(void) static void icp_opal_teardown_cpu(void)
{ {
int cpu = smp_processor_id(); int hw_cpu = hard_smp_processor_id();
/* Clear any pending IPI */ /* Clear any pending IPI */
opal_int_set_mfrr(cpu, 0xff); opal_int_set_mfrr(hw_cpu, 0xff);
} }
static void icp_opal_flush_ipi(void) static void icp_opal_flush_ipi(void)
...@@ -101,14 +101,16 @@ static void icp_opal_eoi(struct irq_data *d) ...@@ -101,14 +101,16 @@ static void icp_opal_eoi(struct irq_data *d)
static void icp_opal_cause_ipi(int cpu, unsigned long data) static void icp_opal_cause_ipi(int cpu, unsigned long data)
{ {
opal_int_set_mfrr(cpu, IPI_PRIORITY); int hw_cpu = get_hard_smp_processor_id(cpu);
opal_int_set_mfrr(hw_cpu, IPI_PRIORITY);
} }
static irqreturn_t icp_opal_ipi_action(int irq, void *dev_id) static irqreturn_t icp_opal_ipi_action(int irq, void *dev_id)
{ {
int cpu = smp_processor_id(); int hw_cpu = hard_smp_processor_id();
opal_int_set_mfrr(cpu, 0xff); opal_int_set_mfrr(hw_cpu, 0xff);
return smp_ipi_demux(); return smp_ipi_demux();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment