Merge tag 'powerpc-4.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc updates from Michael Ellerman: - Kconfig: remove BE-only platforms from LE kernel build from Boqun Feng - Refresh ps3_defconfig from Geoff Levand - Emit GNU & SysV hashes for the vdso from Michael Ellerman - Define an enum for the bolted SLB indexes from Anshuman Khandual - Use a local to avoid multiple calls to get_slb_shadow() from Michael Ellerman - Add gettimeofday() benchmark from Michael Neuling - Avoid link stack corruption in __get_datapage() from Michael Neuling - Add virt_to_pfn and use this instead of opencoding from Aneesh Kumar K.V - Add ppc64le_defconfig from Michael Ellerman - pseries: extract of_helpers module from Andy Shevchenko - Correct string length in pseries_of_derive_parent() from Nathan Fontenot - Free the MSI bitmap if it was slab allocated from Denis Kirjanov - Shorten irq_chip name for the SIU from Christophe Leroy - Wait 1s for secondaries to enter OPAL during kexec from Samuel Mendoza-Jonas - Fix _ALIGN_* errors due to type difference, from Aneesh Kumar K.V - powerpc/pseries/hvcserver: don't memset pi_buff if it is null from Colin Ian King - Disable hugepd for 64K page size, from Aneesh Kumar K.V - Differentiate between hugetlb and THP during page walk from Aneesh Kumar K.V - Make PCI non-optional for pseries from Michael Ellerman - Individual System V IPC system calls from Sam bobroff - Add selftest of unmuxed IPC calls from Michael Ellerman - discard .exit.data at runtime from Stephen Rothwell - Delete old orphaned PrPMC 280/2800 DTS and boot file, from Paul Gortmaker - Use of_get_next_parent to simplify code from Christophe Jaillet - Paginate some xmon output from Sam bobroff - Add some more elements to the xmon PACA dump from Michael Ellerman - Allow the tm-syscall selftest to build with old headers from Michael Ellerman - Run EBB selftests only on POWER8 from Denis Kirjanov - Drop CONFIG_TUNE_CELL in favour of CONFIG_CELL_CPU from Michael Ellerman - Avoid reference to potentially freed memory in prom.c from Christophe Jaillet - Quieten boot wrapper output with run_cmd from Geoff Levand - EEH fixes and cleanups from Gavin Shan - Fix recursive fenced PHB on Broadcom shiner adapter from Gavin Shan - Use of_get_next_parent() in of_get_ibm_chip_id() from Michael Ellerman - Fix section mismatch warning in msi_bitmap_alloc() from Denis Kirjanov - Fix ps3-lpm white space from Rudhresh Kumar J - Fix ps3-vuart null dereference from Colin King - nvram: Add missing kfree in error path from Christophe Jaillet - nvram: Fix function name in some errors messages, from Christophe Jaillet - drivers/macintosh: adb: fix misleading Kconfig help text from Aaro Koskinen - agp/uninorth: fix a memleak in create_gatt_table from Denis Kirjanov - cxl: Free virtual PHB when removing from Andrew Donnellan - scripts/kconfig/Makefile: Allow KBUILD_DEFCONFIG to be a target from Michael Ellerman - scripts/kconfig/Makefile: Fix KBUILD_DEFCONFIG check when building with O= from Michael Ellerman - Freescale updates from Scott: Highlights include 64-bit book3e kexec/kdump support, a rework of the qoriq clock driver, device tree changes including qoriq fman nodes, support for a new 85xx board, and some fixes. - MPC5xxx updates from Anatolij: Highlights include a driver for MPC512x LocalPlus Bus FIFO with its device tree binding documentation, mpc512x device tree updates and some minor fixes. * tag 'powerpc-4.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: (106 commits) powerpc/msi: Fix section mismatch warning in msi_bitmap_alloc() powerpc/prom: Use of_get_next_parent() in of_get_ibm_chip_id() powerpc/pseries: Correct string length in pseries_of_derive_parent() powerpc/e6500: hw tablewalk: make sure we invalidate and write to the same tlb entry powerpc/mpc85xx: Add FSL QorIQ DPAA FMan support to the SoC device tree(s) powerpc/mpc85xx: Create dts components for the FSL QorIQ DPAA FMan powerpc/fsl: Add #clock-cells and clockgen label to clockgen nodes powerpc: handle error case in cpm_muram_alloc() powerpc: mpic: use IRQCHIP_SKIP_SET_WAKE instead of redundant mpic_irq_set_wake powerpc/book3e-64: Enable kexec powerpc/book3e-64/kexec: Set "r4 = 0" when entering spinloop powerpc/booke: Only use VIRT_PHYS_OFFSET on booke32 powerpc/book3e-64/kexec: Enable SMP release powerpc/book3e-64/kexec: create an identity TLB mapping powerpc/book3e-64: Don't limit paca to 256 MiB powerpc/book3e/kdump: Enable crash_kexec_wait_realmode powerpc/book3e: support CONFIG_RELOCATABLE powerpc/booke64: Fix args to copy_and_flush powerpc/book3e-64: rename interrupt_end_book3e with __end_interrupts powerpc/e6500: kexec: Handle hardware threads ...
This commit is contained in:
@@ -147,7 +147,8 @@ unsigned long cpm_muram_alloc(unsigned long size, unsigned long align)
|
||||
spin_lock_irqsave(&cpm_muram_lock, flags);
|
||||
cpm_muram_info.alignment = align;
|
||||
start = rh_alloc(&cpm_muram_info, size, "commproc");
|
||||
memset_io(cpm_muram_addr(start), 0, size);
|
||||
if (!IS_ERR_VALUE(start))
|
||||
memset_io(cpm_muram_addr(start), 0, size);
|
||||
spin_unlock_irqrestore(&cpm_muram_lock, flags);
|
||||
|
||||
return start;
|
||||
|
||||
@@ -179,6 +179,19 @@ static int setup_one_atmu(struct ccsr_pci __iomem *pci,
|
||||
return i;
|
||||
}
|
||||
|
||||
static bool is_kdump(void)
|
||||
{
|
||||
struct device_node *node;
|
||||
|
||||
node = of_find_node_by_type(NULL, "memory");
|
||||
if (!node) {
|
||||
WARN_ON_ONCE(1);
|
||||
return false;
|
||||
}
|
||||
|
||||
return of_property_read_bool(node, "linux,usable-memory");
|
||||
}
|
||||
|
||||
/* atmu setup for fsl pci/pcie controller */
|
||||
static void setup_pci_atmu(struct pci_controller *hose)
|
||||
{
|
||||
@@ -192,6 +205,16 @@ static void setup_pci_atmu(struct pci_controller *hose)
|
||||
const char *name = hose->dn->full_name;
|
||||
const u64 *reg;
|
||||
int len;
|
||||
bool setup_inbound;
|
||||
|
||||
/*
|
||||
* If this is kdump, we don't want to trigger a bunch of PCI
|
||||
* errors by closing the window on in-flight DMA.
|
||||
*
|
||||
* We still run most of the function's logic so that things like
|
||||
* hose->dma_window_size still get set.
|
||||
*/
|
||||
setup_inbound = !is_kdump();
|
||||
|
||||
if (early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) {
|
||||
if (in_be32(&pci->block_rev1) >= PCIE_IP_REV_2_2) {
|
||||
@@ -204,8 +227,11 @@ static void setup_pci_atmu(struct pci_controller *hose)
|
||||
/* Disable all windows (except powar0 since it's ignored) */
|
||||
for(i = 1; i < 5; i++)
|
||||
out_be32(&pci->pow[i].powar, 0);
|
||||
for (i = start_idx; i < end_idx; i++)
|
||||
out_be32(&pci->piw[i].piwar, 0);
|
||||
|
||||
if (setup_inbound) {
|
||||
for (i = start_idx; i < end_idx; i++)
|
||||
out_be32(&pci->piw[i].piwar, 0);
|
||||
}
|
||||
|
||||
/* Setup outbound MEM window */
|
||||
for(i = 0, j = 1; i < 3; i++) {
|
||||
@@ -278,6 +304,7 @@ static void setup_pci_atmu(struct pci_controller *hose)
|
||||
|
||||
/* Setup inbound mem window */
|
||||
mem = memblock_end_of_DRAM();
|
||||
pr_info("%s: end of DRAM %llx\n", __func__, mem);
|
||||
|
||||
/*
|
||||
* The msi-address-64 property, if it exists, indicates the physical
|
||||
@@ -320,12 +347,14 @@ static void setup_pci_atmu(struct pci_controller *hose)
|
||||
|
||||
piwar |= ((mem_log - 1) & PIWAR_SZ_MASK);
|
||||
|
||||
/* Setup inbound memory window */
|
||||
out_be32(&pci->piw[win_idx].pitar, 0x00000000);
|
||||
out_be32(&pci->piw[win_idx].piwbar, 0x00000000);
|
||||
out_be32(&pci->piw[win_idx].piwar, piwar);
|
||||
win_idx--;
|
||||
if (setup_inbound) {
|
||||
/* Setup inbound memory window */
|
||||
out_be32(&pci->piw[win_idx].pitar, 0x00000000);
|
||||
out_be32(&pci->piw[win_idx].piwbar, 0x00000000);
|
||||
out_be32(&pci->piw[win_idx].piwar, piwar);
|
||||
}
|
||||
|
||||
win_idx--;
|
||||
hose->dma_window_base_cur = 0x00000000;
|
||||
hose->dma_window_size = (resource_size_t)sz;
|
||||
|
||||
@@ -343,13 +372,15 @@ static void setup_pci_atmu(struct pci_controller *hose)
|
||||
|
||||
piwar = (piwar & ~PIWAR_SZ_MASK) | (mem_log - 1);
|
||||
|
||||
/* Setup inbound memory window */
|
||||
out_be32(&pci->piw[win_idx].pitar, 0x00000000);
|
||||
out_be32(&pci->piw[win_idx].piwbear,
|
||||
pci64_dma_offset >> 44);
|
||||
out_be32(&pci->piw[win_idx].piwbar,
|
||||
pci64_dma_offset >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwar, piwar);
|
||||
if (setup_inbound) {
|
||||
/* Setup inbound memory window */
|
||||
out_be32(&pci->piw[win_idx].pitar, 0x00000000);
|
||||
out_be32(&pci->piw[win_idx].piwbear,
|
||||
pci64_dma_offset >> 44);
|
||||
out_be32(&pci->piw[win_idx].piwbar,
|
||||
pci64_dma_offset >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwar, piwar);
|
||||
}
|
||||
|
||||
/*
|
||||
* install our own dma_set_mask handler to fixup dma_ops
|
||||
@@ -362,12 +393,15 @@ static void setup_pci_atmu(struct pci_controller *hose)
|
||||
} else {
|
||||
u64 paddr = 0;
|
||||
|
||||
/* Setup inbound memory window */
|
||||
out_be32(&pci->piw[win_idx].pitar, paddr >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwbar, paddr >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwar, (piwar | (mem_log - 1)));
|
||||
win_idx--;
|
||||
if (setup_inbound) {
|
||||
/* Setup inbound memory window */
|
||||
out_be32(&pci->piw[win_idx].pitar, paddr >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwbar, paddr >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwar,
|
||||
(piwar | (mem_log - 1)));
|
||||
}
|
||||
|
||||
win_idx--;
|
||||
paddr += 1ull << mem_log;
|
||||
sz -= 1ull << mem_log;
|
||||
|
||||
@@ -375,11 +409,15 @@ static void setup_pci_atmu(struct pci_controller *hose)
|
||||
mem_log = ilog2(sz);
|
||||
piwar |= (mem_log - 1);
|
||||
|
||||
out_be32(&pci->piw[win_idx].pitar, paddr >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwbar, paddr >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwar, piwar);
|
||||
win_idx--;
|
||||
if (setup_inbound) {
|
||||
out_be32(&pci->piw[win_idx].pitar,
|
||||
paddr >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwbar,
|
||||
paddr >> 12);
|
||||
out_be32(&pci->piw[win_idx].piwar, piwar);
|
||||
}
|
||||
|
||||
win_idx--;
|
||||
paddr += 1ull << mem_log;
|
||||
}
|
||||
|
||||
@@ -1002,7 +1040,7 @@ int fsl_pci_mcheck_exception(struct pt_regs *regs)
|
||||
ret = probe_kernel_address((void *)regs->nip, inst);
|
||||
}
|
||||
|
||||
if (mcheck_handle_load(regs, inst)) {
|
||||
if (!ret && mcheck_handle_load(regs, inst)) {
|
||||
regs->nip += 4;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
|
||||
unsigned long mpc5xxx_get_bus_frequency(struct device_node *node)
|
||||
{
|
||||
struct device_node *np;
|
||||
const unsigned int *p_bus_freq = NULL;
|
||||
|
||||
of_node_get(node);
|
||||
@@ -22,9 +21,7 @@ unsigned long mpc5xxx_get_bus_frequency(struct device_node *node)
|
||||
if (p_bus_freq)
|
||||
break;
|
||||
|
||||
np = of_get_parent(node);
|
||||
of_node_put(node);
|
||||
node = np;
|
||||
node = of_get_next_parent(node);
|
||||
}
|
||||
of_node_put(node);
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ static int mpc8xx_set_irq_type(struct irq_data *d, unsigned int flow_type)
|
||||
}
|
||||
|
||||
static struct irq_chip mpc8xx_pic = {
|
||||
.name = "MPC8XX SIU",
|
||||
.name = "8XX SIU",
|
||||
.irq_unmask = mpc8xx_unmask_irq,
|
||||
.irq_mask = mpc8xx_mask_irq,
|
||||
.irq_ack = mpc8xx_ack,
|
||||
|
||||
@@ -924,22 +924,6 @@ int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type)
|
||||
return IRQ_SET_MASK_OK_NOCOPY;
|
||||
}
|
||||
|
||||
static int mpic_irq_set_wake(struct irq_data *d, unsigned int on)
|
||||
{
|
||||
struct irq_desc *desc = container_of(d, struct irq_desc, irq_data);
|
||||
struct mpic *mpic = mpic_from_irq_data(d);
|
||||
|
||||
if (!(mpic->flags & MPIC_FSL))
|
||||
return -ENXIO;
|
||||
|
||||
if (on)
|
||||
desc->action->flags |= IRQF_NO_SUSPEND;
|
||||
else
|
||||
desc->action->flags &= ~IRQF_NO_SUSPEND;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mpic_set_vector(unsigned int virq, unsigned int vector)
|
||||
{
|
||||
struct mpic *mpic = mpic_from_irq(virq);
|
||||
@@ -977,7 +961,6 @@ static struct irq_chip mpic_irq_chip = {
|
||||
.irq_unmask = mpic_unmask_irq,
|
||||
.irq_eoi = mpic_end_irq,
|
||||
.irq_set_type = mpic_set_irq_type,
|
||||
.irq_set_wake = mpic_irq_set_wake,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -992,7 +975,6 @@ static struct irq_chip mpic_tm_chip = {
|
||||
.irq_mask = mpic_mask_tm,
|
||||
.irq_unmask = mpic_unmask_tm,
|
||||
.irq_eoi = mpic_end_irq,
|
||||
.irq_set_wake = mpic_irq_set_wake,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MPIC_U3_HT_IRQS
|
||||
@@ -1284,8 +1266,11 @@ struct mpic * __init mpic_alloc(struct device_node *node,
|
||||
flags |= MPIC_NO_RESET;
|
||||
if (of_get_property(node, "single-cpu-affinity", NULL))
|
||||
flags |= MPIC_SINGLE_DEST_CPU;
|
||||
if (of_device_is_compatible(node, "fsl,mpic"))
|
||||
if (of_device_is_compatible(node, "fsl,mpic")) {
|
||||
flags |= MPIC_FSL | MPIC_LARGE_VECTORS;
|
||||
mpic_irq_chip.flags |= IRQCHIP_SKIP_SET_WAKE;
|
||||
mpic_tm_chip.flags |= IRQCHIP_SKIP_SET_WAKE;
|
||||
}
|
||||
|
||||
mpic = kzalloc(sizeof(struct mpic), GFP_KERNEL);
|
||||
if (mpic == NULL)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <asm/msi_bitmap.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
@@ -111,7 +112,7 @@ int msi_bitmap_reserve_dt_hwirqs(struct msi_bitmap *bmp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int msi_bitmap_alloc(struct msi_bitmap *bmp, unsigned int irq_count,
|
||||
int __init_refok msi_bitmap_alloc(struct msi_bitmap *bmp, unsigned int irq_count,
|
||||
struct device_node *of_node)
|
||||
{
|
||||
int size;
|
||||
@@ -122,7 +123,15 @@ int msi_bitmap_alloc(struct msi_bitmap *bmp, unsigned int irq_count,
|
||||
size = BITS_TO_LONGS(irq_count) * sizeof(long);
|
||||
pr_debug("msi_bitmap: allocator bitmap size is 0x%x bytes\n", size);
|
||||
|
||||
bmp->bitmap = zalloc_maybe_bootmem(size, GFP_KERNEL);
|
||||
bmp->bitmap_from_slab = slab_is_available();
|
||||
if (bmp->bitmap_from_slab)
|
||||
bmp->bitmap = kzalloc(size, GFP_KERNEL);
|
||||
else {
|
||||
bmp->bitmap = memblock_virt_alloc(size, 0);
|
||||
/* the bitmap won't be freed from memblock allocator */
|
||||
kmemleak_not_leak(bmp->bitmap);
|
||||
}
|
||||
|
||||
if (!bmp->bitmap) {
|
||||
pr_debug("msi_bitmap: ENOMEM allocating allocator bitmap!\n");
|
||||
return -ENOMEM;
|
||||
@@ -138,7 +147,8 @@ int msi_bitmap_alloc(struct msi_bitmap *bmp, unsigned int irq_count,
|
||||
|
||||
void msi_bitmap_free(struct msi_bitmap *bmp)
|
||||
{
|
||||
/* we can't free the bitmap we don't know if it's bootmem etc. */
|
||||
if (bmp->bitmap_from_slab)
|
||||
kfree(bmp->bitmap);
|
||||
of_node_put(bmp->of_node);
|
||||
bmp->bitmap = NULL;
|
||||
}
|
||||
@@ -203,8 +213,6 @@ static void __init test_basics(void)
|
||||
|
||||
/* Clients may WARN_ON bitmap == NULL for "not-allocated" */
|
||||
WARN_ON(bmp.bitmap != NULL);
|
||||
|
||||
kfree(bmp.bitmap);
|
||||
}
|
||||
|
||||
static void __init test_of_node(void)
|
||||
|
||||
Reference in New Issue
Block a user