Commit a44a553f authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc

* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc:
  powerpc/pseries: Correct rtas_data_buf locking in dlpar code
  powerpc/85xx: Add P1021 PCI IDs and quirks
  arch/powerpc/sysdev/qe_lib/qe.c: Add of_node_put to avoid memory leak
  arch/powerpc/platforms/83xx/mpc837x_mds.c: Add missing iounmap
  fsl_rio: fix compile errors
  powerpc/85xx: Fix compile issue with p1022_ds due to lmb rename to memblock
  powerpc/85xx: Fix compilation of mpc85xx_mds.c
  powerpc: Don't use kernel stack with translation off
  powerpc/perf_event: Reduce latency of calling perf_event_do_pending
  powerpc/kexec: Adds correct calling convention for kexec purgatory
parents ce7db282 93f68f1e
...@@ -575,13 +575,19 @@ __secondary_start: ...@@ -575,13 +575,19 @@ __secondary_start:
/* Initialize the kernel stack. Just a repeat for iSeries. */ /* Initialize the kernel stack. Just a repeat for iSeries. */
LOAD_REG_ADDR(r3, current_set) LOAD_REG_ADDR(r3, current_set)
sldi r28,r24,3 /* get current_set[cpu#] */ sldi r28,r24,3 /* get current_set[cpu#] */
ldx r1,r3,r28 ldx r14,r3,r28
addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD addi r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD
std r1,PACAKSAVE(r13) std r14,PACAKSAVE(r13)
/* Do early setup for that CPU (stab, slb, hash table pointer) */ /* Do early setup for that CPU (stab, slb, hash table pointer) */
bl .early_setup_secondary bl .early_setup_secondary
/*
* setup the new stack pointer, but *don't* use this until
* translation is on.
*/
mr r1, r14
/* Clear backchain so we get nice backtraces */ /* Clear backchain so we get nice backtraces */
li r7,0 li r7,0
mtlr r7 mtlr r7
......
...@@ -810,6 +810,9 @@ relocate_new_kernel: ...@@ -810,6 +810,9 @@ relocate_new_kernel:
isync isync
sync sync
mfspr r3, SPRN_PIR /* current core we are running on */
mr r4, r5 /* load physical address of chunk called */
/* jump to the entry point, usually the setup routine */ /* jump to the entry point, usually the setup routine */
mtlr r5 mtlr r5
blrl blrl
......
...@@ -577,20 +577,11 @@ void timer_interrupt(struct pt_regs * regs) ...@@ -577,20 +577,11 @@ void timer_interrupt(struct pt_regs * regs)
* some CPUs will continuue to take decrementer exceptions */ * some CPUs will continuue to take decrementer exceptions */
set_dec(DECREMENTER_MAX); set_dec(DECREMENTER_MAX);
#ifdef CONFIG_PPC32 #if defined(CONFIG_PPC32) && defined(CONFIG_PMAC)
if (atomic_read(&ppc_n_lost_interrupts) != 0) if (atomic_read(&ppc_n_lost_interrupts) != 0)
do_IRQ(regs); do_IRQ(regs);
#endif #endif
now = get_tb_or_rtc();
if (now < decrementer->next_tb) {
/* not time for this event yet */
now = decrementer->next_tb - now;
if (now <= DECREMENTER_MAX)
set_dec((int)now);
trace_timer_interrupt_exit(regs);
return;
}
old_regs = set_irq_regs(regs); old_regs = set_irq_regs(regs);
irq_enter(); irq_enter();
...@@ -606,8 +597,16 @@ void timer_interrupt(struct pt_regs * regs) ...@@ -606,8 +597,16 @@ void timer_interrupt(struct pt_regs * regs)
get_lppaca()->int_dword.fields.decr_int = 0; get_lppaca()->int_dword.fields.decr_int = 0;
#endif #endif
if (evt->event_handler) now = get_tb_or_rtc();
evt->event_handler(evt); if (now >= decrementer->next_tb) {
decrementer->next_tb = ~(u64)0;
if (evt->event_handler)
evt->event_handler(evt);
} else {
now = decrementer->next_tb - now;
if (now <= DECREMENTER_MAX)
set_dec((int)now);
}
#ifdef CONFIG_PPC_ISERIES #ifdef CONFIG_PPC_ISERIES
if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending()) if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending())
......
...@@ -48,8 +48,10 @@ static int mpc837xmds_usb_cfg(void) ...@@ -48,8 +48,10 @@ static int mpc837xmds_usb_cfg(void)
return -1; return -1;
np = of_find_node_by_name(NULL, "usb"); np = of_find_node_by_name(NULL, "usb");
if (!np) if (!np) {
return -ENODEV; ret = -ENODEV;
goto out;
}
phy_type = of_get_property(np, "phy_type", NULL); phy_type = of_get_property(np, "phy_type", NULL);
if (phy_type && !strcmp(phy_type, "ulpi")) { if (phy_type && !strcmp(phy_type, "ulpi")) {
clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN); clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN);
...@@ -65,8 +67,9 @@ static int mpc837xmds_usb_cfg(void) ...@@ -65,8 +67,9 @@ static int mpc837xmds_usb_cfg(void)
} }
of_node_put(np); of_node_put(np);
out:
iounmap(bcsr_regs); iounmap(bcsr_regs);
return 0; return ret;
} }
/* ************************************************************************ /* ************************************************************************
......
...@@ -357,6 +357,7 @@ static void __init mpc85xx_mds_setup_arch(void) ...@@ -357,6 +357,7 @@ static void __init mpc85xx_mds_setup_arch(void)
{ {
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
struct pci_controller *hose; struct pci_controller *hose;
struct device_node *np;
#endif #endif
dma_addr_t max = 0xffffffff; dma_addr_t max = 0xffffffff;
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/lmb.h> #include <linux/memblock.h>
#include <asm/mpic.h> #include <asm/mpic.h>
#include <asm/swiotlb.h> #include <asm/swiotlb.h>
...@@ -97,7 +97,7 @@ static void __init p1022_ds_setup_arch(void) ...@@ -97,7 +97,7 @@ static void __init p1022_ds_setup_arch(void)
#endif #endif
#ifdef CONFIG_SWIOTLB #ifdef CONFIG_SWIOTLB
if (lmb_end_of_DRAM() > max) { if (memblock_end_of_DRAM() > max) {
ppc_swiotlb_enable = 1; ppc_swiotlb_enable = 1;
set_pci_dma_ops(&swiotlb_dma_ops); set_pci_dma_ops(&swiotlb_dma_ops);
ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb;
......
...@@ -129,20 +129,35 @@ struct device_node *dlpar_configure_connector(u32 drc_index) ...@@ -129,20 +129,35 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
struct property *property; struct property *property;
struct property *last_property = NULL; struct property *last_property = NULL;
struct cc_workarea *ccwa; struct cc_workarea *ccwa;
char *data_buf;
int cc_token; int cc_token;
int rc; int rc = -1;
cc_token = rtas_token("ibm,configure-connector"); cc_token = rtas_token("ibm,configure-connector");
if (cc_token == RTAS_UNKNOWN_SERVICE) if (cc_token == RTAS_UNKNOWN_SERVICE)
return NULL; return NULL;
spin_lock(&rtas_data_buf_lock); data_buf = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
ccwa = (struct cc_workarea *)&rtas_data_buf[0]; if (!data_buf)
return NULL;
ccwa = (struct cc_workarea *)&data_buf[0];
ccwa->drc_index = drc_index; ccwa->drc_index = drc_index;
ccwa->zero = 0; ccwa->zero = 0;
rc = rtas_call(cc_token, 2, 1, NULL, rtas_data_buf, NULL); do {
while (rc) { /* Since we release the rtas_data_buf lock between configure
* connector calls we want to re-populate the rtas_data_buffer
* with the contents of the previous call.
*/
spin_lock(&rtas_data_buf_lock);
memcpy(rtas_data_buf, data_buf, RTAS_DATA_BUF_SIZE);
rc = rtas_call(cc_token, 2, 1, NULL, rtas_data_buf, NULL);
memcpy(data_buf, rtas_data_buf, RTAS_DATA_BUF_SIZE);
spin_unlock(&rtas_data_buf_lock);
switch (rc) { switch (rc) {
case NEXT_SIBLING: case NEXT_SIBLING:
dn = dlpar_parse_cc_node(ccwa); dn = dlpar_parse_cc_node(ccwa);
...@@ -197,18 +212,19 @@ struct device_node *dlpar_configure_connector(u32 drc_index) ...@@ -197,18 +212,19 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
"returned from configure-connector\n", rc); "returned from configure-connector\n", rc);
goto cc_error; goto cc_error;
} }
} while (rc);
rc = rtas_call(cc_token, 2, 1, NULL, rtas_data_buf, NULL); cc_error:
kfree(data_buf);
if (rc) {
if (first_dn)
dlpar_free_cc_nodes(first_dn);
return NULL;
} }
spin_unlock(&rtas_data_buf_lock);
return first_dn; return first_dn;
cc_error:
if (first_dn)
dlpar_free_cc_nodes(first_dn);
spin_unlock(&rtas_data_buf_lock);
return NULL;
} }
static struct device_node *derive_parent(const char *path) static struct device_node *derive_parent(const char *path)
......
...@@ -399,6 +399,8 @@ DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013E, quirk_fsl_pcie_header); ...@@ -399,6 +399,8 @@ DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013E, quirk_fsl_pcie_header);
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013, quirk_fsl_pcie_header); DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013, quirk_fsl_pcie_header);
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020E, quirk_fsl_pcie_header); DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020E, quirk_fsl_pcie_header);
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020, quirk_fsl_pcie_header); DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020, quirk_fsl_pcie_header);
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1021E, quirk_fsl_pcie_header);
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1021, quirk_fsl_pcie_header);
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022E, quirk_fsl_pcie_header); DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022E, quirk_fsl_pcie_header);
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022, quirk_fsl_pcie_header); DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022, quirk_fsl_pcie_header);
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header); DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header);
......
...@@ -240,12 +240,13 @@ struct rio_priv { ...@@ -240,12 +240,13 @@ struct rio_priv {
static void __iomem *rio_regs_win; static void __iomem *rio_regs_win;
#ifdef CONFIG_E500
static int (*saved_mcheck_exception)(struct pt_regs *regs); static int (*saved_mcheck_exception)(struct pt_regs *regs);
static int fsl_rio_mcheck_exception(struct pt_regs *regs) static int fsl_rio_mcheck_exception(struct pt_regs *regs)
{ {
const struct exception_table_entry *entry = NULL; const struct exception_table_entry *entry = NULL;
unsigned long reason = (mfspr(SPRN_MCSR) & MCSR_MASK); unsigned long reason = mfspr(SPRN_MCSR);
if (reason & MCSR_BUS_RBERR) { if (reason & MCSR_BUS_RBERR) {
reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR)); reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR));
...@@ -269,6 +270,7 @@ static int fsl_rio_mcheck_exception(struct pt_regs *regs) ...@@ -269,6 +270,7 @@ static int fsl_rio_mcheck_exception(struct pt_regs *regs)
else else
return cur_cpu_spec->machine_check(regs); return cur_cpu_spec->machine_check(regs);
} }
#endif
/** /**
* fsl_rio_doorbell_send - Send a MPC85xx doorbell message * fsl_rio_doorbell_send - Send a MPC85xx doorbell message
...@@ -1517,8 +1519,10 @@ int fsl_rio_setup(struct platform_device *dev) ...@@ -1517,8 +1519,10 @@ int fsl_rio_setup(struct platform_device *dev)
fsl_rio_doorbell_init(port); fsl_rio_doorbell_init(port);
fsl_rio_port_write_init(port); fsl_rio_port_write_init(port);
#ifdef CONFIG_E500
saved_mcheck_exception = ppc_md.machine_check_exception; saved_mcheck_exception = ppc_md.machine_check_exception;
ppc_md.machine_check_exception = fsl_rio_mcheck_exception; ppc_md.machine_check_exception = fsl_rio_mcheck_exception;
#endif
/* Ensure that RFXE is set */ /* Ensure that RFXE is set */
mtspr(SPRN_HID1, (mfspr(SPRN_HID1) | 0x20000)); mtspr(SPRN_HID1, (mfspr(SPRN_HID1) | 0x20000));
......
...@@ -640,6 +640,7 @@ unsigned int qe_get_num_of_snums(void) ...@@ -640,6 +640,7 @@ unsigned int qe_get_num_of_snums(void)
if ((num_of_snums < 28) || (num_of_snums > QE_NUM_OF_SNUM)) { if ((num_of_snums < 28) || (num_of_snums > QE_NUM_OF_SNUM)) {
/* No QE ever has fewer than 28 SNUMs */ /* No QE ever has fewer than 28 SNUMs */
pr_err("QE: number of snum is invalid\n"); pr_err("QE: number of snum is invalid\n");
of_node_put(qe);
return -EINVAL; return -EINVAL;
} }
} }
......
...@@ -2300,6 +2300,8 @@ ...@@ -2300,6 +2300,8 @@
#define PCI_DEVICE_ID_P2010 0x0079 #define PCI_DEVICE_ID_P2010 0x0079
#define PCI_DEVICE_ID_P1020E 0x0100 #define PCI_DEVICE_ID_P1020E 0x0100
#define PCI_DEVICE_ID_P1020 0x0101 #define PCI_DEVICE_ID_P1020 0x0101
#define PCI_DEVICE_ID_P1021E 0x0102
#define PCI_DEVICE_ID_P1021 0x0103
#define PCI_DEVICE_ID_P1011E 0x0108 #define PCI_DEVICE_ID_P1011E 0x0108
#define PCI_DEVICE_ID_P1011 0x0109 #define PCI_DEVICE_ID_P1011 0x0109
#define PCI_DEVICE_ID_P1022E 0x0110 #define PCI_DEVICE_ID_P1022E 0x0110
......
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