Module: xenomai-3
Branch: wip/prioceil
Commit: 8c3bb4a5c83e24eddd868f756604ce28454fc97b
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=8c3bb4a5c83e24eddd868f756604ce28454fc97b

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sun Mar 13 12:08:26 2016 +0100

cobalt/powerpc: upgrade I-pipe support

---

 ...-6.patch => ipipe-core-3.10.32-powerpc-7.patch} |  133 ++++++++++------
 ...9.patch => ipipe-core-3.14.44-powerpc-12.patch} |  168 ++++++++++++++------
 ...-3.patch => ipipe-core-3.18.20-powerpc-5.patch} |   53 ++++--
 3 files changed, 232 insertions(+), 122 deletions(-)

diff --git 
a/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.10.32-powerpc-6.patch 
b/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.10.32-powerpc-7.patch
similarity index 99%
rename from 
kernel/cobalt/arch/powerpc/patches/ipipe-core-3.10.32-powerpc-6.patch
rename to kernel/cobalt/arch/powerpc/patches/ipipe-core-3.10.32-powerpc-7.patch
index 52532d1..cdae495 100644
--- a/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.10.32-powerpc-6.patch
+++ b/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.10.32-powerpc-7.patch
@@ -239,7 +239,7 @@ index ba713f1..ed1b099 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..4806477
+index 0000000..2b71932
 --- /dev/null
 +++ b/arch/powerpc/include/asm/ipipe.h
 @@ -0,0 +1,164 @@
@@ -284,7 +284,7 @@ index 0000000..4806477
 +#include <linux/cache.h>
 +#include <linux/threads.h>
 +
-+#define IPIPE_CORE_RELEASE    6
++#define IPIPE_CORE_RELEASE    7
 +
 +struct ipipe_domain;
 +
@@ -1150,7 +1150,7 @@ index ba7b197..0246507 100644
                                 _TIF_SECCOMP | _TIF_SYSCALL_TRACEPOINT | \
                                 _TIF_NOHZ)
 diff --git a/arch/powerpc/include/asm/uaccess.h 
b/arch/powerpc/include/asm/uaccess.h
-index 4db4959..9d4627a 100644
+index 4db49590..9d4627a 100644
 --- a/arch/powerpc/include/asm/uaccess.h
 +++ b/arch/powerpc/include/asm/uaccess.h
 @@ -117,6 +117,21 @@ struct exception_table_entry {
@@ -1776,7 +1776,7 @@ index 8a9b6f5..9b6d8e2 100644
        /* Fixed Interval Timer (FIT) Exception. (from 0x1010) */
  FITException:
 diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
-index 97e2671..c0e0e62 100644
+index 97e2671..207bca1 100644
 --- a/arch/powerpc/kernel/head_44x.S
 +++ b/arch/powerpc/kernel/head_44x.S
 @@ -262,8 +262,13 @@ interrupt_base:
@@ -1785,7 +1785,7 @@ index 97e2671..c0e0e62 100644
        /* External Input Interrupt */
 +#ifdef CONFIG_IPIPE
 +      EXCEPTION(0x0500, BOOKE_INTERRUPT_EXTERNAL, ExternalInput, \
-+                __ipipe_grab_irq, EXC_XFER_LITE)
++                __ipipe_grab_irq, EXC_XFER_IPIPE)
 +#else /* !CONFIG_IPIPE */
        EXCEPTION(0x0500, BOOKE_INTERRUPT_EXTERNAL, ExternalInput, \
                  do_IRQ, EXC_XFER_LITE)
@@ -1979,10 +1979,10 @@ index 939ea7e..75479f9 100644
                 * Go into low thread priority and possibly
 diff --git a/arch/powerpc/kernel/ipipe.c b/arch/powerpc/kernel/ipipe.c
 new file mode 100644
-index 0000000..1d08533
+index 0000000..0e30a84
 --- /dev/null
 +++ b/arch/powerpc/kernel/ipipe.c
-@@ -0,0 +1,471 @@
+@@ -0,0 +1,466 @@
 +/* -*- linux-c -*-
 + * linux/arch/powerpc/kernel/ipipe.c
 + *
@@ -2423,11 +2423,6 @@ index 0000000..1d08533
 +      return -ret;
 +}
 +
-+void __ipipe_pin_range_globally(unsigned long start, unsigned long end)
-+{
-+      /* We don't support this. */
-+}
-+
 +#ifndef CONFIG_SMP
 +EXPORT_SYMBOL_GPL(last_task_used_math);
 +#endif
@@ -5300,10 +5295,10 @@ index e6bb36a..898a91a 100644
  
 diff --git a/include/linux/ipipe.h b/include/linux/ipipe.h
 new file mode 100644
-index 0000000..525f3cf
+index 0000000..4ef7e3d
 --- /dev/null
 +++ b/include/linux/ipipe.h
-@@ -0,0 +1,443 @@
+@@ -0,0 +1,449 @@
 +/* -*- linux-c -*-
 + * include/linux/ipipe.h
 + *
@@ -5710,6 +5705,12 @@ index 0000000..525f3cf
 +#define __ipipe_uaccess_might_fault() might_fault()
 +#endif
 +
++#ifdef CONFIG_IPIPE_TRACE
++void __ipipe_tracer_hrclock_initialized(void);
++#else /* !CONFIG_IPIPE_TRACE */
++#define __ipipe_tracer_hrclock_initialized()  do { } while(0)
++#endif /* !CONFIG_IPIPE_TRACE */
++
 +#include <linux/ipipe_compat.h>
 +
 +#else /* !CONFIG_IPIPE */
@@ -5749,10 +5750,10 @@ index 0000000..525f3cf
 +#endif        /* !__LINUX_IPIPE_H */
 diff --git a/include/linux/ipipe_base.h b/include/linux/ipipe_base.h
 new file mode 100644
-index 0000000..fc88b2e
+index 0000000..c8fed98
 --- /dev/null
 +++ b/include/linux/ipipe_base.h
-@@ -0,0 +1,392 @@
+@@ -0,0 +1,394 @@
 +/* -*- linux-c -*-
 + * include/linux/ipipe_base.h
 + *
@@ -5935,9 +5936,6 @@ index 0000000..fc88b2e
 +
 +void __ipipe_flush_printk(unsigned int irq, void *cookie);
 +
-+void __ipipe_pin_range_globally(unsigned long start,
-+                              unsigned long end);
-+
 +#define hard_preempt_disable()                                \
 +      ({                                              \
 +              unsigned long __flags__;                \
@@ -6105,10 +6103,6 @@ index 0000000..fc88b2e
 +
 +static inline void __ipipe_clear_taskflags(struct task_struct *p) { }
 +
-+static inline void __ipipe_pin_range_globally(unsigned long start,
-+                                            unsigned long end)
-+{ }
-+
 +#define hard_preempt_disable()                ({ preempt_disable(); 0; })
 +#define hard_preempt_enable(flags)    ({ preempt_enable(); (void)(flags); })
 +
@@ -6135,6 +6129,15 @@ index 0000000..fc88b2e
 +
 +#endif        /* !CONFIG_IPIPE */
 +
++#ifdef CONFIG_IPIPE_WANT_PTE_PINNING
++void __ipipe_pin_mapping_globally(unsigned long start,
++                                unsigned long end);
++#else
++static inline void __ipipe_pin_mapping_globally(unsigned long start,
++                                              unsigned long end)
++{ }
++#endif
++
 +static inline void ipipe_preempt_root_only(void)
 +{
 +#if defined(CONFIG_IPIPE_DEBUG_CONTEXT) && \
@@ -8286,10 +8289,10 @@ index ff7be9d..1e80528 100644
        trace_task_newtask(p, clone_flags);
 diff --git a/kernel/ipipe/Kconfig b/kernel/ipipe/Kconfig
 new file mode 100644
-index 0000000..da17b04
+index 0000000..218f51da
 --- /dev/null
 +++ b/kernel/ipipe/Kconfig
-@@ -0,0 +1,62 @@
+@@ -0,0 +1,65 @@
 +config IPIPE
 +      bool "Interrupt pipeline"
 +      default y
@@ -8310,6 +8313,9 @@ index 0000000..da17b04
 +config IPIPE_WANT_CLOCKSOURCE
 +       bool
 +
++config IPIPE_WANT_PTE_PINNING
++       bool
++
 +config IPIPE_CORE_APIREV
 +       int
 +       depends on IPIPE
@@ -11085,10 +11091,10 @@ index 0000000..0c9b908
 +#endif /* CONFIG_IPIPE_HAVE_HOSTRT */
 diff --git a/kernel/ipipe/tracer.c b/kernel/ipipe/tracer.c
 new file mode 100644
-index 0000000..5cce0bc
+index 0000000..8388671
 --- /dev/null
 +++ b/kernel/ipipe/tracer.c
-@@ -0,0 +1,1447 @@
+@@ -0,0 +1,1468 @@
 +/* -*- linux-c -*-
 + * kernel/ipipe/tracer.c
 + *
@@ -11836,6 +11842,9 @@ index 0000000..5cce0bc
 +      unsigned long long abs_tsc;
 +      long us;
 +
++      if (!__ipipe_hrclock_ok())
++              return 0;
++
 +      /* ipipe_tsc2us works on unsigned => handle sign separately */
 +      abs_tsc = (tsc >= 0) ? tsc : -tsc;
 +      us = ipipe_tsc2us(abs_tsc);
@@ -12038,6 +12047,11 @@ index 0000000..5cce0bc
 +
 +              __ipipe_global_path_unlock(flags);
 +
++              if (!__ipipe_hrclock_ok()) {
++                      seq_printf(m, "No hrclock available, dumping traces 
disabled\n");
++                      return NULL;
++              }
++
 +              /* does this path actually contain data? */
 +              if (print_path->end == print_path->begin)
 +                      return NULL;
@@ -12208,6 +12222,11 @@ index 0000000..5cce0bc
 +              if (!print_path)
 +                      return NULL;
 +
++              if (!__ipipe_hrclock_ok()) {
++                      seq_printf(m, "No hrclock available, dumping traces 
disabled\n");
++                      return NULL;
++              }
++
 +              /* back- and post-tracing length, post-trace length was frozen
 +                 in __ipipe_trace, back-trace may have to be reduced due to
 +                 buffer overrun */
@@ -12457,18 +12476,38 @@ index 0000000..5cce0bc
 +
 +extern struct proc_dir_entry *ipipe_proc_root;
 +
-+void __init __ipipe_init_tracer(void)
++void __init __ipipe_tracer_hrclock_initialized(void)
 +{
-+      struct proc_dir_entry *trace_dir;
 +      unsigned long long start, end, min = ULLONG_MAX;
 +      int i;
++
++#ifdef CONFIG_IPIPE_TRACE_VMALLOC
++      if (!per_cpu(trace_path, 0))
++              return;
++#endif
++      /* Calculate minimum overhead of __ipipe_trace() */
++      hard_local_irq_disable();
++      for (i = 0; i < 100; i++) {
++              ipipe_read_tsc(start);
++              __ipipe_trace(IPIPE_TRACE_FUNC, __BUILTIN_RETURN_ADDRESS0,
++                            __BUILTIN_RETURN_ADDRESS1, 0);
++              ipipe_read_tsc(end);
++
++              end -= start;
++              if (end < min)
++                      min = end;
++      }
++      hard_local_irq_enable();
++      trace_overhead = ipipe_tsc2ns(min);
++}
++
++void __init __ipipe_init_tracer(void)
++{
++      struct proc_dir_entry *trace_dir;
 +#ifdef CONFIG_IPIPE_TRACE_VMALLOC
 +      int cpu, path;
 +#endif /* CONFIG_IPIPE_TRACE_VMALLOC */
 +
-+      if (!__ipipe_hrclock_ok())
-+              return;
-+
 +#ifdef CONFIG_IPIPE_TRACE_VMALLOC
 +      for_each_possible_cpu(cpu) {
 +              struct ipipe_trace_path *tp_buf;
@@ -12490,20 +12529,8 @@ index 0000000..5cce0bc
 +      }
 +#endif /* CONFIG_IPIPE_TRACE_VMALLOC */
 +
-+      /* Calculate minimum overhead of __ipipe_trace() */
-+      hard_local_irq_disable();
-+      for (i = 0; i < 100; i++) {
-+              ipipe_read_tsc(start);
-+              __ipipe_trace(IPIPE_TRACE_FUNC, __BUILTIN_RETURN_ADDRESS0,
-+                            __BUILTIN_RETURN_ADDRESS1, 0);
-+              ipipe_read_tsc(end);
-+
-+              end -= start;
-+              if (end < min)
-+                      min = end;
-+      }
-+      hard_local_irq_enable();
-+      trace_overhead = ipipe_tsc2ns(min);
++      if (__ipipe_hrclock_ok() && !trace_overhead)
++              __ipipe_tracer_hrclock_initialized();
 +
 +#ifdef CONFIG_IPIPE_TRACE_ENABLE
 +      ipipe_trace_enable = 1;
@@ -12537,7 +12564,7 @@ index 0000000..5cce0bc
 +#endif /* !CONFIG_IPIPE_TRACE_MCOUNT */
 +}
 diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
-index cbd97ce..0faa00b 100644
+index cbd97ce..16ab280e 100644
 --- a/kernel/irq/chip.c
 +++ b/kernel/irq/chip.c
 @@ -15,6 +15,7 @@
@@ -12586,7 +12613,7 @@ index cbd97ce..0faa00b 100644
                desc->irq_data.chip->irq_shutdown(&desc->irq_data);
 -      else if (desc->irq_data.chip->irq_disable)
 +#ifdef CONFIG_IPIPE
-+              desc->istate |= ~IPIPE_IRQS_NEEDS_STARTUP;
++              desc->istate |= IPIPE_IRQS_NEEDS_STARTUP;
 +#endif
 +      } else if (desc->irq_data.chip->irq_disable)
                desc->irq_data.chip->irq_disable(&desc->irq_data);
@@ -13158,7 +13185,7 @@ index 1f3186b..5b710c8 100644
  
        if (curr->softirqs_enabled) {
 diff --git a/kernel/panic.c b/kernel/panic.c
-index 167ec09..cd078a7 100644
+index 167ec097..cd078a7 100644
 --- a/kernel/panic.c
 +++ b/kernel/panic.c
 @@ -22,6 +22,7 @@
@@ -14296,7 +14323,7 @@ index f8e0e53..02175aa3 100644
                        wake_up_klogd();
        }
 diff --git a/lib/ioremap.c b/lib/ioremap.c
-index 0c9216c..1575d3e 100644
+index 0c9216c..00a9a30 100644
 --- a/lib/ioremap.c
 +++ b/lib/ioremap.c
 @@ -10,6 +10,7 @@
@@ -14315,7 +14342,7 @@ index 0c9216c..1575d3e 100644
 +      /* APEI may invoke this for temporarily remapping pages in interrupt
 +       * context - nothing we can and need to propagate globally. */
 +      if (!in_interrupt()) {
-+              __ipipe_pin_range_globally(start, end);
++              __ipipe_pin_mapping_globally(start, end);
 +              flush_cache_vmap(start, end);
 +      }
  
@@ -14650,14 +14677,14 @@ index e9f65aa..d9a21ad 100644
  
        return pages;
 diff --git a/mm/vmalloc.c b/mm/vmalloc.c
-index d456560..b50a41d 100644
+index d456560..4083177 100644
 --- a/mm/vmalloc.c
 +++ b/mm/vmalloc.c
 @@ -191,6 +191,8 @@ static int vmap_page_range_noflush(unsigned long start, 
unsigned long end,
                        return err;
        } while (pgd++, addr = next, addr != end);
  
-+      __ipipe_pin_range_globally(start, end);
++      __ipipe_pin_mapping_globally(start, end);
 + 
        return nr;
  }
diff --git 
a/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.14.44-powerpc-9.patch 
b/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.14.44-powerpc-12.patch
similarity index 99%
rename from 
kernel/cobalt/arch/powerpc/patches/ipipe-core-3.14.44-powerpc-9.patch
rename to kernel/cobalt/arch/powerpc/patches/ipipe-core-3.14.44-powerpc-12.patch
index 44309f0..f2f0acd 100644
--- a/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.14.44-powerpc-9.patch
+++ b/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.14.44-powerpc-12.patch
@@ -341,7 +341,7 @@ index 10be1dd..cfad863 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..1533d8b
+index 0000000..6a5f109
 --- /dev/null
 +++ b/arch/powerpc/include/asm/ipipe.h
 @@ -0,0 +1,157 @@
@@ -386,7 +386,7 @@ index 0000000..1533d8b
 +#include <linux/cache.h>
 +#include <linux/threads.h>
 +
-+#define IPIPE_CORE_RELEASE    9
++#define IPIPE_CORE_RELEASE    12
 +
 +struct ipipe_domain;
 +
@@ -1997,7 +1997,7 @@ index 5193116..ab85bde 100644
  #ifdef CONFIG_PPC_DOORBELL
        STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .doorbell_exception)
 diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S
-index 9ad236e..65b8f7c 100644
+index 9ad236e..3f38333 100644
 --- a/arch/powerpc/kernel/fpu.S
 +++ b/arch/powerpc/kernel/fpu.S
 @@ -195,7 +195,17 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
@@ -2005,12 +2005,12 @@ index 9ad236e..65b8f7c 100644
   */
  _GLOBAL(giveup_fpu)
 +#ifdef CONFIG_IPIPE
-+      mfmsr   r6
++      mfmsr   r10
 +#ifdef CONFIG_PPC64   
-+      rldicl  r5,r6,48,1              /* clear MSR_EE */
++      rldicl  r5,r10,48,1             /* clear MSR_EE */
 +      rotldi  r5,r5,16
 +#else
-+      rlwinm  r5,r6,0,17,15           /* clear MSR_EE */
++      rlwinm  r5,r10,0,17,15          /* clear MSR_EE */
 +#endif        
 +#else 
        mfmsr   r5
@@ -2023,7 +2023,7 @@ index 9ad236e..65b8f7c 100644
        isync
        PPC_LCMPI       0,r3,0
 -      beqlr-                          /* if no previous owner, done */
-+      beq-    2f                      /* if no previous owner, done */
++      beq-    3f                      /* if no previous owner, done */
        addi    r3,r3,THREAD            /* want THREAD of task */
        PPC_LL  r6,THREAD_FPSAVEAREA(r3)
        PPC_LL  r5,PT_REGS(r3)
@@ -2031,9 +2031,9 @@ index 9ad236e..65b8f7c 100644
        LOAD_REG_ADDRBASE(r4,last_task_used_math)
        PPC_STL r5,ADDROFF(last_task_used_math)(r4)
  #endif /* CONFIG_SMP */
-+2:
++3:
 +#ifdef CONFIG_IPIPE           /* restore interrupt state */
-+      andi.   r6,r6,MSR_EE
++      andi.   r10,r10,MSR_EE
 +      beqlr
 +      mfmsr   r5
 +      ori     r5,r5,MSR_EE
@@ -2152,7 +2152,7 @@ index 67ee0d6..867f855 100644
        /* Fixed Interval Timer (FIT) Exception. (from 0x1010) */
  FITException:
 diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
-index c334f53..06b4f42 100644
+index c334f53..8fe9c44 100644
 --- a/arch/powerpc/kernel/head_44x.S
 +++ b/arch/powerpc/kernel/head_44x.S
 @@ -262,8 +262,13 @@ interrupt_base:
@@ -2161,7 +2161,7 @@ index c334f53..06b4f42 100644
        /* External Input Interrupt */
 +#ifdef CONFIG_IPIPE
 +      EXCEPTION(0x0500, BOOKE_INTERRUPT_EXTERNAL, ExternalInput, \
-+                __ipipe_grab_irq, EXC_XFER_LITE)
++                __ipipe_grab_irq, EXC_XFER_IPIPE)
 +#else /* !CONFIG_IPIPE */
        EXCEPTION(0x0500, BOOKE_INTERRUPT_EXTERNAL, ExternalInput, \
                  do_IRQ, EXC_XFER_LITE)
@@ -2463,10 +2463,10 @@ index 3fdef0f..72c186e 100644
        li      r0,0
 diff --git a/arch/powerpc/kernel/ipipe.c b/arch/powerpc/kernel/ipipe.c
 new file mode 100644
-index 0000000..d47e1b4
+index 0000000..9995b4f
 --- /dev/null
 +++ b/arch/powerpc/kernel/ipipe.c
-@@ -0,0 +1,391 @@
+@@ -0,0 +1,381 @@
 +/* -*- linux-c -*-
 + * linux/arch/powerpc/kernel/ipipe.c
 + *
@@ -2722,16 +2722,6 @@ index 0000000..d47e1b4
 +}
 +EXPORT_SYMBOL_GPL(ipipe_get_sysinfo);
 +
-+void ipipe_raise_irq(unsigned int irq)
-+{
-+      unsigned long flags;
-+
-+      flags = hard_local_irq_save();
-+      __ipipe_handle_irq(irq, NULL);
-+      hard_local_irq_restore(flags);
-+}
-+EXPORT_SYMBOL_GPL(ipipe_raise_irq);
-+
 +static int __ipipe_exit_irq(struct pt_regs *regs)
 +{
 +      int root = __ipipe_root_p;
@@ -5566,6 +5556,25 @@ index f04e25f..5fa6be6 100644
        select CPU_IDLE_GOV_LADDER if (!NO_HZ && !NO_HZ_IDLE)
        select CPU_IDLE_GOV_MENU if (NO_HZ || NO_HZ_IDLE)
        help
+diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
+index 228632c9..3da4d6d 100644
+--- a/drivers/iommu/irq_remapping.c
++++ b/drivers/iommu/irq_remapping.c
+@@ -361,12 +361,12 @@ void panic_if_irq_remap(const char *msg)
+ 
+ static void ir_ack_apic_edge(struct irq_data *data)
+ {
+-      ack_APIC_irq();
++      __ack_APIC_irq();
+ }
+ 
+ static void ir_ack_apic_level(struct irq_data *data)
+ {
+-      ack_APIC_irq();
++      __ack_APIC_irq();
+       eoi_ioapic_irq(data->irq, data->chip_data);
+ }
+ 
 diff --git a/drivers/tty/serial/8250/8250_core.c 
b/drivers/tty/serial/8250/8250_core.c
 index 612dfc7..ffd8160 100644
 --- a/drivers/tty/serial/8250/8250_core.c
@@ -5973,10 +5982,10 @@ index e6bb36a..898a91a 100644
  
 diff --git a/include/linux/ipipe.h b/include/linux/ipipe.h
 new file mode 100644
-index 0000000..912f689
+index 0000000..fc31c97
 --- /dev/null
 +++ b/include/linux/ipipe.h
-@@ -0,0 +1,455 @@
+@@ -0,0 +1,461 @@
 +/* -*- linux-c -*-
 + * include/linux/ipipe.h
 + *
@@ -6393,6 +6402,12 @@ index 0000000..912f689
 +#define __ipipe_uaccess_might_fault() might_fault()
 +#endif
 +
++#ifdef CONFIG_IPIPE_TRACE
++void __ipipe_tracer_hrclock_initialized(void);
++#else /* !CONFIG_IPIPE_TRACE */
++#define __ipipe_tracer_hrclock_initialized()  do { } while(0)
++#endif /* !CONFIG_IPIPE_TRACE */
++
 +#include <linux/ipipe_compat.h>
 +
 +#else /* !CONFIG_IPIPE */
@@ -9434,10 +9449,10 @@ index 0000000..797a849
 +}
 diff --git a/kernel/ipipe/core.c b/kernel/ipipe/core.c
 new file mode 100644
-index 0000000..c5b022b
+index 0000000..026f6d9
 --- /dev/null
 +++ b/kernel/ipipe/core.c
-@@ -0,0 +1,1929 @@
+@@ -0,0 +1,1956 @@
 +/* -*- linux-c -*-
 + * linux/kernel/ipipe/core.c
 + *
@@ -10839,6 +10854,33 @@ index 0000000..c5b022b
 +      __ipipe_sync_pipeline(ipipe_head_domain);
 +}
 +
++void ipipe_raise_irq(unsigned int irq)
++{
++      struct ipipe_domain *ipd = ipipe_head_domain;
++      unsigned long flags, control;
++
++      flags = hard_local_irq_save();
++
++      /*
++       * Fast path: raising a virtual IRQ handled by the head
++       * domain.
++       */
++      if (likely(ipipe_virtual_irq_p(irq) && ipd != ipipe_root_domain)) {
++              control = ipd->irqs[irq].control;
++              if (likely(control & IPIPE_HANDLE_MASK)) {
++                      dispatch_irq_head(irq);
++                      goto out;
++              }
++      }
++
++      /* Emulate regular device IRQ receipt. */
++      __ipipe_dispatch_irq(irq, IPIPE_IRQF_NOACK);
++out:
++      hard_local_irq_restore(flags);
++
++}
++EXPORT_SYMBOL_GPL(ipipe_raise_irq);
++
 +#ifdef CONFIG_PREEMPT
 +
 +void preempt_schedule_irq(void);
@@ -11369,10 +11411,10 @@ index 0000000..c5b022b
 +#endif
 diff --git a/kernel/ipipe/timer.c b/kernel/ipipe/timer.c
 new file mode 100644
-index 0000000..0c9b908
+index 0000000..f32a7ff
 --- /dev/null
 +++ b/kernel/ipipe/timer.c
-@@ -0,0 +1,492 @@
+@@ -0,0 +1,493 @@
 +/* -*- linux-c -*-
 + * linux/kernel/ipipe/timer.c
 + *
@@ -11740,6 +11782,7 @@ index 0000000..0c9b908
 +              timer->real_set_next_event = evtdev->set_next_event;
 +              evtdev->mult = 1;
 +              evtdev->shift = 0;
++              evtdev->max_delta_ns = UINT_MAX;
 +              evtdev->set_mode = emumode;
 +              evtdev->set_next_event = emutick;
 +              evtdev->ipipe_stolen = 1;
@@ -11867,10 +11910,10 @@ index 0000000..0c9b908
 +#endif /* CONFIG_IPIPE_HAVE_HOSTRT */
 diff --git a/kernel/ipipe/tracer.c b/kernel/ipipe/tracer.c
 new file mode 100644
-index 0000000..5cce0bc
+index 0000000..8388671
 --- /dev/null
 +++ b/kernel/ipipe/tracer.c
-@@ -0,0 +1,1447 @@
+@@ -0,0 +1,1468 @@
 +/* -*- linux-c -*-
 + * kernel/ipipe/tracer.c
 + *
@@ -12618,6 +12661,9 @@ index 0000000..5cce0bc
 +      unsigned long long abs_tsc;
 +      long us;
 +
++      if (!__ipipe_hrclock_ok())
++              return 0;
++
 +      /* ipipe_tsc2us works on unsigned => handle sign separately */
 +      abs_tsc = (tsc >= 0) ? tsc : -tsc;
 +      us = ipipe_tsc2us(abs_tsc);
@@ -12820,6 +12866,11 @@ index 0000000..5cce0bc
 +
 +              __ipipe_global_path_unlock(flags);
 +
++              if (!__ipipe_hrclock_ok()) {
++                      seq_printf(m, "No hrclock available, dumping traces 
disabled\n");
++                      return NULL;
++              }
++
 +              /* does this path actually contain data? */
 +              if (print_path->end == print_path->begin)
 +                      return NULL;
@@ -12990,6 +13041,11 @@ index 0000000..5cce0bc
 +              if (!print_path)
 +                      return NULL;
 +
++              if (!__ipipe_hrclock_ok()) {
++                      seq_printf(m, "No hrclock available, dumping traces 
disabled\n");
++                      return NULL;
++              }
++
 +              /* back- and post-tracing length, post-trace length was frozen
 +                 in __ipipe_trace, back-trace may have to be reduced due to
 +                 buffer overrun */
@@ -13239,18 +13295,38 @@ index 0000000..5cce0bc
 +
 +extern struct proc_dir_entry *ipipe_proc_root;
 +
-+void __init __ipipe_init_tracer(void)
++void __init __ipipe_tracer_hrclock_initialized(void)
 +{
-+      struct proc_dir_entry *trace_dir;
 +      unsigned long long start, end, min = ULLONG_MAX;
 +      int i;
++
++#ifdef CONFIG_IPIPE_TRACE_VMALLOC
++      if (!per_cpu(trace_path, 0))
++              return;
++#endif
++      /* Calculate minimum overhead of __ipipe_trace() */
++      hard_local_irq_disable();
++      for (i = 0; i < 100; i++) {
++              ipipe_read_tsc(start);
++              __ipipe_trace(IPIPE_TRACE_FUNC, __BUILTIN_RETURN_ADDRESS0,
++                            __BUILTIN_RETURN_ADDRESS1, 0);
++              ipipe_read_tsc(end);
++
++              end -= start;
++              if (end < min)
++                      min = end;
++      }
++      hard_local_irq_enable();
++      trace_overhead = ipipe_tsc2ns(min);
++}
++
++void __init __ipipe_init_tracer(void)
++{
++      struct proc_dir_entry *trace_dir;
 +#ifdef CONFIG_IPIPE_TRACE_VMALLOC
 +      int cpu, path;
 +#endif /* CONFIG_IPIPE_TRACE_VMALLOC */
 +
-+      if (!__ipipe_hrclock_ok())
-+              return;
-+
 +#ifdef CONFIG_IPIPE_TRACE_VMALLOC
 +      for_each_possible_cpu(cpu) {
 +              struct ipipe_trace_path *tp_buf;
@@ -13272,20 +13348,8 @@ index 0000000..5cce0bc
 +      }
 +#endif /* CONFIG_IPIPE_TRACE_VMALLOC */
 +
-+      /* Calculate minimum overhead of __ipipe_trace() */
-+      hard_local_irq_disable();
-+      for (i = 0; i < 100; i++) {
-+              ipipe_read_tsc(start);
-+              __ipipe_trace(IPIPE_TRACE_FUNC, __BUILTIN_RETURN_ADDRESS0,
-+                            __BUILTIN_RETURN_ADDRESS1, 0);
-+              ipipe_read_tsc(end);
-+
-+              end -= start;
-+              if (end < min)
-+                      min = end;
-+      }
-+      hard_local_irq_enable();
-+      trace_overhead = ipipe_tsc2ns(min);
++      if (__ipipe_hrclock_ok() && !trace_overhead)
++              __ipipe_tracer_hrclock_initialized();
 +
 +#ifdef CONFIG_IPIPE_TRACE_ENABLE
 +      ipipe_trace_enable = 1;
@@ -13319,7 +13383,7 @@ index 0000000..5cce0bc
 +#endif /* !CONFIG_IPIPE_TRACE_MCOUNT */
 +}
 diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
-index dc04c16..2296ca9 100644
+index dc04c16..dff8902 100644
 --- a/kernel/irq/chip.c
 +++ b/kernel/irq/chip.c
 @@ -15,6 +15,7 @@
@@ -13368,7 +13432,7 @@ index dc04c16..2296ca9 100644
                desc->irq_data.chip->irq_shutdown(&desc->irq_data);
 -      else if (desc->irq_data.chip->irq_disable)
 +#ifdef CONFIG_IPIPE
-+              desc->istate |= ~IPIPE_IRQS_NEEDS_STARTUP;
++              desc->istate |= IPIPE_IRQS_NEEDS_STARTUP;
 +#endif
 +      } else if (desc->irq_data.chip->irq_disable)
                desc->irq_data.chip->irq_disable(&desc->irq_data);
diff --git 
a/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.18.20-powerpc-3.patch 
b/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.18.20-powerpc-5.patch
similarity index 99%
rename from 
kernel/cobalt/arch/powerpc/patches/ipipe-core-3.18.20-powerpc-3.patch
rename to kernel/cobalt/arch/powerpc/patches/ipipe-core-3.18.20-powerpc-5.patch
index 269753a..a0b9349 100644
--- a/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.18.20-powerpc-3.patch
+++ b/kernel/cobalt/arch/powerpc/patches/ipipe-core-3.18.20-powerpc-5.patch
@@ -304,7 +304,7 @@ index b59ac27..9cc1d25 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..5e12457
+index 0000000..b510fd4
 --- /dev/null
 +++ b/arch/powerpc/include/asm/ipipe.h
 @@ -0,0 +1,157 @@
@@ -349,7 +349,7 @@ index 0000000..5e12457
 +#include <linux/cache.h>
 +#include <linux/threads.h>
 +
-+#define IPIPE_CORE_RELEASE    3
++#define IPIPE_CORE_RELEASE    5
 +
 +struct ipipe_domain;
 +
@@ -1958,7 +1958,7 @@ index 5e01984..6f68eff 100644
  #ifdef CONFIG_PPC_DOORBELL
        STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, doorbell_exception)
 diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S
-index 9ad236e..76482dc 100644
+index 9ad236e..3f38333 100644
 --- a/arch/powerpc/kernel/fpu.S
 +++ b/arch/powerpc/kernel/fpu.S
 @@ -195,7 +195,17 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
@@ -1984,7 +1984,7 @@ index 9ad236e..76482dc 100644
        isync
        PPC_LCMPI       0,r3,0
 -      beqlr-                          /* if no previous owner, done */
-+      beq-    2f                      /* if no previous owner, done */
++      beq-    3f                      /* if no previous owner, done */
        addi    r3,r3,THREAD            /* want THREAD of task */
        PPC_LL  r6,THREAD_FPSAVEAREA(r3)
        PPC_LL  r5,PT_REGS(r3)
@@ -1992,7 +1992,7 @@ index 9ad236e..76482dc 100644
        LOAD_REG_ADDRBASE(r4,last_task_used_math)
        PPC_STL r5,ADDROFF(last_task_used_math)(r4)
  #endif /* CONFIG_SMP */
-+2:
++3:
 +#ifdef CONFIG_IPIPE           /* restore interrupt state */
 +      andi.   r10,r10,MSR_EE
 +      beqlr
@@ -2113,7 +2113,7 @@ index 7d7d863..1c01a90 100644
        /* Fixed Interval Timer (FIT) Exception. (from 0x1010) */
  FITException:
 diff --git a/arch/powerpc/kernel/head_44x.S b/arch/powerpc/kernel/head_44x.S
-index b5061ab..e70e553 100644
+index b5061ab..e69a9af 100644
 --- a/arch/powerpc/kernel/head_44x.S
 +++ b/arch/powerpc/kernel/head_44x.S
 @@ -262,8 +262,13 @@ interrupt_base:
@@ -2122,7 +2122,7 @@ index b5061ab..e70e553 100644
        /* External Input Interrupt */
 +#ifdef CONFIG_IPIPE
 +      EXCEPTION(0x0500, BOOKE_INTERRUPT_EXTERNAL, ExternalInput, \
-+                __ipipe_grab_irq, EXC_XFER_LITE)
++                __ipipe_grab_irq, EXC_XFER_IPIPE)
 +#else /* !CONFIG_IPIPE */
        EXCEPTION(0x0500, BOOKE_INTERRUPT_EXTERNAL, ExternalInput, \
                  do_IRQ, EXC_XFER_LITE)
@@ -5582,8 +5582,27 @@ index c5029c1..2d68014 100644
        select CPU_IDLE_GOV_LADDER if (!NO_HZ && !NO_HZ_IDLE)
        select CPU_IDLE_GOV_MENU if (NO_HZ || NO_HZ_IDLE)
        help
+diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
+index 74a1767..7cf4766 100644
+--- a/drivers/iommu/irq_remapping.c
++++ b/drivers/iommu/irq_remapping.c
+@@ -366,12 +366,12 @@ void panic_if_irq_remap(const char *msg)
+ 
+ static void ir_ack_apic_edge(struct irq_data *data)
+ {
+-      ack_APIC_irq();
++      __ack_APIC_irq();
+ }
+ 
+ static void ir_ack_apic_level(struct irq_data *data)
+ {
+-      ack_APIC_irq();
++      __ack_APIC_irq();
+       eoi_ioapic_irq(data->irq, data->chip_data);
+ }
+ 
 diff --git a/drivers/tty/serial/8250/8250_core.c 
b/drivers/tty/serial/8250/8250_core.c
-index e5c31ea..8dce875 100644
+index e5c31ea..8dce8751 100644
 --- a/drivers/tty/serial/8250/8250_core.c
 +++ b/drivers/tty/serial/8250/8250_core.c
 @@ -3480,6 +3480,84 @@ static int serial8250_resume(struct platform_device 
*dev)
@@ -9505,10 +9524,10 @@ index 0000000..797a849
 +}
 diff --git a/kernel/ipipe/core.c b/kernel/ipipe/core.c
 new file mode 100644
-index 0000000..0320453
+index 0000000..d7c8934
 --- /dev/null
 +++ b/kernel/ipipe/core.c
-@@ -0,0 +1,1917 @@
+@@ -0,0 +1,1916 @@
 +/* -*- linux-c -*-
 + * linux/kernel/ipipe/core.c
 + *
@@ -11247,11 +11266,10 @@ index 0000000..0320453
 +       * currently stalled, in which case preemption would be
 +       * disabled, and no migration could occur.
 +       */
-+      if (this_domain == ipipe_root_domain) {
-+              p = raw_cpu_ptr(&ipipe_percpu.root);
-+              if (test_bit(IPIPE_STALL_FLAG, &p->status) || preempt_count())
-+                      goto out;
-+      }
++
++      p = raw_cpu_ptr(&ipipe_percpu.root);
++      if (!preemptible())
++              goto out;
 +      /*
 +       * Our caller may end up accessing the wrong per-cpu variable
 +       * instance due to CPU migration; tell it to complain about
@@ -11428,10 +11446,10 @@ index 0000000..0320453
 +#endif
 diff --git a/kernel/ipipe/timer.c b/kernel/ipipe/timer.c
 new file mode 100644
-index 0000000..354bf29
+index 0000000..143f9e6
 --- /dev/null
 +++ b/kernel/ipipe/timer.c
-@@ -0,0 +1,496 @@
+@@ -0,0 +1,497 @@
 +/* -*- linux-c -*-
 + * linux/kernel/ipipe/timer.c
 + *
@@ -11799,6 +11817,7 @@ index 0000000..354bf29
 +              timer->real_set_next_event = evtdev->set_next_event;
 +              evtdev->mult = 1;
 +              evtdev->shift = 0;
++              evtdev->max_delta_ns = UINT_MAX;
 +              evtdev->set_mode = emumode;
 +              evtdev->set_next_event = emutick;
 +              evtdev->ipipe_stolen = 1;


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to