Module: xenomai-2.5 Branch: master Commit: 999041a2c5a1e2d24db1bebbffde202377f3ce6b URL: http://git.xenomai.org/?p=xenomai-2.5.git;a=commit;h=999041a2c5a1e2d24db1bebbffde202377f3ce6b
Author: Philippe Gerum <r...@xenomai.org> Date: Thu Jun 24 15:12:45 2010 +0200 powerpc: upgrade I-pipe support to 2.6.34-powerpc-2.10-03 This patch introduces support for the KUP4K board (Kieback & Peter, mpc855). --- ...ch => adeos-ipipe-2.6.34-powerpc-2.10-03.patch} | 196 +++++++++++++++++++- 1 files changed, 189 insertions(+), 7 deletions(-) diff --git a/ksrc/arch/powerpc/patches/adeos-ipipe-2.6.34-powerpc-2.10-02.patch b/ksrc/arch/powerpc/patches/adeos-ipipe-2.6.34-powerpc-2.10-03.patch similarity index 98% rename from ksrc/arch/powerpc/patches/adeos-ipipe-2.6.34-powerpc-2.10-02.patch rename to ksrc/arch/powerpc/patches/adeos-ipipe-2.6.34-powerpc-2.10-03.patch index 8f27969..233e0b4 100644 --- a/ksrc/arch/powerpc/patches/adeos-ipipe-2.6.34-powerpc-2.10-02.patch +++ b/ksrc/arch/powerpc/patches/adeos-ipipe-2.6.34-powerpc-2.10-03.patch @@ -262,7 +262,7 @@ index bd100fc..8fa1901 100644 * or should we not care like we do now ? --BenH. diff --git a/arch/powerpc/include/asm/ipipe.h b/arch/powerpc/include/asm/ipipe.h new file mode 100644 -index 0000000..8aa91f0 +index 0000000..31d54bb --- /dev/null +++ b/arch/powerpc/include/asm/ipipe.h @@ -0,0 +1,277 @@ @@ -313,10 +313,10 @@ index 0000000..8aa91f0 +#include <asm/paca.h> +#endif + -+#define IPIPE_ARCH_STRING "2.10-02" ++#define IPIPE_ARCH_STRING "2.10-03" +#define IPIPE_MAJOR_NUMBER 2 +#define IPIPE_MINOR_NUMBER 10 -+#define IPIPE_PATCH_NUMBER 2 ++#define IPIPE_PATCH_NUMBER 3 + +#ifdef CONFIG_IPIPE_WANT_PREEMPTIBLE_SWITCH + @@ -2079,7 +2079,7 @@ index bed9a29..172418a 100644 bl .start_kernel diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S -index 3ef743f..53a6c9e 100644 +index 3ef743f..f4a3d7b 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S @@ -185,6 +185,12 @@ i##n: \ @@ -2119,6 +2119,31 @@ index 3ef743f..53a6c9e 100644 EXCEPTION(0xa00, Trap_0a, unknown_exception, EXC_XFER_EE) EXCEPTION(0xb00, Trap_0b, unknown_exception, EXC_XFER_EE) +@@ -918,15 +932,24 @@ _GLOBAL(set_context) + * It is important we get called with interrupts disabled. I used to + * do that, but it appears that all code that calls this already had + * interrupt disabled. ++ * I-pipe: we enforce this back, we need to bypass virtualization ++ * here. + */ + .globl set_dec_cpu6 + set_dec_cpu6: ++#ifdef CONFIG_IPIPE ++ mfmsr r6 ++ rlwinm r5,r6,0,17,15 /* clear MSR_EE */ ++#endif + lis r7, cpu6_errata_w...@h + ori r7, r7, cpu6_errata_w...@l + li r4, 0x2c00 + stw r4, 8(r7) + lwz r4, 8(r7) + mtspr 22, r3 /* Update Decrementer */ ++#ifdef CONFIG_IPIPE ++ MTMSRD(r6) ++#endif + SYNC + blr + #endif diff --git a/arch/powerpc/kernel/head_booke.h b/arch/powerpc/kernel/head_booke.h index 50504ae..01b3d31 100644 --- a/arch/powerpc/kernel/head_booke.h @@ -4311,6 +4336,64 @@ index 5b0ab99..6e057d7 100644 } #endif /* CONFIG_CPM2 */ +diff --git a/arch/powerpc/platforms/8xx/m8xx_setup.c b/arch/powerpc/platforms/8xx/m8xx_setup.c +index 60168c1..a39bcff 100644 +--- a/arch/powerpc/platforms/8xx/m8xx_setup.c ++++ b/arch/powerpc/platforms/8xx/m8xx_setup.c +@@ -170,6 +170,7 @@ int mpc8xx_set_rtc_time(struct rtc_time *tm) + { + sitk8xx_t __iomem *sys_tmr1; + sit8xx_t __iomem *sys_tmr2; ++ unsigned long flags; + int time; + + sys_tmr1 = immr_map(im_sitk); +@@ -177,9 +178,11 @@ int mpc8xx_set_rtc_time(struct rtc_time *tm) + time = mktime(tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); + ++ local_irq_save_hw_cond(flags); + out_be32(&sys_tmr1->sitk_rtck, KAPWR_KEY); + out_be32(&sys_tmr2->sit_rtc, time); + out_be32(&sys_tmr1->sitk_rtck, ~KAPWR_KEY); ++ local_irq_restore_hw_cond(flags); + + immr_unmap(sys_tmr2); + immr_unmap(sys_tmr1); +@@ -205,7 +208,7 @@ void mpc8xx_restart(char *cmd) + car8xx_t __iomem *clk_r = immr_map(im_clkrst); + + +- local_irq_disable(); ++ local_irq_disable_hw(); + + setbits32(&clk_r->car_plprcr, 0x00000080); + /* Clear the ME bit in MSR to cause checkstop on machine check +@@ -220,6 +223,16 @@ static void cpm_cascade(unsigned int irq, struct irq_desc *desc) + { + int cascade_irq; + ++#ifdef CONFIG_IPIPE ++ desc->chip->eoi(irq); ++ if ((cascade_irq = cpm_get_irq()) >= 0) { ++ struct irq_desc *cdesc = irq_to_desc(cascade_irq); ++ ++ cdesc->chip->eoi(cascade_irq); ++ ipipe_handle_chained_irq(cascade_irq); ++ } ++ desc->chip->unmask(irq); ++#else + if ((cascade_irq = cpm_get_irq()) >= 0) { + struct irq_desc *cdesc = irq_to_desc(cascade_irq); + +@@ -227,6 +240,7 @@ static void cpm_cascade(unsigned int irq, struct irq_desc *desc) + cdesc->chip->eoi(cascade_irq); + } + desc->chip->eoi(irq); ++#endif + } + + /* Initialize the internal interrupt controllers. The number of diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c index 8547e86..59c45d5 100644 --- a/arch/powerpc/platforms/cell/spu_base.c @@ -4389,6 +4472,45 @@ index 0707653..3be595e 100644 static long pSeries_lpar_hpte_remove(unsigned long hpte_group) { +diff --git a/arch/powerpc/sysdev/cpm1.c b/arch/powerpc/sysdev/cpm1.c +index 8d103ca..6576ca0 100644 +--- a/arch/powerpc/sysdev/cpm1.c ++++ b/arch/powerpc/sysdev/cpm1.c +@@ -59,22 +59,34 @@ static struct irq_host *cpm_pic_host; + static void cpm_mask_irq(unsigned int irq) + { + unsigned int cpm_vec = (unsigned int)irq_map[irq].hwirq; ++ unsigned long flags; + ++ local_irq_save_hw_cond(flags); ++ ipipe_irq_lock(irq); + clrbits32(&cpic_reg->cpic_cimr, (1 << cpm_vec)); ++ local_irq_restore_hw_cond(flags); + } + + static void cpm_unmask_irq(unsigned int irq) + { + unsigned int cpm_vec = (unsigned int)irq_map[irq].hwirq; ++ unsigned long flags; + ++ local_irq_save_hw_cond(flags); + setbits32(&cpic_reg->cpic_cimr, (1 << cpm_vec)); ++ ipipe_irq_unlock(irq); ++ local_irq_restore_hw_cond(flags); + } + + static void cpm_end_irq(unsigned int irq) + { + unsigned int cpm_vec = (unsigned int)irq_map[irq].hwirq; ++ unsigned long flags; + ++ local_irq_save_hw_cond(flags); + out_be32(&cpic_reg->cpic_cisr, (1 << cpm_vec)); ++ clrbits32(&cpic_reg->cpic_cimr, (1 << cpm_vec)); ++ local_irq_restore_hw_cond(flags); + } + + static struct irq_chip cpm_pic = { diff --git a/arch/powerpc/sysdev/cpm2_pic.c b/arch/powerpc/sysdev/cpm2_pic.c index fcea4ff..38ac727 100644 --- a/arch/powerpc/sysdev/cpm2_pic.c @@ -4505,10 +4627,10 @@ index d7b9b9c..160e7a6 100644 static struct ipic_info ipic_info[] = { [1] = { diff --git a/arch/powerpc/sysdev/mpc8xx_pic.c b/arch/powerpc/sysdev/mpc8xx_pic.c -index 8c27d26..f01d78b 100644 +index 8c27d26..8bb94f5 100644 --- a/arch/powerpc/sysdev/mpc8xx_pic.c +++ b/arch/powerpc/sysdev/mpc8xx_pic.c -@@ -29,24 +29,30 @@ static void mpc8xx_unmask_irq(unsigned int virq) +@@ -29,24 +29,32 @@ static void mpc8xx_unmask_irq(unsigned int virq) { int bit, word; unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq; @@ -4520,6 +4642,7 @@ index 8c27d26..f01d78b 100644 + local_irq_save_hw_cond(flags); ppc_cached_irq_mask[word] |= (1 << (31-bit)); out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]); ++ ipipe_irq_unlock(virq); + local_irq_restore_hw_cond(flags); } @@ -4533,12 +4656,71 @@ index 8c27d26..f01d78b 100644 word = irq_nr >> 5; + local_irq_save_hw_cond(flags); ++ ipipe_irq_lock(virq); ppc_cached_irq_mask[word] &= ~(1 << (31-bit)); out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]); -+ local_irq_save_hw_cond(flags); ++ local_irq_restore_hw_cond(flags); } static void mpc8xx_ack(unsigned int virq) +@@ -58,16 +66,37 @@ static void mpc8xx_ack(unsigned int virq) + out_be32(&siu_reg->sc_sipend, 1 << (31-bit)); + } + ++#ifdef CONFIG_IPIPE ++static void mpc8xx_mask_ack_irq(unsigned int virq) ++{ ++ int bit, word; ++ unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq; ++ unsigned long flags; ++ ++ bit = irq_nr & 0x1f; ++ word = irq_nr >> 5; ++ ++ local_irq_save_hw_cond(flags); ++ ppc_cached_irq_mask[word] &= ~(1 << (31-bit)); ++ out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]); ++ out_be32(&siu_reg->sc_sipend, 1 << (31-bit)); ++ local_irq_restore_hw_cond(flags); ++} ++#endif ++ + static void mpc8xx_end_irq(unsigned int virq) + { + int bit, word; + unsigned int irq_nr = (unsigned int)irq_map[virq].hwirq; ++ unsigned long flags; + + bit = irq_nr & 0x1f; + word = irq_nr >> 5; + ++ local_irq_save_hw_cond(flags); + ppc_cached_irq_mask[word] |= (1 << (31-bit)); + out_be32(&siu_reg->sc_simask, ppc_cached_irq_mask[word]); ++ local_irq_restore_hw_cond(flags); + } + + static int mpc8xx_set_irq_type(unsigned int virq, unsigned int flow_type) +@@ -87,7 +116,9 @@ static int mpc8xx_set_irq_type(unsigned int virq, unsigned int flow_type) + if ((hw & 1) == 0) { + siel |= (0x80000000 >> hw); + out_be32(&siu_reg->sc_siel, siel); ++#ifndef CONFIG_IPIPE + desc->handle_irq = handle_edge_irq; ++#endif + } + } + return 0; +@@ -98,6 +129,9 @@ static struct irq_chip mpc8xx_pic = { + .unmask = mpc8xx_unmask_irq, + .mask = mpc8xx_mask_irq, + .ack = mpc8xx_ack, ++#ifdef CONFIG_IPIPE ++ .mask_ack = mpc8xx_mask_ack_irq, ++#endif + .eoi = mpc8xx_end_irq, + .set_type = mpc8xx_set_irq_type, + }; diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 260295b..dfb0d41 100644 --- a/arch/powerpc/sysdev/mpic.c _______________________________________________ Xenomai-git mailing list Xenomai-git@gna.org https://mail.gna.org/listinfo/xenomai-git