forked from luck/tmp_suning_uos_patched
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
This commit is contained in:
commit
a44a553f82
|
@ -575,13 +575,19 @@ __secondary_start:
|
|||
/* Initialize the kernel stack. Just a repeat for iSeries. */
|
||||
LOAD_REG_ADDR(r3, current_set)
|
||||
sldi r28,r24,3 /* get current_set[cpu#] */
|
||||
ldx r1,r3,r28
|
||||
addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
|
||||
std r1,PACAKSAVE(r13)
|
||||
ldx r14,r3,r28
|
||||
addi r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD
|
||||
std r14,PACAKSAVE(r13)
|
||||
|
||||
/* Do early setup for that CPU (stab, slb, hash table pointer) */
|
||||
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 */
|
||||
li r7,0
|
||||
mtlr r7
|
||||
|
|
|
@ -810,6 +810,9 @@ relocate_new_kernel:
|
|||
isync
|
||||
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 */
|
||||
mtlr r5
|
||||
blrl
|
||||
|
|
|
@ -577,20 +577,11 @@ void timer_interrupt(struct pt_regs * regs)
|
|||
* some CPUs will continuue to take decrementer exceptions */
|
||||
set_dec(DECREMENTER_MAX);
|
||||
|
||||
#ifdef CONFIG_PPC32
|
||||
#if defined(CONFIG_PPC32) && defined(CONFIG_PMAC)
|
||||
if (atomic_read(&ppc_n_lost_interrupts) != 0)
|
||||
do_IRQ(regs);
|
||||
#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);
|
||||
irq_enter();
|
||||
|
||||
|
@ -606,8 +597,16 @@ void timer_interrupt(struct pt_regs * regs)
|
|||
get_lppaca()->int_dword.fields.decr_int = 0;
|
||||
#endif
|
||||
|
||||
if (evt->event_handler)
|
||||
evt->event_handler(evt);
|
||||
now = get_tb_or_rtc();
|
||||
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
|
||||
if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending())
|
||||
|
|
|
@ -48,8 +48,10 @@ static int mpc837xmds_usb_cfg(void)
|
|||
return -1;
|
||||
|
||||
np = of_find_node_by_name(NULL, "usb");
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
if (!np) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
phy_type = of_get_property(np, "phy_type", NULL);
|
||||
if (phy_type && !strcmp(phy_type, "ulpi")) {
|
||||
clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN);
|
||||
|
@ -65,8 +67,9 @@ static int mpc837xmds_usb_cfg(void)
|
|||
}
|
||||
|
||||
of_node_put(np);
|
||||
out:
|
||||
iounmap(bcsr_regs);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* ************************************************************************
|
||||
|
|
|
@ -357,6 +357,7 @@ static void __init mpc85xx_mds_setup_arch(void)
|
|||
{
|
||||
#ifdef CONFIG_PCI
|
||||
struct pci_controller *hose;
|
||||
struct device_node *np;
|
||||
#endif
|
||||
dma_addr_t max = 0xffffffff;
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/lmb.h>
|
||||
#include <linux/memblock.h>
|
||||
|
||||
#include <asm/mpic.h>
|
||||
#include <asm/swiotlb.h>
|
||||
|
@ -97,7 +97,7 @@ static void __init p1022_ds_setup_arch(void)
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
if (lmb_end_of_DRAM() > max) {
|
||||
if (memblock_end_of_DRAM() > max) {
|
||||
ppc_swiotlb_enable = 1;
|
||||
set_pci_dma_ops(&swiotlb_dma_ops);
|
||||
ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb;
|
||||
|
|
|
@ -129,20 +129,35 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
|
|||
struct property *property;
|
||||
struct property *last_property = NULL;
|
||||
struct cc_workarea *ccwa;
|
||||
char *data_buf;
|
||||
int cc_token;
|
||||
int rc;
|
||||
int rc = -1;
|
||||
|
||||
cc_token = rtas_token("ibm,configure-connector");
|
||||
if (cc_token == RTAS_UNKNOWN_SERVICE)
|
||||
return NULL;
|
||||
|
||||
spin_lock(&rtas_data_buf_lock);
|
||||
ccwa = (struct cc_workarea *)&rtas_data_buf[0];
|
||||
data_buf = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
|
||||
if (!data_buf)
|
||||
return NULL;
|
||||
|
||||
ccwa = (struct cc_workarea *)&data_buf[0];
|
||||
ccwa->drc_index = drc_index;
|
||||
ccwa->zero = 0;
|
||||
|
||||
rc = rtas_call(cc_token, 2, 1, NULL, rtas_data_buf, NULL);
|
||||
while (rc) {
|
||||
do {
|
||||
/* 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) {
|
||||
case NEXT_SIBLING:
|
||||
dn = dlpar_parse_cc_node(ccwa);
|
||||
|
@ -197,18 +212,19 @@ struct device_node *dlpar_configure_connector(u32 drc_index)
|
|||
"returned from configure-connector\n", rc);
|
||||
goto cc_error;
|
||||
}
|
||||
|
||||
rc = rtas_call(cc_token, 2, 1, NULL, rtas_data_buf, NULL);
|
||||
}
|
||||
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
return first_dn;
|
||||
} while (rc);
|
||||
|
||||
cc_error:
|
||||
if (first_dn)
|
||||
dlpar_free_cc_nodes(first_dn);
|
||||
spin_unlock(&rtas_data_buf_lock);
|
||||
return NULL;
|
||||
kfree(data_buf);
|
||||
|
||||
if (rc) {
|
||||
if (first_dn)
|
||||
dlpar_free_cc_nodes(first_dn);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return first_dn;
|
||||
}
|
||||
|
||||
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);
|
|||
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_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_P1022, quirk_fsl_pcie_header);
|
||||
DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header);
|
||||
|
|
|
@ -240,12 +240,13 @@ struct rio_priv {
|
|||
|
||||
static void __iomem *rio_regs_win;
|
||||
|
||||
#ifdef CONFIG_E500
|
||||
static int (*saved_mcheck_exception)(struct pt_regs *regs);
|
||||
|
||||
static int fsl_rio_mcheck_exception(struct pt_regs *regs)
|
||||
{
|
||||
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) {
|
||||
reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR));
|
||||
|
@ -269,6 +270,7 @@ static int fsl_rio_mcheck_exception(struct pt_regs *regs)
|
|||
else
|
||||
return cur_cpu_spec->machine_check(regs);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* fsl_rio_doorbell_send - Send a MPC85xx doorbell message
|
||||
|
@ -1517,8 +1519,10 @@ int fsl_rio_setup(struct platform_device *dev)
|
|||
fsl_rio_doorbell_init(port);
|
||||
fsl_rio_port_write_init(port);
|
||||
|
||||
#ifdef CONFIG_E500
|
||||
saved_mcheck_exception = ppc_md.machine_check_exception;
|
||||
ppc_md.machine_check_exception = fsl_rio_mcheck_exception;
|
||||
#endif
|
||||
/* Ensure that RFXE is set */
|
||||
mtspr(SPRN_HID1, (mfspr(SPRN_HID1) | 0x20000));
|
||||
|
||||
|
|
|
@ -640,6 +640,7 @@ unsigned int qe_get_num_of_snums(void)
|
|||
if ((num_of_snums < 28) || (num_of_snums > QE_NUM_OF_SNUM)) {
|
||||
/* No QE ever has fewer than 28 SNUMs */
|
||||
pr_err("QE: number of snum is invalid\n");
|
||||
of_node_put(qe);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2300,6 +2300,8 @@
|
|||
#define PCI_DEVICE_ID_P2010 0x0079
|
||||
#define PCI_DEVICE_ID_P1020E 0x0100
|
||||
#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_P1011 0x0109
|
||||
#define PCI_DEVICE_ID_P1022E 0x0110
|
||||
|
|
Loading…
Reference in New Issue
Block a user