On Tue, Nov 17, 2015 at 04:45:23PM -0800, Mathieu Rondonneau wrote:
> On 15-11-17 07:02 AM, Lennart Sorensen wrote:
> > On Mon, Nov 16, 2015 at 08:05:57PM -0800, Mathieu Rondonneau wrote:
> >> From fae80ca1c28b6a9e34f597fe63bfce768123337f Mon Sep 17 00:00:00 2001
> >> From: Mathieu Rondonneau <[email protected]>
> >> Date: Mon, 16 Nov 2015 20:03:28 -0800
> >> Subject: [PATCH] IPIPE patch for BCM2709/RPI2.
> >>
> >>  - kernel: https://github.com/raspberrypi/linux (rpi-3.18.y)
> >>    - 1bb18c8f721ef674a447f3622273f2e2de7a205c
> >>  - xenomai: git://git.xenomai.org/xenomai-3.git (stable-3.0.x)
> >>    - cb72996a06ae4f29e403e3397324069f1983145e
> >> ---
> >>  arch/arm/Kconfig                                 |  2 +-
> >>  arch/arm/mach-bcm2709/armctrl.c                  |  4 ++++
> >>  arch/arm/mach-bcm2709/bcm2708_gpio.c             |  6 ++++--
> >>  arch/arm/mach-bcm2709/bcm2709.c                  |  9 +++++++++
> >>  arch/arm/mach-bcm2709/include/mach/entry-macro.S | 12 ++++++++++--
> >>  5 files changed, 28 insertions(+), 5 deletions(-)
> >>
> >> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> >> index 4860d5f..ed45f63 100644
> >> --- a/arch/arm/Kconfig
> >> +++ b/arch/arm/Kconfig
> >> @@ -1058,7 +1058,7 @@ config IPIPE_ARM_KUSER_TSC
> >>         bool
> >>         select GENERIC_TIME_VSYSCALL
> >>         select IPIPE_HAVE_HOSTRT if IPIPE
> >> -       default y if ARCH_AT91 || ARM_TIMER_SP804 || ARCH_MXC ||
> >> ARCH_OMAP || PLAT_PXA || PLAT_S3C24XX || ARCH_SA1100
> >> +       default y if ARCH_AT91 || ARM_TIMER_SP804 || ARCH_MXC ||
> >> ARCH_OMAP || PLAT_PXA || PLAT_S3C24XX || ARCH_SA1100 || ARCH_BCM2709
> >>  endif
> >>
> >>  source "arch/arm/firmware/Kconfig"
> >> diff --git a/arch/arm/mach-bcm2709/armctrl.c
> >> b/arch/arm/mach-bcm2709/armctrl.c
> >> index fc6cb8b..c50b2cb 100644
> >> --- a/arch/arm/mach-bcm2709/armctrl.c
> >> +++ b/arch/arm/mach-bcm2709/armctrl.c
> >> @@ -333,6 +333,10 @@ static struct irq_chip armctrl_chip = {
> >>    .irq_mask = armctrl_mask_irq,
> >>    .irq_unmask = armctrl_unmask_irq,
> >>    .irq_set_wake = armctrl_set_wake,
> >> +#ifdef CONFIG_IPIPE
> >> +  .irq_hold = armctrl_mask_irq,
> >> +  .irq_release = armctrl_unmask_irq,
> >> +#endif
> >>  };
> >>
> >>  /**
> >> diff --git a/arch/arm/mach-bcm2709/bcm2708_gpio.c
> >> b/arch/arm/mach-bcm2709/bcm2708_gpio.c
> >> index c1e9254..7852129 100644
> >> --- a/arch/arm/mach-bcm2709/bcm2708_gpio.c
> >> +++ b/arch/arm/mach-bcm2709/bcm2708_gpio.c
> >> @@ -24,6 +24,7 @@
> >>  #include <linux/pinctrl/consumer.h>
> >>
> >>  #include <linux/platform_data/bcm2708.h>
> >> +#include <linux/ipipe.h>
> >>
> >>  #define BCM_GPIO_DRIVER_NAME "bcm2708_gpio"
> >>  #define DRIVER_NAME BCM_GPIO_DRIVER_NAME
> >> @@ -56,7 +57,8 @@ enum { GPIO_FSEL_INPUT, GPIO_FSEL_OUTPUT,
> >>     * the GPIO code. This also makes the case of a GPIO routine call from
> >>     * the IRQ code simpler.
> >>     */
> >> -static DEFINE_SPINLOCK(lock);     /* GPIO registers */
> >> +static IPIPE_DEFINE_SPINLOCK(lock); /* GPIO registers */
> >> +
> >>
> >>  struct bcm2708_gpio {
> >>    struct list_head list;
> >> @@ -294,7 +296,7 @@ static irqreturn_t bcm2708_gpio_interrupt(int irq,
> >> void *dev_id)
> >>                    if (!(level_bits & (1<<i)))
> >>                            writel(1<<i,
> >>                                   __io_address(GPIO_BASE) + GPIOEDS(bank));
> >> -                  generic_handle_irq(gpio_to_irq(gpio));
> >> +                  ipipe_handle_demuxed_irq(gpio_to_irq(gpio));
> >>                    /* ack level triggered IRQ after handling them */
> >>                    if (level_bits & (1<<i))
> >>                            writel(1<<i,
> >> diff --git a/arch/arm/mach-bcm2709/bcm2709.c
> >> b/arch/arm/mach-bcm2709/bcm2709.c
> >> index 6bfd99e..4dd796c 100644
> >> --- a/arch/arm/mach-bcm2709/bcm2709.c
> >> +++ b/arch/arm/mach-bcm2709/bcm2709.c
> >> @@ -1072,11 +1072,13 @@ static void __init bcm2709_timer_init(void)
> >>  static void __init bcm2709_timer_init(void)
> >>  {
> >>    extern void dc4_arch_timer_init(void);
> >> +#ifndef CONFIG_IPIPE
> >>    // timer control
> >>    writel(0, __io_address(ARM_LOCAL_CONTROL));
> >>    // timer pre_scaler
> >>    writel(0x80000000, __io_address(ARM_LOCAL_PRESCALER)); // 19.2MHz
> >>    //writel(0x06AAAAAB, __io_address(ARM_LOCAL_PRESCALER)); // 1MHz
> >> +#endif
> >>
> >>    if (use_dt)
> >>    {
> >> @@ -1085,6 +1087,13 @@ static void __init bcm2709_timer_init(void)
> >>    }
> >>    else
> >>            dc4_arch_timer_init();
> >> +
> >> +#ifdef CONFIG_IPIPE
> >> +  // timer control
> >> +  writel(0, __io_address(ARM_LOCAL_CONTROL));
> >> +  // timer pre_scaler
> >> +  writel(0x80000000, __io_address(ARM_LOCAL_PRESCALER)); // 19.2MHz
> >> +#endif
> >>  }
> >>
> >>  #endif
> >> diff --git a/arch/arm/mach-bcm2709/include/mach/entry-macro.S
> >> b/arch/arm/mach-bcm2709/include/mach/entry-macro.S
> >> index 101d9f1..9e089c8 100644
> >> --- a/arch/arm/mach-bcm2709/include/mach/entry-macro.S
> >> +++ b/arch/arm/mach-bcm2709/include/mach/entry-macro.S
> >> @@ -52,7 +52,11 @@
> >>    dsb
> >>    mov     r1, sp
> >>    adr     lr, BSYM(1b)
> >> -  b       do_IPI
> >> +#ifdef CONFIG_IPIPE
> >> +        b __ipipe_grab_ipi
> >> +#else
> >> +        b do_IPI
> >> +#endif
> >>
> >>  1030:
> >>    /* check gpu interrupt */
> >> @@ -107,7 +111,11 @@
> >>    @ routine called with r0 = irq number, r1 = struct pt_regs *
> >>    @
> >>    adr     lr, BSYM(1b)
> >> -  b       asm_do_IRQ
> >> +#ifdef CONFIG_IPIPE
> >> +        b __ipipe_grab_irq
> >> +#else
> >> +        b asm_do_IRQ
> >> +#endif
> > 
> > Wrong indentation.
> > 
> Good catch!
> will fix in next patch,
> Thanks for reviewing,

No problem.  It just jumped out at me for looking wrong on the screen.

Surprisingly short patch for adding support for a new CPU.  I guess a
lot of ARM designs being pretty generic helps.

-- 
Len Sorensen

_______________________________________________
Xenomai mailing list
[email protected]
http://xenomai.org/mailman/listinfo/xenomai

Reply via email to