diff options
| -rw-r--r-- | arch/powerpc/kernel/head_64.S | 12 | ||||
| -rw-r--r-- | arch/powerpc/kernel/misc_32.S | 3 | ||||
| -rw-r--r-- | arch/powerpc/kernel/time.c | 23 | ||||
| -rw-r--r-- | arch/powerpc/platforms/83xx/mpc837x_mds.c | 9 | ||||
| -rw-r--r-- | arch/powerpc/platforms/85xx/mpc85xx_mds.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/platforms/85xx/p1022_ds.c | 4 | ||||
| -rw-r--r-- | arch/powerpc/platforms/pseries/dlpar.c | 42 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_pci.c | 2 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/fsl_rio.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/qe_lib/qe.c | 1 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 2 |
11 files changed, 71 insertions, 34 deletions
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 4d6681dce816..c571cd3c1453 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
| @@ -575,13 +575,19 @@ __secondary_start: | |||
| 575 | /* Initialize the kernel stack. Just a repeat for iSeries. */ | 575 | /* Initialize the kernel stack. Just a repeat for iSeries. */ |
| 576 | LOAD_REG_ADDR(r3, current_set) | 576 | LOAD_REG_ADDR(r3, current_set) |
| 577 | sldi r28,r24,3 /* get current_set[cpu#] */ | 577 | sldi r28,r24,3 /* get current_set[cpu#] */ |
| 578 | ldx r1,r3,r28 | 578 | ldx r14,r3,r28 |
| 579 | addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD | 579 | addi r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD |
| 580 | std r1,PACAKSAVE(r13) | 580 | std r14,PACAKSAVE(r13) |
| 581 | 581 | ||
| 582 | /* Do early setup for that CPU (stab, slb, hash table pointer) */ | 582 | /* Do early setup for that CPU (stab, slb, hash table pointer) */ |
| 583 | bl .early_setup_secondary | 583 | bl .early_setup_secondary |
| 584 | 584 | ||
| 585 | /* | ||
| 586 | * setup the new stack pointer, but *don't* use this until | ||
| 587 | * translation is on. | ||
| 588 | */ | ||
| 589 | mr r1, r14 | ||
| 590 | |||
| 585 | /* Clear backchain so we get nice backtraces */ | 591 | /* Clear backchain so we get nice backtraces */ |
| 586 | li r7,0 | 592 | li r7,0 |
| 587 | mtlr r7 | 593 | mtlr r7 |
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 6bbd7a604d24..a7a570dcdd57 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
| @@ -810,6 +810,9 @@ relocate_new_kernel: | |||
| 810 | isync | 810 | isync |
| 811 | sync | 811 | sync |
| 812 | 812 | ||
| 813 | mfspr r3, SPRN_PIR /* current core we are running on */ | ||
| 814 | mr r4, r5 /* load physical address of chunk called */ | ||
| 815 | |||
| 813 | /* jump to the entry point, usually the setup routine */ | 816 | /* jump to the entry point, usually the setup routine */ |
| 814 | mtlr r5 | 817 | mtlr r5 |
| 815 | blrl | 818 | blrl |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index ce53dfa7130d..8533b3b83f5d 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
| @@ -577,20 +577,11 @@ void timer_interrupt(struct pt_regs * regs) | |||
| 577 | * some CPUs will continuue to take decrementer exceptions */ | 577 | * some CPUs will continuue to take decrementer exceptions */ |
| 578 | set_dec(DECREMENTER_MAX); | 578 | set_dec(DECREMENTER_MAX); |
| 579 | 579 | ||
| 580 | #ifdef CONFIG_PPC32 | 580 | #if defined(CONFIG_PPC32) && defined(CONFIG_PMAC) |
| 581 | if (atomic_read(&ppc_n_lost_interrupts) != 0) | 581 | if (atomic_read(&ppc_n_lost_interrupts) != 0) |
| 582 | do_IRQ(regs); | 582 | do_IRQ(regs); |
| 583 | #endif | 583 | #endif |
| 584 | 584 | ||
| 585 | now = get_tb_or_rtc(); | ||
| 586 | if (now < decrementer->next_tb) { | ||
| 587 | /* not time for this event yet */ | ||
| 588 | now = decrementer->next_tb - now; | ||
| 589 | if (now <= DECREMENTER_MAX) | ||
| 590 | set_dec((int)now); | ||
| 591 | trace_timer_interrupt_exit(regs); | ||
| 592 | return; | ||
| 593 | } | ||
| 594 | old_regs = set_irq_regs(regs); | 585 | old_regs = set_irq_regs(regs); |
| 595 | irq_enter(); | 586 | irq_enter(); |
| 596 | 587 | ||
| @@ -606,8 +597,16 @@ void timer_interrupt(struct pt_regs * regs) | |||
| 606 | get_lppaca()->int_dword.fields.decr_int = 0; | 597 | get_lppaca()->int_dword.fields.decr_int = 0; |
| 607 | #endif | 598 | #endif |
| 608 | 599 | ||
| 609 | if (evt->event_handler) | 600 | now = get_tb_or_rtc(); |
| 610 | evt->event_handler(evt); | 601 | if (now >= decrementer->next_tb) { |
| 602 | decrementer->next_tb = ~(u64)0; | ||
| 603 | if (evt->event_handler) | ||
| 604 | evt->event_handler(evt); | ||
| 605 | } else { | ||
| 606 | now = decrementer->next_tb - now; | ||
| 607 | if (now <= DECREMENTER_MAX) | ||
| 608 | set_dec((int)now); | ||
| 609 | } | ||
| 611 | 610 | ||
| 612 | #ifdef CONFIG_PPC_ISERIES | 611 | #ifdef CONFIG_PPC_ISERIES |
| 613 | if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending()) | 612 | if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending()) |
diff --git a/arch/powerpc/platforms/83xx/mpc837x_mds.c b/arch/powerpc/platforms/83xx/mpc837x_mds.c index f9751c8905be..83068322abd1 100644 --- a/arch/powerpc/platforms/83xx/mpc837x_mds.c +++ b/arch/powerpc/platforms/83xx/mpc837x_mds.c | |||
| @@ -48,8 +48,10 @@ static int mpc837xmds_usb_cfg(void) | |||
| 48 | return -1; | 48 | return -1; |
| 49 | 49 | ||
| 50 | np = of_find_node_by_name(NULL, "usb"); | 50 | np = of_find_node_by_name(NULL, "usb"); |
| 51 | if (!np) | 51 | if (!np) { |
| 52 | return -ENODEV; | 52 | ret = -ENODEV; |
| 53 | goto out; | ||
| 54 | } | ||
| 53 | phy_type = of_get_property(np, "phy_type", NULL); | 55 | phy_type = of_get_property(np, "phy_type", NULL); |
| 54 | if (phy_type && !strcmp(phy_type, "ulpi")) { | 56 | if (phy_type && !strcmp(phy_type, "ulpi")) { |
| 55 | clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN); | 57 | clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN); |
| @@ -65,8 +67,9 @@ static int mpc837xmds_usb_cfg(void) | |||
| 65 | } | 67 | } |
| 66 | 68 | ||
| 67 | of_node_put(np); | 69 | of_node_put(np); |
| 70 | out: | ||
| 68 | iounmap(bcsr_regs); | 71 | iounmap(bcsr_regs); |
| 69 | return 0; | 72 | return ret; |
| 70 | } | 73 | } |
| 71 | 74 | ||
| 72 | /* ************************************************************************ | 75 | /* ************************************************************************ |
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c index da64be19d099..aa34cac4eb5c 100644 --- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c +++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c | |||
| @@ -357,6 +357,7 @@ static void __init mpc85xx_mds_setup_arch(void) | |||
| 357 | { | 357 | { |
| 358 | #ifdef CONFIG_PCI | 358 | #ifdef CONFIG_PCI |
| 359 | struct pci_controller *hose; | 359 | struct pci_controller *hose; |
| 360 | struct device_node *np; | ||
| 360 | #endif | 361 | #endif |
| 361 | dma_addr_t max = 0xffffffff; | 362 | dma_addr_t max = 0xffffffff; |
| 362 | 363 | ||
diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c index e1467c937450..34e00902ce86 100644 --- a/arch/powerpc/platforms/85xx/p1022_ds.c +++ b/arch/powerpc/platforms/85xx/p1022_ds.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | #include <linux/pci.h> | 20 | #include <linux/pci.h> |
| 21 | #include <linux/of_platform.h> | 21 | #include <linux/of_platform.h> |
| 22 | #include <linux/lmb.h> | 22 | #include <linux/memblock.h> |
| 23 | 23 | ||
| 24 | #include <asm/mpic.h> | 24 | #include <asm/mpic.h> |
| 25 | #include <asm/swiotlb.h> | 25 | #include <asm/swiotlb.h> |
| @@ -97,7 +97,7 @@ static void __init p1022_ds_setup_arch(void) | |||
| 97 | #endif | 97 | #endif |
| 98 | 98 | ||
| 99 | #ifdef CONFIG_SWIOTLB | 99 | #ifdef CONFIG_SWIOTLB |
| 100 | if (lmb_end_of_DRAM() > max) { | 100 | if (memblock_end_of_DRAM() > max) { |
| 101 | ppc_swiotlb_enable = 1; | 101 | ppc_swiotlb_enable = 1; |
| 102 | set_pci_dma_ops(&swiotlb_dma_ops); | 102 | set_pci_dma_ops(&swiotlb_dma_ops); |
| 103 | ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; | 103 | ppc_md.pci_dma_dev_setup = pci_dma_dev_setup_swiotlb; |
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c index 227c1c3d585e..72d8054fa739 100644 --- a/arch/powerpc/platforms/pseries/dlpar.c +++ b/arch/powerpc/platforms/pseries/dlpar.c | |||
| @@ -129,20 +129,35 @@ struct device_node *dlpar_configure_connector(u32 drc_index) | |||
| 129 | struct property *property; | 129 | struct property *property; |
| 130 | struct property *last_property = NULL; | 130 | struct property *last_property = NULL; |
| 131 | struct cc_workarea *ccwa; | 131 | struct cc_workarea *ccwa; |
| 132 | char *data_buf; | ||
| 132 | int cc_token; | 133 | int cc_token; |
| 133 | int rc; | 134 | int rc = -1; |
| 134 | 135 | ||
| 135 | cc_token = rtas_token("ibm,configure-connector"); | 136 | cc_token = rtas_token("ibm,configure-connector"); |
| 136 | if (cc_token == RTAS_UNKNOWN_SERVICE) | 137 | if (cc_token == RTAS_UNKNOWN_SERVICE) |
| 137 | return NULL; | 138 | return NULL; |
| 138 | 139 | ||
| 139 | spin_lock(&rtas_data_buf_lock); | 140 | data_buf = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL); |
| 140 | ccwa = (struct cc_workarea *)&rtas_data_buf[0]; | 141 | if (!data_buf) |
| 142 | return NULL; | ||
| 143 | |||
| 144 | ccwa = (struct cc_workarea *)&data_buf[0]; | ||
| 141 | ccwa->drc_index = drc_index; | 145 | ccwa->drc_index = drc_index; |
| 142 | ccwa->zero = 0; | 146 | ccwa->zero = 0; |
| 143 | 147 | ||
| 144 | rc = rtas_call(cc_token, 2, 1, NULL, rtas_data_buf, NULL); | 148 | do { |
| 145 | while (rc) { | 149 | /* Since we release the rtas_data_buf lock between configure |
| 150 | * connector calls we want to re-populate the rtas_data_buffer | ||
| 151 | * with the contents of the previous call. | ||
| 152 | */ | ||
| 153 | spin_lock(&rtas_data_buf_lock); | ||
| 154 | |||
| 155 | memcpy(rtas_data_buf, data_buf, RTAS_DATA_BUF_SIZE); | ||
| 156 | rc = rtas_call(cc_token, 2, 1, NULL, rtas_data_buf, NULL); | ||
| 157 | memcpy(data_buf, rtas_data_buf, RTAS_DATA_BUF_SIZE); | ||
| 158 | |||
| 159 | spin_unlock(&rtas_data_buf_lock); | ||
| 160 | |||
| 146 | switch (rc) { | 161 | switch (rc) { |
| 147 | case NEXT_SIBLING: | 162 | case NEXT_SIBLING: |
| 148 | dn = dlpar_parse_cc_node(ccwa); | 163 | dn = dlpar_parse_cc_node(ccwa); |
| @@ -197,18 +212,19 @@ struct device_node *dlpar_configure_connector(u32 drc_index) | |||
| 197 | "returned from configure-connector\n", rc); | 212 | "returned from configure-connector\n", rc); |
| 198 | goto cc_error; | 213 | goto cc_error; |
| 199 | } | 214 | } |
| 215 | } while (rc); | ||
| 200 | 216 | ||
| 201 | rc = rtas_call(cc_token, 2, 1, NULL, rtas_data_buf, NULL); | 217 | cc_error: |
| 218 | kfree(data_buf); | ||
| 219 | |||
| 220 | if (rc) { | ||
| 221 | if (first_dn) | ||
| 222 | dlpar_free_cc_nodes(first_dn); | ||
| 223 | |||
| 224 | return NULL; | ||
| 202 | } | 225 | } |
| 203 | 226 | ||
| 204 | spin_unlock(&rtas_data_buf_lock); | ||
| 205 | return first_dn; | 227 | return first_dn; |
| 206 | |||
| 207 | cc_error: | ||
| 208 | if (first_dn) | ||
| 209 | dlpar_free_cc_nodes(first_dn); | ||
| 210 | spin_unlock(&rtas_data_buf_lock); | ||
| 211 | return NULL; | ||
| 212 | } | 228 | } |
| 213 | 229 | ||
| 214 | static struct device_node *derive_parent(const char *path) | 230 | static struct device_node *derive_parent(const char *path) |
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index 209384b6e039..4ae933225251 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
| @@ -399,6 +399,8 @@ DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013E, quirk_fsl_pcie_header); | |||
| 399 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013, quirk_fsl_pcie_header); | 399 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1013, quirk_fsl_pcie_header); |
| 400 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020E, quirk_fsl_pcie_header); | 400 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020E, quirk_fsl_pcie_header); |
| 401 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020, quirk_fsl_pcie_header); | 401 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1020, quirk_fsl_pcie_header); |
| 402 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1021E, quirk_fsl_pcie_header); | ||
| 403 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1021, quirk_fsl_pcie_header); | ||
| 402 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022E, quirk_fsl_pcie_header); | 404 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022E, quirk_fsl_pcie_header); |
| 403 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022, quirk_fsl_pcie_header); | 405 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P1022, quirk_fsl_pcie_header); |
| 404 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header); | 406 | DECLARE_PCI_FIXUP_HEADER(0x1957, PCI_DEVICE_ID_P2010E, quirk_fsl_pcie_header); |
diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index 6425abe5b7db..3017532319c8 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c | |||
| @@ -240,12 +240,13 @@ struct rio_priv { | |||
| 240 | 240 | ||
| 241 | static void __iomem *rio_regs_win; | 241 | static void __iomem *rio_regs_win; |
| 242 | 242 | ||
| 243 | #ifdef CONFIG_E500 | ||
| 243 | static int (*saved_mcheck_exception)(struct pt_regs *regs); | 244 | static int (*saved_mcheck_exception)(struct pt_regs *regs); |
| 244 | 245 | ||
| 245 | static int fsl_rio_mcheck_exception(struct pt_regs *regs) | 246 | static int fsl_rio_mcheck_exception(struct pt_regs *regs) |
| 246 | { | 247 | { |
| 247 | const struct exception_table_entry *entry = NULL; | 248 | const struct exception_table_entry *entry = NULL; |
| 248 | unsigned long reason = (mfspr(SPRN_MCSR) & MCSR_MASK); | 249 | unsigned long reason = mfspr(SPRN_MCSR); |
| 249 | 250 | ||
| 250 | if (reason & MCSR_BUS_RBERR) { | 251 | if (reason & MCSR_BUS_RBERR) { |
| 251 | reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR)); | 252 | reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR)); |
| @@ -269,6 +270,7 @@ static int fsl_rio_mcheck_exception(struct pt_regs *regs) | |||
| 269 | else | 270 | else |
| 270 | return cur_cpu_spec->machine_check(regs); | 271 | return cur_cpu_spec->machine_check(regs); |
| 271 | } | 272 | } |
| 273 | #endif | ||
| 272 | 274 | ||
| 273 | /** | 275 | /** |
| 274 | * fsl_rio_doorbell_send - Send a MPC85xx doorbell message | 276 | * fsl_rio_doorbell_send - Send a MPC85xx doorbell message |
| @@ -1517,8 +1519,10 @@ int fsl_rio_setup(struct platform_device *dev) | |||
| 1517 | fsl_rio_doorbell_init(port); | 1519 | fsl_rio_doorbell_init(port); |
| 1518 | fsl_rio_port_write_init(port); | 1520 | fsl_rio_port_write_init(port); |
| 1519 | 1521 | ||
| 1522 | #ifdef CONFIG_E500 | ||
| 1520 | saved_mcheck_exception = ppc_md.machine_check_exception; | 1523 | saved_mcheck_exception = ppc_md.machine_check_exception; |
| 1521 | ppc_md.machine_check_exception = fsl_rio_mcheck_exception; | 1524 | ppc_md.machine_check_exception = fsl_rio_mcheck_exception; |
| 1525 | #endif | ||
| 1522 | /* Ensure that RFXE is set */ | 1526 | /* Ensure that RFXE is set */ |
| 1523 | mtspr(SPRN_HID1, (mfspr(SPRN_HID1) | 0x20000)); | 1527 | mtspr(SPRN_HID1, (mfspr(SPRN_HID1) | 0x20000)); |
| 1524 | 1528 | ||
diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/arch/powerpc/sysdev/qe_lib/qe.c index 3da8014931c9..90020de4dcf2 100644 --- a/arch/powerpc/sysdev/qe_lib/qe.c +++ b/arch/powerpc/sysdev/qe_lib/qe.c | |||
| @@ -640,6 +640,7 @@ unsigned int qe_get_num_of_snums(void) | |||
| 640 | if ((num_of_snums < 28) || (num_of_snums > QE_NUM_OF_SNUM)) { | 640 | if ((num_of_snums < 28) || (num_of_snums > QE_NUM_OF_SNUM)) { |
| 641 | /* No QE ever has fewer than 28 SNUMs */ | 641 | /* No QE ever has fewer than 28 SNUMs */ |
| 642 | pr_err("QE: number of snum is invalid\n"); | 642 | pr_err("QE: number of snum is invalid\n"); |
| 643 | of_node_put(qe); | ||
| 643 | return -EINVAL; | 644 | return -EINVAL; |
| 644 | } | 645 | } |
| 645 | } | 646 | } |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index f6a3b2d36cad..10d33309e9a6 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -2300,6 +2300,8 @@ | |||
| 2300 | #define PCI_DEVICE_ID_P2010 0x0079 | 2300 | #define PCI_DEVICE_ID_P2010 0x0079 |
| 2301 | #define PCI_DEVICE_ID_P1020E 0x0100 | 2301 | #define PCI_DEVICE_ID_P1020E 0x0100 |
| 2302 | #define PCI_DEVICE_ID_P1020 0x0101 | 2302 | #define PCI_DEVICE_ID_P1020 0x0101 |
| 2303 | #define PCI_DEVICE_ID_P1021E 0x0102 | ||
| 2304 | #define PCI_DEVICE_ID_P1021 0x0103 | ||
| 2303 | #define PCI_DEVICE_ID_P1011E 0x0108 | 2305 | #define PCI_DEVICE_ID_P1011E 0x0108 |
| 2304 | #define PCI_DEVICE_ID_P1011 0x0109 | 2306 | #define PCI_DEVICE_ID_P1011 0x0109 |
| 2305 | #define PCI_DEVICE_ID_P1022E 0x0110 | 2307 | #define PCI_DEVICE_ID_P1022E 0x0110 |
