Message ID | 1341825639-23475-3-git-send-email-monstr@monstr.eu |
---|---|
State | Accepted |
Delegated to: | Michal Simek |
Headers | show |
Hi Michal, On Mon, Jul 9, 2012 at 2:20 AM, Michal Simek <monstr@monstr.eu> wrote: > Clear and prepare for device-tree driven configuration. > Remove CONFIG_SYS_INTC_0 definition > Use dynamic allocation instead of static. > > Signed-off-by: Michal Simek <monstr@monstr.eu> > I'm not really qualified to review this, but it seems reasonable. Acked-by: Simon Glass <sjg@chromium.org> > --- > arch/microblaze/cpu/interrupts.c | 88 > ++++++++++++++----------- > arch/microblaze/cpu/start.S | 2 - > arch/microblaze/cpu/timer.c | 2 - > arch/microblaze/include/asm/microblaze_intc.h | 3 + > arch/microblaze/lib/board.c | 6 +-- > include/configs/microblaze-generic.h | 1 - > 6 files changed, 54 insertions(+), 48 deletions(-) > > diff --git a/arch/microblaze/cpu/interrupts.c > b/arch/microblaze/cpu/interrupts.c > index e7ca859..ee67082 100644 > --- a/arch/microblaze/cpu/interrupts.c > +++ b/arch/microblaze/cpu/interrupts.c > @@ -26,6 +26,7 @@ > > #include <common.h> > #include <command.h> > +#include <malloc.h> > #include <asm/microblaze_intc.h> > #include <asm/asm.h> > > @@ -48,20 +49,19 @@ int disable_interrupts (void) > return (msr & 0x2) != 0; > } > > -#ifdef CONFIG_SYS_INTC_0 > - > -static struct irq_action vecs[CONFIG_SYS_INTC_0_NUM]; > +static struct irq_action *vecs; > +static u32 irq_no; > > /* mapping structure to interrupt controller */ > -microblaze_intc_t *intc = (microblaze_intc_t *) (CONFIG_SYS_INTC_0_ADDR); > +microblaze_intc_t *intc; > > /* default handler */ > -void def_hdlr (void) > +static void def_hdlr(void) > { > puts ("def_hdlr\n"); > } > > -void enable_one_interrupt (int irq) > +static void enable_one_interrupt(int irq) > { > int mask; > int offset = 1; > @@ -76,7 +76,7 @@ void enable_one_interrupt (int irq) > #endif > } > > -void disable_one_interrupt (int irq) > +static void disable_one_interrupt(int irq) > { > int mask; > int offset = 1; > @@ -96,7 +96,7 @@ void install_interrupt_handler (int irq, > interrupt_handler_t * hdlr, void *arg) > { > struct irq_action *act; > /* irq out of range */ > - if ((irq < 0) || (irq > CONFIG_SYS_INTC_0_NUM)) { > + if ((irq < 0) || (irq > irq_no)) { > puts ("IRQ out of range\n"); > return; > } > @@ -114,7 +114,7 @@ void install_interrupt_handler (int irq, > interrupt_handler_t * hdlr, void *arg) > } > > /* initialization interrupt controller - hardware */ > -void intc_init (void) > +static void intc_init(void) > { > intc->mer = 0; > intc->ier = 0; > @@ -127,18 +127,33 @@ void intc_init (void) > #endif > } > > -int interrupts_init (void) > +int interrupts_init(void) > { > int i; > - /* initialize irq list */ > - for (i = 0; i < CONFIG_SYS_INTC_0_NUM; i++) { > - vecs[i].handler = (interrupt_handler_t *) def_hdlr; > - vecs[i].arg = (void *)i; > - vecs[i].count = 0; > + > +#if defined(CONFIG_SYS_INTC_0_ADDR) && defined(CONFIG_SYS_INTC_0_NUM) > + intc = (microblaze_intc_t *) (CONFIG_SYS_INTC_0_ADDR); > + irq_no = CONFIG_SYS_INTC_0_NUM; > +#endif > + if (irq_no) { > + vecs = calloc(1, sizeof(struct irq_action) * irq_no); > This is fine, since I assume it is called after memalloc_init(), but you could set an arbitrary maximum limit if you prefer. > + if (vecs == NULL) { > + puts("Interrupt vector allocation failed\n"); > + return -1; > + } > + > + /* initialize irq list */ > + for (i = 0; i < irq_no; i++) { > + vecs[i].handler = (interrupt_handler_t *) def_hdlr; > + vecs[i].arg = (void *)i; > + vecs[i].count = 0; > + } > + /* initialize intc controller */ > + intc_init(); > + enable_interrupts(); > + } else { > + puts("Undefined interrupt controller\n"); > } > - /* initialize intc controller */ > - intc_init (); > - enable_interrupts (); > return 0; > } > > @@ -172,33 +187,30 @@ void interrupt_handler (void) > printf ("Interrupt handler on %x line, r14 %x\n", irqs, value); > #endif > } > -#endif > > #if defined(CONFIG_CMD_IRQ) > -#ifdef CONFIG_SYS_INTC_0 > -int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char * const > argv[]) > +int do_irqinfo(cmd_tbl_t *cmdtp, int flag, int argc, const char *argv[]) > { > int i; > struct irq_action *act = vecs; > > - puts ("\nInterrupt-Information:\n\n" > - "Nr Routine Arg Count\n" > - "-----------------------------\n"); > - > - for (i = 0; i < CONFIG_SYS_INTC_0_NUM; i++) { > - if (act->handler != (interrupt_handler_t*) def_hdlr) { > - printf ("%02d %08x %08x %d\n", i, > - (int)act->handler, (int)act->arg, > act->count); > + if (irq_no) { > + puts("\nInterrupt-Information:\n\n" > + "Nr Routine Arg Count\n" > + "-----------------------------\n"); > + > + for (i = 0; i < irq_no; i++) { > + if (act->handler != (interrupt_handler_t *) > def_hdlr) { > + printf("%02d %08x %08x %d\n", i, > + (int)act->handler, (int)act->arg, > + > act->count); > + } > + act++; > } > - act++; > + puts("\n"); > + } else { > + puts("Undefined interrupt controller\n"); > } > - puts ("\n"); > - return (0); > -} > -#else > -int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char * const > argv[]) > -{ > - puts ("Undefined interrupt controller\n"); > + return 0; > } > #endif > -#endif > diff --git a/arch/microblaze/cpu/start.S b/arch/microblaze/cpu/start.S > index 9077f74..8a2f634 100644 > --- a/arch/microblaze/cpu/start.S > +++ b/arch/microblaze/cpu/start.S > @@ -108,7 +108,6 @@ _start: > sh r6, r0, r8 > #endif > > -#ifdef CONFIG_SYS_INTC_0 > /* interrupt_handler */ > swi r2, r0, 0x10 /* interrupt - imm opcode */ > swi r3, r0, 0x14 /* interrupt - brai opcode */ > @@ -120,7 +119,6 @@ _start: > sh r7, r0, r8 > rsubi r8, r10, 0x16 > sh r6, r0, r8 > -#endif > > /* hardware exception */ > swi r2, r0, 0x20 /* hardware exception - imm opcode */ > diff --git a/arch/microblaze/cpu/timer.c b/arch/microblaze/cpu/timer.c > index 1952804..ae4ffe0 100644 > --- a/arch/microblaze/cpu/timer.c > +++ b/arch/microblaze/cpu/timer.c > @@ -40,7 +40,6 @@ ulong get_timer (ulong base) > } > #endif > > -#ifdef CONFIG_SYS_INTC_0 > #ifdef CONFIG_SYS_TIMER_0 > microblaze_timer_t *tmr = (microblaze_timer_t *) > (CONFIG_SYS_TIMER_0_ADDR); > > @@ -61,7 +60,6 @@ int timer_init (void) > return 0; > } > #endif > -#endif > > /* > * This function is derived from PowerPC code (read timebase as long > long). > diff --git a/arch/microblaze/include/asm/microblaze_intc.h > b/arch/microblaze/include/asm/microblaze_intc.h > index 4c385aa..6142b9c 100644 > --- a/arch/microblaze/include/asm/microblaze_intc.h > +++ b/arch/microblaze/include/asm/microblaze_intc.h > @@ -41,3 +41,6 @@ struct irq_action { > > void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, > void *arg); > + > +int interrupts_init(void); > + > diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c > index 1cf895b..8cf4266 100644 > --- a/arch/microblaze/lib/board.c > +++ b/arch/microblaze/lib/board.c > @@ -32,6 +32,7 @@ > #include <stdio_dev.h> > #include <net.h> > #include <asm/processor.h> > +#include <asm/microblaze_intc.h> > #include <fdtdec.h> > > DECLARE_GLOBAL_DATA_PTR; > @@ -39,9 +40,6 @@ DECLARE_GLOBAL_DATA_PTR; > #ifdef CONFIG_SYS_GPIO_0 > extern int gpio_init (void); > #endif > -#ifdef CONFIG_SYS_INTC_0 > -extern int interrupts_init (void); > -#endif > #ifdef CONFIG_SYS_TIMER_0 > extern int timer_init (void); > #endif > @@ -73,9 +71,7 @@ init_fnc_t *init_sequence[] = { > #ifdef CONFIG_SYS_GPIO_0 > gpio_init, > #endif > -#ifdef CONFIG_SYS_INTC_0 > interrupts_init, > -#endif > #ifdef CONFIG_SYS_TIMER_0 > timer_init, > #endif > diff --git a/include/configs/microblaze-generic.h > b/include/configs/microblaze-generic.h > index e20eb08..44934eb 100644 > --- a/include/configs/microblaze-generic.h > +++ b/include/configs/microblaze-generic.h > @@ -97,7 +97,6 @@ > > /* interrupt controller */ > #ifdef XILINX_INTC_BASEADDR > -# define CONFIG_SYS_INTC_0 1 > # define CONFIG_SYS_INTC_0_ADDR XILINX_INTC_BASEADDR > # define CONFIG_SYS_INTC_0_NUM XILINX_INTC_NUM_INTR_INPUTS > #endif > -- > 1.7.0.4 > > Regards, Simon
On 07/09/2012 11:21 PM, Simon Glass wrote: > Hi Michal, > > On Mon, Jul 9, 2012 at 2:20 AM, Michal Simek <monstr@monstr.eu <mailto:monstr@monstr.eu>> wrote: > > Clear and prepare for device-tree driven configuration. > Remove CONFIG_SYS_INTC_0 definition > Use dynamic allocation instead of static. > > Signed-off-by: Michal Simek <monstr@monstr.eu <mailto:monstr@monstr.eu>> > > > I'm not really qualified to review this, but it seems reasonable. > > Acked-by: Simon Glass <sjg@chromium.org <mailto:sjg@chromium.org>> thanks. > > --- > arch/microblaze/cpu/interrupts.c | 88 ++++++++++++++----------- > arch/microblaze/cpu/start.S | 2 - > arch/microblaze/cpu/timer.c | 2 - > arch/microblaze/include/asm/microblaze_intc.h | 3 + > arch/microblaze/lib/board.c | 6 +-- > include/configs/microblaze-generic.h | 1 - > 6 files changed, 54 insertions(+), 48 deletions(-) > > diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c > index e7ca859..ee67082 100644 > --- a/arch/microblaze/cpu/interrupts.c > +++ b/arch/microblaze/cpu/interrupts.c > @@ -26,6 +26,7 @@ > > #include <common.h> > #include <command.h> > +#include <malloc.h> > #include <asm/microblaze_intc.h> > #include <asm/asm.h> > > @@ -48,20 +49,19 @@ int disable_interrupts (void) > return (msr & 0x2) != 0; > } > > -#ifdef CONFIG_SYS_INTC_0 > - > -static struct irq_action vecs[CONFIG_SYS_INTC_0_NUM]; > +static struct irq_action *vecs; > +static u32 irq_no; > > /* mapping structure to interrupt controller */ > -microblaze_intc_t *intc = (microblaze_intc_t *) (CONFIG_SYS_INTC_0_ADDR); > +microblaze_intc_t *intc; > > /* default handler */ > -void def_hdlr (void) > +static void def_hdlr(void) > { > puts ("def_hdlr\n"); > } > > -void enable_one_interrupt (int irq) > +static void enable_one_interrupt(int irq) > { > int mask; > int offset = 1; > @@ -76,7 +76,7 @@ void enable_one_interrupt (int irq) > #endif > } > > -void disable_one_interrupt (int irq) > +static void disable_one_interrupt(int irq) > { > int mask; > int offset = 1; > @@ -96,7 +96,7 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) > { > struct irq_action *act; > /* irq out of range */ > - if ((irq < 0) || (irq > CONFIG_SYS_INTC_0_NUM)) { > + if ((irq < 0) || (irq > irq_no)) { > puts ("IRQ out of range\n"); > return; > } > @@ -114,7 +114,7 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) > } > > /* initialization interrupt controller - hardware */ > -void intc_init (void) > +static void intc_init(void) > { > intc->mer = 0; > intc->ier = 0; > @@ -127,18 +127,33 @@ void intc_init (void) > #endif > } > > -int interrupts_init (void) > +int interrupts_init(void) > { > int i; > - /* initialize irq list */ > - for (i = 0; i < CONFIG_SYS_INTC_0_NUM; i++) { > - vecs[i].handler = (interrupt_handler_t *) def_hdlr; > - vecs[i].arg = (void *)i; > - vecs[i].count = 0; > + > +#if defined(CONFIG_SYS_INTC_0_ADDR) && defined(CONFIG_SYS_INTC_0_NUM) > + intc = (microblaze_intc_t *) (CONFIG_SYS_INTC_0_ADDR); > + irq_no = CONFIG_SYS_INTC_0_NUM; > +#endif > + if (irq_no) { > + vecs = calloc(1, sizeof(struct irq_action) * irq_no); > > > This is fine, since I assume it is called after memalloc_init(), but you could set an arbitrary maximum limit if you prefer. > Yes, it is called after mem_malloc_init. The maximum limit is 32 but it won't be reached. This checking is done by u-boot BSP. Applied. Thanks, Michal
diff --git a/arch/microblaze/cpu/interrupts.c b/arch/microblaze/cpu/interrupts.c index e7ca859..ee67082 100644 --- a/arch/microblaze/cpu/interrupts.c +++ b/arch/microblaze/cpu/interrupts.c @@ -26,6 +26,7 @@ #include <common.h> #include <command.h> +#include <malloc.h> #include <asm/microblaze_intc.h> #include <asm/asm.h> @@ -48,20 +49,19 @@ int disable_interrupts (void) return (msr & 0x2) != 0; } -#ifdef CONFIG_SYS_INTC_0 - -static struct irq_action vecs[CONFIG_SYS_INTC_0_NUM]; +static struct irq_action *vecs; +static u32 irq_no; /* mapping structure to interrupt controller */ -microblaze_intc_t *intc = (microblaze_intc_t *) (CONFIG_SYS_INTC_0_ADDR); +microblaze_intc_t *intc; /* default handler */ -void def_hdlr (void) +static void def_hdlr(void) { puts ("def_hdlr\n"); } -void enable_one_interrupt (int irq) +static void enable_one_interrupt(int irq) { int mask; int offset = 1; @@ -76,7 +76,7 @@ void enable_one_interrupt (int irq) #endif } -void disable_one_interrupt (int irq) +static void disable_one_interrupt(int irq) { int mask; int offset = 1; @@ -96,7 +96,7 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) { struct irq_action *act; /* irq out of range */ - if ((irq < 0) || (irq > CONFIG_SYS_INTC_0_NUM)) { + if ((irq < 0) || (irq > irq_no)) { puts ("IRQ out of range\n"); return; } @@ -114,7 +114,7 @@ void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg) } /* initialization interrupt controller - hardware */ -void intc_init (void) +static void intc_init(void) { intc->mer = 0; intc->ier = 0; @@ -127,18 +127,33 @@ void intc_init (void) #endif } -int interrupts_init (void) +int interrupts_init(void) { int i; - /* initialize irq list */ - for (i = 0; i < CONFIG_SYS_INTC_0_NUM; i++) { - vecs[i].handler = (interrupt_handler_t *) def_hdlr; - vecs[i].arg = (void *)i; - vecs[i].count = 0; + +#if defined(CONFIG_SYS_INTC_0_ADDR) && defined(CONFIG_SYS_INTC_0_NUM) + intc = (microblaze_intc_t *) (CONFIG_SYS_INTC_0_ADDR); + irq_no = CONFIG_SYS_INTC_0_NUM; +#endif + if (irq_no) { + vecs = calloc(1, sizeof(struct irq_action) * irq_no); + if (vecs == NULL) { + puts("Interrupt vector allocation failed\n"); + return -1; + } + + /* initialize irq list */ + for (i = 0; i < irq_no; i++) { + vecs[i].handler = (interrupt_handler_t *) def_hdlr; + vecs[i].arg = (void *)i; + vecs[i].count = 0; + } + /* initialize intc controller */ + intc_init(); + enable_interrupts(); + } else { + puts("Undefined interrupt controller\n"); } - /* initialize intc controller */ - intc_init (); - enable_interrupts (); return 0; } @@ -172,33 +187,30 @@ void interrupt_handler (void) printf ("Interrupt handler on %x line, r14 %x\n", irqs, value); #endif } -#endif #if defined(CONFIG_CMD_IRQ) -#ifdef CONFIG_SYS_INTC_0 -int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) +int do_irqinfo(cmd_tbl_t *cmdtp, int flag, int argc, const char *argv[]) { int i; struct irq_action *act = vecs; - puts ("\nInterrupt-Information:\n\n" - "Nr Routine Arg Count\n" - "-----------------------------\n"); - - for (i = 0; i < CONFIG_SYS_INTC_0_NUM; i++) { - if (act->handler != (interrupt_handler_t*) def_hdlr) { - printf ("%02d %08x %08x %d\n", i, - (int)act->handler, (int)act->arg, act->count); + if (irq_no) { + puts("\nInterrupt-Information:\n\n" + "Nr Routine Arg Count\n" + "-----------------------------\n"); + + for (i = 0; i < irq_no; i++) { + if (act->handler != (interrupt_handler_t *) def_hdlr) { + printf("%02d %08x %08x %d\n", i, + (int)act->handler, (int)act->arg, + act->count); + } + act++; } - act++; + puts("\n"); + } else { + puts("Undefined interrupt controller\n"); } - puts ("\n"); - return (0); -} -#else -int do_irqinfo (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) -{ - puts ("Undefined interrupt controller\n"); + return 0; } #endif -#endif diff --git a/arch/microblaze/cpu/start.S b/arch/microblaze/cpu/start.S index 9077f74..8a2f634 100644 --- a/arch/microblaze/cpu/start.S +++ b/arch/microblaze/cpu/start.S @@ -108,7 +108,6 @@ _start: sh r6, r0, r8 #endif -#ifdef CONFIG_SYS_INTC_0 /* interrupt_handler */ swi r2, r0, 0x10 /* interrupt - imm opcode */ swi r3, r0, 0x14 /* interrupt - brai opcode */ @@ -120,7 +119,6 @@ _start: sh r7, r0, r8 rsubi r8, r10, 0x16 sh r6, r0, r8 -#endif /* hardware exception */ swi r2, r0, 0x20 /* hardware exception - imm opcode */ diff --git a/arch/microblaze/cpu/timer.c b/arch/microblaze/cpu/timer.c index 1952804..ae4ffe0 100644 --- a/arch/microblaze/cpu/timer.c +++ b/arch/microblaze/cpu/timer.c @@ -40,7 +40,6 @@ ulong get_timer (ulong base) } #endif -#ifdef CONFIG_SYS_INTC_0 #ifdef CONFIG_SYS_TIMER_0 microblaze_timer_t *tmr = (microblaze_timer_t *) (CONFIG_SYS_TIMER_0_ADDR); @@ -61,7 +60,6 @@ int timer_init (void) return 0; } #endif -#endif /* * This function is derived from PowerPC code (read timebase as long long). diff --git a/arch/microblaze/include/asm/microblaze_intc.h b/arch/microblaze/include/asm/microblaze_intc.h index 4c385aa..6142b9c 100644 --- a/arch/microblaze/include/asm/microblaze_intc.h +++ b/arch/microblaze/include/asm/microblaze_intc.h @@ -41,3 +41,6 @@ struct irq_action { void install_interrupt_handler (int irq, interrupt_handler_t * hdlr, void *arg); + +int interrupts_init(void); + diff --git a/arch/microblaze/lib/board.c b/arch/microblaze/lib/board.c index 1cf895b..8cf4266 100644 --- a/arch/microblaze/lib/board.c +++ b/arch/microblaze/lib/board.c @@ -32,6 +32,7 @@ #include <stdio_dev.h> #include <net.h> #include <asm/processor.h> +#include <asm/microblaze_intc.h> #include <fdtdec.h> DECLARE_GLOBAL_DATA_PTR; @@ -39,9 +40,6 @@ DECLARE_GLOBAL_DATA_PTR; #ifdef CONFIG_SYS_GPIO_0 extern int gpio_init (void); #endif -#ifdef CONFIG_SYS_INTC_0 -extern int interrupts_init (void); -#endif #ifdef CONFIG_SYS_TIMER_0 extern int timer_init (void); #endif @@ -73,9 +71,7 @@ init_fnc_t *init_sequence[] = { #ifdef CONFIG_SYS_GPIO_0 gpio_init, #endif -#ifdef CONFIG_SYS_INTC_0 interrupts_init, -#endif #ifdef CONFIG_SYS_TIMER_0 timer_init, #endif diff --git a/include/configs/microblaze-generic.h b/include/configs/microblaze-generic.h index e20eb08..44934eb 100644 --- a/include/configs/microblaze-generic.h +++ b/include/configs/microblaze-generic.h @@ -97,7 +97,6 @@ /* interrupt controller */ #ifdef XILINX_INTC_BASEADDR -# define CONFIG_SYS_INTC_0 1 # define CONFIG_SYS_INTC_0_ADDR XILINX_INTC_BASEADDR # define CONFIG_SYS_INTC_0_NUM XILINX_INTC_NUM_INTR_INPUTS #endif
Clear and prepare for device-tree driven configuration. Remove CONFIG_SYS_INTC_0 definition Use dynamic allocation instead of static. Signed-off-by: Michal Simek <monstr@monstr.eu> --- arch/microblaze/cpu/interrupts.c | 88 ++++++++++++++----------- arch/microblaze/cpu/start.S | 2 - arch/microblaze/cpu/timer.c | 2 - arch/microblaze/include/asm/microblaze_intc.h | 3 + arch/microblaze/lib/board.c | 6 +-- include/configs/microblaze-generic.h | 1 - 6 files changed, 54 insertions(+), 48 deletions(-)